diff --git a/ext/open62541.cmake b/ext/open62541.cmake
deleted file mode 100644
index c829671..0000000
--- a/ext/open62541.cmake
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2019 NXP
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-
-INCLUDE(open62541_lib.cmake)
diff --git a/ext/open62541/.clang-tidy b/ext/open62541/.clang-tidy
deleted file mode 100644
index 0b5f28c..0000000
--- a/ext/open62541/.clang-tidy
+++ /dev/null
@@ -1,3 +0,0 @@
-Checks:             'cert-*,performance-*,readability-*,-readability-braces-around-statements'
-WarningsAsErrors:   'cert-*,performance-*,readability-*,-readability-braces-around-statements'
-FormatStyle:        file
diff --git a/ext/open62541/.cquery b/ext/open62541/.cquery
deleted file mode 100644
index bf61846..0000000
--- a/ext/open62541/.cquery
+++ /dev/null
@@ -1,8 +0,0 @@
-%clang
-%c -std=c99
-
-# Includes
--I./include
--I./src
--I./deps
--I./plugins
\ No newline at end of file
diff --git a/ext/open62541/.editorconfig b/ext/open62541/.editorconfig
deleted file mode 100644
index cecbf7d..0000000
--- a/ext/open62541/.editorconfig
+++ /dev/null
@@ -1,27 +0,0 @@
-# EditorConfig is awesome: http://EditorConfig.org
-
-# top-most EditorConfig file
-root = true
-
-# Unix-style newlines with a newline ending every file
-[*]
-end_of_line = lf
-insert_final_newline = true
-indent_style = space
-indent_size = 4
-
-# Matches multiple files with brace expansion notation
-# Set default charset
-[*.{js,py}]
-charset = utf-8
-
-# Tab indentation (no size specified)
-[Makefile]
-indent_style = tab
-
-# Matches the exact files either package.json or .travis.yml
-[{package.json,.travis.yml,appveyor.yml}]
-indent_style = space
-indent_size = 2
-
-
diff --git a/ext/open62541/.travis-apt-pin.preferences b/ext/open62541/.travis-apt-pin.preferences
deleted file mode 100644
index 617f645..0000000
--- a/ext/open62541/.travis-apt-pin.preferences
+++ /dev/null
@@ -1,24 +0,0 @@
-Package: clang-3.9
-Pin: release o=Ubuntu
-Pin-Priority: -1
-
-Package: libclang-common-3.9-dev
-Pin: release o=Ubuntu
-Pin-Priority: -1
-
-Package: libclang1-3.9
-Pin: release o=Ubuntu
-Pin-Priority: -1
-
-Package: libllvm3.9v4
-Pin: release o=Ubuntu
-Pin-Priority: -1
-
-Package: clang-tidy-3.9
-Pin: release o=Ubuntu
-Pin-Priority: -1
-
-Package: libfuzzer-3.9-dev
-Pin: release o=Ubuntu
-Pin-Priority: -1
-
diff --git a/ext/open62541/.travis.yml b/ext/open62541/.travis.yml
deleted file mode 100644
index 9f89954..0000000
--- a/ext/open62541/.travis.yml
+++ /dev/null
@@ -1,385 +0,0 @@
-language: c
-sudo: required
-
-env:
-  global:
-    # GITAUTH:
-    - secure: nSunY54Wp5HkQCHHbKwlwpbaKyqRVIu/0EnhaoJSwhM1wqerQV/E5d/2JelO9/tZgbungAO7wk/fjutRMVc7d378RTIPwS8vHpvZfEoGhCFsLoTOlqESzsZFBup2H5t1lpQ23jRHDOxlLdJy2lz5U+zd1YnYgDXqdDFjegsIYdo=
-    - PYTHON=python2
-    # For tag builds we do not have the base branch in TRAVIS_BRANCH, therefore store it in BRANCH_FOR_TAG
-    - BRANCH_FOR_TAG=$(git ls-remote origin | sed -n "\|$TRAVIS_COMMIT\s\+refs/heads/|{s///p}")
-
-
-dist: trusty
-
-# Make sure we have the git tags. Travis uses shallow checkout where git describe does not work
-git:
-  depth: false
-
-matrix:
-  fast_finish: true
-  include:
-#
-# gcc-4.8 (trusty) full host and cross build with tests:
-# doc, cert, cross-mingw32, cross-mingw64, cross-linux32, cross-raspi, linux64,
-# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal, debian-package
-    - os: linux
-      compiler: gcc-4.8
-      addons:
-        apt:
-          sources:
-            # see https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json
-            - ubuntu-toolchain-r-test
-          packages:
-            - mingw-w64
-            - gcc-mingw-w64-i686
-            - gcc-mingw-w64-x86-64
-            - binutils-mingw-w64-i686
-            - g++-multilib
-            # debian packaging
-            - cmake
-            - debhelper
-            - fakeroot
-            # doc
-            - python-sphinx
-            - graphviz
-            - texlive-generic-extra
-            - texlive-fonts-recommended
-            - texlive-latex-extra
-            - latexmk
-            # tests
-            - check
-            - libsubunit-dev
-            - valgrind
-      env:
-        - MINGW=true
-        - DEBIAN=true
-#
-# gcc-8 full host build with tests:
-# doc, cert, linux64,
-# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
-    - os: linux
-      compiler: gcc-8
-      addons:
-        apt:
-          sources:
-            - ubuntu-toolchain-r-test
-          packages:
-            - gcc-8
-            - gcc-8-multilib
-            # doc
-            - python-sphinx
-            - graphviz
-            - texlive-generic-extra
-            - texlive-fonts-recommended
-            - texlive-latex-extra
-            - latexmk
-            # tests
-            - check
-            - libsubunit-dev
-            - valgrind
-#
-# clang-6 full host build with tests:
-# doc, cert, linux64,
-# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
-    - os: linux
-      compiler: clang-6.0
-      addons:
-        apt:
-          sources:
-            - llvm-toolchain-trusty-6.0
-            - ubuntu-toolchain-r-test
-          packages:
-            - clang-6.0
-            - clang-tidy-6.0
-            # doc
-            - python-sphinx
-            - graphviz
-            - texlive-generic-extra
-            - texlive-fonts-recommended
-            - texlive-latex-extra
-            - latexmk
-            # tests
-            - check
-            - libsubunit-dev
-            - valgrind
-#
-# clang-6 python-3 full host build with tests:
-# doc, cert, linux64,
-# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
-    - os: linux
-      compiler: clang-6.0
-      addons:
-        apt:
-          sources:
-            - llvm-toolchain-trusty-6.0
-            - ubuntu-toolchain-r-test
-          packages:
-            - clang-6.0
-            - clang-tidy-6.0
-            # doc
-            - python3-sphinx
-            - graphviz
-            - texlive-generic-extra
-            - texlive-fonts-recommended
-            - texlive-latex-extra
-            - latexmk
-            # tests
-            - check
-            - libsubunit-dev
-            - valgrind
-      env:
-        - PYTHON=python3
-#
-# tcc full host build:
-# doc, cert, linux64,
-# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
-    - os: linux
-      compiler: tcc
-      addons:
-        apt:
-          packages:
-            # doc
-            - python-sphinx
-            - graphviz
-            - texlive-generic-extra
-            - texlive-fonts-recommended
-            - texlive-latex-extra
-            - latexmk
-            # tests
-            - check
-            - libsubunit-dev
-            - valgrind
-#
-# clang-6 python-3 install build and minimal example:
-# linux64, minimal-example
-    - os: linux
-      compiler: clang-6.0
-      addons:
-        apt:
-          sources:
-            - llvm-toolchain-trusty-6.0
-            - ubuntu-toolchain-r-test
-          packages:
-            - clang-6.0
-            - clang-tidy-6.0
-      env:
-        - INSTALL=true
-        - PYTHON=python3
-        - CXX=clang-6.0
-#
-# gcc-4.8 static code analysis
-    - os: linux
-      compiler: gcc
-      addons:
-        apt:
-          packages:
-            - cppcheck
-      env:
-        - ANALYZE=true
-#
-# clang-6 static code analysis
-    - os: linux
-      compiler: clang-6.0
-      addons:
-        apt:
-          sources:
-            - llvm-toolchain-trusty-6.0
-            - ubuntu-toolchain-r-test
-          packages:
-            - check
-            - libsubunit-dev
-            - clang-6.0
-            - clang-tidy-6.0
-      env:
-        - ANALYZE=true
-        - PYTHON=python3
-#
-# clang-format code analysis
-# is allowed to fail (see allow_failures)
-    - os: linux
-      compiler: clang-6.0
-      addons:
-        apt:
-          sources:
-            - llvm-toolchain-trusty-6.0
-            - ubuntu-toolchain-r-test
-          packages:
-            - clang-6.0
-            - clang-tidy-6.0
-            - clang-format-6.0
-      env:
-        - CLANG_FORMAT=true
-#
-# DOCKER build
-    - os: linux
-      compiler: gcc
-      env:
-        - DOCKER=true
-#
-# clang-6 FUZZER build
-    - os: linux
-      compiler: clang-6.0
-      addons:
-        apt:
-          sources:
-            - llvm-toolchain-trusty-6.0
-            - ubuntu-toolchain-r-test
-          packages:
-            - check
-            - libsubunit-dev
-            - clang-6.0
-            - clang-tidy-6.0
-            - libfuzzer-6.0-dev
-      env:
-        - FUZZER=true
-#
-# OSX clang build
-    - os: osx
-      compiler: clang
-      # disable homebrew auto update which takes a lot of time
-      env: HOMEBREW_NO_AUTO_UPDATE=1
-      cache:
-        directories:
-          - $HOME/Library/Caches/Homebrew
-#
-# SONAR gcc-4.9 build
-    - os: linux
-      compiler: gcc-4.9
-      addons:
-        sonarcloud:
-          organization: open62541
-          branches:
-            - master
-            - sonarcloud
-      env:
-        - SONAR=true
-      cache:
-        directories:
-          - '$HOME/.sonar/cache'
-  allow_failures:
-    #
-    # clang-format code analysis
-    - env:
-        - CLANG_FORMAT=true
-
-cache:
-  pip: true
-  apt: true
-  directories:
-    - $HOME/install
-    - $HOME/.cache/pip
-
-# combine all the commands into one single command. See https://github.com/travis-ci/travis-ci/issues/1066
-before_install: |
- set -eE
-
- errorTrap() {
-   last_rv=$?
-
-   if [ $last_rv -ne 0 ] ; then
-      echo ""
-      echo ""
-      echo "----------------- Error -----------------"
-      echo ""
-      echo "---- Check additional output above!! ----"
-      # Wait a bit until the stdout is flushed
-      for i in 1 2 3 4 5 6 7 8 9 10; do echo "."; sleep 1; done
-   fi
-
-   exit $last_rv
- }
- trap errorTrap 0
-
- # set paths for locally installed libs (like liburcu)
- export LOCAL_PKG=$HOME/install
- mkdir -p $LOCAL_PKG/lib
- mkdir -p $LOCAL_PKG/include
- mkdir -p $LOCAL_PKG/bin
- export LIBRARY_PATH=$LOCAL_PKG/lib:$LIBRARY_PATH
- export C_INCLUDE_PATH=$LOCAL_PKG/include:$C_INCLUDE_PATH
- export CPLUS_INCLUDE_PATH=$LOCAL_PKG/include:$CPLUS_INCLUDE_PATH
- export PKG_CONFIG_PATH=$LOCAL_PKG/lib/pkgconfig:$PKG_CONFIG_PATH
- export PATH=$LOCAL_PKG:$LOCAL_PKG/bin:$PATH
- export CMAKE_PREFIX_PATH=$LOCAL_PKG:CMAKE_PREFIX_PATH
- # set local path for python packages
- export PATH=$PATH:$HOME/.local/bin # linux
- export PATH=$PATH:$HOME/Library/Python #OS X
- export PATH=$PATH:$HOME/Library/Python/2.7/bin #OS X
-
- if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_before_install.sh; fi
- if [ ${TRAVIS_OS_NAME} == "osx" ]; then sh ./tools/travis/travis_osx_before_install.sh; fi
-
-script: |
- set -eE
-
- errorTrap() {
-   last_rv=$?
-
-   if [ $last_rv -ne 0 ] ; then
-      echo ""
-      echo ""
-      echo "----------------- Error -----------------"
-      echo ""
-      echo "---- Check additional output above!! ----"
-      # Wait a bit until the stdout is flushed
-      for i in 1 2 3 4 5 6 7 8 9 10; do echo "."; sleep 1; done
-   fi
-
-   exit $last_rv
- }
- trap errorTrap 0
-
- if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_script.sh; fi
- if [ ${TRAVIS_OS_NAME} == "osx" ]; then sh ./tools/travis/travis_osx_script.sh; fi
-
-after_success: |
- set -eE
-
- errorTrap() {
-   last_rv=$?
-
-   if [ $last_rv -ne 0 ] ; then
-     echo ""
-     echo ""
-     echo "----------------- Error -----------------"
-     echo ""
-     echo "---- Check additional output above!! ----"
-     # Wait a bit until the stdout is flushed
-     for i in 1 2 3 4 5 6 7 8 9 10; do echo "."; sleep 1; done
-   fi
-
-   exit $last_rv
- }
- trap errorTrap 0
-
- if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_after_success.sh; fi
- # Sleep to flush travis output
- echo == Build success ==
- sleep 5
-
-after_failure: |
- # Sleep to flush travis output
- echo == Build failed ==
- sleep 5
-
-deploy:
-  provider: releases
-  api_key:
-    # Uses token from user open62541-travis-release (managed by @Pro). Sets GITAUTH
-    secure: dtn6ayBGoWzeVMM6xYpSRZly1XOhS/2jdiwEHd0hYZIr0dNq18CxTiqbGrUwW1JsSiXoHaGSZhUVr06O1P/tfC3Ma6i7ugyun+yXz6FdZiwirjURI8HQe+XwR4Ui3hqgQSOHLMK/xtOkjM28AN1jg9u3//Zep69xJVIGAqNT0bE=
-  file:
-    - open62541-win32.zip
-    - open62541-win64.zip
-    - open62541-linux32.tar.gz
-    - open62541-linux64.tar.gz
-    - open62541-raspberrypi.tar.gz
-    - open62541.c
-    - open62541.h
-    - open62541*.deb
-  file_glob: true
-  skip_cleanup: true
-  on:
-    repo: open62541/open62541
-    tags: true
-    condition: $MINGW=true
diff --git a/ext/open62541/AUTHORS b/ext/open62541/AUTHORS
deleted file mode 100644
index fe23f18..0000000
--- a/ext/open62541/AUTHORS
+++ /dev/null
@@ -1,13 +0,0 @@
-The authors of open62541 are (in alphabetical order)
-
-Bauer, Maximilian
-Ebrahimi, Reza <reza.ebrahimi.dev (at) gmail.com>
-Graube, Markus <markus.graube (at) tu-dresden.de>
-Gruener, Sten <s.gruener (at) plt.rwth-aachen.de>
-Iatrou, Chris Paul <chris_paul.iatrou (at) tu-dresden.de>
-Jeromin, Holger
-Palm, Florian <f.palm (at) plt.rwth-aachen.de>
-Pfrommer, Julius <julius.pfrommer (at) iosb.fraunhofer.edu>
-Profanter, Stefan <profanter (at) fortiss.org>
-Stalder, Thomas <t.stalder (at) bluetimeconcept.ch>
-Urbas, Leon <leon.urbas (at) tu-dresden.de>
diff --git a/ext/open62541/CHANGELOG b/ext/open62541/CHANGELOG
deleted file mode 100644
index 3e05be6..0000000
--- a/ext/open62541/CHANGELOG
+++ /dev/null
@@ -1,126 +0,0 @@
-This changelog reports changes to the public API. Internal refactorings and bug
-fixes are not reported here.
-
-2018-02-05 pro <profanter at fortiss.org>
-
- * Also pass client to monitoredItem/Events callback
-
-   The UA_MonitoredItemHandlingFunction and UA_MonitoredEventHandlingFunction
-   did not include a reference to the corresponding client used for the call of
-   processPublishResponse.
-   This now also allows to get the client context within the monitored item
-   handling function.
-
-   The API changes are detected by the type-matching in the compiler. So there
-   is little risk for bugs due to unaligned implementations.
-
-2017-09-07 jpfr <julius.pfrommer at web.de>
-
- * Make Client Highlevel Interface consistent
-
-   Two methods in the client highlevel interface were not conformant with the
-   API convention that array sizes are given before the array pointer. This
-   changes the signature of UA_Client_writeArrayDimensionsAttribute and
-   UA_Client_readArrayDimensionsAttribute.
-
-   The API changes are detected by the type-matching in the compiler. So there
-   is little risk for bugs due to unaligned implementations.
-
-2017-08-16 jpfr <julius.pfrommer at web.de>
-
- * Default Attribute Values for Node Attributes
-
-   The AddNodes service takes a structure with the attributes of the new node as
-   input. We began checking the consistency of the attributes more closely. You
-   can now use constant global definitions with default values as a starting
-   point. For example UA_VariableAttributes_default for adding a variable node.
-
- * All nodes have a context pointer
-
-   All nodes now carry a context pointer. The context pointer is initially set
-   to a user-defined memory location. The context pointer is passed to all
-   user-visible callbacks involving the node.
-
- * Global and node-type constructor/destructor
-
-   The constructors are fine-grained mechanisms to control the instantiation and
-   deletion of nodes. Constructors receive the node context pointer and can also
-   replace it.
-
-2017-08-13 Infinity95 <mark.giraud at student.kit.edu>
-
- * New/Delete methods for the server configuration
-
-   The default server configuration is no longer a constant global variable.
-   Instead, it is now handled with a pair of new/delete methods. This enables
-   the use of malloced members of the server configuration. With this change,
-   the endpoint descriptions are no longer generated in the server but are
-   created as part of the server configuration. See the example server
-   implementations on how to use the configuration generation. The change is a
-   precursor to the encryption implementation that ties into the generation of
-   endpoint descriptions in the server config.
-
-   The generation of the default server configuration is implemented as a
-   "plugin". So it comes with CC0 licensing and can be freely adjusted by users.
-
-   The TCP port in the default configuration is 4840. This is the recommended
-   port for OPC UA and now used throughout all examples.
-
-2017-07-04 jpfr <julius.pfrommer at web.de>
-
- * Return partially overlapping ranges
-
-   Test the integrity of the range and compute the max index used for every
-   dimension. The standard says in Part 4, Section 7.22:
-
-   When reading a value, the indexes may not speify a range that is within
-   the bounds of the array. The Server shall return a partial result if some
-   elements exist within the range.
-
-2017-07-03 jpfr <julius.pfrommer at web.de>
-
- * Implement asynchronous service calls for the client
-
-   All OPC UA services are asynchronous in nature. So several service calls can
-   be made without waiting for a response first. Responess may come in a
-   different ordering. The client takes a method pointer and a data pointer to
-   perform an asynchronous callback on the request response.
-
-   Synchronous service calls are still supported in the client. Asynchronous
-   responses are processed in the background until the synchronous response (the
-   client is waiting for) returns the control flow back to the user.
-
-2017-06-26 janitza-thbe
-
- * Enable IPv6 in the networklayer plugin
-
-   The server networklayer listens on several sockets for available networks and
-   IP versions. IPv4 connections are still supported.
-
-   The OPC Foundation ANSI C Stack before 2016 does not fully support IPv6. On
-   Windows, the 'localhost' target is resolved to IPv6 by default. Old
-   applications (e.g. the Conformance Testing Tools) need to connect to
-   127.0.0.1 instead of 'localhost' to force IPv4.
-
-2017-06-16 jpfr <julius.pfrommer at web.de>
-
- * Require the AccessLevel bit UA_ACCESSLEVELMASK_READ for reading
-
-   Set the bit by default when adding nodes for a smooth transition to the new
-   API. This will change at a later point with an additional node settings
-   argument for the AddNodes methods.
-
-2017-05-03 pro <profanter at fortiss.org>
-
- * Array dimensions are UInt32 also for the highlevel client read service
-
-2017-04-16 jpfr <julius.pfrommer at web.de>
-
- * Refactor UA_parseEndpointUrl to work with UA_String
-
-   The output hostname and path now point into the original endpointUrl with an
-   appropriate length.
-
-2017-04-14 jpfr <julius.pfrommer at web.de>
-
- * Auto-instantiate only child nodes marked as mandatory (fixes #1004)
diff --git a/ext/open62541/CMakeLists.txt b/ext/open62541/CMakeLists.txt
deleted file mode 100644
index 5af4224..0000000
--- a/ext/open62541/CMakeLists.txt
+++ /dev/null
@@ -1,1292 +0,0 @@
-cmake_minimum_required(VERSION 3.0...3.12)
-project(open62541)
-# set(CMAKE_VERBOSE_MAKEFILE ON)
-if(${CMAKE_VERSION} VERSION_LESS 3.12)
-    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
-endif()
-
-string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_LOWER_CASE)
-
-set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/tools/cmake")
-find_package(PythonInterp REQUIRED)
-find_package(Git)
-include(AssignSourceGroup)
-include(GNUInstallDirs)
-
-# Set when installed via make install
-set(open62541_TOOLS_DIR ${PROJECT_SOURCE_DIR}/tools)
-set(open62541_NODESET_DIR ${PROJECT_SOURCE_DIR}/deps/ua-nodeset)
-
-include(macros_internal)
-include(macros_public)
-
-#############################
-# Compiled binaries folders #
-#############################
-
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-
-###########
-# Version #
-###########
-
-include(SetGitBasedVersion)
-
-# The version string will be automatically set based on the git describe output.
-# This will automate the version strings. Just create a new tag, and the version will be set correctly.
-set_open62541_version()
-MESSAGE(STATUS "open62541 Version: ${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}.${OPEN62541_VER_PATCH}${OPEN62541_VER_LABEL}")
-
-#################
-# Build Options #
-#################
-
-# Set default build type.
-if(NOT CMAKE_BUILD_TYPE)
-    message(STATUS "CMAKE_BUILD_TYPE not given; setting to 'Debug'")
-    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build" FORCE)
-endif()
-
-option(UA_ENABLE_AMALGAMATION "Concatenate the library to a single file open62541.h/.c" OFF)
-set(UA_AMALGAMATION_ARCHITECTURES "" CACHE STRING "List of architectures to include in amalgamation")
-mark_as_advanced(UA_AMALGAMATION_ARCHITECTURES)
-
-# Platform. This is at the beginning in case the architecture changes some UA options
-set(UA_ARCHITECTURE "None" CACHE STRING "Architecture to build open62541 on")
-
-if(UA_ENABLE_AMALGAMATION)
-    if("${UA_AMALGAMATION_ARCHITECTURES}" STREQUAL "")
-        if(NOT "${UA_ARCHITECTURE}" STREQUAL "None")
-            set(UA_AMALGAMATION_ARCHITECTURES "${UA_ARCHITECTURE}")
-        else()
-            # select some default architectures which should be included
-            set(UA_AMALGAMATION_ARCHITECTURES "win32;posix")
-        endif()
-    endif()
-    message(STATUS "Architectures included in amalgamation: ${UA_AMALGAMATION_ARCHITECTURES}")
-endif()
-
-if("${UA_ARCHITECTURE}" STREQUAL "None")
-    if(UNIX)
-        set(UA_ARCHITECTURE "posix" CACHE STRING "" FORCE)
-    elseif(WIN32)
-        set(UA_ARCHITECTURE "win32" CACHE STRING ""  FORCE)
-    endif(UNIX)
-endif()
-
-message(STATUS "The selected architecture is: ${UA_ARCHITECTURE}")
-string(TOUPPER ${UA_ARCHITECTURE} UA_ARCHITECTURE_UPPER)
-add_definitions(-DUA_ARCHITECTURE_${UA_ARCHITECTURE_UPPER})
-
-add_subdirectory(arch)
-
-GET_PROPERTY(architectures GLOBAL PROPERTY UA_ARCHITECTURES)
-list(SORT architectures)
-set_property(CACHE UA_ARCHITECTURE PROPERTY STRINGS None ${architectures})
-
-GET_PROPERTY(ua_architecture_directories_to_include GLOBAL PROPERTY UA_INCLUDE_DIRECTORIES)
-
-GET_PROPERTY(ua_architecture_headers GLOBAL PROPERTY UA_ARCHITECTURE_HEADERS)
-
-GET_PROPERTY(ua_architecture_headers_beginning GLOBAL PROPERTY UA_ARCHITECTURE_HEADERS_BEGINNING)
-
-GET_PROPERTY(ua_architecture_sources GLOBAL PROPERTY UA_ARCHITECTURE_SOURCES)
-
-set(ua_architecture_sources ${ua_architecture_sources}
-    ${PROJECT_SOURCE_DIR}/arch/network_tcp.c
-)
-
-set(ua_architecture_headers ${ua_architecture_headers}
-    ${PROJECT_SOURCE_DIR}/include/open62541/network_tcp.h
-    ${PROJECT_SOURCE_DIR}/include/open62541/architecture_functions.h
-)
-
-if(UA_ENABLE_WEBSOCKET_SERVER)
-    set(ua_architecture_sources ${ua_architecture_sources}
-                                ${PROJECT_SOURCE_DIR}/arch/network_ws.c)
-
-    set(ua_architecture_headers ${ua_architecture_headers}
-                                ${PROJECT_SOURCE_DIR}/include/open62541/network_ws.h)
-endif()
-
-if(${UA_ARCHITECTURE} STREQUAL "None")
-  message(FATAL_ERROR "No architecture was selected. Please select the architecture of your target platform")
-endif(${UA_ARCHITECTURE} STREQUAL "None")
-
-# Create a list of ifdefs for all the architectures.
-# This is needed to enable a default architecture if none is selected through gcc compiler def.
-# Especially if someone is using the amalgamated file on Linux/Windows he should not need to define an architecture.
-set(UA_ARCHITECTURES_NODEF "1 ") #to make it easier to append later the && symbol
-foreach(arch_ ${architectures})
-    string(TOUPPER ${arch_} UA_ARCHITECTURE_UPPER_)
-    set(UA_ARCHITECTURES_NODEF "${UA_ARCHITECTURES_NODEF} && !defined(UA_ARCHITECTURE_${UA_ARCHITECTURE_UPPER_})")
-endforeach(arch_ ${architectures})
-
-# Options
-set(UA_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported")
-option(UA_ENABLE_HISTORIZING "Enable server and client to provide historical access." OFF)
-option(UA_ENABLE_EXPERIMENTAL_HISTORIZING "Enable client experimental historical access features." OFF)
-option(UA_ENABLE_METHODCALLS "Enable the Method service set" ON)
-option(UA_ENABLE_NODEMANAGEMENT "Enable dynamic addition and removal of nodes at runtime" ON)
-option(UA_ENABLE_SUBSCRIPTIONS "Enable subscriptions support." ON)
-option(UA_ENABLE_SUBSCRIPTIONS_EVENTS "Enable the use of event subscriptions" OFF)
-option(UA_ENABLE_DISCOVERY "Enable Discovery Service (LDS)" ON)
-option(UA_ENABLE_DISCOVERY_MULTICAST "Enable Discovery Service with multicast support (LDS-ME)" OFF)
-option(UA_ENABLE_QUERY "Enable query support." OFF)
-option(UA_ENABLE_COVERAGE "Enable gcov coverage" OFF)
-option(UA_ENABLE_ENCRYPTION "Enable encryption support (uses mbedTLS)" OFF)
-option(UA_ENABLE_MICRO_EMB_DEV_PROFILE "Builds CTT Compliant Micro Embedded Device Server Profile" OFF)
-option(BUILD_SHARED_LIBS "Enable building of shared libraries (dll/so)" OFF)
-option(UA_ENABLE_WEBSOCKET_SERVER "Enable websocket support (uses libwebsockets)" OFF)
-
-# Namespace Zero
-set(UA_NAMESPACE_ZERO "REDUCED" CACHE STRING "Completeness of the generated namespace zero (minimal/reduced/full)")
-SET_PROPERTY(CACHE UA_NAMESPACE_ZERO PROPERTY STRINGS "MINIMAL" "REDUCED" "FULL")
-if(UA_NAMESPACE_ZERO STREQUAL "MINIMAL")
-    set(UA_GENERATED_NAMESPACE_ZERO OFF)
-else()
-    set(UA_GENERATED_NAMESPACE_ZERO ON)
-endif()
-
-if(MSVC AND UA_NAMESPACE_ZERO STREQUAL "FULL")
-    # For the full NS0 we need a stack size of 8MB (as it is default on linux)
-    # See https://github.com/open62541/open62541/issues/1326
-    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:8000000")
-endif()
-
-if(UA_ENABLE_MICRO_EMB_DEV_PROFILE)
-    if(NOT (UA_NAMESPACE_ZERO STREQUAL "FULL"))
-        message(FATAL_ERROR "CTT Compliant Micro Embedded Device Server Profile needs full namespace zero")
-    endif()
-endif()
-
-if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ OR UA_BUILD_FUZZING_CORPUS)
-    # Force enable options not passed in the build script, to also fuzzy-test this code
-    set(UA_ENABLE_DISCOVERY ON CACHE STRING "" FORCE)
-    set(UA_ENABLE_DISCOVERY_MULTICAST ON CACHE STRING "" FORCE)
-    set(UA_ENABLE_ENCRYPTION ON CACHE STRING "" FORCE)
-    set(UA_ENABLE_HISTORIZING ON CACHE STRING "" FORCE)
-    set(UA_ENABLE_JSON_ENCODING ON CACHE STRING "" FORCE)
-    set(UA_ENABLE_SUBSCRIPTIONS ON CACHE STRING "" FORCE)
-    set(UA_ENABLE_SUBSCRIPTIONS_EVENTS ON CACHE STRING "" FORCE)
-endif()
-
-
-# It should not be possible to enable events without enabling subscriptions and full ns0
-#if((UA_ENABLE_SUBSCRIPTIONS_EVENTS) AND (NOT (UA_ENABLE_SUBSCRIPTIONS AND UA_NAMESPACE_ZERO STREQUAL "FULL")))
-#    message(FATAL_ERROR "Unable to enable events without UA_ENABLE_SUBSCRIPTIONS and full namespace 0")
-#endif()
-
-if(UA_ENABLE_COVERAGE)
-  set(CMAKE_BUILD_TYPE DEBUG)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
-  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov")
-  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
-endif()
-
-if(UA_ENABLE_DISCOVERY_MULTICAST AND NOT UA_ENABLE_DISCOVERY)
-    MESSAGE(WARNING "UA_ENABLE_DISCOVERY_MULTICAST is enabled, but not UA_ENABLE_DISCOVERY. UA_ENABLE_DISCOVERY_MULTICAST will be set to OFF")
-    SET(UA_ENABLE_DISCOVERY_MULTICAST OFF CACHE BOOL "Enable Discovery Service with multicast support (LDS-ME)" FORCE)
-endif()
-
-# Advanced options
-option(UA_ENABLE_IMMUTABLE_NODES "Nodes in the information model are not edited but copied and replaced" OFF)
-mark_as_advanced(UA_ENABLE_IMMUTABLE_NODES)
-
-set(UA_MULTITHREADING 0 CACHE STRING "Level of multithreading")
-mark_as_advanced(UA_MULTITHREADING)
-if (UA_MULTITHREADING GREATER 100)
-    set(UA_ENABLE_IMMUTABLE_NODES ON)
-endif()
-
-option(UA_ENABLE_CUSTOM_NODESTORE "Do not compile the default Nodestore implementation into the library" OFF)
-mark_as_advanced(UA_ENABLE_CUSTOM_NODESTORE)
-
-option(UA_ENABLE_PUBSUB "Enable publish/subscribe" OFF)
-mark_as_advanced(UA_ENABLE_PUBSUB)
-
-option(UA_ENABLE_DA "Enable data access" ON)
-mark_as_advanced(UA_ENABLE_DA)
-
-option(UA_ENABLE_PUBSUB_ETH_UADP "Enable publish/subscribe UADP over Ethernet" OFF)
-mark_as_advanced(UA_ENABLE_PUBSUB_ETH_UADP)
-if(UA_ENABLE_PUBSUB_ETH_UADP)
-    if (NOT CMAKE_SYSTEM MATCHES "Linux")
-    message(FATAL_ERROR "UADP over Ethernet is only available on Linux.")
-	endif()
-endif()
-
-option(UA_ENABLE_PUBSUB_DELTAFRAMES "Enable sending of delta frames with only the changes" OFF)
-mark_as_advanced(UA_ENABLE_PUBSUB_DELTAFRAMES)
-
-option(UA_ENABLE_PUBSUB_INFORMATIONMODEL "Enable PubSub information model twin" OFF)
-mark_as_advanced(UA_ENABLE_PUBSUB_INFORMATIONMODEL)
-option(UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS "Enable PubSub informationmodel methods" OFF)
-mark_as_advanced(UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS)
-if(UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS)
-    if(NOT UA_ENABLE_PUBSUB_INFORMATIONMODEL)
-        message(FATAL_ERROR "PubSub information model methods cannot be used with disabled PubSub information model.")
-    endif()
-endif()
-if(UA_ENABLE_PUBSUB_INFORMATIONMODEL)
-    if(NOT UA_ENABLE_PUBSUB)
-        message(FATAL_ERROR "PubSub information model representation cannot be used with disabled PubSub function.")
-    endif()
-    if(UA_NAMESPACE_ZERO STREQUAL "MINIMAL")
-        message(FATAL_ERROR "PubSub information model representation cannot be used with MINIMAL namespace zero.")
-    endif()
-endif()
-
-option(UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING
-       "Use a custom implementation for the publish callback handling" OFF)
-mark_as_advanced(UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING)
-if(UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_INTERRUPT)
-    if(NOT UA_ENABLE_PUBSUB)
-        message(FATAL_ERROR "Custom publish callback handling cannot be used with PubSub function disabled")
-    endif()
-endif()
-
-option(UA_ENABLE_JSON_ENCODING "Enable Json encoding (EXPERIMENTAL)" OFF)
-mark_as_advanced(UA_ENABLE_JSON_ENCODING)
-
-option(UA_ENABLE_STATUSCODE_DESCRIPTIONS "Enable conversion of StatusCode to human-readable error message" ON)
-mark_as_advanced(UA_ENABLE_STATUSCODE_DESCRIPTIONS)
-
-option(UA_ENABLE_TYPEDESCRIPTION "Add the type and member names to the UA_DataType structure" ON)
-mark_as_advanced(UA_ENABLE_TYPEDESCRIPTION)
-
-option(UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS "Set node description attribute for nodeset compiler generated nodes" ON)
-mark_as_advanced(UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS)
-
-option(UA_ENABLE_DETERMINISTIC_RNG "Do not seed the random number generator (e.g. for unit tests)." OFF)
-mark_as_advanced(UA_ENABLE_DETERMINISTIC_RNG)
-
-option(UA_ENABLE_MALLOC_SINGLETON
-       "Use a global variable pointer for malloc (and free, ...) that can be switched at runtime" OFF)
-mark_as_advanced(UA_ENABLE_MALLOC_SINGLETON)
-if(UA_ENABLE_MALLOC_SINGLETON)
-    if(NOT "${UA_ARCHITECTURE}" MATCHES "posix")
-        message(FATAL_ERROR "The singleton malloc is available only for the posix architecture")
-    endif()
-endif()
-
-option(UA_ENABLE_VALGRIND_INTERACTIVE "Enable dumping valgrind every iteration. CAUTION! SLOWDOWN!" OFF)
-mark_as_advanced(UA_ENABLE_VALGRIND_INTERACTIVE)
-
-option(UA_MSVC_FORCE_STATIC_CRT "Force linking with the static C-runtime library when compiling to static library with MSVC" ON)
-mark_as_advanced(UA_MSVC_FORCE_STATIC_CRT)
-
-option(UA_FILE_NS0 "Override the NodeSet xml file used to generate namespace zero")
-mark_as_advanced(UA_FILE_NS0)
-
-# Semaphores/file system may not be available on embedded devices. It can be
-# disabled with the following option
-option(UA_ENABLE_DISCOVERY_SEMAPHORE "Enable Discovery Semaphore support" ON)
-mark_as_advanced(UA_ENABLE_DISCOVERY_SEMAPHORE)
-
-option(UA_ENABLE_UNIT_TESTS_MEMCHECK "Use Valgrind (Linux) or DrMemory (Windows) to detect memory leaks when running the unit tests" OFF)
-mark_as_advanced(UA_ENABLE_UNIT_TESTS_MEMCHECK)
-
-option(UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-       "Add hooks to force failure modes for additional unit tests. Not for production use!" OFF)
-mark_as_advanced(UA_ENABLE_UNIT_TEST_FAILURE_HOOKS)
-
-set(UA_VALGRIND_INTERACTIVE_INTERVAL 1000 CACHE STRING "The number of iterations to wait before creating the next dump")
-mark_as_advanced(UA_VALGRIND_INTERACTIVE_INTERVAL)
-
-# Build options for debugging
-option(UA_DEBUG "Enable assertions and additional functionality that should not be included in release builds" OFF)
-mark_as_advanced(UA_DEBUG)
-if(CMAKE_BUILD_TYPE STREQUAL "Debug")
-    set(UA_DEBUG ON)
-endif()
-
-option(UA_DEBUG_DUMP_PKGS "Dump every package received by the server as hexdump format" OFF)
-mark_as_advanced(UA_DEBUG_DUMP_PKGS)
-
-option(UA_ENABLE_HARDENING "Enable Hardening measures (e.g. Stack-Protectors and Fortify)" ON)
-mark_as_advanced(UA_ENABLE_HARDENING)
-
-if(CMAKE_VERSION VERSION_GREATER 3.6)
-    set(UA_ENABLE_STATIC_ANALYZER "OFF" CACHE STRING "Enable installed static analyzer during build process (off/minimal/reduced/full)")
-    SET_PROPERTY(CACHE UA_ENABLE_STATIC_ANALYZER PROPERTY STRINGS "OFF" "MINIMAL" "REDUCED" "FULL")
-endif()
-
-# Build Targets
-option(UA_BUILD_EXAMPLES "Build example servers and clients" OFF)
-option(UA_BUILD_TOOLS "Build OPC UA shell tools" OFF)
-option(UA_BUILD_UNIT_TESTS "Build the unit tests" OFF)
-option(UA_BUILD_FUZZING "Build the fuzzing executables" OFF)
-mark_as_advanced(UA_BUILD_FUZZING)
-if(UA_BUILD_FUZZING)
-    # oss-fuzz already defines this by default
-    add_definitions(-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
-endif()
-
-if(UA_ENABLE_EXPERIMENTAL_HISTORIZING)
-    if(NOT UA_ENABLE_HISTORIZING)
-        message(FATAL_ERROR "UA_ENABLE_EXPERIMENTAL_HISTORIZING cannot be used with disabled UA_ENABLE_HISTORIZING.")
-    endif()
-endif()
-
-option(UA_BUILD_FUZZING_CORPUS "Build the fuzzing corpus" OFF)
-mark_as_advanced(UA_BUILD_FUZZING_CORPUS)
-if(UA_BUILD_FUZZING_CORPUS)
-    add_definitions(-DUA_DEBUG_DUMP_PKGS_FILE)
-    set(UA_ENABLE_TYPEDESCRIPTION ON CACHE STRING "" FORCE)
-    #set(UA_DEBUG_DUMP_PKGS ON CACHE STRING "" FORCE)
-endif()
-
-option(UA_BUILD_OSS_FUZZ "Special build switch used in oss-fuzz" OFF)
-mark_as_advanced(UA_BUILD_OSS_FUZZ)
-
-# Advanced Build Targets
-option(UA_PACK_DEBIAN "Special build switch used in .deb packaging" OFF)
-mark_as_advanced(UA_PACK_DEBIAN)
-
-# Building shared libs (dll, so). This option is written into ua_config.h.
-set(UA_DYNAMIC_LINKING OFF)
-if(BUILD_SHARED_LIBS)
-  set(UA_DYNAMIC_LINKING ON)
-  if (UA_ENABLE_DISCOVERY_MULTICAST)
-      set(MDNSD_DYNAMIC_LINKING ON)
-  endif()
-endif()
-
-# Warn if experimental features are enabled
-if(UA_MULTITHREADING)
-    MESSAGE(WARNING "UA_MULTITHREADING is enabled. The feature is under development and marked as EXPERIMENTAL")
-endif()
-
-########################
-# Linting during build #
-########################
-set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-include(linting_build)
-
-######################
-# External Libraries #
-######################
-
-list(APPEND open62541_LIBRARIES "")
-
-# Force compilation with as C++
-option(UA_COMPILE_AS_CXX "Force compilation with a C++ compiler" OFF)
-mark_as_advanced(UA_COMPILE_AS_CXX)
-if (UA_COMPILE_AS_CXX)
-    # We need the UINT32_C define
-    add_definitions(-D__STDC_CONSTANT_MACROS)
-endif()
-
-if(UA_ENABLE_ENCRYPTION)
-    # The recommended way is to install mbedtls via the OS package manager. If
-    # that is not possible, manually compile mbedTLS and set the cmake variables
-    # defined in /tools/cmake/FindMbedTLS.cmake.
-    find_package(MbedTLS REQUIRED)
-    list(APPEND open62541_LIBRARIES ${MBEDTLS_LIBRARIES})
-endif()
-
-if(UA_ENABLE_WEBSOCKET_SERVER)
-    # The recommended way is to install libwebsockets via the OS package manager. If
-    # that is not possible, manually compile libwebsockets and set the cmake variables
-    # defined in /tools/cmake/Findlibwebsockets.cmake
-    find_package(libwebsockets REQUIRED)
-    list(APPEND open62541_LIBRARIES ${LIBWEBSOCKETS_LIBRARIES})
-endif()
-
-#####################
-# Compiler Settings #
-#####################
-
-include(CompilerFlags)
-if(NOT UA_COMPILE_AS_CXX AND (CMAKE_COMPILER_IS_GNUCC OR "x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang"))
-    # Compiler
-    add_definitions(-std=c99 -pipe
-                    -Wall -Wextra -Wpedantic
-                    -Wno-static-in-inline # clang doesn't like the use of static inline methods inside static inline methods
-                    -Wno-overlength-strings # may happen in the nodeset compiler when complex values are directly encoded
-                    -Wno-unused-parameter # some methods may require unused arguments to cast to a method pointer
-                    -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls
-                    -Wformat -Wformat-security -Wformat-nonliteral
-                    -Wuninitialized -Winit-self
-                    -Wcast-qual
-                    -Wstrict-overflow
-                    -Wnested-externs
-                    -Wmultichar
-                    -Wundef
-                    -Wc++-compat
-                    -fno-strict-aliasing # fewer compiler assumptions about pointer types
-                    -fexceptions # recommended for multi-threaded C code, also in combination with C++ code
-                    )
-    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
-
-    if (NOT MINGW)
-        if(UA_ENABLE_HARDENING)
-            check_cc_flag("-fstack-protector-strong") # more performant stack protector, available since gcc 4.9
-            check_cc_flag("-fstack-clash-protection") # increased reliability of stack overflow detection, available since gcc 8
-            check_cc_flag_untested("-mcet -fcf-protection") # future use (control flow integrity protection)
-        endif()
-
-        # IPO requires too much memory for unit tests
-        # GCC docu recommends to compile all files with the same options, therefore ignore it completely
-        if(NOT UA_BUILD_UNIT_TESTS)
-            # needed to check if IPO is supported (check needs cmake > 3.9)
-            if("${CMAKE_VERSION}" VERSION_GREATER 3.9)
-                cmake_policy(SET CMP0069 NEW) # needed as long as required cmake < 3.9
-                include(CheckIPOSupported)
-                check_ipo_supported(RESULT CC_HAS_IPO) # Inter Procedural Optimization / Link Time Optimization (should be same as -flto)
-                if(CC_HAS_IPO)
-                    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
-                endif()
-            endif()
-        endif()
-    endif()
-
-    if(UA_ENABLE_AMALGAMATION)
-        add_definitions(-Wno-unused-function)
-    endif()
-
-    if(UA_PACK_DEBIAN)
-        remove_definitions(-Wno-static-in-inline)
-    endif()
-
-    # Linker
-    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") # cmake sets -rdynamic by default
-
-    # Debug
-    if(BUILD_TYPE_LOWER_CASE STREQUAL "debug" AND UNIX)
-        if("x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang" AND NOT UA_ENABLE_UNIT_TESTS_MEMCHECK)
-            # Add default sanitizer settings when using clang and Debug build.
-            # This allows e.g. CLion to find memory locations for SegFaults
-            message(STATUS "Sanitizer enabled")
-            set(SANITIZER_FLAGS "-g -fno-omit-frame-pointer -gline-tables-only -fsanitize=address -fsanitize-address-use-after-scope -fsanitize-coverage=trace-pc-guard,trace-cmp -fsanitize=leak -fsanitize=undefined")
-            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}")
-            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAGS}")
-        endif()
-    endif()
-
-    if(UA_ENABLE_HARDENING AND ((CMAKE_BUILD_TYPE STREQUAL "Release") OR (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")))
-        check_cc_flag("-D_FORTIFY_SOURCE=2") # run-time buffer overflow detection (needs at least -O1)
-    endif()
-
-    # Strip release builds
-    if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "Release")
-        add_definitions(-ffunction-sections -fdata-sections -fno-unwind-tables
-                        -fno-asynchronous-unwind-tables -fno-math-errno -fno-ident)
-        # remove stack-protector with MinSizeRel
-        if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
-            add_definitions(-fno-stack-protector)
-        endif()
-        if(NOT OS9)
-            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -s")
-            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
-        endif()
-        if(APPLE)
-            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-dead_strip")
-            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
-        else()
-            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--gc-sections")
-            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
-        endif()
-        if(NOT WIN32 AND NOT CYGWIN AND NOT APPLE)
-            # these settings reduce the binary size by ~2kb
-            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-z,norelro -Wl,--hash-style=gnu -Wl,--build-id=none")
-        endif()
-    endif()
-endif()
-
-
-
-if(APPLE)
-    set(CMAKE_MACOSX_RPATH 1)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DARWIN_C_SOURCE=1")
-endif()
-
-if(MSVC)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX /w44996") # Compiler warnings, error on warning
-
-  if(UA_MSVC_FORCE_STATIC_CRT AND NOT BUILD_SHARED_LIBS)
-    set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS
-        CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE)
-    foreach(CompilerFlag ${CompilerFlags})
-      string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
-    endforeach()
-  endif()
-endif()
-
-if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ)
-    add_definitions(-DUA_malloc=UA_memoryManager_malloc)
-    add_definitions(-DUA_free=UA_memoryManager_free)
-    add_definitions(-DUA_calloc=UA_memoryManager_calloc)
-    add_definitions(-DUA_realloc=UA_memoryManager_realloc)
-endif()
-
-#########################
-# Generate Main Library #
-#########################
-
-file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src_generated")
-configure_file(include/open62541/config.h.in ${PROJECT_BINARY_DIR}/src_generated/open62541/config.h)
-configure_file(open62541.pc.in ${PROJECT_BINARY_DIR}/src_generated/open62541.pc @ONLY)
-
-if(UA_ENABLE_DISCOVERY_MULTICAST)
-    set(MDNSD_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported" FORCE)
-    configure_file("deps/mdnsd/libmdnsd/mdnsd_config.h.in" "${PROJECT_BINARY_DIR}/src_generated/mdnsd_config.h")
-endif()
-
-set(exported_headers ${exported_headers}
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/config.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/architecture_base.h
-                     ${ua_architecture_headers_beginning}
-                     )
-
-if(NOT "${UA_AMALGAMATION_ARCHITECTURES}" STREQUAL "")
-    foreach(arch ${UA_AMALGAMATION_ARCHITECTURES})
-        list(APPEND exported_headers ${PROJECT_SOURCE_DIR}/arch/${arch}/ua_architecture.h)
-    endforeach()
-else()
-    list(APPEND exported_headers ${PROJECT_SOURCE_DIR}/arch/${UA_ARCHITECTURE}/ua_architecture.h)
-endif()
-
-
-if(UA_ENABLE_HISTORIZING)
-    # Historizing needs to be included before server_config.h
-    set(historizing_exported_headers
-         ${PROJECT_SOURCE_DIR}/include/open62541/plugin/historydatabase.h)
-endif()
-
-set(exported_headers ${exported_headers}
-                     ${PROJECT_SOURCE_DIR}/deps/ms_stdint.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/architecture_definitions.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/nodeids.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/constants.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/types.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated_handling.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/util.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/server.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/log.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/network.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/accesscontrol.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/pki.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/securitypolicy.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/server_pubsub.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/pubsub.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/plugin/nodestore.h
-                     ${historizing_exported_headers}
-                     ${PROJECT_SOURCE_DIR}/include/open62541/server_config.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/client_config.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/client.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/client_highlevel.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/client_subscriptions.h
-                     ${PROJECT_SOURCE_DIR}/include/open62541/client_highlevel_async.h)
-
-set(internal_headers ${PROJECT_SOURCE_DIR}/deps/open62541_queue.h
-                     ${PROJECT_SOURCE_DIR}/deps/ziptree.h
-                     ${PROJECT_SOURCE_DIR}/deps/pcg_basic.h
-                     ${PROJECT_SOURCE_DIR}/deps/libc_time.h
-                     ${PROJECT_SOURCE_DIR}/deps/base64.h
-                     ${PROJECT_SOURCE_DIR}/src/ua_util_internal.h
-                     ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_binary.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated_encoding_binary.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated_handling.h
-                     ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated_encoding_binary.h
-                     ${PROJECT_SOURCE_DIR}/src/ua_connection_internal.h
-                     ${PROJECT_SOURCE_DIR}/src/ua_securechannel.h
-                     ${PROJECT_SOURCE_DIR}/src/ua_workqueue.h
-                     ${PROJECT_SOURCE_DIR}/src/ua_timer.h
-                     ${PROJECT_SOURCE_DIR}/src/server/ua_session.h
-                     ${PROJECT_SOURCE_DIR}/src/server/ua_subscription.h
-                     ${PROJECT_SOURCE_DIR}/src/server/ua_session_manager.h
-                     ${PROJECT_SOURCE_DIR}/src/server/ua_securechannel_manager.h
-                     ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_networkmessage.h
-                     ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub.h
-                     ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_manager.h
-                     ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_ns0.h
-                     ${PROJECT_SOURCE_DIR}/src/server/ua_server_internal.h
-                     ${PROJECT_SOURCE_DIR}/src/server/ua_services.h
-                     ${PROJECT_SOURCE_DIR}/src/client/ua_client_internal.h)
-
-# TODO: make client optional
-set(lib_sources ${PROJECT_SOURCE_DIR}/src/ua_types.c
-                ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_binary.c
-                ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated.c
-                ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated.c
-                ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.c
-                ${PROJECT_SOURCE_DIR}/src/ua_util.c
-                ${PROJECT_SOURCE_DIR}/src/ua_workqueue.c
-                ${PROJECT_SOURCE_DIR}/src/ua_timer.c
-                ${PROJECT_SOURCE_DIR}/src/ua_connection.c
-                ${PROJECT_SOURCE_DIR}/src/ua_securechannel.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_session.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_nodes.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_server.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_server_ns0.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_server_config.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_server_binary.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_server_utils.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_server_discovery.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_securechannel_manager.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_session_manager.c
-                ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_networkmessage.c
-                ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub.c
-                ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_manager.c
-                ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_ns0.c
-                # services
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_view.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_method.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_session.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_attribute.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_discovery.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_subscription.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_monitoreditem.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_securechannel.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_nodemanagement.c
-                ${PROJECT_SOURCE_DIR}/src/server/ua_services_discovery_multicast.c
-                # client
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client.c
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client_connect.c
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client_connect_async.c
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client_discovery.c
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client_highlevel.c
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client_subscriptions.c
-                ${PROJECT_SOURCE_DIR}/src/client/ua_client_worker.c
-
-                # dependencies
-                ${PROJECT_SOURCE_DIR}/deps/libc_time.c
-                ${PROJECT_SOURCE_DIR}/deps/pcg_basic.c
-                ${PROJECT_SOURCE_DIR}/deps/base64.c)
-
-set(default_plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/accesscontrol_default.h
-                           ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/pki_default.h
-                           ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/log_stdout.h
-                           ${PROJECT_SOURCE_DIR}/plugins/include/open62541/server_config_default.h
-                           ${PROJECT_SOURCE_DIR}/plugins/include/open62541/client_config_default.h
-                           ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/securitypolicy_default.h
-)
-
-set(default_plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_log_stdout.c
-                           ${PROJECT_SOURCE_DIR}/plugins/ua_accesscontrol_default.c
-                           ${PROJECT_SOURCE_DIR}/plugins/ua_pki_default.c
-                           ${PROJECT_SOURCE_DIR}/plugins/ua_nodestore_default.c
-                           ${PROJECT_SOURCE_DIR}/plugins/ua_config_default.c
-                           ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_none.c
-)
-
-if(UA_GENERATED_NAMESPACE_ZERO)
-    list(APPEND internal_headers ${PROJECT_BINARY_DIR}/src_generated/open62541/namespace0_generated.h)
-    list(APPEND lib_sources ${PROJECT_BINARY_DIR}/src_generated/open62541/namespace0_generated.c)
-endif()
-
-list(APPEND default_plugin_headers
-     ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/securitypolicy_mbedtls_common.h)
-list(APPEND default_plugin_sources
-     ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/securitypolicy_mbedtls_common.c
-     ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c
-     ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic256.c
-     ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c)
-
-if(UA_ENABLE_HISTORIZING)
-
-    list(APPEND default_plugin_headers
-         ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_backend.h
-         ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_gathering.h
-         ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_database_default.h
-         ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_gathering_default.h
-         ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_backend_memory.h
-         )
-    list(APPEND default_plugin_sources
-         ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_data_backend_memory.c
-         ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_data_gathering_default.c
-         ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_database_default.c
-         )
-endif()
-
-if(UA_ENABLE_DISCOVERY)
-    list(INSERT internal_headers 13 ${PROJECT_SOURCE_DIR}/src/server/ua_discovery_manager.h)
-    list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_discovery_manager.c)
-endif()
-
-if(UA_ENABLE_PUBSUB)
-    list(APPEND default_plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/pubsub_udp.h)
-    list(APPEND default_plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_pubsub_udp.c)
-    if(UA_ENABLE_PUBSUB_ETH_UADP)
-        list(APPEND default_plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/pubsub_ethernet.h)
-        list(APPEND default_plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_pubsub_ethernet.c)
-    endif()
-endif()
-
-if(UA_ENABLE_JSON_ENCODING)
-    if(UA_ENABLE_PUBSUB)
-        list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_networkmessage_json.c)
-    endif()
-    list(APPEND internal_headers ${PROJECT_SOURCE_DIR}/deps/jsmn/jsmn.h
-                                 ${PROJECT_SOURCE_DIR}/deps/string_escape.h
-                                 ${PROJECT_SOURCE_DIR}/deps/itoa.h
-                                 ${PROJECT_SOURCE_DIR}/deps/atoi.h
-                                 ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_json.h)
-    list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/deps/jsmn/jsmn.c
-                            ${PROJECT_SOURCE_DIR}/deps/string_escape.c
-                            ${PROJECT_SOURCE_DIR}/deps/itoa.c
-                            ${PROJECT_SOURCE_DIR}/deps/atoi.c
-                            ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_json.c)
-endif()
-
-if(UA_ENABLE_CUSTOM_LIBC)
-     list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/deps/musl/floatscan.c
-                             ${PROJECT_SOURCE_DIR}/deps/musl/vfprintf.c)
-endif()
-
-if(UA_ENABLE_SUBSCRIPTIONS)
-    list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_subscription.c
-                            ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_monitoreditem.c
-                            ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_datachange.c)
-    if(UA_ENABLE_SUBSCRIPTIONS_EVENTS)
-        list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_events.c)
-    endif()
-endif()
-
-if(UA_DEBUG_DUMP_PKGS)
-    list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/plugins/ua_debug_dump_pkgs.c)
-endif()
-
-if(UA_ENABLE_DISCOVERY_MULTICAST)
-    # prepend in list, otherwise it complains that winsock2.h has to be included before windows.h
-    set(internal_headers ${PROJECT_BINARY_DIR}/src_generated/mdnsd_config.h
-                         ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/1035.h
-                         ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/xht.h
-                         ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/sdtxt.h
-                         ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/mdnsd.h
-                         ${internal_headers} )
-    set(lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_server_discovery_mdns.c
-        ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/1035.c
-        ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/xht.c
-        ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/sdtxt.c
-        ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/mdnsd.c
-        ${lib_sources})
-endif()
-
-if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ)
-    set(lib_sources
-        ${lib_sources}
-        ${PROJECT_SOURCE_DIR}/tests/fuzz/custom_memory_manager.c)
-endif()
-
-#########################
-# Generate source files #
-#########################
-
-# List of nodeset files combined into NS0 generated file
-set(UA_FILE_NODESETS)
-
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-    if(NOT UA_FILE_NS0)
-        set(UA_FILE_NS0 ${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml)
-    endif()
-    set(UA_FILE_NODESETS "${UA_FILE_NS0}")
-
-    if(NOT EXISTS "${UA_FILE_NS0}")
-        message(FATAL_ERROR "File ${UA_FILE_NS0} not found. You probably need to initialize the git submodule for deps/ua-nodeset.")
-    endif()
-
-
-    set(UA_FILE_NODEIDS ${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/NodeIds.csv)
-    set(UA_FILE_STATUSCODES ${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/StatusCode.csv)
-    set(UA_FILE_TYPES_BSD ${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.Types.bsd)
-else()
-    if(NOT UA_FILE_NS0)
-        set(UA_FILE_NS0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.NodeSet2.Minimal.xml)
-    endif()
-    set(UA_FILE_NODESETS "${UA_FILE_NS0}")
-
-    set(UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_minimal.txt)
-    set(UA_FILE_NODEIDS ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv)
-    set(UA_FILE_STATUSCODES ${PROJECT_SOURCE_DIR}/tools/schema/StatusCode.csv)
-    set(UA_FILE_TYPES_BSD ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd)
-
-    if(UA_ENABLE_METHODCALLS)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_method.txt)
-    endif()
-
-    if(UA_ENABLE_SUBSCRIPTIONS)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_subscriptions.txt)
-    endif()
-
-    if(UA_ENABLE_SUBSCRIPTIONS_EVENTS)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_events.txt)
-        list(APPEND UA_FILE_NODESETS ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.NodeSet2.EventsMinimal.xml)
-    endif()
-
-    if(UA_ENABLE_HISTORIZING)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_historizing.txt)
-        list(APPEND UA_FILE_NODESETS ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.NodeSet2.HistorizingMinimal.xml)
-    endif()
-
-    if(UA_ENABLE_DISCOVERY)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_discovery.txt)
-    endif()
-
-    if(UA_ENABLE_QUERY)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_query.txt)
-    endif()
-
-    if(UA_ENABLE_PUBSUB)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_pubsub.txt)
-        if(UA_ENABLE_PUBSUB_INFORMATIONMODEL)
-            list(APPEND UA_FILE_NODESETS ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.NodeSet2.PubSubMinimal.xml)
-        endif()
-    endif()
-	if(UA_ENABLE_DA)
-		list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_dataaccess.txt)
-    endif()
-    if(UA_ENABLE_TYPEDESCRIPTION)
-        list(APPEND UA_FILE_DATATYPES ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_typedescription.txt)
-    endif()
-endif()
-
-# standard-defined data types
-ua_generate_datatypes(
-    BUILTIN
-    NAME "types"
-    TARGET_SUFFIX "types"
-    NAMESPACE_IDX 0
-    FILE_CSV "${UA_FILE_NODEIDS}"
-    FILES_BSD "${UA_FILE_TYPES_BSD}"
-    FILES_SELECTED ${UA_FILE_DATATYPES}
-)
-
-# transport data types
-ua_generate_datatypes(
-    INTERNAL
-    NAME "transport"
-    TARGET_SUFFIX "transport"
-    NAMESPACE_IDX 1
-    FILE_CSV "${UA_FILE_NODEIDS}"
-    FILES_BSD "${UA_FILE_TYPES_BSD}" "${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd"
-    FILES_SELECTED "${PROJECT_SOURCE_DIR}/tools/schema/datatypes_transport.txt"
-)
-
-# statuscode explanation
-add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h
-                          ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.c
-        PRE_BUILD
-        COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_statuscode_descriptions.py
-        ${UA_FILE_STATUSCODES} ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes
-        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_statuscode_descriptions.py
-                ${UA_FILE_STATUSCODES})
-
-# Header containing defines for all NodeIds
-ua_generate_nodeid_header(
-    NAME "nodeids"
-    ID_PREFIX "NS0"
-    TARGET_SUFFIX "ids-ns0"
-    FILE_CSV "${UA_FILE_NODEIDS}"
-)
-
-# we need a custom target to avoid that the generator is called concurrently and
-# thus overwriting files while the other thread is compiling
-add_custom_target(open62541-generator-statuscode DEPENDS
-        ${PROJECT_BINARY_DIR}/src_generated/open62541/nodeids.h
-        ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h
-        ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.c)
-
-if (UA_ENABLE_AMALGAMATION)
-    # single-file release
-    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.h
-                       PRE_BUILD
-                       COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
-                               ${OPEN62541_VER_COMMIT} ${CMAKE_CURRENT_BINARY_DIR}/open62541.h
-                               ${exported_headers} ${default_plugin_headers} ${ua_architecture_headers}
-                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
-                               ${exported_headers} ${default_plugin_headers} ${ua_architecture_headers})
-
-    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.c
-                       PRE_BUILD
-                       COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
-                               ${OPEN62541_VER_COMMIT} ${CMAKE_CURRENT_BINARY_DIR}/open62541.c
-                               ${internal_headers} ${lib_sources} ${default_plugin_sources} ${ua_architecture_sources}
-                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${internal_headers}
-                               ${lib_sources} ${default_plugin_sources} ${ua_architecture_sources} )
-
-    add_custom_target(open62541-amalgamation-source DEPENDS ${PROJECT_BINARY_DIR}/open62541.c)
-    add_custom_target(open62541-amalgamation-header DEPENDS ${PROJECT_BINARY_DIR}/open62541.h)
-
-    add_dependencies(open62541-amalgamation-header open62541-generator-types)
-    add_dependencies(open62541-amalgamation-source open62541-generator-types
-                     open62541-generator-transport open62541-generator-statuscode)
-endif()
-
-ua_generate_nodeset(
-    NAME "ns0"
-    FILE ${UA_FILE_NODESETS}
-    INTERNAL
-    IGNORE "${PROJECT_SOURCE_DIR}/tools/nodeset_compiler/NodeID_NS0_Base.txt"
-    DEPENDS_TARGET "open62541-generator-types"
-)
-
-# stack protector and optimization needs to be disabled for the huge ns0 file, otherwise debian packaging fails due to long build times.
-# We also disable optimization on Appveyor builds, since they take almost an hour otherwise
-if(UA_PACK_DEBIAN OR (NOT "$ENV{APPVEYOR}" STREQUAL "") OR (
-        (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") AND (
-            # List of compilers which have problems with the huge ns0 optimization
-            (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") AND (CMAKE_C_COMPILER_VERSION VERSION_LESS 7.0))
-        )
-   ))
-    set_source_files_properties(${PROJECT_BINARY_DIR}/src_generated/open62541/namespace0_generated.c PROPERTIES COMPILE_FLAGS "-fno-stack-protector -O0")
-endif()
-
-#####################
-# Build the Library #
-#####################
-
-assign_source_group(${lib_sources})
-assign_source_group(${internal_headers})
-assign_source_group(${exported_headers})
-assign_source_group(${default_plugin_sources})
-assign_source_group(${ua_architecture_sources})
-
-if(UA_ENABLE_AMALGAMATION)
-    add_library(open62541-object OBJECT ${PROJECT_BINARY_DIR}/open62541.c ${PROJECT_BINARY_DIR}/open62541.h)
-    target_include_directories(open62541-object PRIVATE ${PROJECT_BINARY_DIR})
-    target_include_directories(open62541-object PRIVATE "${ua_architecture_directories_to_include}")
-    if(UA_ENABLE_ENCRYPTION)
-        target_include_directories(open62541-object PRIVATE ${MBEDTLS_INCLUDE_DIRS})
-    endif()
-
-    # make sure the open62541_amalgamation target builds before so that amalgamation is finished and it is not executed again for open62541-object
-    # and thus may overwrite the amalgamation result during multiprocessor compilation
-    # the header is already a dependency of open62541 target itself
-    add_dependencies(open62541-object
-                     open62541-amalgamation-header
-                     open62541-generator-types
-                     open62541-generator-transport
-                     open62541-generator-statuscode
-                     open62541-amalgamation-source)
-
-    add_library(open62541 $<TARGET_OBJECTS:open62541-object>)
-    # the only directory that needs to be included if open62541 (amalgameted) target from
-    # the build directory is ${PROJECT_BINARY_DIR}, that contains the generated open62541.h
-    target_include_directories(open62541 PUBLIC $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>)
-
-    if(UA_COMPILE_AS_CXX)
-        set_source_files_properties(${PROJECT_BINARY_DIR}/open62541.c PROPERTIES LANGUAGE CXX)
-    endif()
-
-    add_dependencies(open62541-amalgamation-source open62541-generator-namespace)
-    add_dependencies(open62541-amalgamation-header open62541-generator-namespace)
-else()
-    add_library(open62541-object OBJECT ${lib_sources} ${internal_headers} ${exported_headers})
-    add_dependencies(open62541-object
-                     open62541-generator-types
-                     open62541-generator-transport
-                     open62541-generator-statuscode
-                     open62541-generator-namespace
-                     )
-    target_include_directories(open62541-object PRIVATE ${PROJECT_SOURCE_DIR}/src)
-
-    add_library(open62541-plugins OBJECT ${default_plugin_sources} ${ua_architecture_sources} ${exported_headers})
-    add_dependencies(open62541-plugins open62541-generator-types open62541-generator-transport open62541-generator-namespace)
-    target_include_directories(open62541-plugins PRIVATE ${PROJECT_SOURCE_DIR}/plugins)
-    target_include_directories(open62541-plugins PRIVATE ${PROJECT_BINARY_DIR}/src_generated)
-    target_compile_definitions(open62541-plugins PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
-    set_target_properties(open62541-plugins PROPERTIES FOLDER "open62541/lib")
-
-    add_library(open62541 $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-
-    if(UA_COMPILE_AS_CXX)
-        set_source_files_properties(${lib_sources} PROPERTIES LANGUAGE CXX)
-        set_source_files_properties(${default_plugin_sources} ${ua_architecture_sources} PROPERTIES LANGUAGE CXX)
-    endif()
-
-    # Declare include directories
-    function(include_directories_private)
-        foreach(_include_dir IN ITEMS ${ARGN})
-            target_include_directories(open62541-object PRIVATE ${_include_dir})
-            target_include_directories(open62541-plugins PRIVATE ${_include_dir})
-        endforeach()
-    endfunction()
-
-    function(include_directories_public)
-        include_directories_private(${ARGN})
-        foreach(_include_dir IN ITEMS ${ARGN})
-            target_include_directories(open62541 PUBLIC $<BUILD_INTERFACE:${_include_dir}>)
-        endforeach()
-    endfunction()
-
-    # Public includes
-    include_directories_public(${ua_architecture_directories_to_include}
-                               "${PROJECT_SOURCE_DIR}/include"
-                               "${PROJECT_SOURCE_DIR}/plugins/include"
-                               "${PROJECT_SOURCE_DIR}/deps"
-                               "${PROJECT_SOURCE_DIR}/src/pubsub"
-                               "${PROJECT_BINARY_DIR}/src_generated")
-
-    # Private includes
-    include_directories_private("${PROJECT_BINARY_DIR}")
-
-    if(UA_ENABLE_ENCRYPTION)
-        include_directories_private(${MBEDTLS_INCLUDE_DIRS})
-    endif()
-
-    # Option-specific includes
-    if(UA_ENABLE_DISCOVERY)
-        include_directories_private("${PROJECT_SOURCE_DIR}/src/client")
-    endif()
-
-endif()
-
-# Ensure that the open62541::open62541 alias can be used inside open62541's build
-add_library(open62541::open62541 ALIAS open62541)
-
-# Export Symbols
-target_compile_definitions(open62541-object PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
-target_compile_definitions(open62541 PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
-if (UA_ENABLE_DISCOVERY_MULTICAST)
-    target_compile_definitions(open62541-object PRIVATE -DMDNSD_DYNAMIC_LINKING_EXPORT)
-    target_compile_definitions(open62541 PRIVATE -DMDNSD_DYNAMIC_LINKING_EXPORT)
-endif()
-# Generate properly versioned shared library links on Linux
-SET_TARGET_PROPERTIES(open62541 PROPERTIES SOVERSION "${OPEN62541_VER_MAJOR}" VERSION "${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}.${OPEN62541_VER_PATCH}")
-
-##################################
-#     Architectures changes      #
-##################################
-
-GET_PROPERTY(ua_architecture_add_definitions GLOBAL PROPERTY UA_ARCHITECTURE_ADD_DEFINITIONS)
-add_definitions(${ua_architecture_add_definitions})
-
-GET_PROPERTY(ua_architecture_remove_definitions GLOBAL PROPERTY UA_ARCHITECTURE_REMOVE_DEFINITIONS)
-if (NOT "${ua_architecture_remove_definitions}" STREQUAL "")
-  string(REPLACE " " ";" ua_architecture_remove_definitions_list ${ua_architecture_remove_definitions})
-  remove_definitions(${ua_architecture_remove_definitions_list})
-endif(NOT "${ua_architecture_remove_definitions}" STREQUAL "")
-
-GET_PROPERTY(ua_architecture_append_to_library GLOBAL PROPERTY UA_ARCHITECTURE_APPEND_TO_LIBRARY)
-list(APPEND open62541_LIBRARIES ${ua_architecture_append_to_library})
-
-target_compile_definitions(open62541 PUBLIC UA_ARCHITECTURE_${UA_ARCHITECTURE_UPPER})
-
-# DLL requires linking to dependencies
-target_link_libraries(open62541 ${open62541_LIBRARIES})
-
-##########################
-# Build Selected Targets #
-##########################
-
-# always include, builds with make doc
-add_subdirectory(doc)
-
-if(UA_BUILD_EXAMPLES)
-    if(UA_ENABLE_AMALGAMATION)
-        # Cannot compile tests with amalgamation. Not prepared for single header include
-        message(FATAL_ERROR "Examples cannot be built with source amalgamation enabled")
-    endif()
-    add_subdirectory(examples)
-endif()
-
-if(UA_BUILD_UNIT_TESTS)
-    if(UA_ENABLE_AMALGAMATION)
-        # Cannot compile tests with amalgamation. Amalgamation uses the default plugins, not the testing plugins
-        message(FATAL_ERROR "Unit tests cannot be generated with source amalgamation enabled")
-    endif()
-    enable_testing()
-    add_subdirectory(tests)
-endif()
-
-if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ OR UA_BUILD_FUZZING_CORPUS)
-    add_subdirectory(tests/fuzz)
-endif()
-
-if(UA_BUILD_TOOLS)
-    if(UA_ENABLE_JSON_ENCODING)
-        add_subdirectory(tools/ua2json)
-    endif()
-endif()
-
-########################
-# Linting as target    #
-########################
-include(linting_target)
-
-##########################
-# Installation           #
-##########################
-# invoke via `make install`
-# specify install location with `-DCMAKE_INSTALL_PREFIX=xyz`
-# Enable shared library with `-DBUILD_SHARED_LIBS=ON`
-
-set(cmake_configfile_install ${CMAKE_INSTALL_LIBDIR}/cmake/open62541)
-set(open62541_install_tools_dir share/open62541/tools)
-set(open62541_install_nodeset_dir share/open62541/tools/ua-nodeset)
-
-# This list of components allows to define a find_package requirement.
-# E.g.:
-# find_package(open62541 1.0.0 REQUIRED COMPONENTS Events Methods FullNamespace)
-set(open62541_enabled_components "")
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-    list(APPEND open62541_enabled_components "FullNamespace")
-endif()
-if(UA_ENABLE_METHODCALLS)
-    list(APPEND open62541_enabled_components "Methods")
-endif()
-if(UA_ENABLE_SUBSCRIPTIONS)
-    list(APPEND open62541_enabled_components "Subscriptions")
-endif()
-if(UA_ENABLE_PUBSUB)
-    list(APPEND open62541_enabled_components "PubSub")
-endif()
-if(UA_ENABLE_ENCRYPTION)
-    list(APPEND open62541_enabled_components "Encryption")
-endif()
-if(UA_ENABLE_AMALGAMATION)
-    list(APPEND open62541_enabled_components "Amalgamation")
-endif()
-if(UA_ENABLE_HISTORIZING)
-    list(APPEND open62541_enabled_components "Historizing")
-endif()
-if(UA_ENABLE_EXPERIMENTAL_HISTORIZING)
-    list(APPEND open62541_enabled_components "ExperimentalHistorizing")
-endif()
-if(UA_ENABLE_SUBSCRIPTIONS_EVENTS)
-    list(APPEND open62541_enabled_components "Events")
-endif()
-if(UA_MULTITHREADING)
-    list(APPEND open62541_enabled_components "Multithreading")
-endif()
-if(UA_ENABLE_DISCOVERY)
-    list(APPEND open62541_enabled_components "Discovery")
-endif()
-if(UA_ENABLE_DISCOVERY_MULTICAST)
-    list(APPEND open62541_enabled_components "DiscoveryMulticast")
-endif()
-
-# export library (either static or shared depending on BUILD_SHARED_LIBS)
-install(TARGETS open62541
-        EXPORT open62541Targets
-        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}
-        INCLUDES DESTINATION include)
-
-if(UA_ENABLE_AMALGAMATION)
-# Our default way of installation is the non-amalgamated version.
-# See also https://github.com/open62541/open62541/pull/2292#discussion_r241106424
-install(CODE "MESSAGE(WARNING \"Installation with UA_ENABLE_AMALGAMATION=ON is not recommended.\")")
-endif()
-
-include(CMakePackageConfigHelpers)
-configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/open62541Config.cmake.in"
-                              "${CMAKE_CURRENT_BINARY_DIR}/open62541Config.cmake"
-                              INSTALL_DESTINATION "${cmake_configfile_install}"
-                              PATH_VARS open62541_install_tools_dir
-                                        open62541_install_nodeset_dir
-                                        open62541_enabled_components
-                              )
-
-set(open62541_VERSION)
-get_target_property(open62541_VERSION open62541 VERSION)
-
-write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/open62541ConfigVersion.cmake"
-                                 VERSION ${open62541_VERSION}
-                                 COMPATIBILITY AnyNewerVersion)
-
-install(EXPORT open62541Targets
-        FILE open62541Targets.cmake
-        DESTINATION "${cmake_configfile_install}"
-        NAMESPACE open62541::)
-
-export(
-    TARGETS open62541
-    NAMESPACE open62541::
-    FILE ${CMAKE_CURRENT_BINARY_DIR}/open62541Targets.cmake
-)
-
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/macros_public.cmake" "${CMAKE_CURRENT_BINARY_DIR}/open62541Macros.cmake" COPYONLY)
-
-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/open62541Config.cmake"
-              "${CMAKE_CURRENT_BINARY_DIR}/open62541ConfigVersion.cmake"
-              "${CMAKE_CURRENT_BINARY_DIR}/open62541Macros.cmake"
-        DESTINATION "${cmake_configfile_install}")
-
-if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
-    install(FILES "${PROJECT_BINARY_DIR}/src_generated/open62541.pc"
-            DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
-endif()
-
-set(UA_install_tools_dirs "tools/certs"
-    "tools/nodeset_compiler"
-    "tools/schema"
-    "deps/ua-nodeset")
-
-set(UA_install_tools_files "tools/generate_datatypes.py"
-    "tools/generate_nodeid_header.py"
-    "tools/generate_statuscode_descriptions.py")
-
-install(DIRECTORY ${UA_install_tools_dirs} 
-    DESTINATION ${open62541_install_tools_dir} 
-    USE_SOURCE_PERMISSIONS
-    FILES_MATCHING
-    PATTERN "*"
-    PATTERN "*.pyc" EXCLUDE
-    )
-
-install(FILES ${UA_install_tools_files} DESTINATION ${open62541_install_tools_dir})
-
-if(NOT UA_ENABLE_AMALGAMATION)
-    # Recreate the include folder structure from the source also in /usr/lib/include/open62541
-
-    set(FILES_TO_INSTALL
-        ${exported_headers}
-        ${default_plugin_headers}
-        ${ua_architecture_headers})
-
-    set(BASE_PATH_MAIN "${PROJECT_SOURCE_DIR}/include/open62541")
-    set(BASE_PATH_PLUGINS "${PROJECT_SOURCE_DIR}/plugins/include/open62541")
-    set(BASE_PATH_ARCH "${PROJECT_SOURCE_DIR}/arch")
-    set(BASE_PATH_GENERATED "${PROJECT_BINARY_DIR}/src_generated/open62541")
-    set(BASE_PATH_DEPS "${PROJECT_SOURCE_DIR}/deps")
-
-    foreach ( file ${FILES_TO_INSTALL} )
-        # Construct a relative path by replacing any occurence of the absolute path
-        set(full_path ${file})
-        string(REPLACE ${BASE_PATH_MAIN} "" file ${file})
-        string(REPLACE ${BASE_PATH_PLUGINS} "" file ${file})
-        string(REPLACE ${BASE_PATH_ARCH} "" file ${file})
-        string(REPLACE ${BASE_PATH_GENERATED} "" file ${file})
-        string(REPLACE ${BASE_PATH_DEPS} "" file ${file})
-
-        get_filename_component( dir ${file} DIRECTORY )
-        install( FILES ${full_path} DESTINATION include/open62541${dir} )
-    endforeach()
-
-else()
-    # Export amalgamated header open62541.h which is generated due to build of 
-    # open62541-object
-    install(FILES ${PROJECT_BINARY_DIR}/open62541.h DESTINATION include)
-endif()
-
-add_subdirectory(tools/packaging)
-
-##################################
-# Visual studio solution folders #
-##################################
-
-set_property(GLOBAL PROPERTY USE_FOLDERS ON)
-set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "_CmakePredifinedTargets")
-
-set_target_properties(open62541 PROPERTIES FOLDER "open62541/lib")
-set_target_properties(open62541-object PROPERTIES FOLDER "open62541/lib")
-if (UA_ENABLE_AMALGAMATION)
-    set_target_properties(open62541-amalgamation-header PROPERTIES FOLDER "open62541/lib")
-    set_target_properties(open62541-amalgamation-source PROPERTIES FOLDER "open62541/lib")
-endif()
-
-set_target_properties(open62541-generator-namespace PROPERTIES FOLDER "open62541/generators")
-set_target_properties(open62541-generator-statuscode PROPERTIES FOLDER "open62541/generators")
-set_target_properties(open62541-generator-transport PROPERTIES FOLDER "open62541/generators")
-set_target_properties(open62541-generator-types PROPERTIES FOLDER "open62541/generators")
-
diff --git a/ext/open62541/CODE_OF_CONDUCT.md b/ext/open62541/CODE_OF_CONDUCT.md
deleted file mode 100644
index 565a86b..0000000
--- a/ext/open62541/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment include:
-
-- Using welcoming and inclusive language
-- Being respectful of differing viewpoints and experiences
-- Gracefully accepting constructive criticism
-- Focusing on what is best for the community
-- Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-- The use of sexualized language or imagery and unwelcome sexual attention or advances
-- Trolling, insulting/derogatory comments, and personal or political attacks
-- Public or private harassment
-- Publishing others' private information, such as a physical or electronic address, without explicit permission
-- Other conduct which could reasonably be considered inappropriate in a professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at open62541-core@googlegroups.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
-
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/4/
diff --git a/ext/open62541/CONTRIBUTING.md b/ext/open62541/CONTRIBUTING.md
deleted file mode 100644
index 7da2e39..0000000
--- a/ext/open62541/CONTRIBUTING.md
+++ /dev/null
@@ -1,187 +0,0 @@
-# Contributing to open62541
-
-Contributions to open62541 include code, documentation, answering user
-questions, running the project's infrastructure, and advocating for all types of
-open62541 users.
-
-The open62541 project welcomes all contributions from anyone willing to work in
-good faith with other contributors and the community. No contribution is too
-small and all contributions are valued.
-
-This guide explains the process for contributing to the open62541 project's core
-repository and describes what to expect at each step. Thank you for considering
-these point.
-
-Your friendly open62541 community!
-
-## Code of Conduct
-
-The open62541 project has a [Code of Conduct](./CODE_OF_CONDUCT.md) that *all*
-contributors are expected to follow. This code describes the *minimum* behavior
-expectations for all contributors.
-
-## Pull Requests
-
-Everybody can propose a pull request (PR). But only the core-maintainers of the
-project can merge PR.
-
-### Minimal requirements for a PR
-
-The following are the minimal requirements that every PR needs to meet.
-
-- **Pass Continuous Integration (CI)**: Every PR has to pass our CI. This
-  includes compilation with a range of compilers and for a range of target
-  architectures, passing the unit tests and no detected issues with static code
-  analysis tools.
-
-- **Code-Style**: Please consider the
-  [Code-Style](https://github.com/open62541/open62541/wiki/Code-Style)
-  recommendations when formatting your code.
-
-- **Signed CLA**: Every contributor must sign the Contributor License Agreement
-  (CLA) before we can merge his first PR. The signing can be done online. The
-  link automatically appears on the page of the first PR. In addition, the CLA
-  text can be accessed [here](https://cla-assistant.io/open62541/open62541).
-
-## Commit and PR Hygiene
-
-We have very precise rules over how our git commit messages can be formatted.  This leads to **more
-readable messages** that are easy to follow when looking through the **project history**.  But also,
-we use the git commit messages to **generate the change log**.
-
-This convention is identical to the [Conventional Commits](https://www.conventionalcommits.org) specification or the one used by Angular.
-
-### Commit Message Format
-Each commit message consists of a **header**, a **body** and a **footer**.  The header has a special
-format that includes a **type**, a **scope** and a **subject**:
-
-```text
-<type>(<scope>): <subject>
-<BLANK LINE>
-<body>
-<BLANK LINE>
-<footer>
-```
-
-The **header** is mandatory and the **scope** of the header is optional.
-
-Any line of the commit message cannot be longer 100 characters! This allows the message to be easier
-to read on GitHub as well as in various git tools.
-
-The footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any.
-
-Samples: (even more [samples](https://github.com/angular/angular/commits/master))
-
-```text
-docs(server): add function documentation
-```
-```text
-fix(core): fix parsing of endpoint url
-
-Parsing of endpoint urls now also supports https
-```
-
-### Revert
-If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
-
-### Type
-Must be one of the following:
-
-- **build**: Changes that affect the build system or external dependencies
-- **ci**: Changes to our CI configuration files and scripts (example scopes: travis, appveyor, fuzz)
-- **docs**: Documentation only changes
-- **feat**: A new feature
-- **fix**: A bug fix
-- **perf**: A code change that improves performance
-- **refactor**: A code change that neither fixes a bug nor adds a feature
-- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
-- **test**: Adding missing tests or correcting existing tests
-
-### Scope
-The scope is optional, but recommended to be used. It should be the name of the component which is affected (as perceived by the person reading the changelog generated from commit messages).
-
-The following is the list of supported scopes:
-
-- **arch**: Changes to specific architecture code in `root/arch`
-- **client**: Changes only affecting client code
-- **core**: Core functionality used by the client and server
-- **encrypt**: Encryption changes
-- **example**: Example code changes
-- **multithread**: Changes specifically for multithreading
-- **nc**: Nodeset compiler
-- **pack**: Packaging setting changes
-- **plugis**: Change to any (optional) plugin
-- **pubsub**: Changes to the pubsub code
-- **server**: Changes only affecting server code
-
-### Subject
-The subject contains a succinct description of the change:
-
-- use the imperative, present tense: "change" not "changed" nor "changes"
-- don't capitalize the first letter
-- no dot (.) at the end
-
-### Body
-Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
-The body should include the motivation for the change and contrast this with previous behavior.
-
-### Footer
-The footer should contain any information about **Breaking Changes** and is also the place to
-reference GitHub issues that this commit **Closes**.
-
-**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
-
-## General commit hygiene
-
-We are using the [Conventional Commits](https://www.conventionalcommits.org) specification (see previous section).
-
-These sites explain a core set of good practice rules for preparing a PR:
-
-- https://wiki.openstack.org/wiki/GitCommitMessages
-- https://nvie.com/posts/a-successful-git-branching-model/
-
-The following points will be especially looked at during the review.
-
-- **Separation of Concerns**: Small changes are much easier to review.
-  Typically, small PR are merged much faster. For larger contributions, it might
-  make sense to break them up into a series of PR. For example, a PR with a new
-  feature should not contain other commits with only stylistic improvements to
-  another portion of the code.
-
-- **Feature Commits**: The same holds true for the individual PR as well. Every
-  commit inside the PR should do one thing only. If many changes have been
-  applied at the same time, `git add --patch` can be used to partially stage and
-  commit changes that belong together.
-
-- **Commit Messages**: Good commit messages help in understanding changes.
-  See previous section.
-
-- **Linear Commit History**: Our goal is to maintain a linear commit history
-  where possible. Use the `git rebase` functionality before pushing a PR. Use
-  `git rebase --interactive` to squash bugfix commits.
-
-### Review Process
-
-These labels can be used for the PR title to indicate its status.
-
-- `[WIP]`: The PR is work in progress and at this point simply informative.
-- `[Review]`: The PR is ready from the developers perspective. He requests a review from a core-maintainer.
-- `[Discussion]`: The PR is a contribution to ongoing technical discussions. The PR may be incomplete and is not intended to be merged before the discussion has concluded.
-
-The core-maintainers are busy people. If they take especially long to react,
-feel free to trigger them by additional comments in the PR thread. Again, small
-PR are much faster to review.
-
-It is the job of the developer that posts the PR to rebase the PR on the target
-branch when the two diverge.
-
-### Changes to the public API
-
-The *public* API is the collection of header files in the /include folder.
-
-Changes to the public API are under especially high scrutiny. Public API changes
-are best discussed with the core-maintainers early on. Simply to avoid duplicate
-work when changes to the proposed API become necessary.
-
-You can create a special issue or PR just for the sake of discussing a proposed
-API change. The actual implementation can follow later on.
diff --git a/ext/open62541/CPPLINT.cfg b/ext/open62541/CPPLINT.cfg
deleted file mode 100644
index 598b5f0..0000000
--- a/ext/open62541/CPPLINT.cfg
+++ /dev/null
@@ -1,21 +0,0 @@
-set noparent
-filter=-whitespace/line_length
-filter=-readability/casting
-filter=-legal/copyright
-filter=-build/include_subdir
-filter=-readability/todo
-filter=-runtime/casting
-filter=-runtime/int
-filter=-build/include_what_you_use
-filter=-readability/multiline_comment
-filter=-runtime/printf
-filter=-build/include
-filter=-build/header_guard
-filter=-readability/alt_tokens
-filter=-runtime/indentation_namespace
-filter=-whitespace/comments
-filter=-whitespace/blank_line
-filter=-whitespace/parens
-filter=-readability/braces
-exclude_files=deps/*
-exclude_files=build/*
diff --git a/ext/open62541/Dockerfile b/ext/open62541/Dockerfile
deleted file mode 100644
index 5cf1018..0000000
--- a/ext/open62541/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-FROM alpine:3.10
-RUN apk add --no-cache cmake gcc git g++ musl-dev mbedtls-dev python py-pip make && rm -rf /var/cache/apk/*
-ADD . /opt/open62541
-
-# Get all the git tags to make sure we detect the correct version with git describe
-WORKDIR /opt/open62541
-RUN git remote add github-upstream https://github.com/open62541/open62541.git
-RUN git fetch --tags github-upstream
-
-WORKDIR /opt/open62541/build
-RUN cmake -DBUILD_SHARED_LIBS=ON \
-		-DCMAKE_BUILD_TYPE=Debug \
-		-DUA_BUILD_EXAMPLES=ON \
-		# Hardening needs to be disabled, otherwise the docker build takes too long and travis fails
-		-DUA_ENABLE_HARDENING=OFF \
-        -DUA_ENABLE_ENCRYPTION=ON \
-        -DUA_ENABLE_SUBSCRIPTIONS=ON \
-        -DUA_ENABLE_SUBSCRIPTIONS_EVENTS=ON \
-		-DUA_NAMESPACE_ZERO=FULL \
-         /opt/open62541
-RUN make -j
-RUN make install
-WORKDIR /opt/open62541
-
-# Generate certificates
-RUN apk add --no-cache python-dev linux-headers openssl && rm -rf /var/cache/apk/*
-RUN pip install netifaces==0.10.9
-RUN mkdir -p /opt/open62541/pki/created
-RUN python /opt/open62541/tools/certs/create_self-signed.py /opt/open62541/pki/created
-
-
-EXPOSE 4840
-CMD ["/opt/open62541/build/bin/examples/server_ctt" , "/opt/open62541/pki/created/server_cert.der", "/opt/open62541/pki/created/server_key.der", "--enableUnencrypted", "--enableAnonymous"]
diff --git a/ext/open62541/FEATURES.md b/ext/open62541/FEATURES.md
deleted file mode 100644
index 07dbfc2..0000000
--- a/ext/open62541/FEATURES.md
+++ /dev/null
@@ -1,110 +0,0 @@
-open62541 Supported Features
-============================
-
-OPC UA Stack
-------------
-
-|                                         |                    |                      |
-| --------------------------------------- |:------------------:| -------------------- |
-| **Encoding**                            |                    |                      |
-| OPC UA Binary                           | :heavy_check_mark: |                      |
-| OPC UA JSON                             |     :new_moon:     | WIP for Release 0.4  |
-| OPC UA XML                              |     :new_moon:     |                      |
-| **Transport**                           |                    |                      |
-| UA-TCP UA-SC UA Binary                  | :heavy_check_mark: |                      |
-| OPC UA HTTPS                            |     :new_moon:     |                      |
-| SOAP-HTTP WS-SC UA Binary               |     :new_moon:     |                      |
-| SOAP-HTTP WS-SC UA XML                  |     :new_moon:     |                      |
-| SOAP-HTTP WS-SC UA XML-UA Binary        |     :new_moon:     |                      |
-| **Encryption**                          |                    |                      |
-| None                                    | :heavy_check_mark: |                      |
-| Basic128Rsa15                           | :heavy_check_mark: | master, Release 0.3  |
-| Basic256                                | :heavy_check_mark: | master, Release 0.3  |
-| Basic256Sha256                          | :heavy_check_mark: | master, Release 0.3  |
-| **Authentication**                      |                    |                      |
-| Anonymous                               | :heavy_check_mark: |                      |
-| User Name Password                      | :heavy_check_mark: |                      |
-| X509 Certificate                        |     :new_moon:     |                      |
-
-OPC UA Server
--------------
-
-| **Service-Set**             | **Service**                     | **Support**          | **Comment**          |
-| --------------------------- | ------------------------------- |:--------------------:| -------------------- |
-| Discovery Service Set       | FindServers()                   |  :heavy_check_mark:  |                      |
-|                             | FindServersOnNetwork()          |     :full_moon:      | master, Release 0.3  |
-|                             | GetEndpoints()                  |  :heavy_check_mark:  |                      |
-|                             | RegisterServer()                |  :heavy_check_mark:  |                      |
-|                             | RegisterServer2()               |     :full_moon:      | master, Release 0.3  |
-| Secure Channel Service Set  | OpenSecureChannel()             |  :heavy_check_mark:  |                      |
-|                             | CloseSecureChannel()            |  :heavy_check_mark:  |                      |
-| Session Service Set         | CreateSession()                 |  :heavy_check_mark:  |                      |
-|                             | CloseSession()                  |  :heavy_check_mark:  |                      |
-|                             | ActivateSession()               |  :heavy_check_mark:  |                      |
-|                             | Cancel()                        |      :new_moon:      |                      |
-| Node Management Service Set | AddNodes()                      |  :heavy_check_mark:  |                      |
-|                             | AddReferences()                 |  :heavy_check_mark:  |                      |
-|                             | DeleteNodes()                   |  :heavy_check_mark:  |                      |
-|                             | DeleteReferences()              |  :heavy_check_mark:  |                      |
-| View Service Set            | Browse()                        |  :heavy_check_mark:  |                      |
-|                             | BrowseNext()                    |  :heavy_check_mark:  |                      |
-|                             | TranslateBrowsePathsToNodeIds() |  :heavy_check_mark:  |                      |
-|                             | RegisterNodes()                 |  :heavy_check_mark:  |                      |
-|                             | UnregisterNodes()               |  :heavy_check_mark:  |                      |
-| Query Service Set           | QueryFirst()                    |      :new_moon:      |                      |
-|                             | QueryNext()                     |      :new_moon:      |                      |
-| Attribute Service Set       | Read()                          |  :heavy_check_mark:  |                      |
-|                             | Write()                         |  :heavy_check_mark:  |                      |
-|                             | HistoryRead()                   | :waning_gibbous_moon: | [WIP](https://github.com/open62541/open62541/pull/1740), Release 0.4 |
-|                             | HistoryUpdate()                 | :waning_gibbous_moon: | [WIP](https://github.com/open62541/open62541/pull/1740), Release 0.4 |
-| Method Service Set          | Call()                          |  :heavy_check_mark:  |                      |
-| MonitoredItems Service Set  | CreateMonitoredItems()          |  :heavy_check_mark:  | See below for Events |
-|                             | DeleteMonitoredItems()          |  :heavy_check_mark:  |                      |
-|                             | ModifyMonitoredItems()          |  :heavy_check_mark:  |                      |
-|                             | SetMonitoringMode()             |  :heavy_check_mark:  |                      |
-|                             | SetTriggering()                 |      :new_moon:      |                      |
-| Subscription Service Set    | CreateSubscription()            |  :heavy_check_mark:  |                      |
-|                             | ModifySubscription()            |  :heavy_check_mark:  |                      |
-|                             | SetPublishingMode()             |  :heavy_check_mark:  |                      |
-|                             | Publish()                       |  :heavy_check_mark:  |                      |
-|                             | Republish()                     |  :heavy_check_mark:  |                      |
-|                             | DeleteSubscriptions()           |  :heavy_check_mark:  |                      |
-|                             | TransferSubscriptions()         |      :new_moon:      |                      |
-
-| **Subscriptions**                       |                    |                      |
-| --------------------------------------- |:------------------:| -------------------- |
-| DataChange MonitoredItems               | :heavy_check_mark: | master, Release 0.3  |
-| DataChange Filters                      | :heavy_check_mark: | master               |
-| Event MonitoredItems                    | :heavy_check_mark: | master               |
-| Event Filters                           |     :new_moon:     |                      |
-
-| **Discovery**                           |                    | See Discovery Service Set |
-| --------------------------------------- |:------------------:| -------------------- |
-| Local Discovery Server                  | :heavy_check_mark: | master, Release 0.3  |
-| Local Discovery Server Multicast Ext.   | :heavy_check_mark: | master, Release 0.3  |
-| Global Discovery Server                 |     :new_moon:     |                      |
-
-OPC UA Client
--------------
-
-- All services are supported
-- Handling of subscriptions in the background
-
-OPC UA PubSub
--------------
-
-|                                                   |                       |                        |
-| ------------------------------------------------- |:---------------------:| ---------------------- |
-| **NetworkMessage decoding/encoding**              |                       |                        |
-| Binary (UADP)                                     |   :heavy_check_mark:  |                        |
-| JSON                                              |       :new_moon:      | WIP                    |
-| **PubSub Transport**                              |                       |                        |
-| UDP/multicast (send and receive)                  |   :heavy_check_mark:  |                        |
-| Ethernet (TSN)                                    | :waning_gibbous_moon: | Defined API to plug in custom networking implementation |
-| MQTT                                              |      :new_moon:       | WIP                    |
-| AMQP                                              |      :new_moon:       |                        |
-| **Publisher Configuration**                       |                       |                        |
-| Configure (server-side) Publisher at runtime      |  :heavy_check_mark:   |                        |
-| Configuration representation in information model |  :heavy_check_mark:   | Runtime configuration changes by editing the information model representation are possible |
-| Security Key Service Model                        |      :new_moon:       |                        |
-| **Subscriber Configuration**                      | :waning_gibbous_moon: | Manual Subscriber only |
diff --git a/ext/open62541/ISSUE_TEMPLATE.md b/ext/open62541/ISSUE_TEMPLATE.md
deleted file mode 100644
index 97ee0a2..0000000
--- a/ext/open62541/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-!ATTENTION!
-Please read the following page carefully and provide us with all the
-information requested:
-https://github.com/open62541/open62541/wiki/Writing-Good-Issue-Reports
-
-Use Github Markdown to format your text:
-https://help.github.com/articles/basic-writing-and-formatting-syntax/
-
-Fill out the sections and checklist below (add text at the end of each line).
-
-!ATTENTION!
---------------------------------------------------------------------------------
--->
-
-## Description
-
-## Background Information / Reproduction Steps
-
-
-
-Used CMake options:
-
-<!-- 
-
-Include all CMake options here, which you modified or used for your build.
-
-If you are using cmake-gui, go to "Tools > Show my Changes" and paste the content of "Command Line Options"
-
-On the command line use `cmake -L` (or `cmake -LA` if you changed advanced variables)
--->
-
-```bash
-cmake -DUA_NAMESPACE_ZERO=<YOUR_OPTION> <ANY_OTHER_OPTIONS> ..
-```
-
-## Checklist
-
-Please provide the following information:
-
- - [ ] open62541 Version (release number or git tag):
- - [ ] Other OPC UA SDKs used (client or server): 
- - [ ] Operating system:
- - [ ] Logs (with `UA_LOGLEVEL` set as low as necessary) attached
- - [ ] Wireshark network dump attached
- - [ ] Self-contained code example attached
- - [ ] Critical issue
diff --git a/ext/open62541/LICENSE b/ext/open62541/LICENSE
deleted file mode 100644
index 14e2f77..0000000
--- a/ext/open62541/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in 
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
diff --git a/ext/open62541/LICENSE-CC0 b/ext/open62541/LICENSE-CC0
deleted file mode 100644
index ad7fdad..0000000
--- a/ext/open62541/LICENSE-CC0
+++ /dev/null
@@ -1,110 +0,0 @@
-Creative Commons CCZero 1.0 Universal
-
-Statement of Purpose
-
-The laws of most jurisdictions throughout the world automatically confer
-exclusive Copyright and Related Rights (defined below) upon the creator
-and subsequent owner(s) (each and all, an "owner") of an original work of
-authorship and/or a database (each, a "Work").
-
-Certain owners wish to permanently relinquish those rights to a Work for
-the purpose of contributing to a commons of creative, cultural and
-scientific works ("Commons") that the public can reliably and without fear
-of later claims of infringement build upon, modify, incorporate in other
-works, reuse and redistribute as freely as possible in any form whatsoever
-and for any purposes, including without limitation commercial purposes.
-These owners may contribute to the Commons to promote the ideal of a free
-culture and the further production of creative, cultural and scientific
-works, or to gain reputation or greater distribution for their Work in
-part through the use and efforts of others.
-
-For these and/or other purposes and motivations, and without any
-expectation of additional consideration or compensation, the person
-associating CC0 with a Work (the "Affirmer"), to the extent that he or she
-is an owner of Copyright and Related Rights in the Work, voluntarily
-elects to apply CC0 to the Work and publicly distribute the Work under its
-terms, with knowledge of his or her Copyright and Related Rights in the
-Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be
-protected by copyright and related or neighboring rights ("Copyright and
-Related Rights"). Copyright and Related Rights include, but are not
-limited to, the following:
-
-  i. the right to reproduce, adapt, distribute, perform, display,
-     communicate, and translate a Work;
- ii. moral rights retained by the original author(s) and/or performer(s);
-iii. publicity and privacy rights pertaining to a person's image or
-     likeness depicted in a Work;
- iv. rights protecting against unfair competition in regards to a Work,
-     subject to the limitations in paragraph 4(a), below;
-  v. rights protecting the extraction, dissemination, use and reuse of data
-     in a Work;
- vi. database rights (such as those arising under Directive 96/9/EC of the
-     European Parliament and of the Council of 11 March 1996 on the legal
-     protection of databases, and under any national implementation
-     thereof, including any amended or successor version of such
-     directive); and
-vii. other similar, equivalent or corresponding rights throughout the
-     world based on applicable law or treaty, and any national
-     implementations thereof.
-
-2. Waiver. To the greatest extent permitted by, but not in contravention
-of, applicable law, Affirmer hereby overtly, fully, permanently,
-irrevocably and unconditionally waives, abandons, and surrenders all of
-Affirmer's Copyright and Related Rights and associated claims and causes
-of action, whether now known or unknown (including existing as well as
-future claims and causes of action), in the Work (i) in all territories
-worldwide, (ii) for the maximum duration provided by applicable law or
-treaty (including future time extensions), (iii) in any current or future
-medium and for any number of copies, and (iv) for any purpose whatsoever,
-including without limitation commercial, advertising or promotional
-purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
-member of the public at large and to the detriment of Affirmer's heirs and
-successors, fully intending that such Waiver shall not be subject to
-revocation, rescission, cancellation, termination, or any other legal or
-equitable action to disrupt the quiet enjoyment of the Work by the public
-as contemplated by Affirmer's express Statement of Purpose.
-
-3. Public License Fallback. Should any part of the Waiver for any reason
-be judged legally invalid or ineffective under applicable law, then the
-Waiver shall be preserved to the maximum extent permitted taking into
-account Affirmer's express Statement of Purpose. In addition, to the
-extent the Waiver is so judged Affirmer hereby grants to each affected
-person a royalty-free, non transferable, non sublicensable, non exclusive,
-irrevocable and unconditional license to exercise Affirmer's Copyright and
-Related Rights in the Work (i) in all territories worldwide, (ii) for the
-maximum duration provided by applicable law or treaty (including future
-time extensions), (iii) in any current or future medium and for any number
-of copies, and (iv) for any purpose whatsoever, including without
-limitation commercial, advertising or promotional purposes (the
-"License"). The License shall be deemed effective as of the date CC0 was
-applied by Affirmer to the Work. Should any part of the License for any
-reason be judged legally invalid or ineffective under applicable law, such
-partial invalidity or ineffectiveness shall not invalidate the remainder
-of the License, and in such case Affirmer hereby affirms that he or she
-will not (i) exercise any of his or her remaining Copyright and Related
-Rights in the Work or (ii) assert any associated claims and causes of
-action with respect to the Work, in either case contrary to Affirmer's
-express Statement of Purpose.
-
-4. Limitations and Disclaimers.
-
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
-    surrendered, licensed or otherwise affected by this document.
- b. Affirmer offers the Work as-is and makes no representations or
-    warranties of any kind concerning the Work, express, implied,
-    statutory or otherwise, including without limitation warranties of
-    title, merchantability, fitness for a particular purpose, non
-    infringement, or the absence of latent or other defects, accuracy, or
-    the present or absence of errors, whether or not discoverable, all to
-    the greatest extent permissible under applicable law.
- c. Affirmer disclaims responsibility for clearing rights of other persons
-    that may apply to the Work or any use thereof, including without
-    limitation any person's Copyright and Related Rights in the Work.
-    Further, Affirmer disclaims responsibility for obtaining any necessary
-    consents, permissions or other rights required for any use of the
-    Work.
- d. Affirmer understands and acknowledges that Creative Commons is not a
-    party to this document and has no duty or obligation with respect to
-    this CC0 or use of the Work.
diff --git a/ext/open62541/README.md b/ext/open62541/README.md
deleted file mode 100644
index f52d8fc..0000000
--- a/ext/open62541/README.md
+++ /dev/null
@@ -1,240 +0,0 @@
-# open62541
-
-open62541 (<http://open62541.org>) is an open source and free implementation of OPC UA (OPC Unified Architecture) written in the common subset of the C99 and C++98 languages. The library is usable with all major compilers and provides the necessary tools to implement dedicated OPC UA clients and servers, or to integrate OPC UA-based communication into existing applications. open62541 library is platform independent. All platform-specific functionality is implemented via exchangeable plugins. Plugin implementations are provided for the major operating systems.
-
-open62541 is licensed under the Mozilla Public License v2.0. So the *open62541 library can be used in projects that are not open source*. Only changes to the open62541 library itself need to published under the same license. The plugins, as well as the server and client examples are in the public domain (CC0 license). They can be reused under any license and changes do not have to be published.
-
-The library is [available](https://github.com/open62541/open62541/releases) in standard source and binary form. In addition, the single-file source distribution merges the entire library into a single .c and .h file that can be easily added to existing projects. Example server and client implementations can be found in the [/examples](examples/) directory or further down on this page.
-
-## Project Information
-
-Build Status:
-
-[![Build Status](https://img.shields.io/travis/open62541/open62541/master.svg)](https://travis-ci.org/open62541/open62541)
-[![Build Status](https://dev.azure.com/open62541/open62541/_apis/build/status/open62541.open62541?branchName=master)](https://dev.azure.com/open62541/open62541/_build/latest?definitionId=1&branchName=master)
-[![Build Status](https://ci.appveyor.com/api/projects/status/github/open62541/open62541?branch=master&svg=true)](https://ci.appveyor.com/project/open62541/open62541/branch/master)
-[![Build Status](https://img.shields.io/docker/cloud/build/open62541/open62541)](https://cloud.docker.com/u/open62541/repository/docker/open62541/open62541)
-
-Code Quality:
-
-[![Codacy Badge](https://api.codacy.com/project/badge/Grade/68ad08e897624c77a64fc2be66ca7b50)](https://www.codacy.com/app/open62541/open62541?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=open62541/open62541&amp;utm_campaign=Badge_Grade)
-[![Total Alerts](https://img.shields.io/lgtm/alerts/g/open62541/open62541.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/open62541/open62541/alerts)
-[![Coverage Status](https://img.shields.io/coveralls/open62541/open62541/master.svg)](https://coveralls.io/r/open62541/open62541?branch=master)
-[![codecov](https://codecov.io/gh/open62541/open62541/branch/master/graph/badge.svg)](https://codecov.io/gh/open62541/open62541)
-[![Code Quality: Cpp](https://img.shields.io/lgtm/grade/cpp/g/open62541/open62541.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/open62541/open62541/context:cpp)
-
-General Project Info:
-
-[![Open Hub Project Status](https://www.openhub.net/p/open62541/widgets/project_thin_badge.gif)](https://www.openhub.net/p/open62541/)
-[![Overall Downloads](https://img.shields.io/github/downloads/open62541/open62541/total.svg)](https://github.com/open62541/open62541/releases)
-
-### Features and Certification
-
-open62541 implements the OPC UA binary protocol stack as well as a client and server SDK. The final server binaries can be well under 100kb, depending on the selected features and the size of the information model.
-
-- Communication Stack
-  - OPC UA binary protocol
-  - OPC UA JSON encoding
-  - Secure communication with encrypted messages
-  - Exchangeable network layer (plugin) for using custom networking APIs (e.g. on embedded targets)
-  - Support for generating data types from standard XML definitions
-- Server
-  - Support for all OPC UA node types
-  - Access control for individual nodes
-  - Support for generating server-side information models from standard XML definitions (nodesets)
-  - Support for adding and removing nodes and references also at runtime.
-  - Support for inheritance and instantiation of object- and variable-types (custom constructor/destructor, instantiation of child nodes)
-  - Support for subscriptions/monitoreditems (data change notifications and events)
-- Client
-  - All OPC UA services supported
-  - Asynchronous service requests
-  - Background handling of subscriptions
-- Publish/Subscribe
-  - UADP Binary protocol with UDP-multicast or Ethernet communication
-  - PubSub JSON encoding
-
-open62541 is currently self-certifying. That is, the Conformance Testing Tools (CTT) of the OPC Foundation are regularly applied. But the SDK has not started an official certification so far.
-The CTT configuration and results are tracked at https://github.com/open62541/open62541-ctt. The OPC UA profiles under regular test in the CTT are currently:
-
-- Micro Embedded Device Server
-- Method Server Facet
-
-The goal for the upcoming 0.4 release is to support the *Embedded UA Server* profile in the CTT.
-See the page on [open62541 Features](FEATURES.md) for an in-depth look at the support for the conformance units that make up the OPC UA profiles.
-  
-### Dependencies
-
-On most systems, open62541 requires the C standard library only. For dependencies during the build process, see the following list and the [build documentation](https://open62541.org/doc/current/building.html) for details.
-
-- Core Library: The core library has no dependencies besides the C99 standard headers.
-- Default Plugins: The default plugins use the POSIX interfaces for networking and accessing the system clock. Ports to different (embedded) architectures are achieved by customizing the plugins.
-- Building and Code Generation: The build environment is generated via CMake. Some code is auto-generated from XML definitions that are part of the OPC UA standard. The code generation scripts run with both Python 2 and 3.
-
-### Code Quality
-
-We emphasize code quality. The following quality metrics are continuously checked and are ensured to hold before an official release is made:
-
-- Zero errors indicated by the Compliance Testing Tool (CTT) of the OPC Foundation for the supported features
-- Zero compiler warnings from GCC/Clang/MSVC with very strict compilation flags
-- Zero issues indicated by unit tests (more than 80% coverage)
-- Zero issues indicated by clang-analyzer, clang-tidy, cpp-check and the Codacy static code analysis tools
-- Zero unresolved issues from fuzzing the library in Google's oss-fuzz infrastructure
-- Zero issues indicated by Valgrind (Linux), DrMemory (Windows) and Clang AddressSanitizer / MemorySanitizer for the CTT tests, unit tests and fuzzing
-
-### Documentation and Support
-
-A general introduction to OPC UA and the open62541 documentation can be found at http://open62541.org/doc/current.
-Past releases of the library can be downloaded at https://github.com/open62541/open62541/releases.
-To use the latest improvements, download a nightly build of the *single-file distribution* (the entire library merged into a single source and header file) from http://open62541.org/releases. Nightly builds of MSVC binaries of the library are available [here](https://ci.appveyor.com/project/open62541/open62541/build/artifacts).
-
-For individual discussion and support, use the following channels:
-
-- the [mailing list](https://groups.google.com/d/forum/open62541)
-- our [IRC channel](http://webchat.freenode.net/?channels=%23open62541)
-- the [bugtracker](https://github.com/open62541/open62541/issues)
-
-We want to foster an open and welcoming community. Please take our [code of conduct](CODE_OF_CONDUCT.md) into regard.
-
-Jointly with the overall open62541 community, the core maintainers steer the long-term development. The current core maintainers are (as of April 2018, in alphabetical order):
-
-- Chris-Paul Iatrou (Dresden University of Technology, Chair for Process Control Systems Engineering)
-- Florian Palm (RWTH Aachen University, Chair of Process Control Engineering)
-- Julius Pfrommer (Fraunhofer IOSB, Karlsruhe)
-- Stefan Profanter (fortiss, Munich)
-
-## Support & Development
-
-### Commercial Support
-
-The open62541 community handles support requests for the open source library and its development. Custom development and individual support is provided by commercial partners that are affiliated with open62541:
-
-- [Kalycito Infotech, Tamil Nadu, INDIA](https://www.kalycito.com/landing/open62541-commercial-partner) for embedded and realtime IIoT applications (Contact: enterprise.services@kalycito.com)
-- [basysKom GmbH, Darmstadt, Germany](https://www.basyskom.com/) Software Engineering for Embedded Systems. (Contact: info@basysKom.com) 
-
-For custom development that shall eventually become part of the open62541 library, please keep one of the core maintainers in the loop. Again, please note that all changes to files that are already licensed under the MPLv2 automatically become MPLv2 as well. Static linking of the open62541 library with code under a different license is possible. All architecture-specific code is implemented in the form of exchangeable plugins under a very permissible CC0 license.
-
-### Development
-
-As an open source project, new contributors are encouraged to help improve open62541. The following are good starting points for new contributors:
-
-- [Report bugs](https://github.com/open62541/open62541/issues)
-- Improve the [documentation](http://open62541.org/doc/current)
-- Work on issues marked as "[good first issue](https://github.com/open62541/open62541/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)"
-
-### Success Stories and Users of open62541
-
-A list of projects and companies using our open62541 stack can be found in our Wiki:
-
-https://github.com/open62541/open62541/wiki/References-to-open62541
-
-## Installation and code usage
-
-For every release, we provide some pre-packed release packages which you can directly use in your compile infrastructure.
-
-Have a look at the [release page](https://github.com/open62541/open62541/releases) and the corresponding attached assets.
-
-A more detailed explanation on how to install the open62541 SDK is given in our [documentation](https://open62541.org/doc/current/installing.html).
-
-You can not directly download a .zip package from the main branches using the Github UI, since then some of the submodules and version strings are missing.
-Therefore you have three options to install and use this stack:
-
-- **Recommended:** Use any of the prepared packages attached to every release or in the package repository of your distro (if available).  
-  Please check the install guide for more info.
-  
-- Download a .zip package of special `pack/` branches.  
-  These pack branches are up-to-date with the corresponding base branches, but already have the submodules in-place and the version string set correctly.  
-  Here are some direct download links for the current pack branches:  
-  - [pack/master.zip](https://github.com/open62541/open62541/archive/pack/master.zip)
-  - [pack/1.0.zip](https://github.com/open62541/open62541/archive/pack/1.0.zip)
-   
-- Clone this repository and initialize all the submodules using `git submodule update --init --recursive`. Then either use `make install` or setup your CMake project correspondingly.
-
-## Examples
-
-A complete list of examples can be found in the [examples directory](https://github.com/open62541/open62541/tree/master/examples).
-
-To build the examples, we recommend to install the open62541 project as mentioned in previous section.
-
-### Example Server Implementation
-
-The following simple server example can be built using gcc, after you installed open62541 on your system.
-
-Using the GCC compiler, just run ```gcc -std=c99 -lopen62541 -DUA_ARCHITECTURE_POSIX <server.c> -o server``` (under Windows you may need to add ``` -lws2_32``` 
-and change `-DUA_ARCHITECTURE_POSIX` to `-DUA_ARCHITECTURE_WIN32`).
-```c
-#include <signal.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-UA_Boolean running = true;
-void signalHandler(int sig) {
-    running = false;
-}
-
-int main(int argc, char** argv)
-{
-    signal(SIGINT, signalHandler); /* catch ctrl-c */
-
-    /* Create a server listening on port 4840 */
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* Add a variable node */
-    /* 1) Define the node attributes */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "the answer");
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-
-    /* 2) Define where the node shall be added with which browsename */
-    UA_NodeId newNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId variableType = UA_NODEID_NULL; /* take the default variable type */
-    UA_QualifiedName browseName = UA_QUALIFIEDNAME(1, "the answer");
-
-    /* 3) Add the node */
-    UA_Server_addVariableNode(server, newNodeId, parentNodeId, parentReferenceNodeId,
-                              browseName, variableType, attr, NULL, NULL);
-
-    /* Run the server loop */
-    UA_StatusCode status = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return status;
-}
-```
-
-### Example Client Implementation
-```c
-#include <stdio.h>
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-
-int main(int argc, char *argv[])
-{
-    /* Create a client and connect */
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode status = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if(status != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return status;
-    }
-
-    /* Read the value attribute of the node. UA_Client_readValueAttribute is a
-     * wrapper for the raw read service available as UA_Client_Service_read. */
-    UA_Variant value; /* Variants can hold scalar values and arrays of any type */
-    UA_Variant_init(&value);
-    status = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "the.answer"), &value);
-    if(status == UA_STATUSCODE_GOOD &&
-       UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_INT32])) {
-        printf("the value is: %i\n", *(UA_Int32*)value.data);
-    }
-
-    /* Clean up */
-    UA_Variant_deleteMembers(&value);
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return status;
-}
-```
diff --git a/ext/open62541/TinyDockerfile b/ext/open62541/TinyDockerfile
deleted file mode 100644
index 661cbfc..0000000
--- a/ext/open62541/TinyDockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM alpine:3.5
-ADD . /tmp/open62541
-WORKDIR /tmp/open62541/build
-RUN apk add --no-cache cmake gcc g++ musl-dev python make && rm -rf /var/cache/apk/* && \
-    cmake -DUA_ENABLE_AMALGAMATION=true \
-          -DBUILD_SHARED_LIBS=true /tmp/open62541 && \
-    make && \
-    cp *.h /usr/include/ && \
-    cp bin/*.so /usr/lib && \
-    make clean && \
-    apk del cmake gcc g++ musl-dev python make
diff --git a/ext/open62541/appveyor.yml b/ext/open62541/appveyor.yml
deleted file mode 100644
index 5f065f3..0000000
--- a/ext/open62541/appveyor.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-version: '{build}'
-
-clone_folder: c:\projects\open62541
-
-# Do not set clone depth, we need all the tags to automatically detect the version based on git describe
-# clone_depth: 20
-
-# Avoid building branch if it is part of a PR and built anyways
-skip_branch_with_pr: true
-
-# Fast finish (stop other builds if one fails) to speed up appveyor builds
-# matrix:
-#  fast_finish: true
-
-environment:
-    global:
-        APPVEYOR_CACHE_ENTRY_ZIP_ARGS: -t7z -m0=lzma -mx=9
-
-    matrix:
-        - CC_NAME: Visual Studio 9 2008
-          CC_SHORTNAME: vs2008
-          GENERATOR: Visual Studio 9 2008
-          FORCE_CXX: ON
-        - CC_NAME: Visual Studio 12 2013
-          CC_SHORTNAME: vs2013
-          GENERATOR: Visual Studio 12 2013
-          FORCE_CXX: OFF
-
-cache:
-  - C:\ProgramData\chocolatey\bin -> tools/appveyor/install.ps1
-  - C:\ProgramData\chocolatey\lib -> tools/appveyor/install.ps1
-  - C:\tools\vcpkg\installed -> tools/appveyor/install.ps1
-  #- 'c:\miktex'
-
-init:
-  - git config --global core.autocrlf input # Attempt to ensure we don't try to convert line endings to Win32 CRLF as this will cause build to fail
-
-install:
-- set PATH=C:\Users\appveyor\AppData\Roaming\Python\Scripts;%PATH%
-- ps: '& "./tools/appveyor/install.ps1"'
-
-build_script:
-- ps: '& "./tools/appveyor/build.ps1"'
-
-after_build:
-  # Only push artifact if make install is defined
-  - appveyor PushArtifact %APPVEYOR_BUILD_FOLDER%\open62541-%CC_SHORTNAME%-static.zip
-  - appveyor PushArtifact %APPVEYOR_BUILD_FOLDER%\open62541-%CC_SHORTNAME%-dynamic.zip
diff --git a/ext/open62541/arch/CMakeLists.txt b/ext/open62541/arch/CMakeLists.txt
deleted file mode 100644
index 711f65f..0000000
--- a/ext/open62541/arch/CMakeLists.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\arch)
-
-ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR}) #to have access to ua_network_tcp.h
-
-add_subdirectory(posix)
-add_subdirectory(win32)
-add_subdirectory(freertosLWIP)
-add_subdirectory(vxworks)
-add_subdirectory(eCos)
-add_subdirectory(wec7)
-
-SET(UA_ARCH_EXTRA_INCLUDES "" CACHE STRING "Folders to include from the architecture")
-mark_as_advanced(UA_ARCH_EXTRA_INCLUDES)
-ua_include_directories(${UA_ARCH_EXTRA_INCLUDES})
-
-SET(UA_ARCH_REMOVE_FLAGS "" CACHE STRING "Flags to be removed from compilation that depends on the architecure")
-mark_as_advanced(UA_ARCH_REMOVE_FLAGS)
-ua_architecture_remove_definitions(${UA_ARCH_REMOVE_FLAGS})
-
-SET(UA_ARCH_ADD_FLAGS "" CACHE STRING "Flags to be added to compilation that depends on the architecure")
-mark_as_advanced(UA_ARCH_ADD_FLAGS)
-ua_architecture_add_definitions(${UA_ARCH_ADD_FLAGS})
-
-SET(UA_ARCH_LINKER_FLAGS "" CACHE STRING "Linker Flags to be added to compilation that depends on the architecure")
-mark_as_advanced(UA_ARCH_LINKER_FLAGS)
-ua_architecture_append_to_library(${UA_ARCH_LINKER_FLAGS})
diff --git a/ext/open62541/arch/Readme.md b/ext/open62541/arch/Readme.md
deleted file mode 100644
index db1ed46..0000000
--- a/ext/open62541/arch/Readme.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# open62541 Architectures 
-
-The `arch` folder contains all the architecture-specific code for a given operating system.
-
-The list of supported architectures is also available as a CMake option.
-
-## Adding new architectures
-
-To port to a new architecture you should follow these steps:
-
-1. Create a folder with your architecture, let's call it new_arch
-
-2. In the CMakeLists.txt file located next to this file, add `add_subdirectory(new_arch)` at the end of it
-
-3. Create a CMakeLists.txt file in the new_arch folder
-
-4. Use the following template for it (remember that when you see new_arch you should replace with the name of your architecture)
-    ```C
-    # ---------------------------------------------------
-    # ---- Beginning of the CMakeLists.txt template -----
-    # ---------------------------------------------------
-    
-    SET(SOURCE_GROUP ${SOURCE_GROUP}\\new_arch)
-    
-    ua_add_architecture("new_arch")
-    
-    if("${UA_ARCHITECTURE}" STREQUAL "new_arch")
-    
-        ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-        ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-        
-        #
-        # Add here below all the things that are specific for your architecture
-        #
-        
-        #You can use the following available CMake functions:
-         
-        #ua_include_directories() include some directories specific to your architecture when compiling the open62541 stack
-        #ua_architecture_remove_definitions() remove compiler flags from the general ../../CMakeLists.txt file that won't work with your architecture
-        #ua_architecture_add_definitions() add compiler flags that your architecture needs
-        #ua_architecture_append_to_library() add libraries to be linked to the open62541 that are needed by your architecture
-        #ua_add_architecture_header() add header files to compilation (Don't add the file ua_architecture.h)
-        #ua_add_architecture_file() add .c files to compilation    
-        
-    endif()
-    
-    # ---------------------------------------------------
-    # ---- End of the CMakeLists.txt template -----
-    # ---------------------------------------------------
-    ```
-5. Create a ua_clock.c file that implements the following functions defined in open62541/types.h:
-
-   * UA_DateTime UA_DateTime_now(void);
-   
-   * UA_Int64 UA_DateTime_localTimeUtcOffset(void);
-   
-   * UA_DateTime UA_DateTime_nowMonotonic(void);
-
-6. Create a file in the folder new_arch called ua_architecture.h
-
-7. Use the following template for it:  
-
-   * Change YEAR, YOUR_NAME and YOUR_COMPANY in the header
-   
-   * Change NEW_ARCH at the beginning in PLUGINS_ARCH_NEW_ARCH_UA_ARCHITECTURE_H_ for your own name in uppercase  
-   
-    ```C
-    /* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
-     * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
-     *
-     *    Copyright YEAR (c) YOUR_NAME, YOUR_COMPANY
-     */
-    
-    #ifndef PLUGINS_ARCH_NEW_ARCH_UA_ARCHITECTURE_H_
-    #define PLUGINS_ARCH_NEW_ARCH_UA_ARCHITECTURE_H_
-    
-    /*
-    * Define and include all that's needed for your architecture
-    */
-    
-    /*
-    * Define OPTVAL_TYPE for non windows systems. In doubt, use int //TODO: Is this really necessary
-    */
-    
-    /*
-    * Define the following network options
-    */
-    
-    
-    //#define UA_IPV6 1 //or 0
-    //#define UA_SOCKET
-    //#define UA_INVALID_SOCKET
-    //#define UA_ERRNO  
-    //#define UA_INTERRUPTED
-    //#define UA_AGAIN
-    //#define UA_EAGAIN
-    //#define UA_WOULDBLOCK
-    //#define UA_ERR_CONNECTION_PROGRESS
-    //#define UA_INTERRUPTED
-    
-    /*
-    * Define the ua_getnameinfo if your architecture supports it
-    */
-    
-    /*
-    * Use #define for the functions defined in ua_architecture_functions.h
-    * or implement them in a ua_architecture_functions.c file and 
-    * put it in your new_arch folder and add it in the CMakeLists.txt file 
-    * using ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-    */ 
-    
-    /*
-    * Define UA_LOG_SOCKET_ERRNO_WRAP(LOG) which prints the string error given a char* errno_str variable
-    * Do the same for UA_LOG_SOCKET_ERRNO_GAI_WRAP(LOG) for errors related to getaddrinfo
-    */
-    
-    #include <open62541/architecture_functions.h>
-    
-    #endif /* PLUGINS_ARCH_NEW_ARCH_UA_ARCHITECTURE_H_ */
-    
-    ```
diff --git a/ext/open62541/arch/common/ua_freeRTOS.h b/ext/open62541/arch/common/ua_freeRTOS.h
deleted file mode 100644
index 1cf4fd8..0000000
--- a/ext/open62541/arch/common/ua_freeRTOS.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifndef ARCH_COMMON_FREERTOS62541_H_
-#define ARCH_COMMON_FREERTOS62541_H_
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef BYTE_ORDER
-# undef BYTE_ORDER
-#endif
-
-#define UA_sleep_ms(X) vTaskDelay(pdMS_TO_TICKS(X))
-
-#ifdef OPEN62541_FEERTOS_USE_OWN_MEM
-# define UA_free vPortFree
-# define UA_malloc pvPortMalloc
-# define UA_calloc pvPortCalloc
-# define UA_realloc pvPortRealloc
-#else
-# define UA_free free
-# define UA_malloc malloc
-# define UA_calloc calloc
-# define UA_realloc realloc
-#endif
-
-#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE
-# ifndef UA_fileExists
-#  define UA_fileExists(X) (0) //file managing is not part of freeRTOS. If the system provides it, please define it before
-# endif // UA_fileExists
-#endif
-
-// No log colors on freeRTOS
-// #define UA_ENABLE_LOG_COLORS
-
-#include <stdio.h>
-#define UA_snprintf snprintf
-
-#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \
-    char *errno_str = ""; \
-    LOG; \
-}
-
-#endif /* ARCH_COMMON_FREERTOS62541_H_ */
diff --git a/ext/open62541/arch/common/ua_lwip.h b/ext/open62541/arch/common/ua_lwip.h
deleted file mode 100644
index ca611fe..0000000
--- a/ext/open62541/arch/common/ua_lwip.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifndef ARCH_COMMON_LWIP62541_H_
-#define ARCH_COMMON_LWIP62541_H_
-
-/*
- * Needed flags to be set before including this file. Normally done in lwipopts.h
- * #define LWIP_COMPAT_SOCKETS 0 // Don't do name define-transformation in networking function names.
- * #define LWIP_SOCKET 1 // Enable Socket API (normally already set)
- * #define LWIP_DNS 1 // enable the lwip_getaddrinfo function, struct addrinfo and more.
- * #define SO_REUSE 1 // Allows to set the socket as reusable
- * #define LWIP_TIMEVAL_PRIVATE 0 // This is optional. Set this flag if you get a compilation error about redefinition of struct timeval
- *
- * Why not define these here? This stack is used as middleware so other code might use this header file with other flags (specially LWIP_COMPAT_SOCKETS)
- */
-#include <lwip/tcpip.h>
-#include <lwip/netdb.h>
-#include <lwip/init.h>
-#include <lwip/sockets.h>
-
-#define OPTVAL_TYPE int
-
-#define UA_fd_set(fd, fds) FD_SET((unsigned int)fd, fds)
-#define UA_fd_isset(fd, fds) FD_ISSET((unsigned int)fd, fds)
-
-#define UA_IPV6 LWIP_IPV6
-#define UA_SOCKET int
-#define UA_INVALID_SOCKET -1
-#define UA_ERRNO errno
-#define UA_INTERRUPTED EINTR
-#define UA_AGAIN EAGAIN
-#define UA_EAGAIN EAGAIN
-#define UA_WOULDBLOCK EWOULDBLOCK
-#define UA_ERR_CONNECTION_PROGRESS EINPROGRESS
-
-#define UA_send lwip_send
-#define UA_recv lwip_recv
-#define UA_sendto lwip_sendto
-#define UA_recvfrom lwip_recvfrom
-#define UA_htonl lwip_htonl
-#define UA_ntohl lwip_ntohl
-#define UA_close lwip_close
-#define UA_select lwip_select
-#define UA_shutdown lwip_shutdown
-#define UA_socket lwip_socket
-#define UA_bind lwip_bind
-#define UA_listen lwip_listen
-#define UA_accept lwip_accept
-#define UA_connect lwip_connect
-#define UA_getsockopt lwip_getsockopt
-#define UA_setsockopt lwip_setsockopt
-#define UA_freeaddrinfo lwip_freeaddrinfo
-#define UA_gethostname gethostname_lwip
-#define UA_getsockname lwip_getsockname
-#define UA_getaddrinfo lwip_getaddrinfo
-
-#if UA_IPV6
-# define UA_inet_pton(af, src, dst) \
-    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \
-     : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0))
-#else
-# define UA_inet_pton(af, src, dst) \
-     (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)
-#endif
-
-#if UA_IPV6
-# define UA_if_nametoindex lwip_if_nametoindex
-
-# if LWIP_VERSION_IS_RELEASE //lwip_if_nametoindex is not yet released
-unsigned int lwip_if_nametoindex(const char *ifname);
-# endif
-#endif
-
-int gethostname_lwip(char* name, size_t len); //gethostname is not present in LwIP. We implement here a dummy. See ../freertosLWIP/ua_architecture_functions.c
-
-#define UA_LOG_SOCKET_ERRNO_GAI_WRAP UA_LOG_SOCKET_ERRNO_WRAP
-
-#endif /* ARCH_COMMON_LWIP62541_H_ */
diff --git a/ext/open62541/arch/eCos/CMakeLists.txt b/ext/open62541/arch/eCos/CMakeLists.txt
deleted file mode 100644
index 4c91e44..0000000
--- a/ext/open62541/arch/eCos/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\eCos)
-
-ua_add_architecture("eCos")
-
-
-list (FIND UA_AMALGAMATION_ARCHITECTURES "eCos" _index)
-if (${_index} GREATER -1 OR "${UA_ARCHITECTURE}" STREQUAL "eCos")
-
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-
-    if("${UA_ARCHITECTURE}" STREQUAL "eCos")
-
-        ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-        
-        set(UA_ECOS_HOSTNAME "eCos-host" CACHE STRING "Define a custom hostname/ip for the endpoint.")
-        ua_architecture_add_definitions(-DUA_ECOS_HOSTNAME="${UA_ECOS_HOSTNAME}")
-    endif()
-
-endif()
diff --git a/ext/open62541/arch/eCos/ua_architecture.h b/ext/open62541/arch/eCos/ua_architecture.h
deleted file mode 100644
index 649d80c..0000000
--- a/ext/open62541/arch/eCos/ua_architecture.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-#ifdef UA_ARCHITECTURE_ECOS
-
-#ifndef PLUGINS_ARCH_ECOS_UA_ARCHITECTURE_H_
-#define PLUGINS_ARCH_ECOS_UA_ARCHITECTURE_H_
-
-#include <pkgconf/system.h>
-#include <cyg/kernel/kapi.h>
-#include <cyg/io/io.h>
-
-#include <network.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <netinet/tcp.h>
-#include <stdlib.h>
-
-#define UA_sleep_ms(X) cyg_thread_delay(1 + ((1000 * X * CYGNUM_HAL_RTC_DENOMINATOR) / (CYGNUM_HAL_RTC_NUMERATOR / 1000)));
-
-#define OPTVAL_TYPE int
-
-#define UA_fd_set(fd, fds) FD_SET((unsigned int)fd, fds)
-#define UA_fd_isset(fd, fds) FD_ISSET((unsigned int)fd, fds)
-
-#define UA_access(x,y) 0
-
-#define UA_IPV6 1
-#define UA_SOCKET int
-#define UA_INVALID_SOCKET -1
-#define UA_ERRNO errno
-#define UA_INTERRUPTED EINTR
-#define UA_AGAIN EAGAIN
-#define UA_EAGAIN EAGAIN
-#define UA_WOULDBLOCK EWOULDBLOCK
-#define UA_ERR_CONNECTION_PROGRESS EINPROGRESS
-
-#define UA_getnameinfo getnameinfo
-#define UA_send send
-#define UA_recv recv
-#define UA_sendto sendto
-#define UA_recvfrom recvfrom
-#define UA_htonl htonl
-#define UA_ntohl ntohl
-#define UA_close close
-#define UA_select select
-#define UA_shutdown shutdown
-#define UA_socket socket
-#define UA_bind bind
-#define UA_listen listen
-#define UA_accept accept
-#define UA_connect connect
-#define UA_getaddrinfo getaddrinfo
-#define UA_getsockopt getsockopt
-#define UA_setsockopt setsockopt
-#define UA_freeaddrinfo freeaddrinfo
-#define UA_gethostname gethostname_ecos
-#define UA_getsockname getsockname
-#define UA_inet_pton(af,src,dst) inet_pton(af, src, (char*) dst)
-#if UA_IPV6
-# define UA_if_nametoindex if_nametoindex
-#endif
-
-int gethostname_ecos(char* name, size_t len);
-
-#define UA_free free
-#define UA_malloc malloc
-#define UA_calloc calloc
-#define UA_realloc realloc
-
-#define UA_snprintf snprintf
-
-#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \
-    char *errno_str = strerror(errno); \
-    LOG; \
-}
-#define UA_LOG_SOCKET_ERRNO_GAI_WRAP(LOG) { \
-    const char *errno_str = gai_strerror(errno); \
-    LOG; \
-}
-
-#if UA_MULTITHREADING >= 100
-#error Multithreading unsupported
-#else
-#define UA_LOCK_TYPE_NAME
-#define UA_LOCK_TYPE(mutexName)
-#define UA_LOCK_TYPE_POINTER(mutexName)
-#define UA_LOCK_INIT(mutexName)
-#define UA_LOCK_DESTROY(mutexName)
-#define UA_LOCK(mutexName)
-#define UA_UNLOCK(mutexName)
-#define UA_LOCK_ASSERT(mutexName, num)
-#endif
-
-#include <open62541/architecture_functions.h>
-
-#endif /* PLUGINS_ARCH_ECOS_UA_ARCHITECTURE_H_ */
-
-#endif /* UA_ARCHITECTURE_ECOS */
diff --git a/ext/open62541/arch/eCos/ua_architecture_functions.c b/ext/open62541/arch/eCos/ua_architecture_functions.c
deleted file mode 100644
index 6f9961b..0000000
--- a/ext/open62541/arch/eCos/ua_architecture_functions.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_ECOS
-
-#include <open62541/types.h>
-
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
-  int on = 0;
-  if(ioctl(sockfd, FIONBIO, &on) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){
-  int on = 1;
-  if(ioctl(sockfd, FIONBIO, &on) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-void UA_initialize_architecture_network(void){
-  return;
-}
-
-void UA_deinitialize_architecture_network(void){
-  return;
-}
-
-int gethostname_ecos(char* name, size_t len){
-  if(strlen(UA_ECOS_HOSTNAME) > (len))
-    return -1;
-  strcpy(name, UA_ECOS_HOSTNAME);
-  return 0;
-}
-
-#endif /* UA_ARCHITECTURE_ECOS */
diff --git a/ext/open62541/arch/eCos/ua_clock.c b/ext/open62541/arch/eCos/ua_clock.c
deleted file mode 100644
index 6a2cb5c..0000000
--- a/ext/open62541/arch/eCos/ua_clock.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_ECOS
-
-#include <open62541/types.h>
-
-UA_DateTime UA_DateTime_now(void) {
-  return UA_DateTime_nowMonotonic();
-}
-
-/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */
-UA_Int64 UA_DateTime_localTimeUtcOffset(void){
-  time_t gmt, rawtime = time(NULL);
-  struct tm *ptm;
-  struct tm gbuf;
-  ptm = gmtime_r(&rawtime, &gbuf);
-  // Request that mktime() looksup dst in timezone database
-  ptm->tm_isdst = -1;
-  gmt = mktime(ptm);
-  return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC);
-}
-
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-
-  cyg_tick_count_t TaskTime = cyg_current_time();
-
-  UA_DateTimeStruct UATime;
-  UATime.milliSec = (UA_UInt16) TaskTime;
-  struct timespec ts;
-  ts.tv_sec = UATime.milliSec / 1000;
-  ts.tv_nsec = (UATime.milliSec % 1000) * 1000000;
-  return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100) + UA_DATETIME_UNIX_EPOCH;
-}
-
-#endif /* UA_ARCHITECTURE_ECOS */
diff --git a/ext/open62541/arch/freertosLWIP/CMakeLists.txt b/ext/open62541/arch/freertosLWIP/CMakeLists.txt
deleted file mode 100644
index 00a50e0..0000000
--- a/ext/open62541/arch/freertosLWIP/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\freertosLWIP)
-
-ua_add_architecture("freertosLWIP")
-
-list (FIND UA_AMALGAMATION_ARCHITECTURES "freertosLWIP" _index)
-if (${_index} GREATER -1 OR "${UA_ARCHITECTURE}" STREQUAL "freertosLWIP")
-
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-
-    if("${UA_ARCHITECTURE}" STREQUAL "freertosLWIP")
-        ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-        ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common)
-        set(UA_ARCH_FREERTOS_USE_OWN_MEMORY_FUNCTIONS OFF CACHE BOOL "Enable free/malloc/etc from own implementation")
-        if(UA_ARCH_FREERTOS_USE_OWN_MEMORY_FUNCTIONS)
-          ua_architecture_add_definitions("-DOPEN62541_FEERTOS_USE_OWN_MEM")
-        endif(UA_ARCH_FREERTOS_USE_OWN_MEMORY_FUNCTIONS)
-        ua_add_architecture_header_beginning(${CMAKE_CURRENT_SOURCE_DIR}/../common/ua_freeRTOS.h
-                                             ${CMAKE_CURRENT_SOURCE_DIR}/../common/ua_lwip.h
-                                             )
-    endif()
-endif()
diff --git a/ext/open62541/arch/freertosLWIP/ua_architecture.h b/ext/open62541/arch/freertosLWIP/ua_architecture.h
deleted file mode 100644
index 3b2d068..0000000
--- a/ext/open62541/arch/freertosLWIP/ua_architecture.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_FREERTOSLWIP
-
-#ifndef PLUGINS_ARCH_FREERTOSLWIP_UA_ARCHITECTURE_H_
-#define PLUGINS_ARCH_FREERTOSLWIP_UA_ARCHITECTURE_H_
-
-#include "ua_lwip.h"
-#include "ua_freeRTOS.h"
-
-#if UA_MULTITHREADING >= 100
-#error Multithreading unsupported
-#else
-#define UA_LOCK_TYPE_NAME
-#define UA_LOCK_TYPE(mutexName)
-#define UA_LOCK_TYPE_POINTER(mutexName)
-#define UA_LOCK_INIT(mutexName)
-#define UA_LOCK_DESTROY(mutexName)
-#define UA_LOCK(mutexName)
-#define UA_UNLOCK(mutexName)
-#define UA_LOCK_ASSERT(mutexName, num)
-#endif
-
-#include <open62541/architecture_functions.h>
-
-#endif /* PLUGINS_ARCH_FREERTOSLWIP_UA_ARCHITECTURE_H_ */
-
-#endif /* UA_ARCHITECTURE_FREERTOSLWIP */
diff --git a/ext/open62541/arch/freertosLWIP/ua_architecture_functions.c b/ext/open62541/arch/freertosLWIP/ua_architecture_functions.c
deleted file mode 100644
index 37e1d93..0000000
--- a/ext/open62541/arch/freertosLWIP/ua_architecture_functions.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- *    Copyright 2018 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_FREERTOSLWIP
-
-#include <open62541/types.h>
-
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
-  int on = 0;
-  if(lwip_ioctl(sockfd, FIONBIO, &on) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){
-  int on = 1;
-  if(lwip_ioctl(sockfd, FIONBIO, &on) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-int gethostname_lwip(char* name, size_t len){
-  // use UA_ServerConfig_set_customHostname to set your hostname as the IP
-  return -1;
-}
-
-void UA_initialize_architecture_network(void){
-  return;
-}
-
-void UA_deinitialize_architecture_network(void){
-  return;
-}
-
-#if UA_IPV6
-# if LWIP_VERSION_IS_RELEASE //lwip_if_nametoindex is not yet released
-unsigned int lwip_if_nametoindex(const char *ifname){
-  return 1; //TODO: assume for now that it only has one interface
-}
-# endif //LWIP_VERSION_IS_RELEASE
-#endif //UA_IPV6
-
-#endif /* UA_ARCHITECTURE_FREERTOSLWIP */
diff --git a/ext/open62541/arch/freertosLWIP/ua_clock.c b/ext/open62541/arch/freertosLWIP/ua_clock.c
deleted file mode 100644
index 0d4fe9f..0000000
--- a/ext/open62541/arch/freertosLWIP/ua_clock.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Stalder
- */
-
-#ifdef UA_ARCHITECTURE_FREERTOSLWIP
-
-#include <open62541/types.h>
-#include <task.h>
-
-/* The current time in UTC time */
-UA_DateTime UA_DateTime_now(void) {
-  UA_DateTime microSeconds = ((UA_DateTime)xTaskGetTickCount()) * (1000000 / configTICK_RATE_HZ);
-  return ((microSeconds / 1000000) * UA_DATETIME_SEC) + ((microSeconds % 1000000) * UA_DATETIME_USEC) + UA_DATETIME_UNIX_EPOCH;
-}
-
-/* Offset between local time and UTC time */
-UA_Int64 UA_DateTime_localTimeUtcOffset(void) {
-  return 0; //TODO: this is set to zero since UA_DateTime_now() is just the local time, and not UTC.
-}
-
-/* CPU clock invariant to system time changes. Use only to measure durations,
- * not absolute time. */
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-  return (((UA_DateTime)xTaskGetTickCount()) * 1000 / configTICK_RATE_HZ) * UA_DATETIME_MSEC;
-}
-
-#endif /* UA_ARCHITECTURE_FREERTOSLWIP */
diff --git a/ext/open62541/arch/network_tcp.c b/ext/open62541/arch/network_tcp.c
deleted file mode 100644
index 05cc479..0000000
--- a/ext/open62541/arch/network_tcp.c
+++ /dev/null
@@ -1,1034 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Jose Cabral
- *    Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#define UA_INTERNAL
-
-#include <open62541/network_tcp.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/util.h>
-
-#include "open62541_queue.h"
-
-#include <string.h>  // memset
-
-#ifndef MSG_NOSIGNAL
-#define MSG_NOSIGNAL 0
-#endif
-
-/****************************/
-/* Generic Socket Functions */
-/****************************/
-
-static UA_StatusCode
-connection_getsendbuffer(UA_Connection *connection,
-                         size_t length, UA_ByteString *buf) {
-    if(length > connection->config.sendBufferSize)
-        return UA_STATUSCODE_BADCOMMUNICATIONERROR;
-    return UA_ByteString_allocBuffer(buf, length);
-}
-
-static void
-connection_releasesendbuffer(UA_Connection *connection,
-                             UA_ByteString *buf) {
-    UA_ByteString_deleteMembers(buf);
-}
-
-static void
-connection_releaserecvbuffer(UA_Connection *connection,
-                             UA_ByteString *buf) {
-    UA_ByteString_deleteMembers(buf);
-}
-
-static UA_StatusCode
-connection_write(UA_Connection *connection, UA_ByteString *buf) {
-    if(connection->state == UA_CONNECTION_CLOSED) {
-        UA_ByteString_deleteMembers(buf);
-        return UA_STATUSCODE_BADCONNECTIONCLOSED;
-    }
-
-    /* Prevent OS signals when sending to a closed socket */
-    int flags = 0;
-    flags |= MSG_NOSIGNAL;
-
-    /* Send the full buffer. This may require several calls to send */
-    size_t nWritten = 0;
-    do {
-        ssize_t n = 0;
-        do {
-            size_t bytes_to_send = buf->length - nWritten;
-            n = UA_send(connection->sockfd,
-                     (const char*)buf->data + nWritten,
-                     bytes_to_send, flags);
-            if(n < 0 && UA_ERRNO != UA_INTERRUPTED && UA_ERRNO != UA_AGAIN) {
-                connection->close(connection);
-                UA_ByteString_deleteMembers(buf);
-                return UA_STATUSCODE_BADCONNECTIONCLOSED;
-            }
-        } while(n < 0);
-        nWritten += (size_t)n;
-    } while(nWritten < buf->length);
-
-    /* Free the buffer */
-    UA_ByteString_deleteMembers(buf);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-connection_recv(UA_Connection *connection, UA_ByteString *response,
-                UA_UInt32 timeout) {
-    if(connection->state == UA_CONNECTION_CLOSED)
-        return UA_STATUSCODE_BADCONNECTIONCLOSED;
-
-    /* Listen on the socket for the given timeout until a message arrives */
-    if(timeout > 0) {
-        fd_set fdset;
-        FD_ZERO(&fdset);
-        UA_fd_set(connection->sockfd, &fdset);
-        UA_UInt32 timeout_usec = timeout * 1000;
-        struct timeval tmptv = {(long int)(timeout_usec / 1000000),
-                                (int)(timeout_usec % 1000000)};
-        int resultsize = UA_select(connection->sockfd+1, &fdset, NULL,
-                                NULL, &tmptv);
-
-        /* No result */
-        if(resultsize == 0)
-            return UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-        if(resultsize == -1) {
-            /* The call to select was interrupted manually. Act as if it timed
-             * out */
-            if(UA_ERRNO == EINTR)
-                return UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-            /* The error cannot be recovered. Close the connection. */
-            connection->close(connection);
-            return UA_STATUSCODE_BADCONNECTIONCLOSED;
-        }
-    }
-
-    response->data = (UA_Byte*)UA_malloc(connection->config.recvBufferSize);
-    if(!response->data) {
-        response->length = 0;
-        return UA_STATUSCODE_BADOUTOFMEMORY; /* not enough memory retry */
-    }
-
-#ifdef _WIN32
-    // windows requires int parameter for length
-    int offset = (int)connection->incompleteChunk.length;
-    int remaining = connection->config.recvBufferSize - offset;
-#else
-    size_t offset = connection->incompleteChunk.length;
-    size_t remaining = connection->config.recvBufferSize - offset;
-#endif
-
-    /* Get the received packet(s) */
-    ssize_t ret = UA_recv(connection->sockfd, (char*)&response->data[offset],
-                          remaining, 0);
-
-    /* The remote side closed the connection */
-    if(ret == 0) {
-        UA_ByteString_deleteMembers(response);
-        connection->close(connection);
-        return UA_STATUSCODE_BADCONNECTIONCLOSED;
-    }
-
-    /* Error case */
-    if(ret < 0) {
-        UA_ByteString_deleteMembers(response);
-        if(UA_ERRNO == UA_INTERRUPTED || (timeout > 0) ?
-           false : (UA_ERRNO == UA_EAGAIN || UA_ERRNO == UA_WOULDBLOCK))
-            return UA_STATUSCODE_GOOD; /* statuscode_good but no data -> retry */
-        connection->close(connection);
-        return UA_STATUSCODE_BADCONNECTIONCLOSED;
-    }
-
-    /* Preprend the last incompleteChunk into the buffer */
-    if (connection->incompleteChunk.length > 0) {
-        memcpy(response->data, connection->incompleteChunk.data,
-               connection->incompleteChunk.length);
-        UA_ByteString_deleteMembers(&connection->incompleteChunk);
-    }
-
-    /* Set the length of the received buffer */
-    response->length = offset + (size_t)ret;
-    return UA_STATUSCODE_GOOD;
-}
-
-
-/***************************/
-/* Server NetworkLayer TCP */
-/***************************/
-
-#define MAXBACKLOG     100
-#define NOHELLOTIMEOUT 120000 /* timeout in ms before close the connection
-                               * if server does not receive Hello Message */
-
-typedef struct ConnectionEntry {
-    UA_Connection connection;
-    LIST_ENTRY(ConnectionEntry) pointers;
-} ConnectionEntry;
-
-typedef struct {
-    const UA_Logger *logger;
-    UA_UInt16 port;
-    UA_SOCKET serverSockets[FD_SETSIZE];
-    UA_UInt16 serverSocketsSize;
-    LIST_HEAD(, ConnectionEntry) connections;
-} ServerNetworkLayerTCP;
-
-static void
-ServerNetworkLayerTCP_freeConnection(UA_Connection *connection) {
-    UA_Connection_deleteMembers(connection);
-    UA_free(connection);
-}
-
-/* This performs only 'shutdown'. 'close' is called when the shutdown
- * socket is returned from select. */
-static void
-ServerNetworkLayerTCP_close(UA_Connection *connection) {
-    if (connection->state == UA_CONNECTION_CLOSED)
-        return;
-    UA_shutdown((UA_SOCKET)connection->sockfd, 2);
-    connection->state = UA_CONNECTION_CLOSED;
-}
-
-static UA_StatusCode
-ServerNetworkLayerTCP_add(UA_ServerNetworkLayer *nl, ServerNetworkLayerTCP *layer,
-                          UA_Int32 newsockfd, struct sockaddr_storage *remote) {
-    /* Set nonblocking */
-    UA_socket_set_nonblocking(newsockfd);//TODO: check return value
-
-    /* Do not merge packets on the socket (disable Nagle's algorithm) */
-    int dummy = 1;
-    if(UA_setsockopt(newsockfd, IPPROTO_TCP, TCP_NODELAY,
-               (const char *)&dummy, sizeof(dummy)) < 0) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-                UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK,
-                             "Cannot set socket option TCP_NODELAY. Error: %s",
-                             errno_str));
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-#if defined(UA_getnameinfo)
-    /* Get the peer name for logging */
-    char remote_name[100];
-    int res = UA_getnameinfo((struct sockaddr*)remote,
-                          sizeof(struct sockaddr_storage),
-                          remote_name, sizeof(remote_name),
-                          NULL, 0, NI_NUMERICHOST);
-    if(res == 0) {
-        UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                    "Connection %i | New connection over TCP from %s",
-                    (int)newsockfd, remote_name);
-    } else {
-        UA_LOG_SOCKET_ERRNO_WRAP(UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                                                "Connection %i | New connection over TCP, "
-                                                "getnameinfo failed with error: %s",
-                                                (int)newsockfd, errno_str));
-    }
-#else
-    UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                "Connection %i | New connection over TCP",
-                (int)newsockfd);
-#endif
-    /* Allocate and initialize the connection */
-    ConnectionEntry *e = (ConnectionEntry*)UA_malloc(sizeof(ConnectionEntry));
-    if(!e){
-        UA_close(newsockfd);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    UA_Connection *c = &e->connection;
-    memset(c, 0, sizeof(UA_Connection));
-    c->sockfd = newsockfd;
-    c->handle = layer;
-    c->config = nl->localConnectionConfig;
-    c->send = connection_write;
-    c->close = ServerNetworkLayerTCP_close;
-    c->free = ServerNetworkLayerTCP_freeConnection;
-    c->getSendBuffer = connection_getsendbuffer;
-    c->releaseSendBuffer = connection_releasesendbuffer;
-    c->releaseRecvBuffer = connection_releaserecvbuffer;
-    c->state = UA_CONNECTION_OPENING;
-    c->openingDate = UA_DateTime_nowMonotonic();
-
-    /* Add to the linked list */
-    LIST_INSERT_HEAD(&layer->connections, e, pointers);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-addServerSocket(ServerNetworkLayerTCP *layer, struct addrinfo *ai) {
-    /* Create the server socket */
-    UA_SOCKET newsock = UA_socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
-    if(newsock == UA_INVALID_SOCKET)
-    {
-        UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                       "Error opening the server socket");
-        return;
-    }
-
-    /* Some Linux distributions have net.ipv6.bindv6only not activated. So
-     * sockets can double-bind to IPv4 and IPv6. This leads to problems. Use
-     * AF_INET6 sockets only for IPv6. */
-
-    int optval = 1;
-#if UA_IPV6
-    if(ai->ai_family == AF_INET6 &&
-       UA_setsockopt(newsock, IPPROTO_IPV6, IPV6_V6ONLY,
-                  (const char*)&optval, sizeof(optval)) == -1) {
-        UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not set an IPv6 socket to IPv6 only");
-        UA_close(newsock);
-        return;
-    }
-#endif
-    if(UA_setsockopt(newsock, SOL_SOCKET, SO_REUSEADDR,
-                  (const char *)&optval, sizeof(optval)) == -1) {
-        UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not make the socket reusable");
-        UA_close(newsock);
-        return;
-    }
-
-
-    if(UA_socket_set_nonblocking(newsock) != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not set the server socket to nonblocking");
-        UA_close(newsock);
-        return;
-    }
-
-    /* Bind socket to address */
-    if(UA_bind(newsock, ai->ai_addr, (socklen_t)ai->ai_addrlen) < 0) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-            UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                           "Error binding a server socket: %s", errno_str));
-        UA_close(newsock);
-        return;
-    }
-
-    /* Start listening */
-    if(UA_listen(newsock, MAXBACKLOG) < 0) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-                UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK,
-                       "Error listening on server socket: %s", errno_str));
-        UA_close(newsock);
-        return;
-    }
-
-    if (layer->port == 0) {
-        /* Port was automatically chosen. Read it from the OS */
-        struct sockaddr_in returned_addr;
-        memset(&returned_addr, 0, sizeof(returned_addr));
-        socklen_t len = sizeof(returned_addr);
-        UA_getsockname(newsock, (struct sockaddr *)&returned_addr, &len);
-        layer->port = ntohs(returned_addr.sin_port);
-    }
-
-    layer->serverSockets[layer->serverSocketsSize] = newsock;
-    layer->serverSocketsSize++;
-}
-
-static UA_StatusCode
-ServerNetworkLayerTCP_start(UA_ServerNetworkLayer *nl, const UA_String *customHostname) {
-  UA_initialize_architecture_network();
-
-    ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle;
-
-    /* Get addrinfo of the server and create server sockets */
-    char portno[6];
-    UA_snprintf(portno, 6, "%d", layer->port);
-    struct addrinfo hints, *res;
-    memset(&hints, 0, sizeof hints);
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-    hints.ai_flags = AI_PASSIVE;
-    hints.ai_protocol = IPPROTO_TCP;
-    if(UA_getaddrinfo(NULL, portno, &hints, &res) != 0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* There might be serveral addrinfos (for different network cards,
-     * IPv4/IPv6). Add a server socket for all of them. */
-    struct addrinfo *ai = res;
-    for(layer->serverSocketsSize = 0;
-        layer->serverSocketsSize < FD_SETSIZE && ai != NULL;
-        ai = ai->ai_next)
-        addServerSocket(layer, ai);
-    UA_freeaddrinfo(res);
-
-    /* Get the discovery url from the hostname */
-    UA_String du = UA_STRING_NULL;
-    char discoveryUrlBuffer[256];
-    if (customHostname->length) {
-        du.length = (size_t)UA_snprintf(discoveryUrlBuffer, 255, "opc.tcp://%.*s:%d/",
-                                        (int)customHostname->length,
-                                        customHostname->data,
-                                        layer->port);
-        du.data = (UA_Byte*)discoveryUrlBuffer;
-    }else{
-        char hostnameBuffer[256];
-        if(UA_gethostname(hostnameBuffer, 255) == 0) {
-            du.length = (size_t)UA_snprintf(discoveryUrlBuffer, 255, "opc.tcp://%s:%d/",
-                                            hostnameBuffer, layer->port);
-            du.data = (UA_Byte*)discoveryUrlBuffer;
-        } else {
-            UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK, "Could not get the hostname");
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-    }
-    UA_String_copy(&du, &nl->discoveryUrl);
-
-    UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                "TCP network layer listening on %.*s",
-                (int)nl->discoveryUrl.length, nl->discoveryUrl.data);
-    return UA_STATUSCODE_GOOD;
-}
-
-/* After every select, reset the sockets to listen on */
-static UA_Int32
-setFDSet(ServerNetworkLayerTCP *layer, fd_set *fdset) {
-    FD_ZERO(fdset);
-    UA_Int32 highestfd = 0;
-    for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) {
-        UA_fd_set(layer->serverSockets[i], fdset);
-        if((UA_Int32)layer->serverSockets[i] > highestfd)
-            highestfd = (UA_Int32)layer->serverSockets[i];
-    }
-
-    ConnectionEntry *e;
-    LIST_FOREACH(e, &layer->connections, pointers) {
-        UA_fd_set(e->connection.sockfd, fdset);
-        if((UA_Int32)e->connection.sockfd > highestfd)
-            highestfd = (UA_Int32)e->connection.sockfd;
-    }
-
-    return highestfd;
-}
-
-static UA_StatusCode
-ServerNetworkLayerTCP_listen(UA_ServerNetworkLayer *nl, UA_Server *server,
-                             UA_UInt16 timeout) {
-    /* Every open socket can generate two jobs */
-    ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle;
-
-    if (layer->serverSocketsSize == 0)
-        return UA_STATUSCODE_GOOD;
-
-    /* Listen on open sockets (including the server) */
-    fd_set fdset, errset;
-    UA_Int32 highestfd = setFDSet(layer, &fdset);
-    setFDSet(layer, &errset);
-    struct timeval tmptv = {0, timeout * 1000};
-    if (UA_select(highestfd+1, &fdset, NULL, &errset, &tmptv) < 0) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-            UA_LOG_DEBUG(layer->logger, UA_LOGCATEGORY_NETWORK,
-                           "Socket select failed with %s", errno_str));
-        // we will retry, so do not return bad
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Accept new connections via the server sockets */
-    for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) {
-        if(!UA_fd_isset(layer->serverSockets[i], &fdset))
-            continue;
-
-        struct sockaddr_storage remote;
-        socklen_t remote_size = sizeof(remote);
-        UA_SOCKET newsockfd = UA_accept((UA_SOCKET)layer->serverSockets[i],
-                                  (struct sockaddr*)&remote, &remote_size);
-        if(newsockfd == UA_INVALID_SOCKET)
-            continue;
-
-        UA_LOG_TRACE(layer->logger, UA_LOGCATEGORY_NETWORK,
-                    "Connection %i | New TCP connection on server socket %i",
-                    (int)newsockfd, (int)(layer->serverSockets[i]));
-
-        ServerNetworkLayerTCP_add(nl, layer, (UA_Int32)newsockfd, &remote);
-    }
-
-    /* Read from established sockets */
-    ConnectionEntry *e, *e_tmp;
-    UA_DateTime now = UA_DateTime_nowMonotonic();
-    LIST_FOREACH_SAFE(e, &layer->connections, pointers, e_tmp) {
-        if ((e->connection.state == UA_CONNECTION_OPENING) &&
-            (now > (e->connection.openingDate + (NOHELLOTIMEOUT * UA_DATETIME_MSEC)))){
-            UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                        "Connection %i | Closed by the server (no Hello Message)",
-                         (int)(e->connection.sockfd));
-            LIST_REMOVE(e, pointers);
-            UA_close(e->connection.sockfd);
-            UA_Server_removeConnection(server, &e->connection);
-            continue;
-        }
-
-        if(!UA_fd_isset(e->connection.sockfd, &errset) &&
-           !UA_fd_isset(e->connection.sockfd, &fdset))
-          continue;
-
-        UA_LOG_TRACE(layer->logger, UA_LOGCATEGORY_NETWORK,
-                    "Connection %i | Activity on the socket",
-                    (int)(e->connection.sockfd));
-
-        UA_ByteString buf = UA_BYTESTRING_NULL;
-        UA_StatusCode retval = connection_recv(&e->connection, &buf, 0);
-
-        if(retval == UA_STATUSCODE_GOOD) {
-            /* Process packets */
-            UA_Server_processBinaryMessage(server, &e->connection, &buf);
-            connection_releaserecvbuffer(&e->connection, &buf);
-        } else if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) {
-            /* The socket is shutdown but not closed */
-            UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                        "Connection %i | Closed",
-                        (int)(e->connection.sockfd));
-            LIST_REMOVE(e, pointers);
-            UA_close(e->connection.sockfd);
-            UA_Server_removeConnection(server, &e->connection);
-        }
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-ServerNetworkLayerTCP_stop(UA_ServerNetworkLayer *nl, UA_Server *server) {
-    ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle;
-    UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                "Shutting down the TCP network layer");
-
-    /* Close the server sockets */
-    for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) {
-        UA_shutdown(layer->serverSockets[i], 2);
-        UA_close(layer->serverSockets[i]);
-    }
-    layer->serverSocketsSize = 0;
-
-    /* Close open connections */
-    ConnectionEntry *e;
-    LIST_FOREACH(e, &layer->connections, pointers)
-        ServerNetworkLayerTCP_close(&e->connection);
-
-    /* Run recv on client sockets. This picks up the closed sockets and frees
-     * the connection. */
-    ServerNetworkLayerTCP_listen(nl, server, 0);
-
-    UA_deinitialize_architecture_network();
-}
-
-/* run only when the server is stopped */
-static void
-ServerNetworkLayerTCP_deleteMembers(UA_ServerNetworkLayer *nl) {
-    ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle;
-    UA_String_deleteMembers(&nl->discoveryUrl);
-
-    /* Hard-close and remove remaining connections. The server is no longer
-     * running. So this is safe. */
-    ConnectionEntry *e, *e_tmp;
-    LIST_FOREACH_SAFE(e, &layer->connections, pointers, e_tmp) {
-        LIST_REMOVE(e, pointers);
-        UA_close(e->connection.sockfd);
-        UA_free(e);
-    }
-
-    /* Free the layer */
-    UA_free(layer);
-}
-
-UA_ServerNetworkLayer
-UA_ServerNetworkLayerTCP(UA_ConnectionConfig config, UA_UInt16 port,
-                         UA_Logger *logger) {
-    UA_ServerNetworkLayer nl;
-    memset(&nl, 0, sizeof(UA_ServerNetworkLayer));
-    nl.deleteMembers = ServerNetworkLayerTCP_deleteMembers;
-    nl.localConnectionConfig = config;
-    nl.start = ServerNetworkLayerTCP_start;
-    nl.listen = ServerNetworkLayerTCP_listen;
-    nl.stop = ServerNetworkLayerTCP_stop;
-    nl.handle = NULL;
-
-    ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP*)
-        UA_calloc(1,sizeof(ServerNetworkLayerTCP));
-    if(!layer)
-        return nl;
-    nl.handle = layer;
-
-    layer->logger = logger;
-    layer->port = port;
-
-    return nl;
-}
-
-typedef struct TCPClientConnection {
-    struct addrinfo hints, *server;
-    UA_DateTime connStart;
-    char* endpointURL;
-    UA_UInt32 timeout;
-} TCPClientConnection;
-
-/***************************/
-/* Client NetworkLayer TCP */
-/***************************/
-
-static void
-ClientNetworkLayerTCP_close(UA_Connection *connection) {
-    if (connection->state == UA_CONNECTION_CLOSED)
-        return;
-
-    if(connection->sockfd != UA_INVALID_SOCKET) {
-        UA_shutdown(connection->sockfd, 2);
-        UA_close(connection->sockfd);
-    }
-    connection->state = UA_CONNECTION_CLOSED;
-}
-
-static void
-ClientNetworkLayerTCP_free(UA_Connection *connection) {
-    if(connection->handle) {
-        TCPClientConnection *tcpConnection = (TCPClientConnection *)connection->handle;
-        if(tcpConnection->server)
-            UA_freeaddrinfo(tcpConnection->server);
-        UA_free(tcpConnection);
-        connection->handle = NULL;
-    }
-}
-
-UA_StatusCode UA_ClientConnectionTCP_poll(UA_Client *client, void *data) {
-    UA_Connection *connection = (UA_Connection*) data;
-
-    if (connection->state == UA_CONNECTION_CLOSED)
-        return UA_STATUSCODE_BADDISCONNECT;
-
-    TCPClientConnection *tcpConnection =
-                    (TCPClientConnection*) connection->handle;
-
-    UA_DateTime connStart = UA_DateTime_nowMonotonic();
-    UA_SOCKET clientsockfd = connection->sockfd;
-
-    UA_ClientConfig *config = UA_Client_getConfig(client);
-
-    if (connection->state == UA_CONNECTION_ESTABLISHED) {
-            UA_Client_removeRepeatedCallback(client, connection->connectCallbackID);
-            connection->connectCallbackID = 0;
-            return UA_STATUSCODE_GOOD;
-    }
-    if ((UA_Double) (UA_DateTime_nowMonotonic() - tcpConnection->connStart)
-                    > tcpConnection->timeout* UA_DATETIME_MSEC ) {
-            // connection timeout
-            ClientNetworkLayerTCP_close(connection);
-            UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK,
-                            "Timed out");
-            return UA_STATUSCODE_BADDISCONNECT;
-
-    }
-    /* On linux connect may immediately return with ECONNREFUSED but we still want to try to connect */
-    /* Thus use a loop and retry until timeout is reached */
-
-    /* Get a socket */
-    if(clientsockfd <= 0) {
-        clientsockfd = UA_socket(tcpConnection->server->ai_family,
-                                 tcpConnection->server->ai_socktype,
-                                 tcpConnection->server->ai_protocol);
-        connection->sockfd = (UA_Int32)clientsockfd; /* cast for win32 */
-    }
-
-    if(clientsockfd == UA_INVALID_SOCKET) {
-        UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not create client socket: %s", strerror(UA_ERRNO));
-        ClientNetworkLayerTCP_close(connection);
-        return UA_STATUSCODE_BADDISCONNECT;
-    }
-
-    /* Non blocking connect to be able to timeout */
-    if(UA_socket_set_nonblocking(clientsockfd) != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not set the client socket to nonblocking");
-        ClientNetworkLayerTCP_close(connection);
-        return UA_STATUSCODE_BADDISCONNECT;
-    }
-
-    /* Non blocking connect */
-    int error = UA_connect(clientsockfd, tcpConnection->server->ai_addr,
-                    tcpConnection->server->ai_addrlen);
-
-    if ((error == -1) && (UA_ERRNO != UA_ERR_CONNECTION_PROGRESS)) {
-            ClientNetworkLayerTCP_close(connection);
-            UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK,
-                           "Connection to  failed with error: %s", strerror(UA_ERRNO));
-            return UA_STATUSCODE_BADDISCONNECT;
-    }
-
-    /* Use select to wait and check if connected */
-    if (error == -1 && (UA_ERRNO == UA_ERR_CONNECTION_PROGRESS)) {
-        /* connection in progress. Wait until connected using select */
-
-        UA_UInt32 timeSinceStart = (UA_UInt32)
-            ((UA_Double) (UA_DateTime_nowMonotonic() - connStart) / UA_DATETIME_MSEC);
-#ifdef _OS9000
-        /* OS-9 can't use select for checking write sockets.
-         * Therefore, we need to use connect until success or failed
-         */
-        UA_UInt32 timeout_usec = (tcpConnection->timeout - timeSinceStart)
-                        * 1000;
-        int resultsize = 0;
-        do {
-            u_int32 time = 0x80000001;
-            signal_code sig;
-
-            timeout_usec -= 1000000/256;    // Sleep 1/256 second
-            if (timeout_usec < 0)
-                break;
-
-            _os_sleep(&time,&sig);
-            error = connect(clientsockfd, tcpConnection->server->ai_addr,
-                        tcpConnection->server->ai_addrlen);
-            if ((error == -1 && UA_ERRNO == EISCONN) || (error == 0))
-                resultsize = 1;
-            if (error == -1 && UA_ERRNO != EALREADY && UA_ERRNO != EINPROGRESS)
-                break;
-        }
-        while(resultsize == 0);
-#else
-        fd_set fdset;
-        FD_ZERO(&fdset);
-        UA_fd_set(clientsockfd, &fdset);
-        UA_UInt32 timeout_usec = (tcpConnection->timeout - timeSinceStart)
-                        * 1000;
-        struct timeval tmptv = { (long int) (timeout_usec / 1000000),
-                        (int) (timeout_usec % 1000000) };
-
-        int resultsize = UA_select((UA_Int32) (clientsockfd + 1), NULL, &fdset,
-        NULL, &tmptv);
-#endif
-        if (resultsize == 1) {
-            /* Windows does not have any getsockopt equivalent and it is not needed there */
-#ifdef _WIN32
-            connection->sockfd = clientsockfd;
-            connection->state = UA_CONNECTION_ESTABLISHED;
-            return UA_STATUSCODE_GOOD;
-#else
-            OPTVAL_TYPE so_error;
-            socklen_t len = sizeof so_error;
-
-            int ret = UA_getsockopt(clientsockfd, SOL_SOCKET, SO_ERROR, &so_error,
-                            &len);
-
-            if (ret != 0 || so_error != 0) {
-                /* on connection refused we should still try to connect */
-                /* connection refused happens on localhost or local ip without timeout */
-                if (so_error != ECONNREFUSED) {
-                        // general error
-                        ClientNetworkLayerTCP_close(connection);
-                        UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK,
-                                        "Connection to failed with error: %s",
-                                        strerror(ret == 0 ? so_error : UA_ERRNO));
-                        return UA_STATUSCODE_BADDISCONNECT;
-                }
-                /* wait until we try a again. Do not make this too small, otherwise the
-                 * timeout is somehow wrong */
-
-            } else {
-                connection->state = UA_CONNECTION_ESTABLISHED;
-                return UA_STATUSCODE_GOOD;
-            }
-#endif
-        }
-    } else {
-        connection->state = UA_CONNECTION_ESTABLISHED;
-        return UA_STATUSCODE_GOOD;
-    }
-
-#ifdef SO_NOSIGPIPE
-    int val = 1;
-    int sso_result = setsockopt(connection->sockfd, SOL_SOCKET,
-                    SO_NOSIGPIPE, (void*)&val, sizeof(val));
-    if(sso_result < 0)
-    UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK,
-                    "Couldn't set SO_NOSIGPIPE");
-#endif
-
-    return UA_STATUSCODE_GOOD;
-
-}
-
-UA_Connection
-UA_ClientConnectionTCP_init(UA_ConnectionConfig config, const UA_String endpointUrl,
-                            UA_UInt32 timeout, UA_Logger *logger) {
-    UA_Connection connection;
-    memset(&connection, 0, sizeof(UA_Connection));
-
-    connection.state = UA_CONNECTION_OPENING;
-    connection.config = config;
-    connection.send = connection_write;
-    connection.recv = connection_recv;
-    connection.close = ClientNetworkLayerTCP_close;
-    connection.free = ClientNetworkLayerTCP_free;
-    connection.getSendBuffer = connection_getsendbuffer;
-    connection.releaseSendBuffer = connection_releasesendbuffer;
-    connection.releaseRecvBuffer = connection_releaserecvbuffer;
-
-    TCPClientConnection *tcpClientConnection = (TCPClientConnection*) UA_malloc(
-                    sizeof(TCPClientConnection));
-    memset(tcpClientConnection, 0, sizeof(TCPClientConnection));
-    connection.handle = (void*) tcpClientConnection;
-    tcpClientConnection->timeout = timeout;
-    UA_String hostnameString = UA_STRING_NULL;
-    UA_String pathString = UA_STRING_NULL;
-    UA_UInt16 port = 0;
-    char hostname[512];
-    tcpClientConnection->connStart = UA_DateTime_nowMonotonic();
-
-    UA_StatusCode parse_retval = UA_parseEndpointUrl(&endpointUrl,
-                    &hostnameString, &port, &pathString);
-    if (parse_retval != UA_STATUSCODE_GOOD || hostnameString.length > 511) {
-            UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                           "Server url is invalid: %.*s",
-                           (int)endpointUrl.length, endpointUrl.data);
-            connection.state = UA_CONNECTION_CLOSED;
-            return connection;
-    }
-    memcpy(hostname, hostnameString.data, hostnameString.length);
-    hostname[hostnameString.length] = 0;
-
-    if (port == 0) {
-            port = 4840;
-            UA_LOG_INFO(logger, UA_LOGCATEGORY_NETWORK,
-                            "No port defined, using default port %d", port);
-    }
-
-    memset(&tcpClientConnection->hints, 0, sizeof(tcpClientConnection->hints));
-    tcpClientConnection->hints.ai_family = AF_UNSPEC;
-    tcpClientConnection->hints.ai_socktype = SOCK_STREAM;
-    char portStr[6];
-    UA_snprintf(portStr, 6, "%d", port);
-    int error = UA_getaddrinfo(hostname, portStr, &tcpClientConnection->hints,
-                    &tcpClientConnection->server);
-    if (error != 0 || !tcpClientConnection->server) {
-      UA_LOG_SOCKET_ERRNO_GAI_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                                                 "DNS lookup of %s failed with error %s", hostname, errno_str));
-      connection.state = UA_CONNECTION_CLOSED;
-      return connection;
-    }
-    return connection;
-}
-
-UA_Connection
-UA_ClientConnectionTCP(UA_ConnectionConfig config, const UA_String endpointUrl,
-                       UA_UInt32 timeout, UA_Logger *logger) {
-    UA_initialize_architecture_network();
-
-    UA_Connection connection;
-    memset(&connection, 0, sizeof(UA_Connection));
-    connection.state = UA_CONNECTION_CLOSED;
-    connection.config = config;
-    connection.send = connection_write;
-    connection.recv = connection_recv;
-    connection.close = ClientNetworkLayerTCP_close;
-    connection.free = ClientNetworkLayerTCP_free;
-    connection.getSendBuffer = connection_getsendbuffer;
-    connection.releaseSendBuffer = connection_releasesendbuffer;
-    connection.releaseRecvBuffer = connection_releaserecvbuffer;
-    connection.handle = NULL;
-
-    UA_String hostnameString = UA_STRING_NULL;
-    UA_String pathString = UA_STRING_NULL;
-    UA_UInt16 port = 0;
-    char hostname[512];
-
-    UA_StatusCode parse_retval =
-        UA_parseEndpointUrl(&endpointUrl, &hostnameString, &port, &pathString);
-    if(parse_retval != UA_STATUSCODE_GOOD || hostnameString.length > 511) {
-        UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                       "Server url is invalid: %.*s",
-                       (int)endpointUrl.length, endpointUrl.data);
-        return connection;
-    }
-    memcpy(hostname, hostnameString.data, hostnameString.length);
-    hostname[hostnameString.length] = 0;
-
-    if(port == 0) {
-        port = 4840;
-        UA_LOG_INFO(logger, UA_LOGCATEGORY_NETWORK,
-                    "No port defined, using default port %d", port);
-    }
-
-    struct addrinfo hints, *server;
-    memset(&hints, 0, sizeof(hints));
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-    hints.ai_protocol = IPPROTO_TCP;
-    char portStr[6];
-    UA_snprintf(portStr, 6, "%d", port);
-    int error = UA_getaddrinfo(hostname, portStr, &hints, &server);
-    if(error != 0 || !server) {
-        UA_LOG_SOCKET_ERRNO_GAI_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                                              "DNS lookup of %s failed with error %s", hostname, errno_str));
-        return connection;
-    }
-
-    UA_Boolean connected = false;
-    UA_DateTime dtTimeout = timeout * UA_DATETIME_MSEC;
-    UA_DateTime connStart = UA_DateTime_nowMonotonic();
-    UA_SOCKET clientsockfd;
-
-    /* On linux connect may immediately return with ECONNREFUSED but we still
-     * want to try to connect. So use a loop and retry until timeout is
-     * reached. */
-    do {
-        /* Get a socket */
-        clientsockfd = UA_socket(server->ai_family,
-                              server->ai_socktype,
-                              server->ai_protocol);
-        if(clientsockfd == UA_INVALID_SOCKET) {
-            UA_LOG_SOCKET_ERRNO_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                                                    "Could not create client socket: %s", errno_str));
-            UA_freeaddrinfo(server);
-            return connection;
-        }
-
-        connection.state = UA_CONNECTION_OPENING;
-
-        /* Connect to the server */
-        connection.sockfd = clientsockfd;
-
-        /* Non blocking connect to be able to timeout */
-        if (UA_socket_set_nonblocking(clientsockfd) != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                           "Could not set the client socket to nonblocking");
-            ClientNetworkLayerTCP_close(&connection);
-            UA_freeaddrinfo(server);
-            return connection;
-        }
-
-        /* Non blocking connect */
-        error = UA_connect(clientsockfd, server->ai_addr, (socklen_t)server->ai_addrlen);
-
-        if ((error == -1) && (UA_ERRNO != UA_ERR_CONNECTION_PROGRESS)) {
-            ClientNetworkLayerTCP_close(&connection);
-            UA_LOG_SOCKET_ERRNO_WRAP(
-                    UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                                   "Connection to %.*s failed with error: %s",
-                                   (int)endpointUrl.length, endpointUrl.data, errno_str));
-            UA_freeaddrinfo(server);
-            return connection;
-        }
-
-        /* Use select to wait and check if connected */
-        if (error == -1 && (UA_ERRNO == UA_ERR_CONNECTION_PROGRESS)) {
-            /* connection in progress. Wait until connected using select */
-            UA_DateTime timeSinceStart = UA_DateTime_nowMonotonic() - connStart;
-            if(timeSinceStart > dtTimeout)
-                break;
-
-#ifdef _OS9000
-            /* OS-9 can't use select for checking write sockets.
-             * Therefore, we need to use connect until success or failed
-             */
-            UA_DateTime timeout_usec = (dtTimeout - timeSinceStart) / UA_DATETIME_USEC;
-            int resultsize = 0;
-            do {
-                u_int32 time = 0x80000001;
-                signal_code sig;
-
-                timeout_usec -= 1000000/256;    // Sleep 1/256 second
-                if (timeout_usec < 0)
-                    break;
-
-                _os_sleep(&time,&sig);
-                error = connect(clientsockfd, server->ai_addr, server->ai_addrlen);
-                if ((error == -1 && UA_ERRNO == EISCONN) || (error == 0))
-                    resultsize = 1;
-                if (error == -1 && UA_ERRNO != EALREADY && UA_ERRNO != EINPROGRESS)
-                    break;
-            }
-            while(resultsize == 0);
-#else
-            fd_set fdset;
-            FD_ZERO(&fdset);
-            UA_fd_set(clientsockfd, &fdset);
-            UA_DateTime timeout_usec = (dtTimeout - timeSinceStart) / UA_DATETIME_USEC;
-            struct timeval tmptv = {(long int) (timeout_usec / 1000000),
-                                    (int) (timeout_usec % 1000000)};
-
-            int resultsize = UA_select((UA_Int32)(clientsockfd + 1), NULL, &fdset, NULL, &tmptv);
-#endif
-
-            if(resultsize == 1) {
-#ifdef _WIN32
-                /* Windows does not have any getsockopt equivalent and it is not
-                 * needed there */
-                connected = true;
-                break;
-#else
-                OPTVAL_TYPE so_error;
-                socklen_t len = sizeof so_error;
-
-                int ret = UA_getsockopt(clientsockfd, SOL_SOCKET, SO_ERROR, &so_error, &len);
-
-                if (ret != 0 || so_error != 0) {
-                    /* on connection refused we should still try to connect */
-                    /* connection refused happens on localhost or local ip without timeout */
-                    if (so_error != ECONNREFUSED) {
-                        ClientNetworkLayerTCP_close(&connection);
-                        UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                                       "Connection to %.*s failed with error: %s",
-                                       (int)endpointUrl.length, endpointUrl.data,
-                                       strerror(ret == 0 ? so_error : UA_ERRNO));
-                        UA_freeaddrinfo(server);
-                        return connection;
-                    }
-                    /* wait until we try a again. Do not make this too small, otherwise the
-                     * timeout is somehow wrong */
-                    UA_sleep_ms(100);
-                } else {
-                    connected = true;
-                    break;
-                }
-#endif
-            }
-        } else {
-            connected = true;
-            break;
-        }
-        ClientNetworkLayerTCP_close(&connection);
-
-    } while ((UA_DateTime_nowMonotonic() - connStart) < dtTimeout);
-
-    UA_freeaddrinfo(server);
-
-    if(!connected) {
-        /* connection timeout */
-        if (connection.state != UA_CONNECTION_CLOSED)
-            ClientNetworkLayerTCP_close(&connection);
-        UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                       "Trying to connect to %.*s timed out",
-                       (int)endpointUrl.length, endpointUrl.data);
-        return connection;
-    }
-
-
-    /* We are connected. Reset socket to blocking */
-    if(UA_socket_set_blocking(clientsockfd) != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not set the client socket to blocking");
-        ClientNetworkLayerTCP_close(&connection);
-        return connection;
-    }
-
-#ifdef SO_NOSIGPIPE
-    int val = 1;
-    int sso_result = UA_setsockopt(connection.sockfd, SOL_SOCKET,
-                                SO_NOSIGPIPE, (void*)&val, sizeof(val));
-    if(sso_result < 0)
-        UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK,
-                       "Couldn't set SO_NOSIGPIPE");
-#endif
-
-    return connection;
-}
diff --git a/ext/open62541/arch/network_ws.c b/ext/open62541/arch/network_ws.c
deleted file mode 100644
index 4c0f31b..0000000
--- a/ext/open62541/arch/network_ws.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    relies heavily on concepts from libwebsockets minimal examples
- *    Copyright 2019 (c) Matthias Konnerth
- *    Copyright 2019 (c) Michael Derfler
- */
-
-#define UA_INTERNAL
-
-#include <open62541/network_ws.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/util.h>
-#include "open62541_queue.h"
-#include <libwebsockets.h>
-#include <string.h>
-
-struct BufferEntry {
-    UA_ByteString msg;
-    SIMPLEQ_ENTRY(BufferEntry) next;
-};
-
-typedef struct BufferEntry BufferEntry;
-
-struct ConnectionUserData {
-    struct lws *wsi;
-    SIMPLEQ_HEAD(, BufferEntry) messages;
-};
-
-typedef struct ConnectionUserData ConnectionUserData;
-
-//one of these is created for each client connecting to us
-struct SessionData {
-    UA_Connection *connection;
-};
-
-// one of these is created for each vhost our protocol is used with
-struct VHostData {
-    struct lws_context *context;
-};
-
-typedef struct {
-    const UA_Logger *logger;
-    UA_UInt16 port;
-    struct lws_context *context;
-    UA_Server *server;
-    UA_ConnectionConfig config;
-} ServerNetworkLayerWS;
-
-static UA_StatusCode
-connection_getsendbuffer(UA_Connection *connection, size_t length, UA_ByteString *buf) {
-    if(length > connection->config.sendBufferSize)
-        return UA_STATUSCODE_BADCOMMUNICATIONERROR;
-    return UA_ByteString_allocBuffer(buf, length);
-}
-
-static void
-connection_releasesendbuffer(UA_Connection *connection, UA_ByteString *buf) {
-    UA_ByteString_deleteMembers(buf);
-}
-
-static void
-connection_releaserecvbuffer(UA_Connection *connection, UA_ByteString *buf) {
-    UA_ByteString_deleteMembers(buf);
-}
-
-static UA_StatusCode
-connection_send(UA_Connection *connection, UA_ByteString *buf) {
-    ConnectionUserData *buffer = (ConnectionUserData *)connection->handle;
-    if(connection->state == UA_CONNECTION_CLOSED) {
-        UA_ByteString_deleteMembers(buf);
-        return UA_STATUSCODE_BADCONNECTIONCLOSED;
-    }
-
-    BufferEntry *entry = (BufferEntry *)malloc(sizeof(BufferEntry));
-    entry->msg.length = buf->length;
-    entry->msg.data = (UA_Byte *)malloc(LWS_PRE + buf->length);
-    memcpy(entry->msg.data + LWS_PRE, buf->data, buf->length);
-    UA_ByteString_deleteMembers(buf);
-    SIMPLEQ_INSERT_TAIL(&buffer->messages, entry, next);
-    lws_callback_on_writable(buffer->wsi);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-ServerNetworkLayerWS_close(UA_Connection *connection) {
-    if(connection->state == UA_CONNECTION_CLOSED)
-        return;
-    connection->state = UA_CONNECTION_CLOSED;
-}
-
-static void
-freeConnection(UA_Connection *connection) {
-    if(connection->handle) {
-        UA_free(connection->handle);
-    }
-    UA_Connection_deleteMembers(connection);
-    UA_free(connection);
-}
-
-static int
-callback_opcua(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in,
-               size_t len) {
-    struct SessionData *pss = (struct SessionData *)user;
-    struct VHostData *vhd =
-        (struct VHostData *)lws_protocol_vh_priv_get(lws_get_vhost(wsi),
-                                                                   lws_get_protocol(wsi));
-
-    switch(reason) {
-        case LWS_CALLBACK_PROTOCOL_INIT:
-            vhd = (struct VHostData *)lws_protocol_vh_priv_zalloc(
-                lws_get_vhost(wsi), lws_get_protocol(wsi),
-                sizeof(struct VHostData));
-            vhd->context = lws_get_context(wsi);
-            break;
-
-        case LWS_CALLBACK_ESTABLISHED:
-            if(!wsi)
-                break;
-            ServerNetworkLayerWS *layer = (ServerNetworkLayerWS*)lws_context_user(vhd->context);
-            UA_Connection *c = (UA_Connection *)malloc(sizeof(UA_Connection));
-            ConnectionUserData *buffer =
-                (ConnectionUserData *)malloc(sizeof(ConnectionUserData));
-            SIMPLEQ_INIT(&buffer->messages);
-            buffer->wsi = wsi;
-            memset(c, 0, sizeof(UA_Connection));
-            c->sockfd = 0;
-            c->handle = buffer;
-            c->config = layer->config;
-            c->send = connection_send;
-            c->close = ServerNetworkLayerWS_close;
-            c->free = freeConnection;
-            c->getSendBuffer = connection_getsendbuffer;
-            c->releaseSendBuffer = connection_releasesendbuffer;
-            c->releaseRecvBuffer = connection_releaserecvbuffer;
-            // stack sets the connection to established
-            c->state = UA_CONNECTION_OPENING;
-            c->openingDate = UA_DateTime_nowMonotonic();
-            pss->connection = c;
-            break;
-
-        case LWS_CALLBACK_CLOSED:
-            // notify server
-            if(!pss->connection->state != UA_CONNECTION_CLOSED) {
-                pss->connection->state = UA_CONNECTION_CLOSED;
-            }
-
-            layer = (ServerNetworkLayerWS*)lws_context_user(vhd->context);
-            if(layer && layer->server)
-            {
-                UA_Server_removeConnection(layer->server, pss->connection);
-            }
-            
-            break;
-
-        case LWS_CALLBACK_SERVER_WRITEABLE:
-            if(!pss->connection)
-                break;
-
-            ConnectionUserData *b = (ConnectionUserData *)pss->connection->handle;
-            do {
-
-                BufferEntry *entry = SIMPLEQ_FIRST(&b->messages);
-                if(!entry)
-                    break;
-
-                int m = lws_write(wsi, entry->msg.data + LWS_PRE, entry->msg.length,
-                                  LWS_WRITE_BINARY);
-                if(m < (int)entry->msg.length) {
-                    lwsl_err("ERROR %d writing to ws\n", m);
-                    return -1;
-                }
-                UA_ByteString_deleteMembers(&entry->msg);
-                UA_free(entry);
-                SIMPLEQ_REMOVE_HEAD(&b->messages, next);
-            } while(!lws_send_pipe_choked(wsi));
-
-            // process remaining messages
-            if(SIMPLEQ_FIRST(&b->messages)) {
-                lws_callback_on_writable(wsi);
-            }
-            break;
-
-        case LWS_CALLBACK_RECEIVE:
-            if(!vhd->context)
-                break;
-            layer =
-                (ServerNetworkLayerWS *)lws_context_user(vhd->context);
-            if(!layer->server)
-                break;
-
-            UA_ByteString message = {len, (UA_Byte *)in};
-            UA_Server_processBinaryMessage(layer->server, pss->connection, &message);
-            break;
-
-        default:
-            break;
-    }
-
-    return 0;
-}
-
-static struct lws_protocols protocols[] = {
-    {"http", lws_callback_http_dummy, 0, 0, 0, NULL, 0},
-    {"opcua", callback_opcua, sizeof(struct SessionData), 0, 0, NULL, 0},
-    {NULL, NULL, 0, 0, 0, NULL, 0}
-};
-
-// make the opcua protocol callback the default one
-const struct lws_protocol_vhost_options pvo_opt = {NULL, NULL, "default", "1"};
-const struct lws_protocol_vhost_options pvo = {NULL, &pvo_opt, "opcua", ""};
-
-static UA_StatusCode
-ServerNetworkLayerWS_start(UA_ServerNetworkLayer *nl, const UA_String *customHostname) {
-    UA_initialize_architecture_network();
-
-    ServerNetworkLayerWS *layer = (ServerNetworkLayerWS *)nl->handle;
-
-    /* Get the discovery url from the hostname */
-    UA_String du = UA_STRING_NULL;
-    char discoveryUrlBuffer[256];
-    char hostnameBuffer[256];
-    if(customHostname->length) {
-        du.length = (size_t)UA_snprintf(discoveryUrlBuffer, 255, "ws://%.*s:%d/",
-                                        (int)customHostname->length, customHostname->data,
-                                        layer->port);
-        du.data = (UA_Byte *)discoveryUrlBuffer;
-    } else {
-        if(UA_gethostname(hostnameBuffer, 255) == 0) {
-            du.length = (size_t)UA_snprintf(discoveryUrlBuffer, 255, "ws://%s:%d/",
-                                            hostnameBuffer, layer->port);
-            du.data = (UA_Byte *)discoveryUrlBuffer;
-        } else {
-            UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK,
-                         "Could not get the hostname");
-        }
-    }
-    UA_String_copy(&du, &nl->discoveryUrl);
-
-    UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                "Websocket network layer listening on %.*s", (int)nl->discoveryUrl.length,
-                nl->discoveryUrl.data);
-
-    struct lws_context_creation_info info;
-    int logLevel = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;
-    lws_set_log_level(logLevel, NULL);
-    memset(&info, 0, sizeof info);
-    info.port = layer->port;
-    info.protocols = protocols;
-    info.vhost_name = (char *)du.data;
-    info.ws_ping_pong_interval = 10;
-    info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;
-    info.pvo = &pvo;
-    info.user = layer;
-
-    struct lws_context *context = lws_create_context(&info);
-    if(!context) {
-        UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK, "lws init failed");
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    layer->context = context;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-ServerNetworkLayerWS_listen(UA_ServerNetworkLayer *nl, UA_Server *server,
-                            UA_UInt16 timeout) {
-    ServerNetworkLayerWS *layer = (ServerNetworkLayerWS *)nl->handle;
-    layer->server = server;
-    // set timeout to zero to return immediately if nothing to do
-    lws_service(layer->context, 0);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-ServerNetworkLayerWS_stop(UA_ServerNetworkLayer *nl, UA_Server *server) {
-    ServerNetworkLayerWS *layer = (ServerNetworkLayerWS *)nl->handle;
-    UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK,
-                "Shutting down the WS network layer");
-    lws_context_destroy(layer->context);
-    UA_deinitialize_architecture_network();
-}
-
-static void
-ServerNetworkLayerWS_deleteMembers(UA_ServerNetworkLayer *nl) {
-    UA_free(nl->handle);
-    UA_String_deleteMembers(&nl->discoveryUrl);
-}
-
-UA_ServerNetworkLayer
-UA_ServerNetworkLayerWS(UA_ConnectionConfig config, UA_UInt16 port, UA_Logger *logger) {
-    UA_ServerNetworkLayer nl;
-    memset(&nl, 0, sizeof(UA_ServerNetworkLayer));
-    nl.deleteMembers = ServerNetworkLayerWS_deleteMembers;
-    nl.localConnectionConfig = config;
-    nl.start = ServerNetworkLayerWS_start;
-    nl.listen = ServerNetworkLayerWS_listen;
-    nl.stop = ServerNetworkLayerWS_stop;
-
-    ServerNetworkLayerWS *layer =
-        (ServerNetworkLayerWS *)UA_calloc(1, sizeof(ServerNetworkLayerWS));
-    if(!layer)
-        return nl;
-    nl.handle = layer;
-    layer->logger = logger;
-    layer->port = port;
-    layer->config = config;
-    return nl;
-}
diff --git a/ext/open62541/arch/posix/CMakeLists.txt b/ext/open62541/arch/posix/CMakeLists.txt
deleted file mode 100644
index 71fbd8d..0000000
--- a/ext/open62541/arch/posix/CMakeLists.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\posix)
-
-ua_add_architecture("posix")
-
-list (FIND UA_AMALGAMATION_ARCHITECTURES "posix" _index)
-if (${_index} GREATER -1 OR "${UA_ARCHITECTURE}" STREQUAL "posix")
-
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-
-
-    if("${UA_ARCHITECTURE}" STREQUAL "posix")
-        if(NOT CYGWIN AND NOT QNXNTO AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD"))
-            ua_architecture_add_definitions(-Wshadow -Wconversion -fvisibility=hidden -fPIC)
-        endif()
-
-        if(QNXNTO)
-          ua_architecture_append_to_library(socket c stdc++)
-        elseif(OS9)
-          ua_architecture_append_to_library(netdb ndblib socket)
-        else()
-          ua_architecture_append_to_library(m)
-          #TODO - Error on first make run if pthread is included conditional?
-          ua_architecture_append_to_library(pthread)
-          if(UA_MULTITHREADING OR UA_BUILD_UNIT_TESTS)
-            ua_architecture_append_to_library(pthread)
-          endif()
-          if(NOT APPLE AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD"))
-            ua_architecture_append_to_library(rt)
-          endif()
-        endif()
-
-    endif()
-
-
-endif()
diff --git a/ext/open62541/arch/posix/ua_architecture.h b/ext/open62541/arch/posix/ua_architecture.h
deleted file mode 100644
index 0d41441..0000000
--- a/ext/open62541/arch/posix/ua_architecture.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_POSIX
-
-#ifndef PLUGINS_ARCH_POSIX_UA_ARCHITECTURE_H_
-#define PLUGINS_ARCH_POSIX_UA_ARCHITECTURE_H_
-
-#include <open62541/architecture_base.h>
-
-/* Enable POSIX features */
-#if !defined(_XOPEN_SOURCE)
-# define _XOPEN_SOURCE 600
-#endif
-#ifndef _DEFAULT_SOURCE
-# define _DEFAULT_SOURCE
-#endif
-/* On older systems we need to define _BSD_SOURCE.
- * _DEFAULT_SOURCE is an alias for that. */
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-#include <errno.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <sys/types.h>
-#include <net/if.h>
-#ifndef UA_sleep_ms
-# include <unistd.h>
-# define UA_sleep_ms(X) usleep(X * 1000)
-#endif
-
-#define OPTVAL_TYPE int
-
-#include <fcntl.h>
-#include <unistd.h> // read, write, close
-
-#ifdef __QNX__
-# include <sys/socket.h>
-#endif
-#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
-# include <sys/param.h>
-# if defined(BSD)
-#  include<sys/socket.h>
-# endif
-#endif
-#if !defined(__CYGWIN__)
-# include <netinet/tcp.h>
-#endif
-
-/* unsigned int for windows and workaround to a glibc bug */
-/* Additionally if GNU_LIBRARY is not defined, it may be using
- * musl libc (e.g. Docker Alpine) */
-#if  defined(__OpenBSD__) || \
-    (defined(__GNU_LIBRARY__) && (__GNU_LIBRARY__ <= 6) && \
-     (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 16) || \
-    !defined(__GNU_LIBRARY__))
-# define UA_fd_set(fd, fds) FD_SET((unsigned int)fd, fds)
-# define UA_fd_isset(fd, fds) FD_ISSET((unsigned int)fd, fds)
-#else
-# define UA_fd_set(fd, fds) FD_SET(fd, fds)
-# define UA_fd_isset(fd, fds) FD_ISSET(fd, fds)
-#endif
-
-#define UA_access access
-
-#define UA_IPV6 1
-#define UA_SOCKET int
-#define UA_INVALID_SOCKET -1
-#define UA_ERRNO errno
-#define UA_INTERRUPTED EINTR
-#define UA_AGAIN EAGAIN
-#define UA_EAGAIN EAGAIN
-#define UA_WOULDBLOCK EWOULDBLOCK
-#define UA_ERR_CONNECTION_PROGRESS EINPROGRESS
-
-#define UA_ENABLE_LOG_COLORS
-
-#define UA_getnameinfo getnameinfo
-#define UA_send send
-#define UA_recv recv
-#define UA_sendto sendto
-#define UA_recvfrom recvfrom
-#define UA_htonl htonl
-#define UA_ntohl ntohl
-#define UA_close close
-#define UA_select select
-#define UA_shutdown shutdown
-#define UA_socket socket
-#define UA_bind bind
-#define UA_listen listen
-#define UA_accept accept
-#define UA_connect connect
-#define UA_getaddrinfo getaddrinfo
-#define UA_getsockopt getsockopt
-#define UA_setsockopt setsockopt
-#define UA_freeaddrinfo freeaddrinfo
-#define UA_gethostname gethostname
-#define UA_getsockname getsockname
-#define UA_inet_pton inet_pton
-#if UA_IPV6
-# define UA_if_nametoindex if_nametoindex
-#endif
-
-#ifdef UA_ENABLE_MALLOC_SINGLETON
-extern void * (*UA_globalMalloc)(size_t size);
-extern void (*UA_globalFree)(void *ptr);
-extern void * (*UA_globalCalloc)(size_t nelem, size_t elsize);
-extern void * (*UA_globalRealloc)(void *ptr, size_t size);
-# define UA_free(ptr) UA_globalFree(ptr)
-# define UA_malloc(size) UA_globalMalloc(size)
-# define UA_calloc(num, size) UA_globalCalloc(num, size)
-# define UA_realloc(ptr, size) UA_globalRealloc(ptr, size)
-#endif
-
-#include <stdlib.h>
-#ifndef UA_free
-# define UA_free free
-#endif
-#ifndef UA_malloc
-# define UA_malloc malloc
-#endif
-#ifndef UA_calloc
-# define UA_calloc calloc
-#endif
-#ifndef UA_realloc
-# define UA_realloc realloc
-#endif
-
-#include <stdio.h>
-#define UA_snprintf snprintf
-
-#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \
-    char *errno_str = strerror(errno); \
-    LOG; \
-}
-#define UA_LOG_SOCKET_ERRNO_GAI_WRAP(LOG) { \
-    const char *errno_str = gai_strerror(errno); \
-    LOG; \
-}
-
-#if UA_MULTITHREADING >= 100
-#include <pthread.h>
-#define UA_LOCK_TYPE_NAME pthread_mutex_t
-#define UA_LOCK_TYPE(mutexName) pthread_mutex_t mutexName; \
-                                        pthread_mutexattr_t mutexName##_attr; \
-                                        int mutexName##Counter;
-#define UA_LOCK_INIT(mutexName) pthread_mutexattr_init(&mutexName##_attr); \
-                                        pthread_mutexattr_settype(&mutexName##_attr, PTHREAD_MUTEX_RECURSIVE); \
-                                        pthread_mutex_init(&mutexName, &mutexName##_attr); \
-                                        mutexName##Counter = 0;
-#define UA_LOCK_DESTROY(mutexName) pthread_mutex_destroy(&mutexName); \
-                                   pthread_mutexattr_destroy(&mutexName##_attr);
-
-#define UA_LOCK(mutexName) pthread_mutex_lock(&mutexName); \
-                           UA_assert(++(mutexName##Counter) == 1); \
-
-#define UA_UNLOCK(mutexName) UA_assert(--(mutexName##Counter) == 0); \
-                             pthread_mutex_unlock(&mutexName);
-#define UA_LOCK_ASSERT(mutexName, num) UA_assert(mutexName##Counter == num);
-#else
-#define UA_LOCK_TYPE_NAME
-#define UA_LOCK_TYPE(mutexName)
-#define UA_LOCK_INIT(mutexName)
-#define UA_LOCK_DESTROY(mutexName)
-#define UA_LOCK(mutexName)
-#define UA_UNLOCK(mutexName)
-#define UA_LOCK_ASSERT(mutexName, num)
-#endif
-
-#include <open62541/architecture_functions.h>
-
-#if defined(__APPLE__)  && defined(_SYS_QUEUE_H_)
-//  in some compilers there's already a _SYS_QUEUE_H_ which is included first and doesn't have all functions
-
-#undef SLIST_HEAD
-#undef SLIST_HEAD_INITIALIZER
-#undef SLIST_ENTRY
-#undef SLIST_FIRST
-#undef SLIST_END
-#undef SLIST_EMPTY
-#undef SLIST_NEXT
-#undef SLIST_FOREACH
-#undef SLIST_FOREACH_SAFE
-#undef SLIST_INIT
-#undef SLIST_INSERT_AFTER
-#undef SLIST_INSERT_HEAD
-#undef SLIST_REMOVE_AFTER
-#undef SLIST_REMOVE_HEAD
-#undef SLIST_REMOVE
-#undef LIST_HEAD
-#undef LIST_HEAD_INITIALIZER
-#undef LIST_ENTRY
-#undef LIST_FIRST
-#undef LIST_END
-#undef LIST_EMPTY
-#undef LIST_NEXT
-#undef LIST_FOREACH
-#undef LIST_FOREACH_SAFE
-#undef LIST_INIT
-#undef LIST_INSERT_AFTER
-#undef LIST_INSERT_BEFORE
-#undef LIST_INSERT_HEAD
-#undef LIST_REMOVE
-#undef LIST_REPLACE
-#undef SIMPLEQ_HEAD
-#undef SIMPLEQ_HEAD_INITIALIZER
-#undef SIMPLEQ_ENTRY
-#undef SIMPLEQ_FIRST
-#undef SIMPLEQ_END
-#undef SIMPLEQ_EMPTY
-#undef SIMPLEQ_NEXT
-#undef SIMPLEQ_FOREACH
-#undef SIMPLEQ_FOREACH_SAFE
-#undef SIMPLEQ_INIT
-#undef SIMPLEQ_INSERT_HEAD
-#undef SIMPLEQ_INSERT_TAIL
-#undef SIMPLEQ_INSERT_AFTER
-#undef SIMPLEQ_REMOVE_HEAD
-#undef SIMPLEQ_REMOVE_AFTER
-#undef XSIMPLEQ_HEAD
-#undef XSIMPLEQ_ENTRY
-#undef XSIMPLEQ_XOR
-#undef XSIMPLEQ_FIRST
-#undef XSIMPLEQ_END
-#undef XSIMPLEQ_EMPTY
-#undef XSIMPLEQ_NEXT
-#undef XSIMPLEQ_FOREACH
-#undef XSIMPLEQ_FOREACH_SAFE
-#undef XSIMPLEQ_INIT
-#undef XSIMPLEQ_INSERT_HEAD
-#undef XSIMPLEQ_INSERT_TAIL
-#undef XSIMPLEQ_INSERT_AFTER
-#undef XSIMPLEQ_REMOVE_HEAD
-#undef XSIMPLEQ_REMOVE_AFTER
-#undef TAILQ_HEAD
-#undef TAILQ_HEAD_INITIALIZER
-#undef TAILQ_ENTRY
-#undef TAILQ_FIRST
-#undef TAILQ_END
-#undef TAILQ_NEXT
-#undef TAILQ_LAST
-#undef TAILQ_PREV
-#undef TAILQ_EMPTY
-#undef TAILQ_FOREACH
-#undef TAILQ_FOREACH_SAFE
-#undef TAILQ_FOREACH_REVERSE
-#undef TAILQ_FOREACH_REVERSE_SAFE
-#undef TAILQ_INIT
-#undef TAILQ_INSERT_HEAD
-#undef TAILQ_INSERT_TAIL
-#undef TAILQ_INSERT_AFTER
-#undef TAILQ_INSERT_BEFORE
-#undef TAILQ_REMOVE
-#undef TAILQ_REPLACE
-#undef CIRCLEQ_HEAD
-#undef CIRCLEQ_HEAD_INITIALIZER
-#undef CIRCLEQ_ENTRY
-#undef CIRCLEQ_FIRST
-#undef CIRCLEQ_LAST
-#undef CIRCLEQ_END
-#undef CIRCLEQ_NEXT
-#undef CIRCLEQ_PREV
-#undef CIRCLEQ_EMPTY
-#undef CIRCLEQ_FOREACH
-#undef CIRCLEQ_FOREACH_SAFE
-#undef CIRCLEQ_FOREACH_REVERSE
-#undef CIRCLEQ_FOREACH_REVERSE_SAFE
-#undef CIRCLEQ_INIT
-#undef CIRCLEQ_INSERT_AFTER
-#undef CIRCLEQ_INSERT_BEFORE
-#undef CIRCLEQ_INSERT_HEAD
-#undef CIRCLEQ_INSERT_TAIL
-#undef CIRCLEQ_REMOVE
-#undef CIRCLEQ_REPLACE
-
-#undef _SYS_QUEUE_H_
-
-#endif /* defined(__APPLE__)  && defined(_SYS_QUEUE_H_) */
-
-
-#endif /* PLUGINS_ARCH_POSIX_UA_ARCHITECTURE_H_ */
-
-#endif /* UA_ARCHITECTURE_POSIX */
diff --git a/ext/open62541/arch/posix/ua_architecture_functions.c b/ext/open62541/arch/posix/ua_architecture_functions.c
deleted file mode 100644
index 14e5237..0000000
--- a/ext/open62541/arch/posix/ua_architecture_functions.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_POSIX
-
-#include <open62541/types.h>
-
-/* Global malloc singletons */
-#ifdef UA_ENABLE_MALLOC_SINGLETON
-void * (*UA_globalMalloc)(size_t size) = malloc;
-void (*UA_globalFree)(void *ptr) = free;
-void * (*UA_globalCalloc)(size_t nelem, size_t elsize) = calloc;
-void * (*UA_globalRealloc)(void *ptr, size_t size) = realloc;
-#endif
-
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
-  int opts = fcntl(sockfd, F_GETFL);
-  if(opts < 0 || fcntl(sockfd, F_SETFL, opts & (~O_NONBLOCK)) < 0)
-      return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){
-  int opts = fcntl(sockfd, F_GETFL);
-  if(opts < 0 || fcntl(sockfd, F_SETFL, opts | O_NONBLOCK) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-void UA_initialize_architecture_network(void){
-}
-
-void UA_deinitialize_architecture_network(void){
-}
-
-#endif /* UA_ARCHITECTURE_POSIX */
diff --git a/ext/open62541/arch/posix/ua_clock.c b/ext/open62541/arch/posix/ua_clock.c
deleted file mode 100644
index e055fae..0000000
--- a/ext/open62541/arch/posix/ua_clock.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#ifdef UA_ARCHITECTURE_POSIX
-
-#include <open62541/types.h>
-
-#include <time.h>
-
-#include <sys/time.h>
-
-#if defined(__APPLE__) || defined(__MACH__)
-# include <mach/clock.h>
-# include <mach/mach.h>
-#endif
-
-UA_DateTime UA_DateTime_now(void) {
-    struct timeval tv;
-    gettimeofday(&tv, NULL);
-    return (tv.tv_sec * UA_DATETIME_SEC) + (tv.tv_usec * UA_DATETIME_USEC) + UA_DATETIME_UNIX_EPOCH;
-}
-
-/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */
-UA_Int64 UA_DateTime_localTimeUtcOffset(void) {
-    time_t gmt, rawtime = time(NULL);
-    struct tm *ptm;
-    struct tm gbuf;
-    ptm = gmtime_r(&rawtime, &gbuf);
-    // Request that mktime() looksup dst in timezone database
-    ptm->tm_isdst = -1;
-    gmt = mktime(ptm);
-    return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC);
-}
-
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-#if defined(__APPLE__) || defined(__MACH__)
-    /* OS X does not have clock_gettime, use clock_get_time */
-    clock_serv_t cclock;
-    mach_timespec_t mts;
-    host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
-    clock_get_time(cclock, &mts);
-    mach_port_deallocate(mach_task_self(), cclock);
-    return (mts.tv_sec * UA_DATETIME_SEC) + (mts.tv_nsec / 100);
-#elif !defined(CLOCK_MONOTONIC_RAW)
-    struct timespec ts;
-    clock_gettime(CLOCK_MONOTONIC, &ts);
-    return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100);
-#else
-    struct timespec ts;
-    clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
-    return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100);
-#endif
-}
-
-#endif /* UA_ARCHITECTURE_POSIX */
diff --git a/ext/open62541/arch/vxworks/CMakeLists.txt b/ext/open62541/arch/vxworks/CMakeLists.txt
deleted file mode 100644
index 863fcfb..0000000
--- a/ext/open62541/arch/vxworks/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\vxworks)
-
-ua_add_architecture("vxworks")
-
-list (FIND UA_AMALGAMATION_ARCHITECTURES "vxworks" _index)
-if (${_index} GREATER -1 OR "${UA_ARCHITECTURE}" STREQUAL "vxworks")
-
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-
-    if("${UA_ARCHITECTURE}" STREQUAL "vxworks")
-
-        ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-
-    endif()
-
-endif()
diff --git a/ext/open62541/arch/vxworks/ua_architecture.h b/ext/open62541/arch/vxworks/ua_architecture.h
deleted file mode 100644
index d899c6f..0000000
--- a/ext/open62541/arch/vxworks/ua_architecture.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_VXWORKS
-
-#ifndef PLUGINS_ARCH_VXWORKS_UA_ARCHITECTURE_H_
-#define PLUGINS_ARCH_VXWORKS_UA_ARCHITECTURE_H_
-
-#include <open62541/architecture_base.h>
-
-#include <errno.h>
-#include <time.h>
-
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <sys/ioctl.h>
-
-#include <hostLib.h>
-#include <selectLib.h>
-
-#define UA_sleep_ms(X)                            \
- {                                                \
- struct timespec timeToSleep;                     \
-   timeToSleep.tv_sec = X / 1000;                 \
-   timeToSleep.tv_nsec = 1000000 * (X % 1000);    \
-   nanosleep(&timeToSleep, NULL);                 \
- }
-
-#ifdef UINT32_C
-# undef UINT32_C
-#endif
-
-#define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX))
-
-#ifdef UA_BINARY_OVERLAYABLE_FLOAT
-# undef UA_BINARY_OVERLAYABLE_FLOAT
-#endif
-#define UA_BINARY_OVERLAYABLE_FLOAT 1
-
-#define OPTVAL_TYPE int
-
-#include <fcntl.h>
-#include <unistd.h> // read, write, close
-#include <netinet/tcp.h>
-
-#define UA_fd_set(fd, fds) FD_SET((unsigned int)fd, fds)
-#define UA_fd_isset(fd, fds) FD_ISSET((unsigned int)fd, fds)
-
-#define UA_access access
-
-#define UA_IPV6 1
-#define UA_SOCKET int
-#define UA_INVALID_SOCKET -1
-#define UA_ERRNO errno
-#define UA_INTERRUPTED EINTR
-#define UA_AGAIN EAGAIN
-#define UA_EAGAIN EAGAIN
-#define UA_WOULDBLOCK EWOULDBLOCK
-#define UA_ERR_CONNECTION_PROGRESS EINPROGRESS
-
-#define UA_ENABLE_LOG_COLORS
-
-#define UA_getnameinfo getnameinfo
-#define UA_send send
-#define UA_recv recv
-#define UA_sendto sendto
-#define UA_recvfrom recvfrom
-#define UA_htonl htonl
-#define UA_ntohl ntohl
-#define UA_close close
-#define UA_select select
-#define UA_shutdown shutdown
-#define UA_socket socket
-#define UA_bind bind
-#define UA_listen listen
-#define UA_accept accept
-#define UA_connect connect
-#define UA_getaddrinfo getaddrinfo
-#define UA_getsockopt getsockopt
-#define UA_setsockopt setsockopt
-#define UA_freeaddrinfo freeaddrinfo
-#define UA_gethostname gethostname
-#define UA_getsockname getsockname
-#define UA_inet_pton inet_pton
-#if UA_IPV6
-# define UA_if_nametoindex if_nametoindex
-#endif
-
-#include <stdlib.h>
-#define UA_free free
-#define UA_malloc malloc
-#define UA_calloc calloc
-#define UA_realloc realloc
-
-#include <stdio.h>
-#define UA_snprintf snprintf
-
-#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \
-    char *errno_str = strerror(errno); \
-    LOG; \
-}
-#define UA_LOG_SOCKET_ERRNO_GAI_WRAP(LOG) { \
-    char *errno_str = gai_strerror(errno); \
-    LOG; \
-}
-
-#if UA_MULTITHREADING >= 100
-#error Multithreading unsupported
-#else
-#define UA_LOCK_TYPE_NAME
-#define UA_LOCK_TYPE(mutexName)
-#define UA_LOCK_TYPE_POINTER(mutexName)
-#define UA_LOCK_INIT(mutexName)
-#define UA_LOCK_DESTROY(mutexName)
-#define UA_LOCK(mutexName)
-#define UA_UNLOCK(mutexName)
-#define UA_LOCK_ASSERT(mutexName, num)
-#endif
-
-#include <open62541/architecture_functions.h>
-
-#endif /* PLUGINS_ARCH_VXWORKS_UA_ARCHITECTURE_H_ */
-
-#endif /* UA_ARCHITECTURE_VXWORKS */
diff --git a/ext/open62541/arch/vxworks/ua_architecture_functions.c b/ext/open62541/arch/vxworks/ua_architecture_functions.c
deleted file mode 100644
index 8fb7bdd..0000000
--- a/ext/open62541/arch/vxworks/ua_architecture_functions.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_VXWORKS
-
-#include <open62541/types.h>
-
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
-  int on = FALSE;
-  if(ioctl(sockfd, FIONBIO, &on) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){
-  int on = TRUE;
-  if(ioctl(sockfd, FIONBIO, &on) < 0)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;
-}
-
-void UA_initialize_architecture_network(void){
-  return;
-}
-
-void UA_deinitialize_architecture_network(void){
-  return;
-}
-
-#endif /* UA_ARCHITECTURE_VXWORKS */
diff --git a/ext/open62541/arch/vxworks/ua_clock.c b/ext/open62541/arch/vxworks/ua_clock.c
deleted file mode 100644
index efb9fe8..0000000
--- a/ext/open62541/arch/vxworks/ua_clock.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Stalder
- */
-
-#ifdef UA_ARCHITECTURE_VXWORKS
-
-#ifndef _DEFAULT_SOURCE
-# define _DEFAULT_SOURCE
-#endif
-/* On older systems we need to define _BSD_SOURCE.
- * _DEFAULT_SOURCE is an alias for that. */
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-#include <time.h>
-#include <sys/time.h>
-
-#include <open62541/types.h>
-
-UA_DateTime UA_DateTime_now(void){
-  struct timeval tv;
-  gettimeofday(&tv, NULL);
-  return (tv.tv_sec * UA_DATETIME_SEC) + (tv.tv_usec * UA_DATETIME_USEC) + UA_DATETIME_UNIX_EPOCH;
-}
-
-/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */
-UA_Int64 UA_DateTime_localTimeUtcOffset(void){
-  time_t gmt, rawtime = time(NULL);
-
-  struct tm *ptm;
-  struct tm gbuf;
-  ptm = gmtime_r(&rawtime, &gbuf);
-  // Request that mktime() looksup dst in timezone database
-  ptm->tm_isdst = -1;
-  gmt = mktime(ptm);
-
-  return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC);
-}
-
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-  struct timespec ts;
-#if !defined(CLOCK_MONOTONIC_RAW)
-  clock_gettime(CLOCK_MONOTONIC, &ts);
-#else
-  clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
-#endif
-  return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100);
-}
-
-#endif /* UA_ARCHITECTURE_VXWORKS */
-
diff --git a/ext/open62541/arch/wec7/CMakeLists.txt b/ext/open62541/arch/wec7/CMakeLists.txt
deleted file mode 100644
index f83bcfc..0000000
--- a/ext/open62541/arch/wec7/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\wec7)
-
-ua_add_architecture("wec7")
-
-list (FIND UA_AMALGAMATION_ARCHITECTURES "wec7" _index)
-if (${_index} GREATER -1 OR "${UA_ARCHITECTURE}" STREQUAL "wec7")
-
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-
-    if("${UA_ARCHITECTURE}" STREQUAL "wec7")
-        ua_architecture_append_to_library(ws2)
-        ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-
-    endif()
-
-endif()
diff --git a/ext/open62541/arch/wec7/ua_architecture.h b/ext/open62541/arch/wec7/ua_architecture.h
deleted file mode 100644
index 558a8a2..0000000
--- a/ext/open62541/arch/wec7/ua_architecture.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Stephan Kantelberg
- */
-
-#ifdef UA_ARCHITECTURE_WEC7
-
-#ifndef PLUGINS_ARCH_WEC7_UA_ARCHITECTURE_H_
-#define PLUGINS_ARCH_WEC7_UA_ARCHITECTURE_H_
-
-#include <open62541/architecture_base.h>
-
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-/* Disable some security warnings on MSVC */
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
-# define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#include "stdint.h"
-#ifdef UNDER_CE
-#define MAX_STRERROR 31
-static char *errorStrings[]= {"Error 0","","No such file or directory","","","","","Arg list too long",
-                              "Exec format error","Bad file number","","","Not enough core","Permission denied","","",
-                              "","File exists","Cross-device link","","","","Invalid argument","","Too many open files",
-                              "","","","No space left on device","","","","","Math argument","Result too large","",
-                              "Resource deadlock would occur", "Unknown error under wince"};
-
-char *strerror(int errnum);
-#endif
-
-#include <stdlib.h>
-#if defined(_WIN32)
-# include <malloc.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <winsock2.h>
-#include <windows.h>
-#include <ws2tcpip.h>
-
-#ifdef _MSC_VER
-# ifndef UNDER_CE
-#  include <io.h> //access
-#  define UA_access _access
-# endif
-#else
-# include <unistd.h> //access and tests
-# define UA_access access
-#endif
-
-#define ssize_t int
-#define OPTVAL_TYPE char
-#ifndef UA_sleep_ms
-# define UA_sleep_ms(X) Sleep(X)
-#endif
-
-// Windows does not support ansi colors
-// #define UA_ENABLE_LOG_COLORS
-
-#if defined(__MINGW32__) //mingw defines SOCKET as long long unsigned int, giving errors in logging and when comparing with UA_Int32
-# define UA_SOCKET int
-# define UA_INVALID_SOCKET -1
-#else
-# define UA_SOCKET SOCKET
-# define UA_INVALID_SOCKET INVALID_SOCKET
-#endif
-#define UA_ERRNO WSAGetLastError()
-#define UA_INTERRUPTED WSAEINTR
-#define UA_AGAIN WSAEWOULDBLOCK
-#define UA_EAGAIN EAGAIN
-#define UA_WOULDBLOCK WSAEWOULDBLOCK
-#define UA_ERR_CONNECTION_PROGRESS WSAEWOULDBLOCK
-
-#define UA_fd_set(fd, fds) FD_SET((UA_SOCKET)fd, fds)
-#define UA_fd_isset(fd, fds) FD_ISSET((UA_SOCKET)fd, fds)
-
-#ifdef UNDER_CE
-#define UA_ERRNO WSAGetLastError()
-#endif
-
-#define UA_getnameinfo getnameinfo
-#define UA_send(sockfd, buf, len, flags) send(sockfd, buf, (int)(len), flags)
-#define UA_recv recv
-#define UA_sendto(sockfd, buf, len, flags, dest_addr, addrlen) sendto(sockfd, (const char*)(buf), (int)(len), flags, dest_addr, (int) (addrlen))
-#define UA_recvfrom(sockfd, buf, len, flags, src_addr, addrlen) recvfrom(sockfd, (char*)(buf), (int)(len), flags, src_addr, addrlen)
-#define UA_htonl htonl
-#define UA_ntohl ntohl
-#define UA_close closesocket
-#define UA_select(nfds, readfds, writefds, exceptfds, timeout) select((int)(nfds), readfds, writefds, exceptfds, timeout)
-#define UA_shutdown shutdown
-#define UA_socket socket
-#define UA_bind bind
-#define UA_listen listen
-#define UA_accept accept
-#define UA_connect(sockfd, addr, addrlen) connect(sockfd, addr, (int)(addrlen))
-#define UA_getaddrinfo getaddrinfo
-#define UA_getsockopt getsockopt
-#define UA_setsockopt(sockfd, level, optname, optval, optlen) setsockopt(sockfd, level, optname, (const char*) (optval), optlen)
-#define UA_freeaddrinfo freeaddrinfo
-#define UA_gethostname gethostname
-#define UA_getsockname getsockname
-#define UA_inet_pton InetPton
-
-#ifdef maxStringLength //defined in mingw64
-# undef maxStringLength
-#endif
-
-#ifndef UA_free
-#define UA_free free
-#endif
-#ifndef UA_malloc
-#define UA_malloc malloc
-#endif
-#ifndef UA_calloc
-#define UA_calloc calloc
-#endif
-#ifndef UA_realloc
-#define UA_realloc realloc
-#endif
-
-#define UA_snprintf(source, size, string, ...) _snprintf_s(source, size, _TRUNCATE, string, __VA_ARGS__)
-
-#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \
-    LPVOID errno_str = NULL; \
-    FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
-    NULL, WSAGetLastError(), \
-    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
-    (LPWSTR)&errno_str, \
-    0, NULL); \
-    LOG; \
-    LocalFree(errno_str); \
-}
-#define UA_LOG_SOCKET_ERRNO_GAI_WRAP UA_LOG_SOCKET_ERRNO_WRAP
-
-#if UA_MULTITHREADING >= 100
-#error Multithreading unsupported
-#else
-#define UA_LOCK_TYPE_NAME
-#define UA_LOCK_TYPE(mutexName)
-#define UA_LOCK_TYPE_POINTER(mutexName)
-#define UA_LOCK_INIT(mutexName)
-#define UA_LOCK_DESTROY(mutexName)
-#define UA_LOCK(mutexName)
-#define UA_UNLOCK(mutexName)
-#endif
-
-#include <open62541/architecture_functions.h>
-
-/* Fix redefinition of SLIST_ENTRY on mingw winnt.h */
-#if !defined(_SYS_QUEUE_H_) && defined(SLIST_ENTRY)
-# undef SLIST_ENTRY
-#endif
-
-#endif /* PLUGINS_ARCH_WEC7_UA_ARCHITECTURE_H_ */
-
-#endif /* UA_ARCHITECTURE_WEC7 */
diff --git a/ext/open62541/arch/wec7/ua_architecture_functions.c b/ext/open62541/arch/wec7/ua_architecture_functions.c
deleted file mode 100644
index 779bc67..0000000
--- a/ext/open62541/arch/wec7/ua_architecture_functions.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Stephan Kantelberg
- */
-
-#ifdef UA_ARCHITECTURE_WEC7
-
-#include <open62541/types.h>
-
-#undef UA_fileExists
-UA_Boolean UA_fileExists(const char* path) {
-  FILE *fp = fopen(path,"rb");
-  UA_Boolean exists = (fp==NULL);
-  if(fp)
-      fclose(fp);
-  return exists;
-}
-
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
-  u_long iMode = 0;
-  if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;;
-}
-
-#ifdef UNDER_CE
-char *strerror(int errnum)
-{
-    if (errnum > MAX_STRERROR)
-        return errorStrings[MAX_STRERROR];
-    else
-        return errorStrings[errnum];
-}
-#endif
-
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){
-  u_long iMode = 1;
-  if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;;
-}
-
-void UA_initialize_architecture_network(void){
-  WSADATA wsaData;
-  WSAStartup(MAKEWORD(2, 2), &wsaData);
-}
-
-void UA_deinitialize_architecture_network(void){
-  WSACleanup();
-}
-
-#endif /* UA_ARCHITECTURE_WEC7 */
diff --git a/ext/open62541/arch/wec7/ua_clock.c b/ext/open62541/arch/wec7/ua_clock.c
deleted file mode 100644
index 4f81c54..0000000
--- a/ext/open62541/arch/wec7/ua_clock.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Stephan Kantelberg
- */
-
-#ifdef UA_ARCHITECTURE_WEC7
-
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-#include <open62541/types.h>
-#include <time.h>
-/* Backup definition of SLIST_ENTRY on mingw winnt.h */
-# ifdef SLIST_ENTRY
-#  pragma push_macro("SLIST_ENTRY")
-#  undef SLIST_ENTRY
-#  define POP_SLIST_ENTRY
-# endif
-# include <windows.h>
-/* restore definition */
-# ifdef POP_SLIST_ENTRY
-#  undef SLIST_ENTRY
-#  undef POP_SLIST_ENTRY
-#  pragma pop_macro("SLIST_ENTRY")
-# endif
-
-UA_DateTime UA_DateTime_now(void) {
-    /* Windows filetime has the same definition as UA_DateTime */
-    FILETIME ft;
-    SYSTEMTIME st;
-    GetSystemTime(&st);
-    SystemTimeToFileTime(&st, &ft);
-    ULARGE_INTEGER ul;
-    ul.LowPart = ft.dwLowDateTime;
-    ul.HighPart = ft.dwHighDateTime;
-    return (UA_DateTime)ul.QuadPart;
-}
-
-UA_Int64 UA_DateTime_localTimeUtcOffset(void) {
-    return 0;
-}
-
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-    LARGE_INTEGER freq, ticks;
-    QueryPerformanceFrequency(&freq);
-    QueryPerformanceCounter(&ticks);
-    UA_Double ticks2dt = UA_DATETIME_SEC / (UA_Double)freq.QuadPart;
-    return (UA_DateTime)(ticks.QuadPart * ticks2dt);
-}
-
-#endif /* UA_ARCHITECTURE_WEC7 */
diff --git a/ext/open62541/arch/win32/CMakeLists.txt b/ext/open62541/arch/win32/CMakeLists.txt
deleted file mode 100644
index 8504731..0000000
--- a/ext/open62541/arch/win32/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-SET(SOURCE_GROUP ${SOURCE_GROUP}\\win32)
-
-ua_add_architecture("win32")
-
-list (FIND UA_AMALGAMATION_ARCHITECTURES "win32" _index)
-if (${_index} GREATER -1 OR "${UA_ARCHITECTURE}" STREQUAL "win32")
-
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_clock.c)
-    ua_add_architecture_file(${CMAKE_CURRENT_SOURCE_DIR}/ua_architecture_functions.c)
-
-    if("${UA_ARCHITECTURE}" STREQUAL "win32")
-        ua_architecture_append_to_library(ws2_32)
-        ua_architecture_append_to_library(iphlpapi)
-	#append iphlpapi permanently. Problem: PUBSUB Flag is configured after execution.        
-	#if(UA_ENABLE_DISCOVERY_MULTICAST OR UA_ENABLE_PUBSUB)
-        #    ua_architecture_append_to_library(iphlpapi)
-        #endif()
-    endif()
-
-    ua_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-
-endif()
diff --git a/ext/open62541/arch/win32/ua_architecture.h b/ext/open62541/arch/win32/ua_architecture.h
deleted file mode 100644
index 1f1e82a..0000000
--- a/ext/open62541/arch/win32/ua_architecture.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_WIN32
-
-#ifndef PLUGINS_ARCH_WIN32_UA_ARCHITECTURE_H_
-#define PLUGINS_ARCH_WIN32_UA_ARCHITECTURE_H_
-
-#include <open62541/architecture_base.h>
-
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-/* Disable some security warnings on MSVC */
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
-# define _CRT_SECURE_NO_WARNINGS
-#endif
-
-/* Assume that Windows versions are newer than Windows XP */
-#if defined(__MINGW32__) && (!defined(WINVER) || WINVER < 0x501)
-# undef WINVER
-# undef _WIN32_WINDOWS
-# undef _WIN32_WINNT
-# define WINVER 0x0600
-# define _WIN32_WINDOWS 0x0600
-# define _WIN32_WINNT 0x0600 //windows vista version, which included InepPton
-#endif
-
-#include <stdlib.h>
-#if defined(_WIN32) && !defined(__clang__)
-# include <malloc.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <winsock2.h>
-#include <windows.h>
-#include <ws2tcpip.h>
-
-#if defined (_MSC_VER) || defined(__clang__)
-# ifndef UNDER_CE
-#  include <io.h> //access
-#  define UA_access _access
-# endif
-#else
-# include <unistd.h> //access and tests
-# define UA_access access
-#endif
-
-#define ssize_t int
-#define OPTVAL_TYPE char
-#ifndef UA_sleep_ms
-# define UA_sleep_ms(X) Sleep(X)
-#endif
-
-// Windows does not support ansi colors
-// #define UA_ENABLE_LOG_COLORS
-
-#define UA_IPV6 1
-
-#if defined(__MINGW32__) && !defined(__clang__) //mingw defines SOCKET as long long unsigned int, giving errors in logging and when comparing with UA_Int32
-# define UA_SOCKET int
-# define UA_INVALID_SOCKET -1
-#else
-# define UA_SOCKET SOCKET
-# define UA_INVALID_SOCKET INVALID_SOCKET
-#endif
-#define UA_ERRNO WSAGetLastError()
-#define UA_INTERRUPTED WSAEINTR
-#define UA_AGAIN WSAEWOULDBLOCK
-#define UA_EAGAIN EAGAIN
-#define UA_WOULDBLOCK WSAEWOULDBLOCK
-#define UA_ERR_CONNECTION_PROGRESS WSAEWOULDBLOCK
-
-#define UA_fd_set(fd, fds) FD_SET((UA_SOCKET)fd, fds)
-#define UA_fd_isset(fd, fds) FD_ISSET((UA_SOCKET)fd, fds)
-
-#ifdef UNDER_CE
-# define errno
-#endif
-
-#define UA_getnameinfo getnameinfo
-#define UA_send(sockfd, buf, len, flags) send(sockfd, buf, (int)(len), flags)
-#define UA_recv(sockfd, buf, len, flags) recv(sockfd, buf, (int)(len), flags)
-#define UA_sendto(sockfd, buf, len, flags, dest_addr, addrlen) sendto(sockfd, (const char*)(buf), (int)(len), flags, dest_addr, (int) (addrlen))
-#define UA_recvfrom(sockfd, buf, len, flags, src_addr, addrlen) recvfrom(sockfd, (char*)(buf), (int)(len), flags, src_addr, addrlen)
-#define UA_htonl htonl
-#define UA_ntohl ntohl
-#define UA_close closesocket
-#define UA_select(nfds, readfds, writefds, exceptfds, timeout) select((int)(nfds), readfds, writefds, exceptfds, timeout)
-#define UA_shutdown shutdown
-#define UA_socket socket
-#define UA_bind bind
-#define UA_listen listen
-#define UA_accept accept
-#define UA_connect(sockfd, addr, addrlen) connect(sockfd, addr, (int)(addrlen))
-#define UA_getaddrinfo getaddrinfo
-#define UA_getsockopt getsockopt
-#define UA_setsockopt(sockfd, level, optname, optval, optlen) setsockopt(sockfd, level, optname, (const char*) (optval), optlen)
-#define UA_freeaddrinfo freeaddrinfo
-#define UA_gethostname gethostname
-#define UA_getsockname getsockname
-#define UA_inet_pton InetPton
-
-#if UA_IPV6
-# include <iphlpapi.h>
-# define UA_if_nametoindex if_nametoindex
-#endif
-
-#ifdef maxStringLength //defined in mingw64
-# undef maxStringLength
-#endif
-
-#ifndef UA_free
-#define UA_free free
-#endif
-#ifndef UA_malloc
-#define UA_malloc malloc
-#endif
-#ifndef UA_calloc
-#define UA_calloc calloc
-#endif
-#ifndef UA_realloc
-#define UA_realloc realloc
-#endif
-
-/* 3rd Argument is the string */
-#define UA_snprintf(source, size, ...) _snprintf_s(source, size, _TRUNCATE, __VA_ARGS__)
-
-#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \
-    char *errno_str = NULL; \
-    FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
-    NULL, WSAGetLastError(), \
-    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
-    (LPSTR)&errno_str, 0, NULL); \
-    LOG; \
-    LocalFree(errno_str); \
-}
-#define UA_LOG_SOCKET_ERRNO_GAI_WRAP UA_LOG_SOCKET_ERRNO_WRAP
-
-#if UA_MULTITHREADING >= 100
-#define UA_LOCK_TYPE_NAME CRITICAL_SECTION
-#define UA_LOCK_TYPE(mutexName) CRITICAL_SECTION mutexName; \
-                                int mutexName##Counter;
-#define UA_LOCK_INIT(mutexName) InitializeCriticalSection(&mutexName); \
-                                mutexName##Counter = 0;;
-#define UA_LOCK_DESTROY(mutexName) DeleteCriticalSection(&mutexName);
-#define UA_LOCK(mutexName) EnterCriticalSection(&mutexName); \
-                           UA_assert(++(mutexName##Counter) == 1);
-#define UA_UNLOCK(mutexName) UA_assert(--(mutexName##Counter) == 0); \
-                             LeaveCriticalSection(&mutexName);
-#define UA_LOCK_ASSERT(mutexName, num) UA_assert(mutexName##Counter == num);
-#else
-#define UA_LOCK_TYPE_NAME
-#define UA_LOCK_TYPE(mutexName)
-#define UA_LOCK_TYPE_POINTER(mutexName)
-#define UA_LOCK_INIT(mutexName)
-#define UA_LOCK_DESTROY(mutexName)
-#define UA_LOCK(mutexName)
-#define UA_UNLOCK(mutexName)
-#define UA_LOCK_ASSERT(mutexName, num)
-#endif
-
-#include <open62541/architecture_functions.h>
-
-/* Fix redefinition of SLIST_ENTRY on mingw winnt.h */
-#if !defined(_SYS_QUEUE_H_) && defined(SLIST_ENTRY)
-# undef SLIST_ENTRY
-#endif
-
-#endif /* PLUGINS_ARCH_WIN32_UA_ARCHITECTURE_H_ */
-
-#endif /* UA_ARCHITECTURE_WIN32 */
diff --git a/ext/open62541/arch/win32/ua_architecture_functions.c b/ext/open62541/arch/win32/ua_architecture_functions.c
deleted file mode 100644
index cf54e9e..0000000
--- a/ext/open62541/arch/win32/ua_architecture_functions.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifdef UA_ARCHITECTURE_WIN32
-
-#include <open62541/types.h>
-
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
-  u_long iMode = 0;
-  if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;;
-}
-
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){
-  u_long iMode = 1;
-  if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR)
-    return UA_STATUSCODE_BADINTERNALERROR;
-  return UA_STATUSCODE_GOOD;;
-}
-
-void UA_initialize_architecture_network(void){
-  WSADATA wsaData;
-  WSAStartup(MAKEWORD(2, 2), &wsaData);
-}
-
-void UA_deinitialize_architecture_network(void){
-  WSACleanup();
-}
-
-#endif /* UA_ARCHITECTURE_WIN32 */
diff --git a/ext/open62541/arch/win32/ua_clock.c b/ext/open62541/arch/win32/ua_clock.c
deleted file mode 100644
index 600c3dd..0000000
--- a/ext/open62541/arch/win32/ua_clock.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Stalder
- */
-
-#ifdef UA_ARCHITECTURE_WIN32
-
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-#include <open62541/types.h>
-
-#include <time.h>
-/* Backup definition of SLIST_ENTRY on mingw winnt.h */
-# ifdef SLIST_ENTRY
-#  pragma push_macro("SLIST_ENTRY")
-#  undef SLIST_ENTRY
-#  define POP_SLIST_ENTRY
-# endif
-# include <windows.h>
-/* restore definition */
-# ifdef POP_SLIST_ENTRY
-#  undef SLIST_ENTRY
-#  undef POP_SLIST_ENTRY
-#  pragma pop_macro("SLIST_ENTRY")
-# endif
-
-UA_DateTime UA_DateTime_now(void) {
-    /* Windows filetime has the same definition as UA_DateTime */
-    FILETIME ft;
-    SYSTEMTIME st;
-    GetSystemTime(&st);
-    SystemTimeToFileTime(&st, &ft);
-    ULARGE_INTEGER ul;
-    ul.LowPart = ft.dwLowDateTime;
-    ul.HighPart = ft.dwHighDateTime;
-    return (UA_DateTime)ul.QuadPart;
-}
-
-/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */
-UA_Int64 UA_DateTime_localTimeUtcOffset(void) {
-    time_t gmt, rawtime = time(NULL);
-
-    struct tm ptm;
-    gmtime_s(&ptm, &rawtime);
-    // Request that mktime() looksup dst in timezone database
-    ptm.tm_isdst = -1;
-    gmt = mktime(&ptm);
-
-    return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC);
-}
-
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-    LARGE_INTEGER freq, ticks;
-    QueryPerformanceFrequency(&freq);
-    QueryPerformanceCounter(&ticks);
-    UA_Double ticks2dt = UA_DATETIME_SEC / (UA_Double)freq.QuadPart;
-    return (UA_DateTime)(ticks.QuadPart * ticks2dt);
-}
-
-#endif /* UA_ARCHITECTURE_WIN32 */
diff --git a/ext/open62541/azure-pipelines.yml b/ext/open62541/azure-pipelines.yml
deleted file mode 100644
index 079f69a..0000000
--- a/ext/open62541/azure-pipelines.yml
+++ /dev/null
@@ -1,99 +0,0 @@
-# Docs see here:
-# https://aka.ms/yaml
-
-
-variables:
-  vcpkg_cache: C:/vcpkg/installed
-
-jobs:
-- job: 'win_vs2017'
-  displayName: 'Windows (VS2017)'
-  pool:
-    vmImage: 'vs2017-win2016'
-  variables:
-    CC_NAME: Visual Studio 15 2017
-    CC_SHORTNAME: VS2017
-    GENERATOR: Visual Studio 15 2017
-    FORCE_CXX: OFF
-  steps:
-  - checkout: self
-    submodules: recursive
-
-  - task: CacheBeta@0
-    inputs:
-      key: $(Build.SourcesDirectory)/tools/azure-devops/install.ps1
-      path: $(vcpkg_cache)
-    displayName: Cache vcpkg
-
-  - powershell: ./tools/azure-devops/install.ps1
-    displayName: Install Requirements
-  - powershell: ./tools/azure-devops/build.ps1
-    displayName: "Build: $(CC_NAME)"
-
-  - task: PublishBuildArtifacts@1
-    inputs:
-        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
-        ArtifactName: open62541-$(CC_SHORTNAME)
-        # publishing artifacts from PRs from a fork is currently blocked
-    condition: succeeded()
-    displayName: "Publish Artifact: open62541-$(CC_SHORTNAME)"
-
-
-- job: 'win_msys64'
-  displayName: 'Windows (msys64)'
-  pool:
-    vmImage: 'windows-latest'
-  variables:
-    CC_NAME: MinGW Makefiles
-    CC_SHORTNAME: mingw
-    GENERATOR: MinGW Makefiles
-    FORCE_CXX: OFF
-    MSYS2_ROOT: C:/msys64
-  steps:
-  - checkout: self
-    submodules: recursive
-
-  - powershell: ./tools/azure-devops/install.ps1
-    displayName: Install Requirements
-  - powershell: ./tools/azure-devops/build.ps1
-    displayName: "Build: $(CC_NAME)"
-    errorActionPreference: continue # If set to Stop, we only get a truncated exception message. Error is handled by checking exit code
-
-
-  - task: PublishBuildArtifacts@1
-    inputs:
-        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
-        ArtifactName: open62541-$(CC_SHORTNAME)
-        # publishing artifacts from PRs from a fork is currently blocked
-    condition: succeeded()
-    displayName: "Publish Artifact: open62541-$(CC_SHORTNAME)"
-
-
-
-- job: 'win_clang'
-  displayName: 'Windows (clang)'
-  pool:
-    vmImage: 'windows-latest'
-  variables:
-    CC_NAME: Clang
-    CC_SHORTNAME: clang-mingw
-    GENERATOR: MinGW Makefiles
-    FORCE_CXX: OFF
-    MSYS2_ROOT: C:/msys64
-  steps:
-  - checkout: self
-    submodules: recursive
-
-  - powershell: ./tools/azure-devops/install.ps1
-    displayName: Install Requirements
-  - powershell: ./tools/azure-devops/build.ps1
-    displayName: "Build: $(CC_NAME)"
-    errorActionPreference: continue # If set to Stop, we only get a truncated exception message. Error is handled by checking exit code
-
-  - task: PublishBuildArtifacts@1
-    inputs:
-        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
-        ArtifactName: open62541-$(CC_SHORTNAME)
-        # publishing artifacts from PRs from a fork is currently blocked
-    condition: succeeded()
-    displayName: "Publish Artifact: open62541-$(CC_SHORTNAME)"
diff --git a/ext/open62541/cppcheck-suppressions.txt b/ext/open62541/cppcheck-suppressions.txt
deleted file mode 100644
index cdadc90..0000000
--- a/ext/open62541/cppcheck-suppressions.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-missingIncludeSystem
-unusedFunction
-*:build
diff --git a/ext/open62541/debian/changelog b/ext/open62541/debian/changelog
deleted file mode 100644
index 10af1da..0000000
--- a/ext/open62541/debian/changelog
+++ /dev/null
@@ -1,5 +0,0 @@
-open62541 (1.0) UNRELEASED; urgency=low
-
-  * Initial Release.
-
- -- open62541 Team <open62541-core@googlegroups.com>  Fri, 19 Jul 2019 10:51:28 +0100
diff --git a/ext/open62541/debian/compat b/ext/open62541/debian/compat
deleted file mode 100644
index 7f8f011..0000000
--- a/ext/open62541/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/ext/open62541/debian/control-template b/ext/open62541/debian/control-template
deleted file mode 100644
index 648c6f0..0000000
--- a/ext/open62541/debian/control-template
+++ /dev/null
@@ -1,36 +0,0 @@
-Source: open62541
-Priority: optional
-Maintainer: open62541 Team <open62541-core@googlegroups.com>
-Build-Depends: debhelper (>= 7.0.50~),
- cmake (>= 2.8),
- git,
- graphviz,
- python (>= 2.7),
-Standards-Version: 4.1.2
-Section: libs
-Homepage: https://open62541.org/
-Vcs-Git: https://github.com/open62541/open62541.git
-Vcs-Browser: https://github.com/open62541/open62541
-
-Package: libopen62541-<soname>-dev
-Section: libdevel
-Architecture: any
-Multi-Arch: same
-Depends: libopen62541-<soname> (= ${binary:Version}), ${misc:Depends}, python
-Description: Development header files for open62541
- open62541 is an open source C (C99) implementation of the OPC UA standard
-
-Package: libopen62541-<soname>
-Architecture: any
-Multi-Arch: same
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Description: Open source implementation of OPC UA (OPC Unified Architecture) aka IEC 62541
- open62541 is an open source C (C99) implementation of the OPC UA standard
-
-Package: libopen62541-<soname>-dbg
-Section: debug
-Architecture: any
-Priority: extra
-Depends: libopen62541-<soname> (= ${binary:Version}), ${misc:Depends}
-Description: Debugging symbols for open62541
- open62541 is an open source C (C99) implementation of the OPC UA standard
diff --git a/ext/open62541/debian/copyright b/ext/open62541/debian/copyright
deleted file mode 100644
index fe89b57..0000000
--- a/ext/open62541/debian/copyright
+++ /dev/null
@@ -1,388 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: open62541
-Upstream-Contact: open62541 Team <open62541-core@googlegroups.com>
-Source: https://open62541.org/
-
-Files: *
-Copyright: 2019 open62541 Team <open62541-core@googlegroups.com>
-License: MPL-2.0
-
-Files: debian/*
-Copyright: 2019 open62541 Team <open62541-core@googlegroups.com>
-License: MPL-2.0
-
-License: MPL-2.0
- Mozilla Public License Version 2.0
- ==================================
-
- 1. Definitions
- --------------
-
- 1.1. "Contributor"
-     means each individual or legal entity that creates, contributes to
-     the creation of, or owns Covered Software.
-
- 1.2. "Contributor Version"
-     means the combination of the Contributions of others (if any) used
-     by a Contributor and that particular Contributor's Contribution.
-
- 1.3. "Contribution"
-     means Covered Software of a particular Contributor.
-
- 1.4. "Covered Software"
-     means Source Code Form to which the initial Contributor has attached
-     the notice in Exhibit A, the Executable Form of such Source Code
-     Form, and Modifications of such Source Code Form, in each case
-     including portions thereof.
-
- 1.5. "Incompatible With Secondary Licenses"
-     means
-
-     (a) that the initial Contributor has attached the notice described
-         in Exhibit B to the Covered Software; or
-
-     (b) that the Covered Software was made available under the terms of
-         version 1.1 or earlier of the License, but not also under the
-         terms of a Secondary License.
-
- 1.6. "Executable Form"
-     means any form of the work other than Source Code Form.
-
- 1.7. "Larger Work"
-     means a work that combines Covered Software with other material, in
-     a separate file or files, that is not Covered Software.
-
- 1.8. "License"
-     means this document.
-
- 1.9. "Licensable"
-     means having the right to grant, to the maximum extent possible,
-     whether at the time of the initial grant or subsequently, any and
-     all of the rights conveyed by this License.
-
- 1.10. "Modifications"
-     means any of the following:
-
-     (a) any file in Source Code Form that results from an addition to,
-         deletion from, or modification of the contents of Covered
-         Software; or
-
-     (b) any new file in Source Code Form that contains any Covered
-         Software.
-
- 1.11. "Patent Claims" of a Contributor
-     means any patent claim(s), including without limitation, method,
-     process, and apparatus claims, in any patent Licensable by such
-     Contributor that would be infringed, but for the grant of the
-     License, by the making, using, selling, offering for sale, having
-     made, import, or transfer of either its Contributions or its
-     Contributor Version.
-
- 1.12. "Secondary License"
-     means either the GNU General Public License, Version 2.0, the GNU
-     Lesser General Public License, Version 2.1, the GNU Affero General
-     Public License, Version 3.0, or any later versions of those
-     licenses.
-
- 1.13. "Source Code Form"
-     means the form of the work preferred for making modifications.
-
- 1.14. "You" (or "Your")
-     means an individual or a legal entity exercising rights under this
-     License. For legal entities, "You" includes any entity that
-     controls, is controlled by, or is under common control with You. For
-     purposes of this definition, "control" means (a) the power, direct
-     or indirect, to cause the direction or management of such entity,
-     whether by contract or otherwise, or (b) ownership of more than
-     fifty percent (50%) of the outstanding shares or beneficial
-     ownership of such entity.
-
- 2. License Grants and Conditions
- --------------------------------
-
- 2.1. Grants
-
- Each Contributor hereby grants You a world-wide, royalty-free,
- non-exclusive license:
-
- (a) under intellectual property rights (other than patent or trademark)
-     Licensable by such Contributor to use, reproduce, make available,
-     modify, display, perform, distribute, and otherwise exploit its
-     Contributions, either on an unmodified basis, with Modifications, or
-     as part of a Larger Work; and
-
- (b) under Patent Claims of such Contributor to make, use, sell, offer
-     for sale, have made, import, and otherwise transfer either its
-     Contributions or its Contributor Version.
-
- 2.2. Effective Date
-
- The licenses granted in Section 2.1 with respect to any Contribution
- become effective for each Contribution on the date the Contributor first
- distributes such Contribution.
-
- 2.3. Limitations on Grant Scope
-
- The licenses granted in this Section 2 are the only rights granted under
- this License. No additional rights or licenses will be implied from the
- distribution or licensing of Covered Software under this License.
- Notwithstanding Section 2.1(b) above, no patent license is granted by a
- Contributor:
-
- (a) for any code that a Contributor has removed from Covered Software;
-     or
-
- (b) for infringements caused by: (i) Your and any other third party's
-     modifications of Covered Software, or (ii) the combination of its
-     Contributions with other software (except as part of its Contributor
-     Version); or
-
- (c) under Patent Claims infringed by Covered Software in the absence of
-     its Contributions.
-
- This License does not grant any rights in the trademarks, service marks,
- or logos of any Contributor (except as may be necessary to comply with
- the notice requirements in Section 3.4).
-
- 2.4. Subsequent Licenses
-
- No Contributor makes additional grants as a result of Your choice to
- distribute the Covered Software under a subsequent version of this
- License (see Section 10.2) or under the terms of a Secondary License (if
- permitted under the terms of Section 3.3).
-
- 2.5. Representation
-
- Each Contributor represents that the Contributor believes its
- Contributions are its original creation(s) or it has sufficient rights
- to grant the rights to its Contributions conveyed by this License.
-
- 2.6. Fair Use
-
- This License is not intended to limit any rights You have under
- applicable copyright doctrines of fair use, fair dealing, or other
- equivalents.
-
- 2.7. Conditions
-
- Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
- in Section 2.1.
-
- 3. Responsibilities
- -------------------
-
- 3.1. Distribution of Source Form
-
- All distribution of Covered Software in Source Code Form, including any
- Modifications that You create or to which You contribute, must be under
- the terms of this License. You must inform recipients that the Source
- Code Form of the Covered Software is governed by the terms of this
- License, and how they can obtain a copy of this License. You may not
- attempt to alter or restrict the recipients' rights in the Source Code
- Form.
-
- 3.2. Distribution of Executable Form
-
- If You distribute Covered Software in Executable Form then:
-
- (a) such Covered Software must also be made available in Source Code
-     Form, as described in Section 3.1, and You must inform recipients of
-     the Executable Form how they can obtain a copy of such Source Code
-     Form by reasonable means in a timely manner, at a charge no more
-     than the cost of distribution to the recipient; and
-
- (b) You may distribute such Executable Form under the terms of this
-     License, or sublicense it under different terms, provided that the
-     license for the Executable Form does not attempt to limit or alter
-     the recipients' rights in the Source Code Form under this License.
-
- 3.3. Distribution of a Larger Work
-
- You may create and distribute a Larger Work under terms of Your choice,
- provided that You also comply with the requirements of this License for
- the Covered Software. If the Larger Work is a combination of Covered
- Software with a work governed by one or more Secondary Licenses, and the
- Covered Software is not Incompatible With Secondary Licenses, this
- License permits You to additionally distribute such Covered Software
- under the terms of such Secondary License(s), so that the recipient of
- the Larger Work may, at their option, further distribute the Covered
- Software under the terms of either this License or such Secondary
- License(s).
-
- 3.4. Notices
-
- You may not remove or alter the substance of any license notices
- (including copyright notices, patent notices, disclaimers of warranty,
- or limitations of liability) contained within the Source Code Form of
- the Covered Software, except that You may alter any license notices to
- the extent required to remedy known factual inaccuracies.
-
- 3.5. Application of Additional Terms
-
- You may choose to offer, and to charge a fee for, warranty, support,
- indemnity or liability obligations to one or more recipients of Covered
- Software. However, You may do so only on Your own behalf, and not on
- behalf of any Contributor. You must make it absolutely clear that any
- such warranty, support, indemnity, or liability obligation is offered by
- You alone, and You hereby agree to indemnify every Contributor for any
- liability incurred by such Contributor as a result of warranty, support,
- indemnity or liability terms You offer. You may include additional
- disclaimers of warranty and limitations of liability specific to any
- jurisdiction.
-
- 4. Inability to Comply Due to Statute or Regulation
- ---------------------------------------------------
-
- If it is impossible for You to comply with any of the terms of this
- License with respect to some or all of the Covered Software due to
- statute, judicial order, or regulation then You must: (a) comply with
- the terms of this License to the maximum extent possible; and (b)
- describe the limitations and the code they affect. Such description must
- be placed in a text file included with all distributions of the Covered
- Software under this License. Except to the extent prohibited by statute
- or regulation, such description must be sufficiently detailed for a
- recipient of ordinary skill to be able to understand it.
-
- 5. Termination
- --------------
-
- 5.1. The rights granted under this License will terminate automatically
- if You fail to comply with any of its terms. However, if You become
- compliant, then the rights granted under this License from a particular
- Contributor are reinstated (a) provisionally, unless and until such
- Contributor explicitly and finally terminates Your grants, and (b) on an
- ongoing basis, if such Contributor fails to notify You of the
- non-compliance by some reasonable means prior to 60 days after You have
- come back into compliance. Moreover, Your grants from a particular
- Contributor are reinstated on an ongoing basis if such Contributor
- notifies You of the non-compliance by some reasonable means, this is the
- first time You have received notice of non-compliance with this License
- from such Contributor, and You become compliant prior to 30 days after
- Your receipt of the notice.
-
- 5.2. If You initiate litigation against any entity by asserting a patent
- infringement claim (excluding declaratory judgment actions,
- counter-claims, and cross-claims) alleging that a Contributor Version
- directly or indirectly infringes any patent, then the rights granted to
- You by any and all Contributors for the Covered Software under Section
- 2.1 of this License shall terminate.
-
- 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
- end user license agreements (excluding distributors and resellers) which
- have been validly granted by You or Your distributors under this License
- prior to termination shall survive termination.
-
- ************************************************************************
- *                                                                      *
- *  6. Disclaimer of Warranty                                           *
- *  -------------------------                                           *
- *                                                                      *
- *  Covered Software is provided under this License on an "as is"       *
- *  basis, without warranty of any kind, either expressed, implied, or  *
- *  statutory, including, without limitation, warranties that the       *
- *  Covered Software is free of defects, merchantable, fit for a        *
- *  particular purpose or non-infringing. The entire risk as to the     *
- *  quality and performance of the Covered Software is with You.        *
- *  Should any Covered Software prove defective in any respect, You     *
- *  (not any Contributor) assume the cost of any necessary servicing,   *
- *  repair, or correction. This disclaimer of warranty constitutes an   *
- *  essential part of this License. No use of any Covered Software is   *
- *  authorized under this License except under this disclaimer.         *
- *                                                                      *
- ************************************************************************
-
- ************************************************************************
- *                                                                      *
- *  7. Limitation of Liability                                          *
- *  --------------------------                                          *
- *                                                                      *
- *  Under no circumstances and under no legal theory, whether tort      *
- *  (including negligence), contract, or otherwise, shall any           *
- *  Contributor, or anyone who distributes Covered Software as          *
- *  permitted above, be liable to You for any direct, indirect,         *
- *  special, incidental, or consequential damages of any character      *
- *  including, without limitation, damages for lost profits, loss of    *
- *  goodwill, work stoppage, computer failure or malfunction, or any    *
- *  and all other commercial damages or losses, even if such party      *
- *  shall have been informed of the possibility of such damages. This   *
- *  limitation of liability shall not apply to liability for death or   *
- *  personal injury resulting from such party's negligence to the       *
- *  extent applicable law prohibits such limitation. Some               *
- *  jurisdictions do not allow the exclusion or limitation of           *
- *  incidental or consequential damages, so this exclusion and          *
- *  limitation may not apply to You.                                    *
- *                                                                      *
- ************************************************************************
-
- 8. Litigation
- -------------
-
- Any litigation relating to this License may be brought only in the
- courts of a jurisdiction where the defendant maintains its principal
- place of business and such litigation shall be governed by laws of that
- jurisdiction, without reference to its conflict-of-law provisions.
- Nothing in this Section shall prevent a party's ability to bring
- cross-claims or counter-claims.
-
- 9. Miscellaneous
- ----------------
-
- This License represents the complete agreement concerning the subject
- matter hereof. If any provision of this License is held to be
- unenforceable, such provision shall be reformed only to the extent
- necessary to make it enforceable. Any law or regulation which provides
- that the language of a contract shall be construed against the drafter
- shall not be used to construe this License against a Contributor.
-
- 10. Versions of the License
- ---------------------------
-
- 10.1. New Versions
-
- Mozilla Foundation is the license steward. Except as provided in Section
- 10.3, no one other than the license steward has the right to modify or
- publish new versions of this License. Each version will be given a
- distinguishing version number.
-
- 10.2. Effect of New Versions
-
- You may distribute the Covered Software under the terms of the version
- of the License under which You originally received the Covered Software,
- or under the terms of any subsequent version published by the license
- steward.
-
- 10.3. Modified Versions
-
- If you create software not governed by this License, and you want to
- create a new license for such software, you may create and use a
- modified version of this License if you rename the license and remove
- any references to the name of the license steward (except to note that
- such modified license differs from this License).
-
- 10.4. Distributing Source Code Form that is Incompatible With Secondary
- Licenses
-
- If You choose to distribute Source Code Form that is Incompatible With
- Secondary Licenses under the terms of this version of the License, the
- notice described in Exhibit B of this License must be attached.
-
- Exhibit A - Source Code Form License Notice
- -------------------------------------------
-
-   This Source Code Form is subject to the terms of the Mozilla Public
-   License, v. 2.0. If a copy of the MPL was not distributed with this
-   file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
- If it is not possible or desirable to put the notice in a particular
- file, then You may include the notice in a location (such as a LICENSE
- file in a relevant directory) where a recipient would be likely to look
- for such a notice.
-
- You may add additional accurate notices of copyright ownership.
-
- Exhibit B - "Incompatible With Secondary Licenses" Notice
- ---------------------------------------------------------
-
-   This Source Code Form is "Incompatible With Secondary Licenses", as
-   defined by the Mozilla Public License, v. 2.0.
-
diff --git a/ext/open62541/debian/libopen62541-dev.install-template b/ext/open62541/debian/libopen62541-dev.install-template
deleted file mode 100644
index e5fb818..0000000
--- a/ext/open62541/debian/libopen62541-dev.install-template
+++ /dev/null
@@ -1,5 +0,0 @@
-usr/include
-usr/lib/*/{*.a,*.so}
-usr/lib/*/cmake/open62541/*
-usr/lib/*/pkgconfig/open62541.pc
-usr/share/open62541/*
diff --git a/ext/open62541/debian/libopen62541.install-template b/ext/open62541/debian/libopen62541.install-template
deleted file mode 100644
index 3de3b10..0000000
--- a/ext/open62541/debian/libopen62541.install-template
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/*/*.so.*
diff --git a/ext/open62541/debian/rules-template b/ext/open62541/debian/rules-template
deleted file mode 100644
index e455ae7..0000000
--- a/ext/open62541/debian/rules-template
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/make -f
-
-export DH_VERBOSE = 1
-
-export DEB_BUILD_OPTIONS=parallel=4
-
-override_dh_auto_configure:
-	dh_auto_configure -- -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUA_NAMESPACE_ZERO=FULL -DUA_ENABLE_AMALGAMATION=OFF -DUA_PACK_DEBIAN=ON
-
-override_dh_auto_test:
-	dh_auto_test -- ARGS+=--output-on-failure
-
-override_dh_strip:
-	dh_strip --dbg-package=libopen62541-<soname>-dbg
-
-%:
-	dh $@ --buildsystem=cmake --parallel
-
-
diff --git a/ext/open62541/debian/source/format b/ext/open62541/debian/source/format
deleted file mode 100644
index 89ae9db..0000000
--- a/ext/open62541/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (native)
diff --git a/ext/open62541/deps/atoi.c b/ext/open62541/deps/atoi.c
deleted file mode 100644
index 8911c5d..0000000
--- a/ext/open62541/deps/atoi.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Originally released by the musl project (http://www.musl-libc.org/) under the
- * MIT license. Taken and adapted from the file src/stdlib/atoi.c 
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
- */
-
-#include "atoi.h"
-
-UA_StatusCode atoiUnsigned(const char *s, size_t size, UA_UInt64 *result){
-    if(size < 1){   
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    size_t i = 0; 
-    UA_UInt64 n = 0;
-    
-    while ( i < size) {
-        /*isDigit*/
-        if ( s[i] >= '0' && s[i] <= '9' )
-        {
-          n *= 10;
-          n = (n + (UA_UInt64)(s[i] - '0'));
-          i++;
-        }else{
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    }
-    
-    *result = n;
-    return UA_STATUSCODE_GOOD;
-   }
-
-UA_StatusCode atoiSigned(const char *s, size_t size, UA_Int64 *result){
-    if(size < 1){   
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    size_t i = 0; 
-    UA_Int64 n = 0;
-    UA_Boolean neg = 0; 
-    
-    if(*s == '-'){
-        neg = 1;
-        i++;
-    }
-    while ( i < size) {
-        if ( s[i] >= '0' && s[i] <= '9' )
-        {
-          n *= 10;
-          n = (n + (s[i] - '0'));
-          i++;
-        }else{
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    }
-    
-    if (neg){
-       n *= -1;
-    }
-    
-    *result = n;
-    return UA_STATUSCODE_GOOD;
-   }
diff --git a/ext/open62541/deps/atoi.h b/ext/open62541/deps/atoi.h
deleted file mode 100644
index e624ecd..0000000
--- a/ext/open62541/deps/atoi.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef ATOI_H
-#define ATOI_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <open62541/types.h>
-
-UA_StatusCode atoiUnsigned(const char *s, size_t size, UA_UInt64 *result);
-UA_StatusCode atoiSigned(const char *s, size_t size, UA_Int64 *result);
-    
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ATOI_H */
-
diff --git a/ext/open62541/deps/base64.c b/ext/open62541/deps/base64.c
deleted file mode 100644
index 2eb32cd..0000000
--- a/ext/open62541/deps/base64.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Base64 encoding: Copyright (c) 2005-2011, Jouni Malinen <j@w1.fi>
- * This software may be distributed under the terms of the BSD license.
- *
- * Base64 decoding: Copyright (c) 2016, polfosol
- * Posted at https://stackoverflow.com/a/37109258 under the CC-BY-SA Creative
- * Commons license.
- */
-
-#include "base64.h"
-#include <open62541/types.h>
-
-static const unsigned char base64_table[65] =
-	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-unsigned char *
-UA_base64(const unsigned char *src, size_t len, size_t *out_len) {
-    if(len == 0) {
-        *out_len = 0;
-        return (unsigned char*)UA_EMPTY_ARRAY_SENTINEL;
-    }
-
-	size_t olen = 4*((len + 2) / 3); /* 3-byte blocks to 4-byte */
-	if(olen < len)
-		return NULL; /* integer overflow */
-
-	unsigned char *out = (unsigned char*)UA_malloc(olen);
-	if(!out)
-		return NULL;
-
-	const unsigned char *end = src + len;
-	const unsigned char *in = src;
-	unsigned char *pos = out;
-	while(end - in >= 3) {
-		*pos++ = base64_table[in[0] >> 2];
-		*pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
-		*pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
-		*pos++ = base64_table[in[2] & 0x3f];
-		in += 3;
-	}
-
-	if(end - in) {
-		*pos++ = base64_table[in[0] >> 2];
-		if(end - in == 1) {
-			*pos++ = base64_table[(in[0] & 0x03) << 4];
-			*pos++ = '=';
-		} else {
-			*pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
-			*pos++ = base64_table[(in[1] & 0x0f) << 2];
-		}
-		*pos++ = '=';
-	}
-
-    *out_len = (size_t)(pos - out);
-	return out;
-}
-
-static const uint32_t from_b64[256] = {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  62, 63, 62, 62, 63,
-    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0,  0,  0,  0,  0,  0,
-    0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
-    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0,  0,  0,  0,  63,
-    0,  26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51};
-
-unsigned char *
-UA_unbase64(const unsigned char *src, size_t len, size_t *out_len) {
-    if(len == 0) {
-        *out_len = 0;
-        return (unsigned char*)UA_EMPTY_ARRAY_SENTINEL;
-    }
-
-    const unsigned char *p = src;
-    size_t pad1 = len % 4 || p[len - 1] == '=';
-    size_t pad2 = pad1 && (len % 4 > 2 || p[len - 2] != '=');
-    const size_t last = (len - pad1) / 4 << 2;
-
-    unsigned char *str = (unsigned char*)UA_malloc(last / 4 * 3 + pad1 + pad2);
-    if(!str)
-        return NULL;
-
-    unsigned char *pos = str;
-    for(size_t i = 0; i < last; i += 4) {
-        uint32_t n = from_b64[p[i]] << 18 | from_b64[p[i + 1]] << 12 |
-                     from_b64[p[i + 2]] << 6 | from_b64[p[i + 3]];
-        *pos++ = (unsigned char)(n >> 16);
-        *pos++ = (unsigned char)(n >> 8 & 0xFF);
-        *pos++ = (unsigned char)(n & 0xFF);
-    }
-
-    if(pad1) {
-        uint32_t n = from_b64[p[last]] << 18 | from_b64[p[last + 1]] << 12;
-        *pos++ = (unsigned char)(n >> 16);
-        if(pad2) {
-            n |= from_b64[p[last + 2]] << 6;
-            *pos++ = (unsigned char)(n >> 8 & 0xFF);
-        }
-    }
-
-    *out_len = (uintptr_t)(pos - str);
-    return str;
-}
diff --git a/ext/open62541/deps/base64.h b/ext/open62541/deps/base64.h
deleted file mode 100644
index 33de7b4..0000000
--- a/ext/open62541/deps/base64.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef UA_BASE64_H_
-#define UA_BASE64_H_
-
-#include <open62541/config.h>
-
-_UA_BEGIN_DECLS
-
-#include <stddef.h>
-
-/**
- * base64_encode - Base64 encode
- * @src: Data to be encoded
- * @len: Length of the data to be encoded
- * @out_len: Pointer to output length variable
- * Returns: Allocated buffer of out_len bytes of encoded data,
- * or %NULL on failure. The output is NOT Null-terminated. */
-unsigned char *
-UA_base64(const unsigned char *src, size_t len, size_t *out_len);
-
-/**
- * base64_decode - Base64 decode
- * @src: Data to be decoded
- * @len: Length of the data to be decoded
- * @out_len: Pointer to output length variable
- * Returns: Allocated buffer of out_len bytes of decoded data,
- * or %NULL on failure. */
-unsigned char *
-UA_unbase64(const unsigned char *src, size_t len, size_t *out_len);
-
-_UA_END_DECLS
-
-#endif /* UA_BASE64_H_ */
diff --git a/ext/open62541/deps/itoa.c b/ext/open62541/deps/itoa.c
deleted file mode 100644
index 40a2af6..0000000
--- a/ext/open62541/deps/itoa.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2017 Techie Delight
- * Permission is hereby granted, free of charge, to any person obtaining a copy 
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights 
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
- * copies of the Software, and to permit persons to whom the Software is 
- * furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included 
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/* Originally released by techiedelight.com 
- * (http://www.techiedelight.com/implement-itoa-function-in-c/) under the
- * MIT license. */
-
-#include "itoa.h"
-
-static void swap(char *x, char *y) {
-    char t = *x;
-    *x = *y;
-    *y = t;
-}
-
-/* function to reverse buffer */
-static char* reverse(char *buffer, UA_UInt16 i, UA_UInt16 j) {
-    while (i < j)
-        swap(&buffer[i++], &buffer[j--]);
-
-    return buffer;
-}
-
-/* adapted from http://www.techiedelight.com/implement-itoa-function-in-c/ to use UA_... types */
-UA_UInt16 itoaUnsigned(UA_UInt64 value, char* buffer, UA_Byte base) {
-    /* consider absolute value of number */
-    UA_UInt64 n = value;
-
-    UA_UInt16 i = 0;
-    while (n) {
-        UA_UInt64 r = n % base;
-
-        if (r >= 10)
-            buffer[i++] = (char)(65 + (r - 10));
-        else
-            buffer[i++] = (char)(48 + r);
-
-        n = n / base;
-    }
-    /* if number is 0 */
-    if (i == 0)
-        buffer[i++] = '0';
-
-    buffer[i] = '\0'; /* null terminate string */
-    i--;
-    /* reverse the string */
-    reverse(buffer, 0, i);
-    i++;
-    return i;
-}
-
-/* adapted from http://www.techiedelight.com/implement-itoa-function-in-c/ to use UA_... types */
-UA_UInt16 itoaSigned(UA_Int64 value, char* buffer) {
-    /* consider absolute value of number */
-    UA_UInt64 n = (UA_UInt64)value;
-
-    if(value < 0){
-        n = (UA_UInt64)-value;
-    }
-    
-    UA_UInt16 i = 0;
-    while (n) {
-        UA_UInt64 r = n % 10;
-
-        if (r >= 10)
-            buffer[i++] = (char)(65 + (r - 10));
-        else
-            buffer[i++] = (char)(48 + r);
-
-        n = n / 10;
-    }
-
-    /* if number is 0 */
-    if (i == 0)
-        buffer[i++] = '0';
-
-    if (value < 0)
-        buffer[i++] = '-';
-
-    buffer[i] = '\0'; /* null terminate string */
-    i--;
-    /* reverse the string and return it */
-    reverse(buffer, 0, i);
-    i++;
-    return i;
-}
-
diff --git a/ext/open62541/deps/itoa.h b/ext/open62541/deps/itoa.h
deleted file mode 100644
index 1e899f0..0000000
--- a/ext/open62541/deps/itoa.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2017 Techie Delight
- * Permission is hereby granted, free of charge, to any person obtaining a copy 
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights 
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
- * copies of the Software, and to permit persons to whom the Software is 
- * furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included 
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef ITOA_H
-#define ITOA_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <open62541/types.h>
-
-UA_UInt16 itoaUnsigned(UA_UInt64 value, char* buffer, UA_Byte base);
-UA_UInt16 itoaSigned(UA_Int64 value, char* buffer);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ITOA_H */
-
diff --git a/ext/open62541/deps/jsmn/jsmn.c b/ext/open62541/deps/jsmn/jsmn.c
deleted file mode 100644
index 8a187e7..0000000
--- a/ext/open62541/deps/jsmn/jsmn.c
+++ /dev/null
@@ -1,316 +0,0 @@
-#include "jsmn.h"
-
-#define JSMN_STRICT
-
-/**
- * Allocates a fresh unused token from the token pull.
- */
-static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
-		jsmntok_t *tokens, size_t num_tokens) {
-	jsmntok_t *tok;
-	if (parser->toknext >= num_tokens) {
-		return NULL;
-	}
-	tok = &tokens[parser->toknext++];
-	tok->start = tok->end = -1;
-	tok->size = 0;
-#ifdef JSMN_PARENT_LINKS
-	tok->parent = -1;
-#endif
-	return tok;
-}
-
-/**
- * Fills token type and boundaries.
- */
-static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
-                            int start, int end) {
-	token->type = type;
-	token->start = start;
-	token->end = end;
-	token->size = 0;
-}
-
-/**
- * Fills next available token with JSON primitive.
- */
-static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
-		size_t len, jsmntok_t *tokens, size_t num_tokens) {
-	jsmntok_t *token;
-	int start;
-
-	start = (int)parser->pos;
-
-	for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
-		switch (js[parser->pos]) {
-#ifndef JSMN_STRICT
-			/* In strict mode primitive must be followed by "," or "}" or "]" */
-			case ':':
-#endif
-			case '\t' : case '\r' : case '\n' : case ' ' :
-			case ','  : case ']'  : case '}' :
-				goto found;
-		}
-		if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
-			parser->pos = (unsigned int)start;
-			return JSMN_ERROR_INVAL;
-		}
-	}
-#ifdef JSMN_STRICT
-	/* In strict mode primitive must be followed by a comma/object/array */
-	parser->pos = (unsigned int)start;
-	return JSMN_ERROR_PART;
-#endif
-
-found:
-	if (tokens == NULL) {
-		parser->pos--;
-		return 0;
-	}
-	token = jsmn_alloc_token(parser, tokens, num_tokens);
-	if (token == NULL) {
-		parser->pos = (unsigned int)start;
-		return JSMN_ERROR_NOMEM;
-	}
-	jsmn_fill_token(token, JSMN_PRIMITIVE, start, (int)parser->pos);
-#ifdef JSMN_PARENT_LINKS
-	token->parent = parser->toksuper;
-#endif
-	parser->pos--;
-	return 0;
-}
-
-/**
- * Fills next token with JSON string.
- */
-static int jsmn_parse_string(jsmn_parser *parser, const char *js,
-		size_t len, jsmntok_t *tokens, size_t num_tokens) {
-	jsmntok_t *token;
-
-	unsigned int start = parser->pos;
-
-	parser->pos++;
-
-	/* Skip starting quote */
-	for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
-		char c = js[parser->pos];
-
-		/* Quote: end of string */
-		if (c == '\"') {
-			if (tokens == NULL) {
-				return 0;
-			}
-			token = jsmn_alloc_token(parser, tokens, num_tokens);
-			if (token == NULL) {
-				parser->pos = start;
-				return JSMN_ERROR_NOMEM;
-			}
-			jsmn_fill_token(token, JSMN_STRING, (int)(start+1), (int)parser->pos);
-#ifdef JSMN_PARENT_LINKS
-			token->parent = parser->toksuper;
-#endif
-			return 0;
-		}
-
-		/* Backslash: Quoted symbol expected */
-		if (c == '\\' && parser->pos + 1 < len) {
-			int i;
-			parser->pos++;
-			switch (js[parser->pos]) {
-				/* Allowed escaped symbols */
-				case '\"': case '/' : case '\\' : case 'b' :
-				case 'f' : case 'r' : case 'n'  : case 't' :
-					break;
-				/* Allows escaped symbol \uXXXX */
-				case 'u':
-					parser->pos++;
-					for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) {
-						/* If it isn't a hex character we have an error */
-						if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */
-									(js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */
-									(js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */
-							parser->pos = start;
-							return JSMN_ERROR_INVAL;
-						}
-						parser->pos++;
-					}
-					parser->pos--;
-					break;
-				/* Unexpected symbol */
-				default:
-					parser->pos = start;
-					return JSMN_ERROR_INVAL;
-			}
-		}
-	}
-	parser->pos = start;
-	return JSMN_ERROR_PART;
-}
-
-/**
- * Parse JSON string and fill tokens.
- */
-int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
-		jsmntok_t *tokens, unsigned int num_tokens) {
-	int r;
-	int i;
-	jsmntok_t *token;
-	unsigned int count = parser->toknext;
-
-	for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
-		char c;
-		jsmntype_t type;
-
-		c = js[parser->pos];
-		switch (c) {
-			case '{': case '[':
-				count++;
-				if (tokens == NULL) {
-					break;
-				}
-				token = jsmn_alloc_token(parser, tokens, num_tokens);
-				if (token == NULL)
-					return JSMN_ERROR_NOMEM;
-				if (parser->toksuper != -1) {
-					tokens[parser->toksuper].size++;
-#ifdef JSMN_PARENT_LINKS
-					token->parent = parser->toksuper;
-#endif
-				}
-				token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
-				token->start = (int)parser->pos;
-				parser->toksuper = (int)parser->toknext - 1;
-				break;
-			case '}': case ']':
-				if (tokens == NULL)
-					break;
-				type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
-#ifdef JSMN_PARENT_LINKS
-				if (parser->toknext < 1) {
-					return JSMN_ERROR_INVAL;
-				}
-				token = &tokens[parser->toknext - 1];
-				for (;;) {
-					if (token->start != -1 && token->end == -1) {
-						if (token->type != type) {
-							return JSMN_ERROR_INVAL;
-						}
-						token->end = parser->pos + 1;
-						parser->toksuper = token->parent;
-						break;
-					}
-					if (token->parent == -1) {
-						if(token->type != type || parser->toksuper == -1) {
-							return JSMN_ERROR_INVAL;
-						}
-						break;
-					}
-					token = &tokens[token->parent];
-				}
-#else
-				for (i = (int)parser->toknext - 1; i >= 0; i--) {
-					token = &tokens[i];
-					if (token->start != -1 && token->end == -1) {
-						if (token->type != type) {
-							return JSMN_ERROR_INVAL;
-						}
-						parser->toksuper = -1;
-						token->end = (int)parser->pos + 1;
-						break;
-					}
-				}
-				/* Error if unmatched closing bracket */
-				if (i == -1) return JSMN_ERROR_INVAL;
-				for (; i >= 0; i--) {
-					token = &tokens[i];
-					if (token->start != -1 && token->end == -1) {
-						parser->toksuper = i;
-						break;
-					}
-				}
-#endif
-				break;
-			case '\"':
-				r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
-				if (r < 0) return r;
-				count++;
-				if (parser->toksuper != -1 && tokens != NULL)
-					tokens[parser->toksuper].size++;
-				break;
-			case '\t' : case '\r' : case '\n' : case ' ':
-				break;
-			case ':':
-				parser->toksuper = (int)parser->toknext - 1;
-				break;
-			case ',':
-				if (tokens != NULL && parser->toksuper != -1 &&
-						tokens[parser->toksuper].type != JSMN_ARRAY &&
-						tokens[parser->toksuper].type != JSMN_OBJECT) {
-#ifdef JSMN_PARENT_LINKS
-					parser->toksuper = tokens[parser->toksuper].parent;
-#else
-					for (i = (int)parser->toknext - 1; i >= 0; i--) {
-						if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
-							if (tokens[i].start != -1 && tokens[i].end == -1) {
-								parser->toksuper = i;
-								break;
-							}
-						}
-					}
-#endif
-				}
-				break;
-#ifdef JSMN_STRICT
-			/* In strict mode primitives are: numbers and booleans */
-			case '-': case '0': case '1' : case '2': case '3' : case '4':
-			case '5': case '6': case '7' : case '8': case '9':
-			case 't': case 'f': case 'n' :
-				/* And they must not be keys of the object */
-				if (tokens != NULL && parser->toksuper != -1) {
-					jsmntok_t *t = &tokens[parser->toksuper];
-					if (t->type == JSMN_OBJECT ||
-							(t->type == JSMN_STRING && t->size != 0)) {
-						return JSMN_ERROR_INVAL;
-					}
-				}
-#else
-			/* In non-strict mode every unquoted value is a primitive */
-			default:
-#endif
-				r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
-				if (r < 0) return r;
-				count++;
-				if (parser->toksuper != -1 && tokens != NULL)
-					tokens[parser->toksuper].size++;
-				break;
-
-#ifdef JSMN_STRICT
-			/* Unexpected char in strict mode */
-			default:
-				return JSMN_ERROR_INVAL;
-#endif
-		}
-	}
-
-	if (tokens != NULL) {
-		for (i = (int)parser->toknext - 1; i >= 0; i--) {
-			/* Unmatched opened object or array */
-			if (tokens[i].start != -1 && tokens[i].end == -1) {
-				return JSMN_ERROR_PART;
-			}
-		}
-	}
-
-	return (int)count;
-}
-
-/**
- * Creates a new parser based over a given  buffer with an array of tokens
- * available.
- */
-void jsmn_init(jsmn_parser *parser) {
-	parser->pos = 0;
-	parser->toknext = 0;
-	parser->toksuper = -1;
-}
-
diff --git a/ext/open62541/deps/jsmn/jsmn.h b/ext/open62541/deps/jsmn/jsmn.h
deleted file mode 100644
index 055687f..0000000
--- a/ext/open62541/deps/jsmn/jsmn.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __JSMN_H_
-#define __JSMN_H_
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * JSON type identifier. Basic types are:
- * 	o Object
- * 	o Array
- * 	o String
- * 	o Other primitive: number, boolean (true/false) or null
- */
-typedef enum {
-	JSMN_UNDEFINED = 0,
-	JSMN_OBJECT = 1,
-	JSMN_ARRAY = 2,
-	JSMN_STRING = 3,
-	JSMN_PRIMITIVE = 4,
-        JSMN_PROCESSED = 5
-} jsmntype_t;
-
-enum jsmnerr {
-	/* Not enough tokens were provided */
-	JSMN_ERROR_NOMEM = -1,
-	/* Invalid character inside JSON string */
-	JSMN_ERROR_INVAL = -2,
-	/* The string is not a full JSON packet, more bytes expected */
-	JSMN_ERROR_PART = -3
-};
-
-/**
- * JSON token description.
- * type		type (object, array, string etc.)
- * start	start position in JSON data string
- * end		end position in JSON data string
- */
-typedef struct {
-	jsmntype_t type;
-	int start;
-	int end;
-	int size;
-#ifdef JSMN_PARENT_LINKS
-	int parent;
-#endif
-} jsmntok_t;
-
-/**
- * JSON parser. Contains an array of token blocks available. Also stores
- * the string being parsed now and current position in that string
- */
-typedef struct {
-	unsigned int pos; /* offset in the JSON string */
-	unsigned int toknext; /* next token to allocate */
-	int toksuper; /* superior token node, e.g parent object or array */
-} jsmn_parser;
-
-/**
- * Create JSON parser over an array of tokens
- */
-void jsmn_init(jsmn_parser *parser);
-
-/**
- * Run JSON parser. It parses a JSON data string into and array of tokens, each describing
- * a single JSON object.
- */
-int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
-		jsmntok_t *tokens, unsigned int num_tokens);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __JSMN_H_ */
diff --git a/ext/open62541/deps/libc_time.c b/ext/open62541/deps/libc_time.c
deleted file mode 100644
index a1aa7e9..0000000
--- a/ext/open62541/deps/libc_time.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Originally released by the musl project (http://www.musl-libc.org/) under the
- * MIT license. Taken from the file /src/time/__secs_to_tm.c */
-
-#include <limits.h>
-#include "libc_time.h"
-
-/* 2000-03-01 (mod 400 year, immediately after feb29 */
-#define LEAPOCH (946684800LL + 86400*(31+29))
-
-#define DAYS_PER_400Y (365*400 + 97)
-#define DAYS_PER_100Y (365*100 + 24)
-#define DAYS_PER_4Y   (365*4   + 1)
-
-int __secs_to_tm(long long t, struct mytm *tm) {
-    long long days, secs, years;
-    int remdays, remsecs, remyears;
-    int qc_cycles, c_cycles, q_cycles;
-    int months;
-    int wday, yday, leap;
-    static const char days_in_month[] = {31,30,31,30,31,31,30,31,30,31,31,29};
-
-    /* Reject time_t values whose year would overflow int */
-    if (t < INT_MIN * 31622400LL || t > INT_MAX * 31622400LL)
-        return -1;
-
-    secs = t - LEAPOCH;
-    days = secs / 86400LL;
-    remsecs = (int)(secs % 86400);
-    if (remsecs < 0) {
-        remsecs += 86400;
-        --days;
-    }
-
-    wday = (int)((3+days)%7);
-    if (wday < 0) wday += 7;
-
-    qc_cycles = (int)(days / DAYS_PER_400Y);
-    remdays = (int)(days % DAYS_PER_400Y);
-    if (remdays < 0) {
-        remdays += DAYS_PER_400Y;
-        --qc_cycles;
-    }
-
-    c_cycles = remdays / DAYS_PER_100Y;
-    if (c_cycles == 4) --c_cycles;
-    remdays -= c_cycles * DAYS_PER_100Y;
-
-    q_cycles = remdays / DAYS_PER_4Y;
-    if (q_cycles == 25) --q_cycles;
-    remdays -= q_cycles * DAYS_PER_4Y;
-
-    remyears = remdays / 365;
-    if (remyears == 4) --remyears;
-    remdays -= remyears * 365;
-
-    leap = !remyears && (q_cycles || !c_cycles);
-    yday = remdays + 31 + 28 + leap;
-    if (yday >= 365+leap) yday -= 365+leap;
-
-    years = remyears + 4*q_cycles + 100*c_cycles + 400LL*qc_cycles;
-
-    for (months=0; days_in_month[months] <= remdays; ++months)
-        remdays -= days_in_month[months];
-
-    if (years+100 > INT_MAX || years+100 < INT_MIN)
-        return -1;
-
-    tm->tm_year = (int)(years + 100);
-    tm->tm_mon = months + 2;
-    if (tm->tm_mon >= 12) {
-        tm->tm_mon -=12;
-        ++tm->tm_year;
-    }
-    tm->tm_mday = remdays + 1;
-    tm->tm_wday = wday;
-    tm->tm_yday = yday;
-
-    tm->tm_hour = remsecs / 3600;
-    tm->tm_min = remsecs / 60 % 60;
-    tm->tm_sec = remsecs % 60;
-
-    return 0;
-}
-
-int __month_to_secs(int month, int is_leap) {
-    static const int secs_through_month[] =
-        {0, 31*86400, 59*86400, 90*86400,
-         120*86400, 151*86400, 181*86400, 212*86400,
-         243*86400, 273*86400, 304*86400, 334*86400 };
-    int t = secs_through_month[month];
-    if (is_leap && month >= 2)
-        t+=86400;
-    return t;
-}
-
-long long __year_to_secs(long long year, int *is_leap) {
-    if (year-(int)2ULL <= 136) {
-        long long y = (int)year;
-        long long leaps = (y-68)>>2;
-        if (!((y-8)&3)) {
-            leaps--;
-            if (is_leap) *is_leap = 1;
-        } else if (is_leap) *is_leap = 0;
-        return 31536000*(y-70) + 86400*leaps;
-    }
-
-    int cycles, centuries, leaps, rem;
-
-    //if (!is_leap) is_leap = &(int){0};
-    int is_leap_val = 0;
-    if (!is_leap) {
-        is_leap = &is_leap_val;
-    }
-    cycles = (int)((year-100) / 400);
-    rem = (int)((year-100) % 400);
-    /* Comparison is always false because rem >= 0.
-    if (rem < 0) {
-        cycles--;
-        rem += 400;
-    } */
-    if (!rem) {
-        *is_leap = 1;
-        centuries = 0;
-        leaps = 0;
-    } else {
-        if (rem >= 200) {
-            if (rem >= 300) centuries = 3, rem -= 300;
-            else centuries = 2, rem -= 200;
-        } else {
-            if (rem >= 100) centuries = 1, rem -= 100;
-            else centuries = 0;
-        }
-        if (!rem) {
-            *is_leap = 0;
-            leaps = 0;
-        } else {
-            leaps = (rem / (int)4U);
-            rem %= (int)4U;
-            *is_leap = !rem;
-        }
-    }
-
-    leaps += 97*cycles + 24*centuries - *is_leap;
-
-    return (year-100) * 31536000LL + leaps * 86400LL + 946684800 + 86400;
-}
-
-long long __tm_to_secs(const struct mytm *tm) {
-    int is_leap;
-    long long year = tm->tm_year;
-    int month = tm->tm_mon;
-    if (month >= 12 || month < 0) {
-        int adj = month / 12;
-        month %= 12;
-        if (month < 0) {
-            adj--;
-            month += 12;
-        }
-        year += adj;
-    }
-    long long t = __year_to_secs(year, &is_leap);
-    t += __month_to_secs(month, is_leap);
-    t += 86400LL * (tm->tm_mday-1);
-    t += 3600LL * tm->tm_hour;
-    t += 60LL * tm->tm_min;
-    t += tm->tm_sec;
-    return t;
-}
diff --git a/ext/open62541/deps/libc_time.h b/ext/open62541/deps/libc_time.h
deleted file mode 100644
index ba53d46..0000000
--- a/ext/open62541/deps/libc_time.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef LIBC_TIME_H_
-#define LIBC_TIME_H_
-
-struct mytm {
-    int tm_sec;
-    int tm_min;
-    int tm_hour;
-    int tm_mday;
-    int tm_mon;
-    int tm_year;
-    int tm_wday;
-    int tm_yday;
-};
-
-int __secs_to_tm(long long t, struct mytm *tm);
-int __month_to_secs(int month, int is_leap);
-long long __year_to_secs(long long year, int *is_leap);
-long long __tm_to_secs(const struct mytm *tm);
-
-#endif /* LIBC_TIME_H_ */
diff --git a/ext/open62541/deps/ms_stdint.h b/ext/open62541/deps/ms_stdint.h
deleted file mode 100644
index 4ab6722..0000000
--- a/ext/open62541/deps/ms_stdint.h
+++ /dev/null
@@ -1,257 +0,0 @@
-// ISO C9x  compliant stdint.h for Microsoft Visual Studio
-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
-// 
-//  Copyright (c) 2006-2013 Alexander Chemeris
-// 
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// 
-//   1. Redistributions of source code must retain the above copyright notice,
-//      this list of conditions and the following disclaimer.
-// 
-//   2. Redistributions in binary form must reproduce the above copyright
-//      notice, this list of conditions and the following disclaimer in the
-//      documentation and/or other materials provided with the distribution.
-// 
-//   3. Neither the name of the product nor the names of its contributors may
-//      be used to endorse or promote products derived from this software
-//      without specific prior written permission.
-// 
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// 
-///////////////////////////////////////////////////////////////////////////////
-
-#if !defined(_MSC_VER) || _MSC_VER >= 1600 // [
-#include <stdint.h>
-#else
-
-#ifndef _MSC_STDINT_H_ // [
-#define _MSC_STDINT_H_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif
-
-#include <limits.h>
-
-// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
-// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
-// or compiler give many errors like this:
-//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
-#ifndef UNDER_CE
-#ifdef __cplusplus
-extern "C" {
-#endif
-#  include <wchar.h>
-#ifdef __cplusplus
-}
-#endif
-#endif
-
-// Define _W64 macros to mark types changing their size, like intptr_t.
-#ifndef _W64
-#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
-#     define _W64 __w64
-#  else
-#     define _W64
-#  endif
-#endif
-
-
-// 7.18.1 Integer types
-
-// 7.18.1.1 Exact-width integer types
-
-// Visual Studio 6 and Embedded Visual C++ 4 doesn't
-// realize that, e.g. char has the same size as __int8
-// so we give up on __intX for them.
-#if (_MSC_VER < 1300)
-   typedef signed char       int8_t;
-   typedef signed short      int16_t;
-   typedef signed int        int32_t;
-   typedef unsigned char     uint8_t;
-   typedef unsigned short    uint16_t;
-   typedef unsigned int      uint32_t;
-#else
-   typedef signed __int8     int8_t;
-   typedef signed __int16    int16_t;
-   typedef signed __int32    int32_t;
-   typedef unsigned __int8   uint8_t;
-   typedef unsigned __int16  uint16_t;
-   typedef unsigned __int32  uint32_t;
-#endif
-typedef signed __int64       int64_t;
-typedef unsigned __int64     uint64_t;
-
-
-// 7.18.1.2 Minimum-width integer types
-typedef int8_t    int_least8_t;
-typedef int16_t   int_least16_t;
-typedef int32_t   int_least32_t;
-typedef int64_t   int_least64_t;
-typedef uint8_t   uint_least8_t;
-typedef uint16_t  uint_least16_t;
-typedef uint32_t  uint_least32_t;
-typedef uint64_t  uint_least64_t;
-
-// 7.18.1.3 Fastest minimum-width integer types
-typedef int8_t    int_fast8_t;
-typedef int16_t   int_fast16_t;
-typedef int32_t   int_fast32_t;
-typedef int64_t   int_fast64_t;
-typedef uint8_t   uint_fast8_t;
-typedef uint16_t  uint_fast16_t;
-typedef uint32_t  uint_fast32_t;
-typedef uint64_t  uint_fast64_t;
-
-// 7.18.1.4 Integer types capable of holding object pointers
-#ifdef _WIN64 // [
-   typedef signed __int64    intptr_t;
-   typedef unsigned __int64  uintptr_t;
-#else // _WIN64 ][
-   typedef _W64 signed int   intptr_t;
-   typedef _W64 unsigned int uintptr_t;
-#endif // _WIN64 ]
-
-// 7.18.1.5 Greatest-width integer types
-typedef int64_t   intmax_t;
-typedef uint64_t  uintmax_t;
-
-
-// 7.18.2 Limits of specified-width integer types
-
-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
-
-// 7.18.2.1 Limits of exact-width integer types
-#define INT8_MIN     ((int8_t)_I8_MIN)
-#define INT8_MAX     _I8_MAX
-#define INT16_MIN    ((int16_t)_I16_MIN)
-#define INT16_MAX    _I16_MAX
-#define INT32_MIN    ((int32_t)_I32_MIN)
-#define INT32_MAX    _I32_MAX
-#define INT64_MIN    ((int64_t)_I64_MIN)
-#define INT64_MAX    _I64_MAX
-#define UINT8_MAX    _UI8_MAX
-#define UINT16_MAX   _UI16_MAX
-#define UINT32_MAX   _UI32_MAX
-#define UINT64_MAX   _UI64_MAX
-
-// 7.18.2.2 Limits of minimum-width integer types
-#define INT_LEAST8_MIN    INT8_MIN
-#define INT_LEAST8_MAX    INT8_MAX
-#define INT_LEAST16_MIN   INT16_MIN
-#define INT_LEAST16_MAX   INT16_MAX
-#define INT_LEAST32_MIN   INT32_MIN
-#define INT_LEAST32_MAX   INT32_MAX
-#define INT_LEAST64_MIN   INT64_MIN
-#define INT_LEAST64_MAX   INT64_MAX
-#define UINT_LEAST8_MAX   UINT8_MAX
-#define UINT_LEAST16_MAX  UINT16_MAX
-#define UINT_LEAST32_MAX  UINT32_MAX
-#define UINT_LEAST64_MAX  UINT64_MAX
-
-// 7.18.2.3 Limits of fastest minimum-width integer types
-#define INT_FAST8_MIN    INT8_MIN
-#define INT_FAST8_MAX    INT8_MAX
-#define INT_FAST16_MIN   INT16_MIN
-#define INT_FAST16_MAX   INT16_MAX
-#define INT_FAST32_MIN   INT32_MIN
-#define INT_FAST32_MAX   INT32_MAX
-#define INT_FAST64_MIN   INT64_MIN
-#define INT_FAST64_MAX   INT64_MAX
-#define UINT_FAST8_MAX   UINT8_MAX
-#define UINT_FAST16_MAX  UINT16_MAX
-#define UINT_FAST32_MAX  UINT32_MAX
-#define UINT_FAST64_MAX  UINT64_MAX
-
-// 7.18.2.4 Limits of integer types capable of holding object pointers
-#ifdef _WIN64 // [
-#  define INTPTR_MIN   INT64_MIN
-#  define INTPTR_MAX   INT64_MAX
-#  define UINTPTR_MAX  UINT64_MAX
-#else // _WIN64 ][
-#  define INTPTR_MIN   INT32_MIN
-#  define INTPTR_MAX   INT32_MAX
-#  define UINTPTR_MAX  UINT32_MAX
-#endif // _WIN64 ]
-
-// 7.18.2.5 Limits of greatest-width integer types
-#define INTMAX_MIN   INT64_MIN
-#define INTMAX_MAX   INT64_MAX
-#define UINTMAX_MAX  UINT64_MAX
-
-// 7.18.3 Limits of other integer types
-
-#ifdef _WIN64 // [
-#  define PTRDIFF_MIN  _I64_MIN
-#  define PTRDIFF_MAX  _I64_MAX
-#else  // _WIN64 ][
-#  define PTRDIFF_MIN  _I32_MIN
-#  define PTRDIFF_MAX  _I32_MAX
-#endif  // _WIN64 ]
-
-#define SIG_ATOMIC_MIN  INT_MIN
-#define SIG_ATOMIC_MAX  INT_MAX
-
-#ifndef SIZE_MAX // [
-#  ifdef _WIN64 // [
-#     define SIZE_MAX  _UI64_MAX
-#  else // _WIN64 ][
-#     define SIZE_MAX  _UI32_MAX
-#  endif // _WIN64 ]
-#endif // SIZE_MAX ]
-
-// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
-#ifndef WCHAR_MIN // [
-#  define WCHAR_MIN  0
-#endif  // WCHAR_MIN ]
-#ifndef WCHAR_MAX // [
-#  define WCHAR_MAX  _UI16_MAX
-#endif  // WCHAR_MAX ]
-
-#define WINT_MIN  0
-#define WINT_MAX  _UI16_MAX
-
-#endif // __STDC_LIMIT_MACROS ]
-
-
-// 7.18.4 Limits of other integer types
-
-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
-
-// 7.18.4.1 Macros for minimum-width integer constants
-
-#define INT8_C(val)  val##i8
-#define INT16_C(val) val##i16
-#define INT32_C(val) val##i32
-#define INT64_C(val) val##i64
-
-#define UINT8_C(val)  val##ui8
-#define UINT16_C(val) val##ui16
-#define UINT32_C(val) val##ui32
-#define UINT64_C(val) val##ui64
-
-// 7.18.4.2 Macros for greatest-width integer constants
-// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.
-// Check out Issue 9 for the details.
-#ifndef INTMAX_C //   [
-#  define INTMAX_C   INT64_C
-#endif // INTMAX_C    ]
-#ifndef UINTMAX_C //  [
-#  define UINTMAX_C  UINT64_C
-#endif // UINTMAX_C   ]
-
-#endif // __STDC_CONSTANT_MACROS ]
-
-#endif // _MSC_STDINT_H_ ]
-
-#endif // !defined(_MSC_VER) || _MSC_VER >= 1600 ]
diff --git a/ext/open62541/deps/musl/floatscan.c b/ext/open62541/deps/musl/floatscan.c
deleted file mode 100644
index 6484c06..0000000
--- a/ext/open62541/deps/musl/floatscan.c
+++ /dev/null
@@ -1,719 +0,0 @@
-/* Originally released by the musl project (http://www.musl-libc.org/) under the
- * MIT license. Taken from the file src/internal/floatscan.c*/
-
-#include <stdint.h>
-#include <math.h>
-#include <limits.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include "floatscan.h"
-#include "vfprintf.h"
-int shgetc(char* input, int *index);
-void shunget(int *index);
-int shlim(int a, int b);
-
-int shgetc(char* input, int *index){
-    int res = input[*index];
-    (*index)++;
-    return res;
-}
-
-void shunget(int *index){
-    (*index)--;
-}
-int shlim(int a, int b){
-    return '0';
-}
-
-
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-long double fmodl(long double x, long double y)
-{
-	return fmod(x, y);
-}
-#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
-long double fmodl(long double x, long double y)
-{
-	union ldshape ux = {x}, uy = {y};
-	int ex = ux.i.se & 0x7fff;
-	int ey = uy.i.se & 0x7fff;
-	int sx = ux.i.se & 0x8000;
-
-	if (y == 0 || isnan(y) || ex == 0x7fff)
-		return (x*y)/(x*y);
-	ux.i.se = (uint16_t)ex;
-	uy.i.se = (uint16_t)ey;
-	if (ux.f <= uy.f) {
-		if (ux.f == uy.f)
-			return 0*x;
-		return x;
-	}
-
-	/* normalize x and y */
-	if (!ex) {
-		ux.f *= 0x1p120f;
-		ex = ux.i.se - 120;
-	}
-	if (!ey) {
-		uy.f *= 0x1p120f;
-		ey = uy.i.se - 120;
-	}
-
-	/* x mod y */
-#if LDBL_MANT_DIG == 64
-	uint64_t i, mx, my;
-	mx = ux.i.m;
-	my = uy.i.m;
-	for (; ex > ey; ex--) {
-		i = mx - my;
-		if (mx >= my) {
-			if (i == 0)
-				return 0*x;
-			mx = 2*i;
-		} else if (2*mx < mx) {
-			mx = 2*mx - my;
-		} else {
-			mx = 2*mx;
-		}
-	}
-	i = mx - my;
-	if (mx >= my) {
-		if (i == 0)
-			return 0*x;
-		mx = i;
-	}
-	for (; mx >> 63 == 0; mx *= 2, ex--);
-	ux.i.m = mx;
-#elif LDBL_MANT_DIG == 113
-	uint64_t hi, lo, xhi, xlo, yhi, ylo;
-	xhi = (ux.i2.hi & -1ULL>>16) | 1ULL<<48;
-	yhi = (uy.i2.hi & -1ULL>>16) | 1ULL<<48;
-	xlo = ux.i2.lo;
-	ylo = uy.i2.lo;
-	for (; ex > ey; ex--) {
-		hi = xhi - yhi;
-		lo = xlo - ylo;
-		if (xlo < ylo)
-			hi -= 1;
-		if (hi >> 63 == 0) {
-			if ((hi|lo) == 0)
-				return 0*x;
-			xhi = 2*hi + (lo>>63);
-			xlo = 2*lo;
-		} else {
-			xhi = 2*xhi + (xlo>>63);
-			xlo = 2*xlo;
-		}
-	}
-	hi = xhi - yhi;
-	lo = xlo - ylo;
-	if (xlo < ylo)
-		hi -= 1;
-	if (hi >> 63 == 0) {
-		if ((hi|lo) == 0)
-			return 0*x;
-		xhi = hi;
-		xlo = lo;
-	}
-	for (; xhi >> 48 == 0; xhi = 2*xhi + (xlo>>63), xlo = 2*xlo, ex--);
-	ux.i2.hi = xhi;
-	ux.i2.lo = xlo;
-#endif
-
-	/* scale result */
-	if (ex <= 0) {
-		ux.i.se = (uint16_t)((ex+120)|sx);
-		ux.f *= (uint16_t)(0x1p-120f);
-	} else
-		ux.i.se = (uint16_t)(ex|sx);
-	return ux.f;
-}
-#endif
-
-
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-long double copysignl(long double x, long double y)
-{
-	return copysign(x, y);
-}
-#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
-long double copysignl(long double x, long double y)
-{
-	union ldshape ux = {x}, uy = {y};
-	ux.i.se &= 0x7fff;
-	ux.i.se = (uint16_t)(ux.i.se | (uy.i.se & 0x8000));
-	return ux.f;
-}
-#endif
-
-double scalbn(double x, int n)
-{
-	union {double f; uint64_t i;} u;
-	double_t y = x;
-
-	if (n > 1023) {
-		y *= 0x1p1023;
-		n -= 1023;
-		if (n > 1023) {
-			y *= 0x1p1023;
-			n -= 1023;
-			if (n > 1023)
-				n = 1023;
-		}
-	} else if (n < -1022) {
-		/* make sure final n < -53 to avoid double
-		   rounding in the subnormal range */
-		y *= 0x1p-1022 * 0x1p53;
-		n += 1022 - 53;
-		if (n < -1022) {
-			y *= 0x1p-1022 * 0x1p53;
-			n += 1022 - 53;
-			if (n < -1022)
-				n = -1022;
-		}
-	}
-	u.i = (uint64_t)(0x3ff+n)<<52;
-	x = y * u.f;
-	return x;
-}
-
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-
-#define LD_B1B_DIG 2
-#define LD_B1B_MAX 9007199, 254740991
-#define KMAX 128
-
-#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
-
-#define LD_B1B_DIG 3
-#define LD_B1B_MAX 18, 446744073, 709551615
-#define KMAX 2048
-
-#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
-
-#define LD_B1B_DIG 4
-#define LD_B1B_MAX 10384593, 717069655, 257060992, 658440191
-#define KMAX 2048
-
-#else
-#error Unsupported long double representation
-#endif
-
-#define MASK (KMAX-1)
-
-#define CONCAT2(x,y) x ## y
-#define CONCAT(x,y) CONCAT2(x,y)
-
-
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-long double scalbnl(long double x, int n)
-{
-	return scalbn(x, n);
-}
-#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
-long double scalbnl(long double x, int n)
-{
-	union ldshape u;
-
-	if (n > 16383) {
-		x *= 0x1p16383L;
-		n -= 16383;
-		if (n > 16383) {
-			x *= 0x1p16383L;
-			n -= 16383;
-			if (n > 16383)
-				n = 16383;
-		}
-	} else if (n < -16382) {
-		x *= 0x1p-16382L * 0x1p113L;
-		n += 16382 - 113;
-		if (n < -16382) {
-			x *= 0x1p-16382L * 0x1p113L;
-			n += 16382 - 113;
-			if (n < -16382)
-				n = -16382;
-		}
-	}
-	u.f = 1.0;
-	u.i.se = (uint16_t)(0x3fff + n);
-	return x * u.f;
-}
-#endif
-
-static long long scanexp(char* input, int *index, int pok)
-{
-	int c;
-	int x;
-	long long y;
-	int neg = 0;
-	
-	c = shgetc(input, index);
-	if (c=='+' || c=='-') {
-		neg = (c=='-');
-		c = shgetc(input, index);
-		if ((unsigned)(c-'0')>=10U && pok) shunget(index);
-	}
-	if ((unsigned)(c-'0')>=10U) {
-		shunget(index);
-		return LLONG_MIN;
-	}
-	for (x=0; (unsigned)(c-'0')<10U && x<INT_MAX/10; c = shgetc(input, index))
-		x = 10*x + c-'0';
-	for (y=x; (unsigned)(c-'0')<10U && y<LLONG_MAX/100; c = shgetc(input, index))
-		y = 10*y + c-'0';
-	for (; (unsigned)(c-'0')<10U; c = shgetc(input, index));
-	shunget(index);
-	return neg ? -y : y;
-}
-
-
-static long double decfloat(char *input, int *index, int c, int bits, int emin, int sign, int pok)
-{
-	uint32_t x[KMAX];
-	static const uint32_t th[] = { LD_B1B_MAX };
-	int i, j, k, a, z;
-	long long lrp=0, dc=0;
-	long long e10=0;
-	int lnz = 0;
-	int gotdig = 0, gotrad = 0;
-	int rp;
-	int e2;
-	int emax = -emin-bits+3;
-	int denormal = 0;
-	long double y;
-	long double frac=0;
-	long double bias=0;
-	static const int p10s[] = { 10, 100, 1000, 10000,
-		100000, 1000000, 10000000, 100000000 };
-
-	j=0;
-	k=0;
-
-	/* Don't let leading zeros consume buffer space */
-	for (; c=='0'; c = shgetc(input, index)) gotdig=1;
-	if (c=='.') {
-		gotrad = 1;
-		for (c = shgetc(input, index); c=='0'; c = shgetc(input, index)) gotdig=1, lrp--;
-	}
-
-	x[0] = 0;
-	for (; (unsigned)(c-'0')<10U || c=='.'; c = shgetc(input, index)) {
-		if (c == '.') {
-			if (gotrad) break;
-			gotrad = 1;
-			lrp = dc;
-		} else if (k < KMAX-3) {
-			dc++;
-			if (c!='0') lnz = (int)dc;
-			if (j) x[k] = (x[k]*10 + (uint32_t)(c-'0'));
-			else x[k] = (uint32_t)(c-'0');
-			if (++j==9) {
-				k++;
-				j=0;
-			}
-			gotdig=1;
-		} else {
-			dc++;
-			if (c!='0') {
-				lnz = (KMAX-4)*9;
-				x[KMAX-4] |= 1;
-			}
-		}
-	}
-	if (!gotrad) lrp=dc;
-
-	if (gotdig && (c|32)=='e') {
-		e10 = scanexp(input, index, pok);
-		if (e10 == LLONG_MIN) {
-			if (pok) {
-				shunget(index);
-			} else {
-				//shlim(f, 0);
-				return 0;
-			}
-			e10 = 0;
-		}
-		lrp += e10;
-	} else if (c>=0) {
-		shunget(index);
-	}
-	if (!gotdig) {
-		errno = EINVAL;
-		//shlim(f, 0);
-		return 0;
-	}
-
-	/* Handle zero specially to avoid nasty special cases later */
-	if (!x[0]) return sign * 0.0;
-
-	/* Optimize small integers (w/no exponent) and over/under-flow */
-	if (lrp==dc && dc<10 && (bits>30 || x[0]>>bits==0))
-		return sign * (long double)x[0];
-	if (lrp > -emin/2) {
-		errno = ERANGE;
-		return sign * LDBL_MAX * LDBL_MAX;
-	}
-	if (lrp < emin-2*LDBL_MANT_DIG) {
-		errno = ERANGE;
-		return sign * LDBL_MIN * LDBL_MIN;
-	}
-
-	/* Align incomplete final B1B digit */
-	if (j) {
-		for (; j<9; j++) x[k]*=10;
-		k++;
-		//j=0;
-	}
-
-	a = 0;
-	z = k;
-	e2 = 0;
-	rp = (int)lrp;
-
-	/* Optimize small to mid-size integers (even in exp. notation) */
-	if (lnz<9 && lnz<=rp && rp < 18) {
-		if (rp == 9) return sign * (long double)x[0];
-		if (rp < 9) return sign * (long double)x[0] / p10s[8-rp];
-		int bitlim = bits-3*(int)(rp-9);
-		if (bitlim>30 || x[0]>>bitlim==0)
-			return sign * (long double)x[0] * p10s[rp-10];
-	}
-
-	/* Drop trailing zeros */
-	for (; !x[z-1]; z--);
-
-	/* Align radix point to B1B digit boundary */
-	if (rp % 9) {
-		int rpm9 = rp>=0 ? rp%9 : rp%9+9;
-		int p10 = p10s[8-rpm9];
-		uint32_t carry = 0;
-		for (k=a; k!=z; k++) {
-			uint32_t tmp = (x[k] % (uint32_t)p10);
-			x[k] = x[k]/(uint32_t)p10 + carry;
-			carry = 1000000000/(uint32_t)p10 * tmp;
-			if (k==a && !x[k]) {
-				a = ((a+1) & MASK);
-				rp -= 9;
-			}
-		}
-		if (carry) x[z++] = carry;
-		rp += 9-rpm9;
-	}
-
-	/* Upscale until desired number of bits are left of radix point */
-	while (rp < 9*LD_B1B_DIG || (rp == 9*LD_B1B_DIG && x[a]<th[0])) {
-		uint32_t carry = 0;
-		e2 -= 29;
-		for (k=((z-1) & MASK); ; k=((k-1) & MASK)) {
-			uint64_t tmp = ((uint64_t)x[k] << 29) + carry;
-			if (tmp > 1000000000) {
-				carry = (uint32_t)(tmp / 1000000000);
-				x[k] = (uint32_t)(tmp % 1000000000);
-			} else {
-				carry = 0;
-				x[k] = (uint32_t)tmp;
-			}
-			if (k==((z-1) & MASK) && k!=a && !x[k]) z = k;
-			if (k==a) break;
-		}
-		if (carry) {
-			rp += 9;
-			a = ((a-1) & MASK);
-			if (a == z) {
-				z = ((z-1) & MASK);
-				x[(z-1) & MASK] |= x[z];
-			}
-			x[a] = carry;
-		}
-	}
-
-	/* Downscale until exactly number of bits are left of radix point */
-	for (;;) {
-		uint32_t carry = 0;
-		int sh = 1;
-		for (i=0; i<LD_B1B_DIG; i++) {
-			k = ((a+i) & MASK);
-			if (k == z || x[k] < th[i]) {
-				i=LD_B1B_DIG;
-				break;
-			}
-			if (x[(a+i) & MASK] > th[i]) break;
-		}
-		if (i==LD_B1B_DIG && rp==9*LD_B1B_DIG) break;
-		/* FIXME: find a way to compute optimal sh */
-		if (rp > 9+9*LD_B1B_DIG) sh = 9;
-		e2 += sh;
-		for (k=a; k!=z; k=((k+1) & MASK)) {
-			uint32_t tmp = (x[k] & (uint32_t)((1<<sh)-1));
-			x[k] = (x[k]>>sh) + carry;
-			carry = ((uint32_t)(1000000000>>sh) * tmp);
-			if (k==a && !x[k]) {
-				a = ((a+1) & MASK);
-				i--;
-				rp -= 9;
-			}
-		}
-		if (carry) {
-			if (((z+1) & MASK) != a) {
-				x[z] = carry;
-				z = ((z+1) & MASK);
-			} else x[(z-1) & MASK] |= 1;
-		}
-	}
-
-	/* Assemble desired bits into floating point variable */
-	for (y=i=0; i<LD_B1B_DIG; i++) {
-		if (((a+i) & MASK)==z) x[(z=((z+1) & MASK))-1] = 0;
-		y = 1000000000.0L * y + x[(a+i) & MASK];
-	}
-
-	y *= sign;
-
-	/* Limit precision for denormal results */
-	if (bits > LDBL_MANT_DIG+e2-emin) {
-		bits = LDBL_MANT_DIG+e2-emin;
-		if (bits<0) bits=0;
-		denormal = 1;
-	}
-
-	/* Calculate bias term to force rounding, move out lower bits */
-	if (bits < LDBL_MANT_DIG) {
-		bias = copysignl(scalbn(1, 2*LDBL_MANT_DIG-bits-1), y);
-		frac = fmodl(y, scalbn(1, LDBL_MANT_DIG-bits));
-		y -= frac;
-		y += bias;
-	}
-
-	/* Process tail of decimal input so it can affect rounding */
-	if (((a+i) & MASK) != z) {
-		uint32_t t = x[(a+i) & MASK];
-		if (t < 500000000 && (t || ((a+i+1) & MASK) != z))
-			frac += 0.25*sign;
-		else if (t > 500000000)
-			frac += 0.75*sign;
-		else if (t == 500000000) {
-			if (((a+i+1) & MASK) == z)
-				frac += 0.5*sign;
-			else
-				frac += 0.75*sign;
-		}
-		//if (LDBL_MANT_DIG-bits >= 2 && !fmodl(frac, 1)) implicit conversion turns floating-point number into integer:
-                if (LDBL_MANT_DIG-bits >= 2 && !((_Bool)fmodl(frac, 1)))
-			frac++;
-	}
-
-	y += frac;
-	y -= bias;
-
-	if (((e2+LDBL_MANT_DIG) & INT_MAX) > emax-5) {
-		if (fabs((double)y) >= CONCAT(0x1p, LDBL_MANT_DIG)) {
-			if (denormal && bits==LDBL_MANT_DIG+e2-emin)
-				denormal = 0;
-			y *= 0.5;
-			e2++;
-		}
-                //if (e2+LDBL_MANT_DIG>emax || (denormal && frac)) implicit conversion turns floating-point number into integer:
-		if (e2+LDBL_MANT_DIG>emax || ((_Bool)denormal && (_Bool)frac))
-			errno = ERANGE;
-	}
-
-	return scalbnl(y, e2);
-}
-
-static long double hexfloat(char *input, int *index, int bits, int emin, int sign, int pok)
-{
-	uint32_t x = 0;
-	long double y = 0;
-	long double scale = 1;
-	long double bias = 0;
-	int gottail = 0, gotrad = 0, gotdig = 0;
-	long long rp = 0;
-	long long dc = 0;
-	long long e2 = 0;
-	int d;
-	int c;
-
-	c = shgetc(input, index);
-
-	/* Skip leading zeros */
-	for (; c=='0'; c = shgetc(input, index)) gotdig = 1;
-
-	if (c=='.') {
-		gotrad = 1;
-		c = shgetc(input, index);
-		/* Count zeros after the radix point before significand */
-		for (rp=0; c=='0'; c = shgetc(input, index), rp--) gotdig = 1;
-	}
-
-	for (; (unsigned)(c-'0')<10U || (unsigned)((c|32)-'a')<6U || c=='.'; c = shgetc(input, index)) {
-		if (c=='.') {
-			if (gotrad) break;
-			rp = dc;
-			gotrad = 1;
-		} else {
-			gotdig = 1;
-			if (c > '9') d = (c|32)+10-'a';
-			else d = c-'0';
-			if (dc<8) {
-				x = (x*16 + (uint32_t)d);
-			} else if (dc < LDBL_MANT_DIG/4+1) {
-				y += d*(scale/=16);
-			} else if (d && !gottail) {
-				y += 0.5*scale;
-				gottail = 1;
-			}
-			dc++;
-		}
-	}
-	if (!gotdig) {
-		shunget(index);
-		if (pok) {
-			shunget(index);
-			if (gotrad) shunget(index);
-		} else {
-			//shlim(f, 0);
-		}
-		return sign * 0.0;
-	}
-	if (!gotrad) rp = dc;
-	while (dc<8) x *= 16, dc++;
-	if ((c|32)=='p') {
-		e2 = scanexp(input, index, pok);
-		if (e2 == LLONG_MIN) {
-			if (pok) {
-				shunget(index);
-			} else {
-				//shlim(f, 0);
-				return 0;
-			}
-			e2 = 0;
-		}
-	} else {
-		shunget(index);
-	}
-	e2 += 4*rp - 32;
-
-	if (!x) return sign * 0.0;
-	if (e2 > -emin) {
-		errno = ERANGE;
-		return sign * LDBL_MAX * LDBL_MAX;
-	}
-	if (e2 < emin-2*LDBL_MANT_DIG) {
-		errno = ERANGE;
-		return sign * LDBL_MIN * LDBL_MIN;
-	}
-
-	while (x < 0x80000000) {
-		if (y>=0.5) {
-			x += x + 1;
-			y += y - 1;
-		} else {
-			x += x;
-			y += y;
-		}
-		e2--;
-	}
-
-	if (bits > 32+e2-emin) {
-		bits =(int)(32+e2-emin);
-		if (bits<0) bits=0;
-	}
-
-	if (bits < LDBL_MANT_DIG)
-		bias = copysignl(scalbn(1, 32+LDBL_MANT_DIG-bits-1), sign);
-
-	if (bits<32 && (_Bool)y && !(x&1)) x++, y=0;
-
-	y = bias + sign*(long double)x + sign*y;
-	y -= bias;
-
-	if (!((_Bool)y)) errno = ERANGE;
-
-	return scalbnl(y, (int)e2);
-}
-
-long double __floatscan(char* input, int prec, int pok)
-{
-    int index = 0;
-	int sign = 1;
-	//size_t i;
-        int i;
-	int bits;
-	int emin;
-	int c;
-
-	switch (prec) {
-	case 0:
-		bits = FLT_MANT_DIG;
-		emin = FLT_MIN_EXP-bits;
-		break;
-	case 1:
-		bits = DBL_MANT_DIG;
-		emin = DBL_MIN_EXP-bits;
-		break;
-	case 2:
-		bits = LDBL_MANT_DIG;
-		emin = LDBL_MIN_EXP-bits;
-		break;
-	default:
-		return 0;
-	}
-
-	while (isspace((c=shgetc(input, &index))));
-
-	if (c=='+' || c=='-') {
-		sign -= 2*(c=='-');
-		c = shgetc(input, &index);
-	}
-
-	for (i=0; i<8 && (c|32)=="infinity"[i]; i++)
-		if (i<7) c = shgetc(input, &index);
-	if (i==3 || i==8 || (i>3 && pok)) {
-		if (i!=8) {
-			shunget(&index);
-			if (pok) for (; i>3; i--) shunget(&index);
-		}
-		return ((float)sign * INFINITY);
-	}
-	if (!i) for (i=0; i<3 && (c|32)=="nan"[i]; i++)
-		if (i<2) c = shgetc(input, &index);
-	if (i==3) {
-		if (shgetc(input, &index) != '(') {
-			shunget(&index);
-			return NAN;
-		}
-		for (i=1; ; i++) {
-			c = shgetc(input, &index);
-			if ((unsigned)(c-'0')<10U || (unsigned)(c-'A')<26U || (unsigned)(c-'a')<26U || c=='_')
-				continue;
-			if (c==')') return NAN;
-			shunget(&index);
-			if (!pok) {
-				errno = EINVAL;
-				//shlim(0, 0);
-				return 0;
-			}
-			while (i--) shunget(&index);
-			return NAN;
-		}
-		return NAN;
-	}
-
-	if (i) {
-		shunget(&index);
-		errno = EINVAL;
-		//shlim(0, 0);
-		return 0;
-	}
-
-	if (c=='0') {
-		c = shgetc(input, &index);
-		if ((c|32) == 'x')
-			return hexfloat(input, &index, bits, emin, sign, pok);
-		shunget(&index);
-		c = '0';
-	}
-
-	return decfloat(input, &index, c, bits, emin, sign, pok);
-}
diff --git a/ext/open62541/deps/musl/floatscan.h b/ext/open62541/deps/musl/floatscan.h
deleted file mode 100644
index 1f8553d..0000000
--- a/ext/open62541/deps/musl/floatscan.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef FLOATSCAN_H
-#define FLOATSCAN_H
-
-//#include <stdio.h>
-
-#define FLT_MANT_DIG 24
-#define FLT_MIN_EXP (-125)
-#define FLT_MAX_EXP 128
-#define FLT_HAS_SUBNORM 1
-
-#define DBL_MANT_DIG 53
-#define DBL_MIN_EXP (-1021)
-#define DBL_MAX_EXP 1024
-#define DBL_HAS_SUBNORM 1
-
-long double __floatscan(char*, int, int);
-
-#endif
diff --git a/ext/open62541/deps/musl/vfprintf.c b/ext/open62541/deps/musl/vfprintf.c
deleted file mode 100644
index 688be16..0000000
--- a/ext/open62541/deps/musl/vfprintf.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/* Originally released by the musl project (http://www.musl-libc.org/) under the
- * MIT license. Taken from the file src/stdio/vfprintf.c */
-
-#include <ctype.h>
-#include "floatscan.h"
-#include "vfprintf.h"
-//int isdigit(int);
-//#define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a)-'0') < 10)
-
-long double frexpl(long double x, int *e);
-//#include <math.h>
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-long double frexpl(long double x, int *e)
-{
-	return frexp(x, e);
-}
-#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
-long double frexpl(long double x, int *e)
-{
-	union ldshape u = {x};
-	int ee = u.i.se & 0x7fff;
-
-	if (!ee) {
-		if ((_Bool)x) {
-			x = frexpl(x*0x1p120, e);
-			*e -= 120;
-		} else *e = 0;
-		return x;
-	} else if (ee == 0x7fff) {
-		return x;
-	}
-
-	*e = ee - 0x3ffe;
-	u.i.se &= 0x8000;
-	u.i.se |= 0x3ffe;
-	return u.f;
-}
-#endif
-
-int __signbitl(long double x);
-#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
-int __signbitl(long double x)
-{
-	union ldshape u = {x};
-	return u.i.se >> 15;
-}
-#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-int __signbitl(long double x)
-{
-	return __signbit(x);
-}
-#endif
-
-static __inline unsigned __FLOAT_BITS(float __f)
-{
-	union {float __f; unsigned __i;} __u;
-	__u.__f = __f;
-	return __u.__i;
-}
-static __inline unsigned long long __DOUBLE_BITS(double __f)
-{
-	union {double __f; unsigned long long __i;} __u;
-	__u.__f = __f;
-	return __u.__i;
-}
-
-#define signbit(x) ( \
-	sizeof(x) == sizeof(float) ? (int)(__FLOAT_BITS((float)x)>>31) : \
-	sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS((double)x)>>63) : \
-	__signbitl(x) )
-
-#define FP_NAN       0
-#define FP_INFINITE  1
-#define FP_ZERO      2
-#define FP_SUBNORMAL 3
-#define FP_NORMAL    4
-
-
-int __fpclassifyl(long double x);
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-int __fpclassifyl(long double x)
-{
-	return __fpclassify(x);
-}
-#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
-int __fpclassifyl(long double x)
-{
-	union ldshape u = {x};
-	int e = u.i.se & 0x7fff;
-	int msb = (int)(u.i.m>>63);
-	if (!e && !msb)
-		return u.i.m ? FP_SUBNORMAL : FP_ZERO;
-	if (!msb)
-		return FP_NAN;
-	if (e == 0x7fff)
-		return u.i.m << 1 ? FP_NAN : FP_INFINITE;
-	return FP_NORMAL;
-}
-#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
-int __fpclassifyl(long double x)
-{
-	union ldshape u = {x};
-	int e = u.i.se & 0x7fff;
-	u.i.se = 0;
-	if (!e)
-		return u.i2.lo | u.i2.hi ? FP_SUBNORMAL : FP_ZERO;
-	if (e == 0x7fff)
-		return u.i2.lo | u.i2.hi ? FP_NAN : FP_INFINITE;
-	return FP_NORMAL;
-}
-#endif
-
-#define isfinite(x) ( \
-	sizeof(x) == sizeof(float) ? (__FLOAT_BITS((float)x) & 0x7fffffff) < 0x7f800000 : \
-	sizeof(x) == sizeof(double) ? (__DOUBLE_BITS((double)x) & -1ULL>>1) < 0x7ffULL<<52 : \
-	__fpclassifyl(x) > FP_INFINITE)
-
-#include "vfprintf.h"
-/* Some useful macros */
-
-#define MAX(a,b) ((a)>(b) ? (a) : (b))
-#define MIN(a,b) ((a)<(b) ? (a) : (b))
-
-/* Convenient bit representation for modifier flags, which all fall
- * within 31 codepoints of the space character. */
-
-#define ALT_FORM   (1U<<('#'-' '))
-#define ZERO_PAD   (1U<<('0'-' '))
-#define LEFT_ADJ   (1U<<('-'-' '))
-#define PAD_POS    (1U<<(' '-' '))
-#define MARK_POS   (1U<<('+'-' '))
-#define GROUPED    (1U<<('\''-' '))
-
-#define FLAGMASK (ALT_FORM|ZERO_PAD|LEFT_ADJ|PAD_POS|MARK_POS|GROUPED)
-
-/* State machine to accept length modifiers + conversion specifiers.
- * Result is 0 on failure, or an argument type to pop on success. */
-
-enum {
-	BARE, LPRE, LLPRE, HPRE, HHPRE, BIGLPRE,
-	ZTPRE, JPRE,
-	STOP,
-	PTR, INT, UINT, ULLONG,
-	LONG, ULONG,
-	SHORT, USHORT, CHAR, UCHAR,
-	LLONG, SIZET, IMAX, UMAX, PDIFF, UIPTR,
-	DBL, LDBL,
-	NOARG,
-	MAXSTATE
-};
-
-#define S(x) [(x)-'A']
-/*
-static const unsigned char states[]['z'-'A'+1] = {
-	{ // 0: bare types 
-		S('d') = INT, S('i') = INT,
-		S('o') = UINT, S('u') = UINT, S('x') = UINT, S('X') = UINT,
-		S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
-		S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
-		S('c') = CHAR, S('C') = INT,
-		S('s') = PTR, S('S') = PTR, S('p') = UIPTR, S('n') = PTR,
-		S('m') = NOARG,
-		S('l') = LPRE, S('h') = HPRE, S('L') = BIGLPRE,
-		S('z') = ZTPRE, S('j') = JPRE, S('t') = ZTPRE,
-	}, { // 1: l-prefixed 
-		S('d') = LONG, S('i') = LONG,
-		S('o') = ULONG, S('u') = ULONG, S('x') = ULONG, S('X') = ULONG,
-		S('e') = DBL, S('f') = DBL, S('g') = DBL, S('a') = DBL,
-		S('E') = DBL, S('F') = DBL, S('G') = DBL, S('A') = DBL,
-		S('c') = INT, S('s') = PTR, S('n') = PTR,
-		S('l') = LLPRE,
-	}, { // 2: ll-prefixed 
-		S('d') = LLONG, S('i') = LLONG,
-		S('o') = ULLONG, S('u') = ULLONG,
-		S('x') = ULLONG, S('X') = ULLONG,
-		S('n') = PTR,
-	}, { //3: h-prefixed 
-		S('d') = SHORT, S('i') = SHORT,
-		S('o') = USHORT, S('u') = USHORT,
-		S('x') = USHORT, S('X') = USHORT,
-		S('n') = PTR,
-		S('h') = HHPRE,
-	}, { // 4: hh-prefixed 
-		S('d') = CHAR, S('i') = CHAR,
-		S('o') = UCHAR, S('u') = UCHAR,
-		S('x') = UCHAR, S('X') = UCHAR,
-		S('n') = PTR,
-	}, { // 5: L-prefixed 
-		S('e') = LDBL, S('f') = LDBL, S('g') = LDBL, S('a') = LDBL,
-		S('E') = LDBL, S('F') = LDBL, S('G') = LDBL, S('A') = LDBL,
-		S('n') = PTR,
-	}, { // 6: z- or t-prefixed (assumed to be same size) 
-		S('d') = PDIFF, S('i') = PDIFF,
-		S('o') = SIZET, S('u') = SIZET,
-		S('x') = SIZET, S('X') = SIZET,
-		S('n') = PTR,
-	}, { //7: j-prefixed 
-		S('d') = IMAX, S('i') = IMAX,
-		S('o') = UMAX, S('u') = UMAX,
-		S('x') = UMAX, S('X') = UMAX,
-		S('n') = PTR,
-	}
-};
-*/
-#define OOB(x) ((unsigned)(x)-'A' > 'z'-'A')
-
-
-
-static void out(char **sp, const char *s, size_t l)
-{
-	//if (!(f->flags & F_ERR)) __fwritex((void *)s, l, f);
-        while (l--) {
-                **sp = *s;
-                (*sp)++;
-                s++;
-        }
-}
-
-static void pad(char **sp, char c, int w, int l, int fl)
-{
-	char pad[256];
-	if ((unsigned int)fl & (LEFT_ADJ | ZERO_PAD) || l >= w) return;
-	l = w - l;
-	memset(pad, c, (long unsigned int)l>sizeof pad ? sizeof pad : (long unsigned int)l);
-	for (; (long unsigned int)l >= sizeof pad; l = l - (int)(sizeof pad))
-		out(sp, pad, sizeof pad);
-	out(sp, pad, (size_t)l);
-}
-
-static const char xdigits[17] = {"0123456789ABCDEF"};
-
-/*
-static char *fmt_x(uintmax_t x, char *s, int lower)
-{
-	for (; x; x>>=4) *--s = xdigits[(x&15)]|lower;
-	return s;
-}
-
-static char *fmt_o(uintmax_t x, char *s)
-{
-	for (; x; x>>=3) *--s = '0' + (x&7);
-	return s;
-}
-*/
-static char *fmt_u(uintmax_t x, char *s)
-{
-	unsigned long y;
-	for (   ; x>ULONG_MAX; x/=10) *--s = (char)('0' + x%10);
-	for (y=x;           y; y/=10) *--s = (char)('0' + y%10);
-	return s;
-}
-
-/* Do not override this check. The floating point printing code below
- * depends on the float.h constants being right. If they are wrong, it
- * may overflow the stack. */
-#if LDBL_MANT_DIG == 53
-typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long double)];
-#endif
-
-
-/*
- * w = string width, p = precision, fl = flags, t = type. "%20.5g gives w=20, p=5, fl=0, t='g'
- */
-int fmt_fp(char *output, long double y, int w, int p, int fl, int t)
-{
-    char* sp = output;
-	uint32_t big[(LDBL_MANT_DIG+28)/29 + 1          // mantissa expansion
-		+ (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9]; // exponent expansion
-	uint32_t *a, *d, *r, *z;
-	int e2=0, e, i, j, l;
-	char buf[9+LDBL_MANT_DIG/4], *s;
-	const char *prefix="-0X+0X 0X-0x+0x 0x";
-	int pl;
-	char ebuf0[3*sizeof(int)], *ebuf=&ebuf0[3*sizeof(int)], *estr = NULL;
-
-	pl=1;
-	if (signbit(y)) {
-		y=-y;
-	} else if ((unsigned int)fl & MARK_POS) {
-		prefix+=3;
-	} else if ((unsigned int)fl & PAD_POS) {
-		prefix+=6;
-	} else prefix++, pl=0;
-
-	if (!isfinite(y)) {
-		s = (t&32)?"inf":"INF";
-		if (y!=y) s=(t&32)?"nan":"NAN";
-		pad(&sp, ' ', w, 3+pl, (int)((unsigned int)fl &~ ZERO_PAD));
-		out(&sp, prefix, (size_t)pl);
-		out(&sp, s, 3);
-		pad(&sp, ' ', w, 3+pl, (int)((unsigned int)fl^LEFT_ADJ));
-		return MAX(w, 3+pl);
-	}
-
-	y = frexpl(y, &e2) * 2;
-	if ((_Bool)y) e2--;
-
-	if ((t|32)=='a') {
-		long double round = 8.0;
-		int re;
-
-		if (t&32) prefix += 9;
-		pl += 2;
-
-		if (p<0 || p>=LDBL_MANT_DIG/4-1) re=0;
-		else re=LDBL_MANT_DIG/4-1-p;
-
-		if (re) {
-			while (re--) round*=16;
-			if (*prefix=='-') {
-				y=-y;
-				y-=round;
-				y+=round;
-				y=-y;
-			} else {
-				y+=round;
-				y-=round;
-			}
-		}
-
-		estr=fmt_u((uintmax_t )(e2<0 ? -e2 : e2), ebuf);
-		if (estr==ebuf) *--estr='0';
-		*--estr = (e2<0 ? '-' : '+');
-		*--estr = (char)(t+('p'-'a'));
-
-		s=buf;
-		do {
-			int x=(int)y;
-			*s++=(char)(xdigits[x]|(t&32));
-			y=16*(y-x);
-			if (s-buf==1 && ((_Bool)y||p>0||((unsigned int)fl&ALT_FORM))) *s++='.';
-		} while ((_Bool)y);
-
-		if (p > INT_MAX-2-(ebuf-estr)-pl)
-			return -1;
-		if (p && s-buf-2 < p)
-			l = (int)((p+2) + (ebuf-estr));
-		else
-			l = (int)((s-buf) + (ebuf-estr));
-
-		pad(&sp, ' ', w, pl+l, fl);
-		out(&sp, prefix, (size_t)pl);
-		pad(&sp, '0', w, pl+l, (int)((unsigned int)fl^ZERO_PAD));
-		out(&sp, buf, (size_t)(s-buf));
-		pad(&sp, '0', (int)(l-(ebuf-estr)-(s-buf)), 0, 0);
-		out(&sp, estr, (size_t)(ebuf-estr));
-		pad(&sp, ' ', w, pl+l, (int)((unsigned int)fl^LEFT_ADJ));
-		return MAX(w, pl+l);
-	}
-	if (p<0) p=6;
-
-	if ((_Bool)y) y *= 0x1p28, e2-=28;
-
-	if (e2<0) a=r=z=big;
-	else a=r=z=big+sizeof(big)/sizeof(*big) - LDBL_MANT_DIG - 1;
-
-	do {
-		*z = (uint32_t)y;
-		y = 1000000000*(y-*z++);
-	} while ((_Bool)y);
-
-	while (e2>0) {
-		uint32_t carry=0;
-		int sh=MIN(29,e2);
-		for (d=z-1; d>=a; d--) {
-			uint64_t x = ((uint64_t)*d<<sh)+carry;
-			*d = (uint32_t)(x % 1000000000);
-			carry = (uint32_t)(x / 1000000000);
-		}
-		if (carry) *--a = carry;
-		while (z>a && !z[-1]) z--;
-		e2-=sh;
-	}
-	while (e2<0) {
-		uint32_t carry=0, *b;
-		int sh=MIN(9,-e2), need=(int)(1+((unsigned int)p+LDBL_MANT_DIG/3U+8)/9);
-		for (d=a; d<z; d++) {
-			uint32_t rm = (*d & (uint32_t)((1<<sh)-1));
-			*d = (*d>>sh) + carry;
-			carry = ((uint32_t)(1000000000>>sh) * rm);
-		}
-		if (!*a) a++;
-		if (carry) *z++ = carry;
-		/* Avoid (slow!) computation past requested precision */
-		b = (t|32)=='f' ? r : a;
-		if (z-b > need) z = b+need;
-		e2+=sh;
-	}
-
-	if (a<z) for (i=10, e=(int)(9*(r-a)); *a>=(unsigned)i; i*=10, e++);
-	else e=0;
-
-	/* Perform rounding: j is precision after the radix (possibly neg) */
-	j = p - ((t|32)!='f')*e - ((t|32)=='g' && p);
-	if (j < 9*(z-r-1)) {
-		uint32_t x;
-		/* We avoid C's broken division of negative numbers */
-		d = r + 1 + ((j+9*LDBL_MAX_EXP)/9 - LDBL_MAX_EXP);
-		j += 9*LDBL_MAX_EXP;
-		j %= 9;
-		for (i=10, j++; j<9; i*=10, j++);
-		x = (*d % (uint32_t)i);
-		/* Are there any significant digits past j? */
-		if (x || d+1!=z) {
-			long double round = 2/LDBL_EPSILON;
-			long double small;
-			if ((*d/(uint32_t)(i) & 1) || (i==1000000000 && d>a && (d[-1]&1)))
-				round += 2;
-			if (x<(unsigned)i/2) small=0x0.8p0;
-			else if (x==(unsigned)i/2 && d+1==z) small=0x1.0p0;
-			else small=0x1.8p0;
-			if (pl && *prefix=='-') round*=-1, small*=-1;
-			*d -= x;
-			/* Decide whether to round by probing round+small */
-			if (round+small != round) {
-				*d = *d + (uint32_t)i;
-				while (*d > 999999999) {
-					*d--=0;
-					if (d<a) *--a=0;
-					(*d)++;
-				}
-				for (i=10, e=(int)(9*(r-a)); *a>=(unsigned)i; i*=10, e++);
-			}
-		}
-		if (z>d+1) z=d+1;
-	}
-	for (; z>a && !z[-1]; z--);
-	
-	if ((t|32)=='g') {
-		if (!p) p++;
-		if (p>e && e>=-4) {
-			t--;
-			p-=e+1;
-		} else {
-			t-=2;
-			p--;
-		}
-		if (!((uint32_t)fl&ALT_FORM)) {
-			/* Count trailing zeros in last place */
-			if (z>a && z[-1]) for (i=10, j=0; (z[-1]%(uint32_t)i)==0; i*=10, j++);
-			else j=9;
-			if ((t|32)=='f')
-				p = (int)MIN(p,MAX(0,9*(z-r-1)-j));
-			else
-				p = (int)MIN(p,MAX(0,9*(z-r-1)+e-j));
-		}
-	}
-	if (p > INT_MAX-1-(p || ((unsigned int)fl&ALT_FORM)))
-		return -1;
-	l = 1 + p + (p || ((unsigned int)fl&ALT_FORM));
-	if ((t|32)=='f') {
-		if (e > INT_MAX-l) return -1;
-		if (e>0) l+=e;
-	} else {
-		estr=fmt_u((uintmax_t)(e<0 ? -e : e), ebuf);
-		while(ebuf-estr<2) *--estr='0';
-		*--estr = (e<0 ? '-' : '+');
-		*--estr = (char)t;
-		if (ebuf-estr > INT_MAX-l) return -1;
-		l += (int)(ebuf-estr);
-	}
-
-	if (l > INT_MAX-pl) return -1;
-	pad(&sp, ' ', w, pl+l, fl);
-	out(&sp, prefix, (size_t)pl);
-	pad(&sp, '0', w, pl+l, (int)((unsigned int)fl^ZERO_PAD));
-
-	if ((t|32)=='f') {
-		if (a>r) a=r;
-		for (d=a; d<=r; d++) {
-			s = fmt_u(*d, buf+9); //@@@
-			if (d!=a) while (s>buf) *--s='0';
-			else if (s==buf+9) *--s='0';
-			out(&sp, s, (size_t)(buf+9-s));
-		}
-		if (p || ((unsigned int)fl&ALT_FORM)) out(&sp, ".", 1);
-		for (; d<z && p>0; d++, p-=9) {
-			s = fmt_u(*d, buf+9); //@@@
-			while (s>buf) *--s='0';
-			out(&sp, s, (size_t)(MIN(9,p)));
-		}
-		pad(&sp, '0', p+9, 9, 0);
-	} else {
-		if (z<=a) z=a+1;
-		for (d=a; d<z && p>=0; d++) {
-			s = fmt_u(*d, buf+9); //@@@
-			if (s==buf+9) *--s='0';
-			if (d!=a) while (s>buf) *--s='0';
-			else {
-				out(&sp, s++, 1);
-				if (p>0||((unsigned int)fl&ALT_FORM)) out(&sp, ".", 1);
-			}
-			out(&sp, s, (size_t)(MIN(buf+9-s, p)));
-			p -= (int)(buf+9-s);
-		}
-		pad(&sp, '0', p+18, 18, 0);
-		out(&sp, estr, (size_t)(ebuf-estr));
-	}
-
-	pad(&sp, ' ', w, pl+l, (int)((unsigned int)fl^LEFT_ADJ));
-
-	return MAX(w, pl+l);
-}
-
-/*
-static int getint(char **s) {
-	int i;
-	for (i=0; isdigit(**s); (*s)++) {
-		if (i > INT_MAX/10U || **s-'0' > INT_MAX-10*i) i = -1;
-		else i = 10*i + (**s-'0');
-	}
-	return i;
-}
-*/
diff --git a/ext/open62541/deps/musl/vfprintf.h b/ext/open62541/deps/musl/vfprintf.h
deleted file mode 100644
index 2a3172b..0000000
--- a/ext/open62541/deps/musl/vfprintf.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef VFPRINTF_H
-#define VFPRINTF_H
-
-#include <limits.h>
-#include <string.h>
-//#include <stdarg.h>
-//#include <stddef.h>
-//#include <wchar.h>
-#include <inttypes.h>
-#include <endian.h>
-
-
-//#include <stdio.h>
-
-//#include <float.h>
-#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
-#define LDBL_MIN     3.3621031431120935063e-4932L
-#define LDBL_MAX     1.1897314953572317650e+4932L
-#define LDBL_EPSILON 1.0842021724855044340e-19L
-
-#define LDBL_MANT_DIG 64
-#define LDBL_MIN_EXP (-16381)
-#define LDBL_MAX_EXP 16384
-//libm.h
-#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
-#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
-union ldshape {
-	long double f;
-	struct {
-		uint64_t m;
-		uint16_t se;
-	} i;
-};
-#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
-union ldshape {
-	long double f;
-	struct {
-		uint64_t lo;
-		uint32_t mid;
-		uint16_t top;
-		uint16_t se;
-	} i;
-	struct {
-		uint64_t lo;
-		uint64_t hi;
-	} i2;
-};
-#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
-union ldshape {
-	long double f;
-	struct {
-		uint16_t se;
-		uint16_t top;
-		uint32_t mid;
-		uint64_t lo;
-	} i;
-	struct {
-		uint64_t hi;
-		uint64_t lo;
-	} i2;
-};
-#else
-#error Unsupported long double representation
-#endif
-
-
-int fmt_fp(char*, long double, int, int, int, int);
-
-#endif
diff --git a/ext/open62541/deps/open62541_queue.h b/ext/open62541/deps/open62541_queue.h
deleted file mode 100644
index ed2962f..0000000
--- a/ext/open62541/deps/open62541_queue.h
+++ /dev/null
@@ -1,648 +0,0 @@
-/*	$OpenBSD: queue.h,v 1.38 2013/07/03 15:05:21 fgsch Exp $	*/
-/*	$NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $	*/
-
-/*
- * Copyright (c) 1991, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)queue.h	8.5 (Berkeley) 8/20/94
- */
-
-#ifndef	_SYS_QUEUE_H_
-#define	_SYS_QUEUE_H_
-
-/*
- * This file defines five types of data structures: singly-linked lists, 
- * lists, simple queues, tail queues, and circular queues.
- *
- *
- * A singly-linked list is headed by a single forward pointer. The elements
- * are singly linked for minimum space and pointer manipulation overhead at
- * the expense of O(n) removal for arbitrary elements. New elements can be
- * added to the list after an existing element or at the head of the list.
- * Elements being removed from the head of the list should use the explicit
- * macro for this purpose for optimum efficiency. A singly-linked list may
- * only be traversed in the forward direction.  Singly-linked lists are ideal
- * for applications with large datasets and few or no removals or for
- * implementing a LIFO queue.
- *
- * A list is headed by a single forward pointer (or an array of forward
- * pointers for a hash table header). The elements are doubly linked
- * so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before
- * or after an existing element or at the head of the list. A list
- * may only be traversed in the forward direction.
- *
- * A simple queue is headed by a pair of pointers, one the head of the
- * list and the other to the tail of the list. The elements are singly
- * linked to save space, so elements can only be removed from the
- * head of the list. New elements can be added to the list before or after
- * an existing element, at the head of the list, or at the end of the
- * list. A simple queue may only be traversed in the forward direction.
- *
- * A tail queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or
- * after an existing element, at the head of the list, or at the end of
- * the list. A tail queue may be traversed in either direction.
- *
- * A circle queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or after
- * an existing element, at the head of the list, or at the end of the list.
- * A circle queue may be traversed in either direction, but has a more
- * complex end of list detection.
- *
- * For details on the use of these macros, see the queue(3) manual page.
- */
-
-#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC))
-#define _Q_INVALIDATE(a) (a) = ((void *)-1)
-#else
-#define _Q_INVALIDATE(a)
-#endif
-
-/*
- * Singly-linked List definitions.
- */
-#define SLIST_HEAD(name, type)						\
-struct name {								\
-    struct type *slh_first;	/* first element */			\
-}
- 
-#define	SLIST_HEAD_INITIALIZER(head)					\
-    { NULL }
-
-#define SLIST_ENTRY(type)						\
-struct {								\
-    struct type *sle_next;	/* next element */			\
-}
- 
-/*
- * Singly-linked List access methods.
- */
-#define	SLIST_FIRST(head)	((head)->slh_first)
-#define	SLIST_END(head)		NULL
-#define	SLIST_EMPTY(head)	(SLIST_FIRST(head) == SLIST_END(head))
-#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
-
-#define	SLIST_FOREACH(var, head, field)					\
-    for((var) = SLIST_FIRST(head);					\
-        (var) != SLIST_END(head);					\
-        (var) = SLIST_NEXT(var, field))
-
-#define	SLIST_FOREACH_SAFE(var, head, field, tvar)			\
-    for ((var) = SLIST_FIRST(head);				\
-        (var) && ((tvar) = SLIST_NEXT(var, field), 1);		\
-        (var) = (tvar))
-
-/*
- * Singly-linked List functions.
- */
-#define	SLIST_INIT(head) {						\
-    SLIST_FIRST(head) = SLIST_END(head);				\
-}
-
-#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
-    (elm)->field.sle_next = (slistelm)->field.sle_next;		\
-    (slistelm)->field.sle_next = (elm);				\
-} while (0)
-
-#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
-    (elm)->field.sle_next = (head)->slh_first;			\
-    (head)->slh_first = (elm);					\
-} while (0)
-
-#define	SLIST_REMOVE_AFTER(elm, field) do {				\
-    (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next;	\
-} while (0)
-
-#define	SLIST_REMOVE_HEAD(head, field) do {				\
-    (head)->slh_first = (head)->slh_first->field.sle_next;		\
-} while (0)
-
-#define SLIST_REMOVE(head, elm, type, field) do {			\
-    if ((head)->slh_first == (elm)) {				\
-        SLIST_REMOVE_HEAD((head), field);			\
-    } else {							\
-        struct type *curelm = (head)->slh_first;		\
-                                    \
-        while (curelm->field.sle_next != (elm))			\
-            curelm = curelm->field.sle_next;		\
-        curelm->field.sle_next =				\
-            curelm->field.sle_next->field.sle_next;		\
-        _Q_INVALIDATE((elm)->field.sle_next);			\
-    }								\
-} while (0)
-
-/*
- * List definitions.
- */
-#define LIST_HEAD(name, type)						\
-struct name {								\
-    struct type *lh_first;	/* first element */			\
-}
-
-#define LIST_HEAD_INITIALIZER(head)					\
-    { NULL }
-
-#define LIST_ENTRY(type)						\
-struct {								\
-    struct type *le_next;	/* next element */			\
-    struct type **le_prev;	/* address of previous next element */	\
-}
-
-/*
- * List access methods
- */
-#define	LIST_FIRST(head)		((head)->lh_first)
-#define	LIST_END(head)			NULL
-#define	LIST_EMPTY(head)		(LIST_FIRST(head) == LIST_END(head))
-#define	LIST_NEXT(elm, field)		((elm)->field.le_next)
-
-#define LIST_FOREACH(var, head, field)					\
-    for((var) = LIST_FIRST(head);					\
-        (var)!= LIST_END(head);					\
-        (var) = LIST_NEXT(var, field))
-
-#define	LIST_FOREACH_SAFE(var, head, field, tvar)			\
-    for ((var) = LIST_FIRST(head);				\
-        (var) && ((tvar) = LIST_NEXT(var, field), 1);		\
-        (var) = (tvar))
-
-/*
- * List functions.
- */
-#define	LIST_INIT(head) do {						\
-    LIST_FIRST(head) = LIST_END(head);				\
-} while (0)
-
-#define LIST_INSERT_AFTER(listelm, elm, field) do {			\
-    if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)	\
-        (listelm)->field.le_next->field.le_prev =		\
-            &(elm)->field.le_next;				\
-    (listelm)->field.le_next = (elm);				\
-    (elm)->field.le_prev = &(listelm)->field.le_next;		\
-} while (0)
-
-#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
-    (elm)->field.le_prev = (listelm)->field.le_prev;		\
-    (elm)->field.le_next = (listelm);				\
-    *(listelm)->field.le_prev = (elm);				\
-    (listelm)->field.le_prev = &(elm)->field.le_next;		\
-} while (0)
-
-#define LIST_INSERT_HEAD(head, elm, field) do {				\
-    if (((elm)->field.le_next = (head)->lh_first) != NULL)		\
-        (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
-    (head)->lh_first = (elm);					\
-    (elm)->field.le_prev = &(head)->lh_first;			\
-} while (0)
-
-#define LIST_REMOVE(elm, field) do {					\
-    if ((elm)->field.le_next != NULL)				\
-        (elm)->field.le_next->field.le_prev =			\
-            (elm)->field.le_prev;				\
-    *(elm)->field.le_prev = (elm)->field.le_next;			\
-    _Q_INVALIDATE((elm)->field.le_prev);				\
-    _Q_INVALIDATE((elm)->field.le_next);				\
-} while (0)
-
-#define LIST_REPLACE(elm, elm2, field) do {				\
-    if (((elm2)->field.le_next = (elm)->field.le_next) != NULL)	\
-        (elm2)->field.le_next->field.le_prev =			\
-            &(elm2)->field.le_next;				\
-    (elm2)->field.le_prev = (elm)->field.le_prev;			\
-    *(elm2)->field.le_prev = (elm2);				\
-    _Q_INVALIDATE((elm)->field.le_prev);				\
-    _Q_INVALIDATE((elm)->field.le_next);				\
-} while (0)
-
-/*
- * Simple queue definitions.
- */
-#define SIMPLEQ_HEAD(name, type)					\
-struct name {								\
-    struct type *sqh_first;	/* first element */			\
-    struct type **sqh_last;	/* addr of last next element */		\
-}
-
-#define SIMPLEQ_HEAD_INITIALIZER(head)					\
-    { NULL, &(head).sqh_first }
-
-#define SIMPLEQ_ENTRY(type)						\
-struct {								\
-    struct type *sqe_next;	/* next element */			\
-}
-
-/*
- * Simple queue access methods.
- */
-#define	SIMPLEQ_FIRST(head)	    ((head)->sqh_first)
-#define	SIMPLEQ_END(head)	    NULL
-#define	SIMPLEQ_EMPTY(head)	    (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head))
-#define	SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
-
-#define SIMPLEQ_FOREACH(var, head, field)				\
-    for((var) = SIMPLEQ_FIRST(head);				\
-        (var) != SIMPLEQ_END(head);					\
-        (var) = SIMPLEQ_NEXT(var, field))
-
-#define	SIMPLEQ_FOREACH_SAFE(var, head, field, tvar)			\
-    for ((var) = SIMPLEQ_FIRST(head);				\
-        (var) && ((tvar) = SIMPLEQ_NEXT(var, field), 1);		\
-        (var) = (tvar))
-
-/*
- * Simple queue functions.
- */
-#define	SIMPLEQ_INIT(head) do {						\
-    (head)->sqh_first = NULL;					\
-    (head)->sqh_last = &(head)->sqh_first;				\
-} while (0)
-
-#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\
-    if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\
-        (head)->sqh_last = &(elm)->field.sqe_next;		\
-    (head)->sqh_first = (elm);					\
-} while (0)
-
-#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\
-    (elm)->field.sqe_next = NULL;					\
-    *(head)->sqh_last = (elm);					\
-    (head)->sqh_last = &(elm)->field.sqe_next;			\
-} while (0)
-
-#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-    if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
-        (head)->sqh_last = &(elm)->field.sqe_next;		\
-    (listelm)->field.sqe_next = (elm);				\
-} while (0)
-
-#define SIMPLEQ_REMOVE_HEAD(head, field) do {			\
-    if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
-        (head)->sqh_last = &(head)->sqh_first;			\
-} while (0)
-
-#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do {			\
-    if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \
-        == NULL)							\
-        (head)->sqh_last = &(elm)->field.sqe_next;		\
-} while (0)
-
-/*
- * XOR Simple queue definitions.
- */
-#define XSIMPLEQ_HEAD(name, type)					\
-struct name {								\
-    struct type *sqx_first;	/* first element */			\
-    struct type **sqx_last;	/* addr of last next element */		\
-    unsigned long sqx_cookie;					\
-}
-
-#define XSIMPLEQ_ENTRY(type)						\
-struct {								\
-    struct type *sqx_next;	/* next element */			\
-}
-
-/*
- * XOR Simple queue access methods.
- */
-#define XSIMPLEQ_XOR(head, ptr)	    ((__typeof(ptr))((head)->sqx_cookie ^ \
-                    (unsigned long)(ptr)))
-#define	XSIMPLEQ_FIRST(head)	    XSIMPLEQ_XOR(head, ((head)->sqx_first))
-#define	XSIMPLEQ_END(head)	    NULL
-#define	XSIMPLEQ_EMPTY(head)	    (XSIMPLEQ_FIRST(head) == XSIMPLEQ_END(head))
-#define	XSIMPLEQ_NEXT(head, elm, field)    XSIMPLEQ_XOR(head, ((elm)->field.sqx_next))
-
-
-#define XSIMPLEQ_FOREACH(var, head, field)				\
-    for ((var) = XSIMPLEQ_FIRST(head);				\
-        (var) != XSIMPLEQ_END(head);				\
-        (var) = XSIMPLEQ_NEXT(head, var, field))
-
-#define	XSIMPLEQ_FOREACH_SAFE(var, head, field, tvar)			\
-    for ((var) = XSIMPLEQ_FIRST(head);				\
-        (var) && ((tvar) = XSIMPLEQ_NEXT(head, var, field), 1);	\
-        (var) = (tvar))
-
-/*
- * XOR Simple queue functions.
- */
-#define	XSIMPLEQ_INIT(head) do {					\
-    arc4random_buf(&(head)->sqx_cookie, sizeof((head)->sqx_cookie)); \
-    (head)->sqx_first = XSIMPLEQ_XOR(head, NULL);			\
-    (head)->sqx_last = XSIMPLEQ_XOR(head, &(head)->sqx_first);	\
-} while (0)
-
-#define XSIMPLEQ_INSERT_HEAD(head, elm, field) do {			\
-    if (((elm)->field.sqx_next = (head)->sqx_first) ==		\
-        XSIMPLEQ_XOR(head, NULL))					\
-        (head)->sqx_last = XSIMPLEQ_XOR(head, &(elm)->field.sqx_next); \
-    (head)->sqx_first = XSIMPLEQ_XOR(head, (elm));			\
-} while (0)
-
-#define XSIMPLEQ_INSERT_TAIL(head, elm, field) do {			\
-    (elm)->field.sqx_next = XSIMPLEQ_XOR(head, NULL);		\
-    *(XSIMPLEQ_XOR(head, (head)->sqx_last)) = XSIMPLEQ_XOR(head, (elm)); \
-    (head)->sqx_last = XSIMPLEQ_XOR(head, &(elm)->field.sqx_next);	\
-} while (0)
-
-#define XSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-    if (((elm)->field.sqx_next = (listelm)->field.sqx_next) ==	\
-        XSIMPLEQ_XOR(head, NULL))					\
-        (head)->sqx_last = XSIMPLEQ_XOR(head, &(elm)->field.sqx_next); \
-    (listelm)->field.sqx_next = XSIMPLEQ_XOR(head, (elm));		\
-} while (0)
-
-#define XSIMPLEQ_REMOVE_HEAD(head, field) do {				\
-    if (((head)->sqx_first = XSIMPLEQ_XOR(head,			\
-        (head)->sqx_first)->field.sqx_next) == XSIMPLEQ_XOR(head, NULL)) \
-        (head)->sqx_last = XSIMPLEQ_XOR(head, &(head)->sqx_first); \
-} while (0)
-
-#define XSIMPLEQ_REMOVE_AFTER(head, elm, field) do {			\
-    if (((elm)->field.sqx_next = XSIMPLEQ_XOR(head,			\
-        (elm)->field.sqx_next)->field.sqx_next)			\
-        == XSIMPLEQ_XOR(head, NULL))				\
-        (head)->sqx_last = 					\
-            XSIMPLEQ_XOR(head, &(elm)->field.sqx_next);		\
-} while (0)
-
-            
-/*
- * Tail queue definitions.
- */
-#define TAILQ_HEAD(name, type)						\
-struct name {								\
-    struct type *tqh_first;	/* first element */			\
-    struct type **tqh_last;	/* addr of last next element */		\
-}
-
-#define TAILQ_HEAD_INITIALIZER(head)					\
-    { NULL, &(head).tqh_first }
-
-#define TAILQ_ENTRY(type)						\
-struct {								\
-    struct type *tqe_next;	/* next element */			\
-    struct type **tqe_prev;	/* address of previous next element */	\
-}
-
-/* 
- * tail queue access methods 
- */
-#define	TAILQ_FIRST(head)		((head)->tqh_first)
-#define	TAILQ_END(head)			NULL
-#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)
-#define TAILQ_LAST(head, headname)					\
-    (*(((struct headname *)((head)->tqh_last))->tqh_last))
-/* XXX */
-#define TAILQ_PREV(elm, headname, field)				\
-    (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
-#define	TAILQ_EMPTY(head)						\
-    (TAILQ_FIRST(head) == TAILQ_END(head))
-
-#define TAILQ_FOREACH(var, head, field)					\
-    for((var) = TAILQ_FIRST(head);					\
-        (var) != TAILQ_END(head);					\
-        (var) = TAILQ_NEXT(var, field))
-
-#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			\
-    for ((var) = TAILQ_FIRST(head);					\
-        (var) != TAILQ_END(head) &&					\
-        ((tvar) = TAILQ_NEXT(var, field), 1);			\
-        (var) = (tvar))
-
-
-#define TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
-    for((var) = TAILQ_LAST(head, headname);				\
-        (var) != TAILQ_END(head);					\
-        (var) = TAILQ_PREV(var, headname, field))
-
-#define	TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)	\
-    for ((var) = TAILQ_LAST(head, headname);			\
-        (var) != TAILQ_END(head) &&					\
-        ((tvar) = TAILQ_PREV(var, headname, field), 1);		\
-        (var) = (tvar))
-
-/*
- * Tail queue functions.
- */
-#define	TAILQ_INIT(head) do {						\
-    (head)->tqh_first = NULL;					\
-    (head)->tqh_last = &(head)->tqh_first;				\
-} while (0)
-
-#define TAILQ_INSERT_HEAD(head, elm, field) do {			\
-    if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\
-        (head)->tqh_first->field.tqe_prev =			\
-            &(elm)->field.tqe_next;				\
-    else								\
-        (head)->tqh_last = &(elm)->field.tqe_next;		\
-    (head)->tqh_first = (elm);					\
-    (elm)->field.tqe_prev = &(head)->tqh_first;			\
-} while (0)
-
-#define TAILQ_INSERT_TAIL(head, elm, field) do {			\
-    (elm)->field.tqe_next = NULL;					\
-    (elm)->field.tqe_prev = (head)->tqh_last;			\
-    *(head)->tqh_last = (elm);					\
-    (head)->tqh_last = &(elm)->field.tqe_next;			\
-} while (0)
-
-#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-    if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
-        (elm)->field.tqe_next->field.tqe_prev =			\
-            &(elm)->field.tqe_next;				\
-    else								\
-        (head)->tqh_last = &(elm)->field.tqe_next;		\
-    (listelm)->field.tqe_next = (elm);				\
-    (elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\
-} while (0)
-
-#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
-    (elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
-    (elm)->field.tqe_next = (listelm);				\
-    *(listelm)->field.tqe_prev = (elm);				\
-    (listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\
-} while (0)
-
-#define TAILQ_REMOVE(head, elm, field) do {				\
-    if (((elm)->field.tqe_next) != NULL)				\
-        (elm)->field.tqe_next->field.tqe_prev =			\
-            (elm)->field.tqe_prev;				\
-    else								\
-        (head)->tqh_last = (elm)->field.tqe_prev;		\
-    *(elm)->field.tqe_prev = (elm)->field.tqe_next;			\
-    _Q_INVALIDATE((elm)->field.tqe_prev);				\
-    _Q_INVALIDATE((elm)->field.tqe_next);				\
-} while (0)
-
-#define TAILQ_REPLACE(head, elm, elm2, field) do {			\
-    if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)	\
-        (elm2)->field.tqe_next->field.tqe_prev =		\
-            &(elm2)->field.tqe_next;				\
-    else								\
-        (head)->tqh_last = &(elm2)->field.tqe_next;		\
-    (elm2)->field.tqe_prev = (elm)->field.tqe_prev;			\
-    *(elm2)->field.tqe_prev = (elm2);				\
-    _Q_INVALIDATE((elm)->field.tqe_prev);				\
-    _Q_INVALIDATE((elm)->field.tqe_next);				\
-} while (0)
-
-/*
- * Circular queue definitions.
- */
-#define CIRCLEQ_HEAD(name, type)					\
-struct name {								\
-    struct type *cqh_first;		/* first element */		\
-    struct type *cqh_last;		/* last element */		\
-}
-
-#define CIRCLEQ_HEAD_INITIALIZER(head)					\
-    { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
-
-#define CIRCLEQ_ENTRY(type)						\
-struct {								\
-    struct type *cqe_next;		/* next element */		\
-    struct type *cqe_prev;		/* previous element */		\
-}
-
-/*
- * Circular queue access methods 
- */
-#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)
-#define	CIRCLEQ_LAST(head)		((head)->cqh_last)
-#define	CIRCLEQ_END(head)		((void *)(head))
-#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)
-#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)
-#define	CIRCLEQ_EMPTY(head)						\
-    (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
-
-#define CIRCLEQ_FOREACH(var, head, field)				\
-    for((var) = CIRCLEQ_FIRST(head);				\
-        (var) != CIRCLEQ_END(head);					\
-        (var) = CIRCLEQ_NEXT(var, field))
-
-#define	CIRCLEQ_FOREACH_SAFE(var, head, field, tvar)			\
-    for ((var) = CIRCLEQ_FIRST(head);				\
-        (var) != CIRCLEQ_END(head) &&				\
-        ((tvar) = CIRCLEQ_NEXT(var, field), 1);			\
-        (var) = (tvar))
-
-#define CIRCLEQ_FOREACH_REVERSE(var, head, field)			\
-    for((var) = CIRCLEQ_LAST(head);					\
-        (var) != CIRCLEQ_END(head);					\
-        (var) = CIRCLEQ_PREV(var, field))
-
-#define	CIRCLEQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)	\
-    for ((var) = CIRCLEQ_LAST(head, headname);			\
-        (var) != CIRCLEQ_END(head) && 				\
-        ((tvar) = CIRCLEQ_PREV(var, headname, field), 1);		\
-        (var) = (tvar))
-
-/*
- * Circular queue functions.
- */
-#define	CIRCLEQ_INIT(head) do {						\
-    (head)->cqh_first = CIRCLEQ_END(head);				\
-    (head)->cqh_last = CIRCLEQ_END(head);				\
-} while (0)
-
-#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-    (elm)->field.cqe_next = (listelm)->field.cqe_next;		\
-    (elm)->field.cqe_prev = (listelm);				\
-    if ((listelm)->field.cqe_next == CIRCLEQ_END(head))		\
-        (head)->cqh_last = (elm);				\
-    else								\
-        (listelm)->field.cqe_next->field.cqe_prev = (elm);	\
-    (listelm)->field.cqe_next = (elm);				\
-} while (0)
-
-#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\
-    (elm)->field.cqe_next = (listelm);				\
-    (elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\
-    if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))		\
-        (head)->cqh_first = (elm);				\
-    else								\
-        (listelm)->field.cqe_prev->field.cqe_next = (elm);	\
-    (listelm)->field.cqe_prev = (elm);				\
-} while (0)
-
-#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\
-    (elm)->field.cqe_next = (head)->cqh_first;			\
-    (elm)->field.cqe_prev = CIRCLEQ_END(head);			\
-    if ((head)->cqh_last == CIRCLEQ_END(head))			\
-        (head)->cqh_last = (elm);				\
-    else								\
-        (head)->cqh_first->field.cqe_prev = (elm);		\
-    (head)->cqh_first = (elm);					\
-} while (0)
-
-#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\
-    (elm)->field.cqe_next = CIRCLEQ_END(head);			\
-    (elm)->field.cqe_prev = (head)->cqh_last;			\
-    if ((head)->cqh_first == CIRCLEQ_END(head))			\
-        (head)->cqh_first = (elm);				\
-    else								\
-        (head)->cqh_last->field.cqe_next = (elm);		\
-    (head)->cqh_last = (elm);					\
-} while (0)
-
-#define	CIRCLEQ_REMOVE(head, elm, field) do {				\
-    if ((elm)->field.cqe_next == CIRCLEQ_END(head))			\
-        (head)->cqh_last = (elm)->field.cqe_prev;		\
-    else								\
-        (elm)->field.cqe_next->field.cqe_prev =			\
-            (elm)->field.cqe_prev;				\
-    if ((elm)->field.cqe_prev == CIRCLEQ_END(head))			\
-        (head)->cqh_first = (elm)->field.cqe_next;		\
-    else								\
-        (elm)->field.cqe_prev->field.cqe_next =			\
-            (elm)->field.cqe_next;				\
-    _Q_INVALIDATE((elm)->field.cqe_prev);				\
-    _Q_INVALIDATE((elm)->field.cqe_next);				\
-} while (0)
-
-#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {			\
-    if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==		\
-        CIRCLEQ_END(head))						\
-        (head)->cqh_last = (elm2);				\
-    else								\
-        (elm2)->field.cqe_next->field.cqe_prev = (elm2);	\
-    if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==		\
-        CIRCLEQ_END(head))						\
-        (head)->cqh_first = (elm2);				\
-    else								\
-        (elm2)->field.cqe_prev->field.cqe_next = (elm2);	\
-    _Q_INVALIDATE((elm)->field.cqe_prev);				\
-    _Q_INVALIDATE((elm)->field.cqe_next);				\
-} while (0)
-
-#endif	/* !_SYS_QUEUE_H_ */
diff --git a/ext/open62541/deps/pcg_basic.c b/ext/open62541/deps/pcg_basic.c
deleted file mode 100644
index 53b0247..0000000
--- a/ext/open62541/deps/pcg_basic.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * PCG Random Number Generation for C.
- *
- * Copyright 2014 Melissa O'Neill <oneill@pcg-random.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * For additional information about the PCG random number generation scheme,
- * including its license and other licensing options, visit
- *
- *       http://www.pcg-random.org
- */
-
-#include "pcg_basic.h"
-
-void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initial_state, uint64_t initseq) {
-    rng->state = 0U;
-    rng->inc = (initseq << 1u) | 1u;
-    pcg32_random_r(rng);
-    rng->state += initial_state;
-    pcg32_random_r(rng);
-}
-
-uint32_t pcg32_random_r(pcg32_random_t* rng) {
-    uint64_t oldstate = rng->state;
-    rng->state = oldstate * 6364136223846793005ULL + rng->inc;
-    uint32_t xorshifted = (uint32_t)(((oldstate >> 18u) ^ oldstate) >> 27u);
-    uint32_t rot = (uint32_t)(oldstate >> 59u);
-    return (xorshifted >> rot) | (xorshifted << ((~rot + 1u) & 31)); /* was (xorshifted >> rot) | (xorshifted << ((-rot) & 31)) */
-}
diff --git a/ext/open62541/deps/pcg_basic.h b/ext/open62541/deps/pcg_basic.h
deleted file mode 100644
index 4f7bcc2..0000000
--- a/ext/open62541/deps/pcg_basic.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * PCG Random Number Generation for C.
- *
- * Copyright 2014 Melissa O'Neill <oneill@pcg-random.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * For additional information about the PCG random number generation scheme,
- * including its license and other licensing options, visit
- *
- *     http://www.pcg-random.org
- */
-
-#ifndef PCG_BASIC_H_
-#define PCG_BASIC_H_
-
-#include <open62541/config.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct pcg_state_setseq_64 {
-    uint64_t state;  /* RNG state.  All values are possible. */
-    uint64_t inc;    /* Controls which RNG sequence (stream) is selected. Must
-                      * *always* be odd. */
-} pcg32_random_t;
-
-#define PCG32_INITIALIZER { 0x853c49e6748fea9bULL, 0xda3e39cb94b95bdbULL }
-
-void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initial_state, uint64_t initseq);
-uint32_t pcg32_random_r(pcg32_random_t* rng);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* PCG_BASIC_H_ */
diff --git a/ext/open62541/deps/string_escape.c b/ext/open62541/deps/string_escape.c
deleted file mode 100644
index 51d320c..0000000
--- a/ext/open62541/deps/string_escape.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
- *
- * Jansson is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
- */
-
-/*escaping from https://github.com/akheron/jansson dump.c */
-
-#include "string_escape.h"
-
-
-
-size_t utf8_check_first(char byte)
-{
-    unsigned char u = (unsigned char)byte;
-
-    if(u < 0x80)
-        return 1;
-
-    if(0x80 <= u && u <= 0xBF) {
-        /* second, third or fourth byte of a multi-byte
-           sequence, i.e. a "continuation byte" */
-        return 0;
-    }
-    else if(u == 0xC0 || u == 0xC1) {
-        /* overlong encoding of an ASCII byte */
-        return 0;
-    }
-    else if(0xC2 <= u && u <= 0xDF) {
-        /* 2-byte sequence */
-        return 2;
-    }
-
-    else if(0xE0 <= u && u <= 0xEF) {
-        /* 3-byte sequence */
-        return 3;
-    }
-    else if(0xF0 <= u && u <= 0xF4) {
-        /* 4-byte sequence */
-        return 4;
-    }
-    else { /* u >= 0xF5 */
-        /* Restricted (start of 4-, 5- or 6-byte sequence) or invalid
-           UTF-8 */
-        return 0;
-    }
-}
-
-size_t utf8_check_full(const char *buffer, size_t size, int32_t *codepoint)
-{
-    size_t i;
-    int32_t value = 0;
-    unsigned char u = (unsigned char)buffer[0];
-
-    if(size == 2)
-    {
-        value = u & 0x1F;
-    }
-    else if(size == 3)
-    {
-        value = u & 0xF;
-    }
-    else if(size == 4)
-    {
-        value = u & 0x7;
-    }
-    else
-        return 0;
-
-    for(i = 1; i < size; i++)
-    {
-        u = (unsigned char)buffer[i];
-
-        if(u < 0x80 || u > 0xBF) {
-            /* not a continuation byte */
-            return 0;
-        }
-
-        value = (value << 6) + (u & 0x3F);
-    }
-
-    if(value > 0x10FFFF) {
-        /* not in Unicode range */
-        return 0;
-    }
-
-    else if(0xD800 <= value && value <= 0xDFFF) {
-        /* invalid code point (UTF-16 surrogate halves) */
-        return 0;
-    }
-
-    else if((size == 2 && value < 0x80) ||
-            (size == 3 && value < 0x800) ||
-            (size == 4 && value < 0x10000)) {
-        /* overlong encoding */
-        return 0;
-    }
-
-    if(codepoint)
-        *codepoint = value;
-
-    return 1;
-}
-
-const char *utf8_iterate(const char *buffer, size_t bufsize, int32_t *codepoint)
-{
-    size_t count;
-    int32_t value;
-
-    if(!bufsize)
-        return buffer;
-
-    count = utf8_check_first(buffer[0]);
-    if(count <= 0)
-        return NULL;
-
-    if(count == 1)
-        value = (unsigned char)buffer[0];
-    else
-    {
-        if(count > bufsize || !utf8_check_full(buffer, count, &value))
-            return NULL;
-    }
-
-    if(codepoint)
-        *codepoint = value;
-
-    return buffer + count;
-}
-
-/* String unescape functions */
-int utf8_encode(int32_t codepoint, char *buffer, size_t *size)
-{
-    if(codepoint < 0)
-        return -1;
-    else if(codepoint < 0x80)
-    {
-        buffer[0] = (char)codepoint;
-        *size = 1;
-    }
-    else if(codepoint < 0x800)
-    {
-        buffer[0] = (char)(0xC0 + ((codepoint & 0x7C0) >> 6));
-        buffer[1] = (char)(0x80 + ((codepoint & 0x03F)));
-        *size = 2;
-    }
-    else if(codepoint < 0x10000)
-    {
-        buffer[0] = (char)(0xE0 + ((codepoint & 0xF000) >> 12));
-        buffer[1] = (char)(0x80 + ((codepoint & 0x0FC0) >> 6));
-        buffer[2] = (char)(0x80 + ((codepoint & 0x003F)));
-        *size = 3;
-    }
-    else if(codepoint <= 0x10FFFF)
-    {
-        buffer[0] = (char)(0xF0 + ((codepoint & 0x1C0000) >> 18));
-        buffer[1] = (char)(0x80 + ((codepoint & 0x03F000) >> 12));
-        buffer[2] = (char)(0x80 + ((codepoint & 0x000FC0) >> 6));
-        buffer[3] = (char)(0x80 + ((codepoint & 0x00003F)));
-        *size = 4;
-    }
-    else
-        return -1;
-
-    return 0;
-}
-
-/* assumes that str points to 'u' plus at least 4 valid hex digits */
-int32_t decode_unicode_escape(const char *str) {
-    int i;
-    int32_t value = 0;
-
-    for(i = 1; i <= 4; i++) {
-        char c = str[i];
-        value <<= 4;
-        if(l_isdigit(c))
-            value += c - '0';
-        else if(l_islower(c))
-            value += c - 'a' + 10;
-        else if(l_isupper(c))
-            value += c - 'A' + 10;
-        else
-            return -1;
-    }
-
-    return value;
-}
diff --git a/ext/open62541/deps/string_escape.h b/ext/open62541/deps/string_escape.h
deleted file mode 100644
index 8eba9da..0000000
--- a/ext/open62541/deps/string_escape.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
- *
- * Jansson is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license.
- */
-
-#ifndef STRING_ESCAPE_H
-#define STRING_ESCAPE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <open62541/architecture_definitions.h>
-#include <string.h>
-    
-/* Locale independent versions of isxxx() functions */
-#define l_isupper(c)  ('A' <= (c) && (c) <= 'Z')
-#define l_islower(c)  ('a' <= (c) && (c) <= 'z')
-#define l_isalpha(c)  (l_isupper(c) || l_islower(c))
-#define l_isdigit(c)  ('0' <= (c) && (c) <= '9')
-#define l_isxdigit(c) (l_isdigit(c) || ('A' <= (c) && (c) <= 'F') || ('a' <= (c) && (c) <= 'f'))
-
-int utf8_encode(int32_t codepoint, char *buffer, size_t *size);
-size_t utf8_check_first(char byte);
-size_t utf8_check_full(const char *buffer, size_t size, int32_t *codepoint);
-const char *utf8_iterate(const char *buffer, size_t size, int32_t *codepoint);
-int utf8_check_string(const char *string, size_t length);
-int32_t decode_unicode_escape(const char *str);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* STRING_ESCAPE_H */
-
diff --git a/ext/open62541/deps/ziptree.h b/ext/open62541/deps/ziptree.h
deleted file mode 100644
index 30eb387..0000000
--- a/ext/open62541/deps/ziptree.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2018 (c) Julius Pfrommer
- */
-
-#ifndef	ZIPTREE_H_
-#define	ZIPTREE_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Reusable zip tree implementation. The style is inspired by the BSD
- * sys/queue.h linked list definition.
- *
- * Zip trees were developed in: Tarjan, R. E., Levy, C. C., and Timmel, S. "Zip
- * Trees." arXiv preprint arXiv:1806.06726 (2018).
- *
- * The ZIP_ENTRY definitions are to be contained in the tree entries themselves.
- * Use ZIP_PROTTYPE to define the signature of the zip tree and ZIP_IMPL (in a
- * .c compilation unit) for the method implementations.
- *
- * Zip trees are a probabilistic data structure. Entries are assigned a
- * (nonzero) rank k with probability 1/2^{k+1}. This header file does not assume
- * a specific random number generator. So the rank must be given when an entry
- * is inserted. A fast way (with a single call to a pseudo random generator) to
- * compute the rank is with ZIP_FFS32(random()). The ZIP_FFS32 returns the least
- * significant nonzero bit of a 32bit number. */
-
-#define ZIP_HEAD(name, type)                    \
-struct name {                                   \
-    struct type *zip_root;                      \
-}
-
-#define ZIP_INIT(head) do { (head)->zip_root = NULL; } while (0)
-#define ZIP_ROOT(head) (head)->zip_root
-#define ZIP_EMPTY(head) (ZIP_ROOT(head) == NULL)
-
-#define ZIP_ENTRY(type)                         \
-struct {                                        \
-    struct type *zip_left;                      \
-    struct type *zip_right;                     \
-    unsigned char rank;                         \
-}
-
-#define ZIP_LEFT(elm, field) (elm)->field.zip_left
-#define ZIP_RIGHT(elm, field) (elm)->field.zip_right
-#define ZIP_RANK(elm, field) (elm)->field.rank
-
-/* Shortcuts */
-#define ZIP_INSERT(name, head, elm, rank) name##_ZIP_INSERT(head, elm, rank)
-#define ZIP_REMOVE(name, head, elm) name##_ZIP_REMOVE(head, elm)
-#define ZIP_FIND(name, head, key) name##_ZIP_FIND(head, key)
-#define ZIP_MIN(name, head) name##_ZIP_MIN(head)
-#define ZIP_MAX(name, head) name##_ZIP_MAX(head)
-#define ZIP_ITER(name, head, cb, d) name##_ZIP_ITER(head, cb, d)
-
-/* Zip tree method prototypes */
-#define ZIP_PROTTYPE(name, type, keytype)                               \
-void name##_ZIP_INSERT(struct name *head, struct type *elm, unsigned char rank); \
-void name##_ZIP_REMOVE(struct name *head, struct type *elm);            \
-struct type *name##_ZIP_FIND(struct name *head, const keytype *key);    \
-struct type *name##_ZIP_MIN(struct name *head);                         \
-struct type *name##_ZIP_MAX(struct name *head);                         \
-typedef void (*name##_cb)(struct type *elm, void *data);                \
-void name##_ZIP_ITER(struct name *head, name##_cb cb, void *data);      \
-
-/* The comparison method "cmp" defined for every zip tree has the signature
- *
- *   enum ZIP_CMP cmpDateTime(const keytype *a, const keytype *b);
- *
- * The entries need an absolute ordering. So ZIP_CMP_EQ must only be returned if
- * a and b point to the same memory. (E.g. assured by unique identifiers.) */
-enum ZIP_CMP {
-    ZIP_CMP_LESS = -1,
-    ZIP_CMP_EQ = 0,
-    ZIP_CMP_MORE = 1
-};
-
-/* Find the position of the first bit in an unsigned 32bit integer */
-#ifdef _MSC_VER
-static __inline
-#else
-static inline
-#endif
-unsigned char
-ZIP_FFS32(unsigned int v) {
-    unsigned int t = 1;
-    unsigned char r = 1;
-    if(v == 0) return 0;
-    while((v & t) == 0) {
-        t = t << 1; r++;
-    }
-    return r;
-}
-
-/* Zip tree method implementations */
-#define ZIP_IMPL(name, type, field, keytype, keyfield, cmp)             \
-static struct type *                                                    \
-__##name##_ZIP_INSERT(struct type *root, struct type *elm) {            \
-    if(!root) {                                                         \
-        ZIP_LEFT(elm, field) = NULL;                                    \
-        ZIP_RIGHT(elm, field) = NULL;                                   \
-        return elm;                                                     \
-    }                                                                   \
-    if((cmp)(&(elm)->keyfield, &(root)->keyfield) == ZIP_CMP_LESS) {    \
-        if(__##name##_ZIP_INSERT(ZIP_LEFT(root, field), elm) == elm) {  \
-            if(ZIP_RANK(elm, field) < ZIP_RANK(root, field)) {          \
-                ZIP_LEFT(root, field) = elm;                            \
-            } else {                                                    \
-                ZIP_LEFT(root, field) = ZIP_RIGHT(elm, field);          \
-                ZIP_RIGHT(elm, field) = root;                           \
-                return elm;                                             \
-            }                                                           \
-        }                                                               \
-    } else {                                                            \
-        if(__##name##_ZIP_INSERT(ZIP_RIGHT(root, field), elm) == elm) { \
-            if(ZIP_RANK(elm, field) <= ZIP_RANK(root, field)) {         \
-                ZIP_RIGHT(root, field) = elm;                           \
-            } else {                                                    \
-                ZIP_RIGHT(root, field) = ZIP_LEFT(elm, field);          \
-                ZIP_LEFT(elm, field) = root;                            \
-                return elm;                                             \
-            }                                                           \
-        }                                                               \
-    }                                                                   \
-    return root;                                                        \
-}                                                                       \
-                                                                        \
-void                                                                    \
-name##_ZIP_INSERT(struct name *head, struct type *elm,                  \
-                  unsigned char rank) {                                 \
-    ZIP_RANK(elm, field) = rank;                                        \
-    ZIP_ROOT(head) = __##name##_ZIP_INSERT(ZIP_ROOT(head), elm);        \
-}                                                                       \
-                                                                        \
-static struct type *                                                    \
-__##name##ZIP(struct type *x, struct type *y) {                         \
-    if(!x) return y;                                                    \
-    if(!y) return x;                                                    \
-    if(ZIP_RANK(x, field) < ZIP_RANK(y, field)) {                       \
-        ZIP_LEFT(y, field) = __##name##ZIP(x, ZIP_LEFT(y, field));      \
-        return y;                                                       \
-    }                                                                   \
-    ZIP_RIGHT(x, field) = __##name##ZIP(ZIP_RIGHT(x, field), y);        \
-    return x;                                                           \
-}                                                                       \
-                                                                        \
-static struct type *                                                    \
-__##name##_ZIP_REMOVE(struct type *root, struct type *elm) {            \
-    if(root == elm)                                                     \
-        return __##name##ZIP(ZIP_LEFT(root, field),                     \
-                             ZIP_RIGHT(root, field));                   \
-    enum ZIP_CMP eq = (cmp)(&(elm)->keyfield, &(root)->keyfield);       \
-    if(eq == ZIP_CMP_LESS) {                                            \
-        struct type *left = ZIP_LEFT(root, field);                      \
-        if(elm == left)                                                 \
-            ZIP_LEFT(root, field) =                                     \
-                __##name##ZIP(ZIP_LEFT(left, field),                    \
-                              ZIP_RIGHT(left, field));                  \
-        else                                                            \
-            __##name##_ZIP_REMOVE(left, elm);                           \
-    } else {                                                            \
-        struct type *right = ZIP_RIGHT(root, field);                    \
-        if(elm == right)                                                \
-            ZIP_RIGHT(root, field) =                                    \
-                __##name##ZIP(ZIP_LEFT(right, field),                   \
-                              ZIP_RIGHT(right, field));                 \
-        else                                                            \
-            __##name##_ZIP_REMOVE(right, elm);                          \
-    }                                                                   \
-    return root;                                                        \
-}                                                                       \
-                                                                        \
-void                                                                    \
-name##_ZIP_REMOVE(struct name *head, struct type *elm) {                \
-    ZIP_ROOT(head) = __##name##_ZIP_REMOVE(ZIP_ROOT(head), elm);        \
-}                                                                       \
-                                                                        \
-static struct type *                                                    \
-__##name##_ZIP_FIND(struct type *root, const keytype *key) {            \
-    if(!root)                                                           \
-        return NULL;                                                    \
-    enum ZIP_CMP eq = (cmp)(key, &(root)->keyfield);                    \
-    if(eq == ZIP_CMP_EQ) {                                              \
-        return root;                                                    \
-    }                                                                   \
-    if(eq == ZIP_CMP_LESS) {                                            \
-        return __##name##_ZIP_FIND(ZIP_LEFT(root, field), key);         \
-    }                                                                   \
-    return __##name##_ZIP_FIND(ZIP_RIGHT(root, field), key);            \
-}                                                                       \
-                                                                        \
-struct type *                                                           \
-name##_ZIP_FIND(struct name *head, const keytype *key) {                \
-    return __##name##_ZIP_FIND(ZIP_ROOT(head), key);                    \
-}                                                                       \
-                                                                        \
-struct type *                                                           \
-name##_ZIP_MIN(struct name *head) {                                     \
-    struct type *cur = ZIP_ROOT(head);                                  \
-    if(!cur) return NULL;                                               \
-    while(ZIP_LEFT(cur, field)) {                                       \
-        cur = ZIP_LEFT(cur, field);                                     \
-    }                                                                   \
-    return cur;                                                         \
-}                                                                       \
-                                                                        \
-struct type *                                                           \
-name##_ZIP_MAX(struct name *head) {                                     \
-    struct type *cur = ZIP_ROOT(head);                                  \
-    if(!cur) return NULL;                                               \
-    while(ZIP_RIGHT(cur, field)) {                                      \
-        cur = ZIP_RIGHT(cur, field);                                    \
-    }                                                                   \
-    return cur;                                                         \
-}                                                                       \
-                                                                        \
-static void                                                             \
-__##name##_ZIP_ITER(struct type *elm, name##_cb cb, void *data) {       \
-    if(!elm)                                                            \
-        return;                                                         \
-    __##name##_ZIP_ITER(ZIP_LEFT(elm, field), cb, data);                \
-    __##name##_ZIP_ITER(ZIP_RIGHT(elm, field), cb, data);               \
-    cb(elm, data);                                                      \
-}                                                                       \
-                                                                        \
-void                                                                    \
-name##_ZIP_ITER(struct name *head, name##_cb cb, void *data) {          \
-    __##name##_ZIP_ITER(ZIP_ROOT(head), cb, data);                      \
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ZIPTREE_H_ */
diff --git a/ext/open62541/doc/CMakeLists.txt b/ext/open62541/doc/CMakeLists.txt
deleted file mode 100644
index 4cd3810..0000000
--- a/ext/open62541/doc/CMakeLists.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-find_package(Sphinx)
-find_package(LATEX)
-
-set(DOC_LATEX_DIR ${PROJECT_BINARY_DIR}/doc_latex)
-set(DOC_HTML_DIR ${PROJECT_BINARY_DIR}/doc)
-set(DOC_SRC_DIR ${PROJECT_BINARY_DIR}/doc_src)
-
-make_directory(${DOC_SRC_DIR})
-
-# Copy all files from /doc dir to the /doc_src dir. doc_src is used to compile the documentation.
-# Use custom copy command to make sure files are correctly updated when they are changed.
-file(GLOB DOC_SRC "${PROJECT_SOURCE_DIR}/doc/*")
-list(REMOVE_ITEM DOC_SRC "${PROJECT_SOURCE_DIR}/doc/conf.py")
-list(REMOVE_ITEM DOC_SRC "${PROJECT_SOURCE_DIR}/doc/CMakeLists.txt")
-string(REPLACE "${PROJECT_SOURCE_DIR}/doc" "${DOC_SRC_DIR}" DOC_TARGET "${DOC_SRC}")
-file(COPY ${DOC_SRC} DESTINATION ${DOC_SRC_DIR})
-
-configure_file("${PROJECT_SOURCE_DIR}/doc/conf.py" "${DOC_SRC_DIR}/conf.py")
-
-
-list(APPEND GENERATED_RST "")
-
-macro(generate_rst in out)
-    add_custom_command(OUTPUT ${out}
-                       DEPENDS ${PROJECT_SOURCE_DIR}/tools/c2rst.py ${in}
-                       PRE_BUILD
-                       COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/c2rst.py ${in} ${out})
-    list(APPEND GENERATED_RST "${out}")
-endmacro()
-
-
-# Doc from headers
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/types.h ${DOC_SRC_DIR}/types.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/constants.h ${DOC_SRC_DIR}/constants.rst)
-generate_rst(${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h ${DOC_SRC_DIR}/statuscodes.rst)
-generate_rst(${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated.h ${DOC_SRC_DIR}/types_generated.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/server_config.h ${DOC_SRC_DIR}/server_config.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/server.h ${DOC_SRC_DIR}/server.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/client_config.h ${DOC_SRC_DIR}/client_config.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/client_subscriptions.h ${DOC_SRC_DIR}/client_subscriptions.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/client.h ${DOC_SRC_DIR}/client.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/client_highlevel.h ${DOC_SRC_DIR}/client_highlevel.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/plugin/log.h ${DOC_SRC_DIR}/plugin_log.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/plugin/network.h ${DOC_SRC_DIR}/plugin_network.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/plugin/accesscontrol.h ${DOC_SRC_DIR}/plugin_accesscontrol.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/src/server/ua_services.h ${DOC_SRC_DIR}/services.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/plugin/nodestore.h ${DOC_SRC_DIR}/nodestore.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/plugin/pubsub.h ${DOC_SRC_DIR}/plugin_pubsub_connection.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/include/open62541/server_pubsub.h ${DOC_SRC_DIR}/pubsub.rst)
-
-# Doc from tutorial code
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_datatypes.c ${DOC_SRC_DIR}/tutorial_datatypes.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_firststeps.c ${DOC_SRC_DIR}/tutorial_server_firststeps.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_variable.c ${DOC_SRC_DIR}/tutorial_server_variable.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_variabletype.c ${DOC_SRC_DIR}/tutorial_server_variabletype.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_datasource.c ${DOC_SRC_DIR}/tutorial_server_datasource.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_events.c ${DOC_SRC_DIR}/tutorial_server_events.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_monitoreditems.c ${DOC_SRC_DIR}/tutorial_server_monitoreditems.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_object.c ${DOC_SRC_DIR}/tutorial_server_object.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_server_method.c ${DOC_SRC_DIR}/tutorial_server_method.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/tutorial_client_firststeps.c ${DOC_SRC_DIR}/tutorial_client_firststeps.rst)
-generate_rst(${PROJECT_SOURCE_DIR}/examples/pubsub/tutorial_pubsub_publish.c ${DOC_SRC_DIR}/tutorial_pubsub_publish.rst)
-
-
-# Doc targets
-
-add_custom_target(doc_latex ${SPHINX_EXECUTABLE}
-                  -b latex "${DOC_SRC_DIR}" "${DOC_LATEX_DIR}"
-                  DEPENDS ${GENERATED_RST} ${DOC_TARGET}
-                  COMMENT "Building LaTeX sources for documentation with Sphinx")
-add_dependencies(doc_latex open62541)
-
-add_custom_target(doc_pdf ${PDFLATEX_COMPILER} -interaction=batchmode "open62541.tex"
-                  WORKING_DIRECTORY ${DOC_LATEX_DIR}
-                  # compile it twice so that the contents pages are correct
-                  COMMAND ${PDFLATEX_COMPILER} -interaction=batchmode "open62541.tex"
-                  DEPENDS ${PDFLATEX_COMPILER}
-                  COMMENT "Generating PDF documentation from LaTeX sources")
-add_dependencies(doc_pdf doc_latex)
-
-add_custom_target(doc ${SPHINX_EXECUTABLE}
-                  -b html "${DOC_SRC_DIR}" "${DOC_HTML_DIR}"
-                  DEPENDS ${GENERATED_RST} ${DOC_TARGET}
-                  COMMENT "Building HTML documentation with Sphinx")
-add_dependencies(doc open62541)
-
-set_target_properties(doc doc_latex doc_pdf PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE)
-set_target_properties(doc doc_latex doc_pdf PROPERTIES FOLDER "open62541/doc")
diff --git a/ext/open62541/doc/building.rst b/ext/open62541/doc/building.rst
deleted file mode 100644
index 4c09ff9..0000000
--- a/ext/open62541/doc/building.rst
+++ /dev/null
@@ -1,299 +0,0 @@
-.. _building:
-
-Building open62541
-==================
-
-open62541 uses CMake to build the library and binaries. The library version is automatically
-detected using ``git describe``. This command returns a valid version string based on the current tag.
-If you did not directly clone the sources, but use the tar or zip package from a release, you need
-to manually specify the version. In that case use e.g. ``cmake -DOPEN62541_VERSION=v1.0.3``.
-
-Building the Examples
----------------------
-
-Using the GCC compiler, the following calls build the examples on Linux.
-
-.. code-block:: bash
-
-   cp /path-to/open62541.* . # copy single-file distribution to the local directory
-   cp /path-to/examples/tutorial_server_variable.c . # copy the example server
-   gcc -std=c99 -DUA_ARCHITECTURE_POSIX open62541.c tutorial_server_variable.c -o server
-
-Building the Library
---------------------
-
-Building with CMake on Ubuntu or Debian
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. code-block:: bash
-
-   sudo apt-get install git build-essential gcc pkg-config cmake python
-
-   # enable additional features
-   sudo apt-get install cmake-curses-gui # for the ccmake graphical interface
-   sudo apt-get install libmbedtls-dev # for encryption support
-   sudo apt-get install check libsubunit-dev # for unit tests
-   sudo apt-get install python-sphinx graphviz # for documentation generation
-   sudo apt-get install python-sphinx-rtd-theme # documentation style
-
-   cd open62541
-   mkdir build
-   cd build
-   cmake ..
-   make
-
-   # select additional features
-   ccmake ..
-   make
-
-   # build documentation
-   make doc # html documentation
-   make doc_pdf # pdf documentation (requires LaTeX)
-
-Building with CMake on Windows
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Here we explain the build process for Visual Studio (2013 or newer). To build
-with MinGW, just replace the compiler selection in the call to CMake.
-
-- Download and install
-
-  - Python 2.7.x (Python 3.x works as well): https://python.org/downloads
-  - CMake: http://www.cmake.org/cmake/resources/software.html
-  - Microsoft Visual Studio: https://www.visualstudio.com/products/visual-studio-community-vs
-
-- Download the open62541 sources (using git or as a zipfile from github)
-- Open a command shell (cmd) and run
-
-.. code-block:: bat
-
-   cd <path-to>\open62541
-   mkdir build
-   cd build
-   <path-to>\cmake.exe .. -G "Visual Studio 14 2015"
-   :: You can use use cmake-gui for a graphical user-interface to select features
-
-- Then open :file:`build\open62541.sln` in Visual Studio 2015 and build as usual
-
-Building on OS X
-^^^^^^^^^^^^^^^^
-
-- Download and install
-
-  - Xcode: https://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12
-  - Homebrew: http://brew.sh/
-  - Pip (a package manager for python, may be preinstalled): ``sudo easy_install pip``
-
-- Run the following in a shell
-
-.. code-block:: bash
-
-   brew install cmake
-   pip install sphinx # for documentation generation
-   pip install sphinx_rtd_theme # documentation style
-   brew install graphviz # for graphics in the documentation
-   brew install check # for unit tests
-
-Follow Ubuntu instructions without the ``apt-get`` commands as these are taken care of by the above packages.
-
-Building on OpenBSD
-^^^^^^^^^^^^^^^^^^^
-The procedure below works on OpenBSD 5.8 with gcc version 4.8.4, cmake version 3.2.3 and Python version 2.7.10.
-
-- Install a recent gcc, python and cmake:
-
-.. code-block:: bash
-   
-   pkg_add gcc python cmake
-
-- Tell the system to actually use the recent gcc (it gets installed as egcc on OpenBSD): 
-
-.. code-block:: bash
-   
-   export CC=egcc CXX=eg++
-
-- Now procede as described for Ubuntu/Debian:
-
-.. code-block:: bash
-
-   cd open62541
-   mkdir build
-   cd build
-   cmake ..
-   make
-
-
-.. _build_options:
-
-Build Options
--------------
-
-The open62541 project uses CMake to manage the build options, for code
-generation and to generate build projects for the different systems and IDEs.
-The tools *ccmake* or *cmake-gui* can be used to graphically set the build
-options.
-
-Most options can be changed manually in :file:`ua_config.h` (:file:`open62541.h`
-for the single-file release) after the code generation. But usually there is no
-need to adjust them.
-
-Main Build Options
-^^^^^^^^^^^^^^^^^^
-
-**CMAKE_BUILD_TYPE**
-  - ``RelWithDebInfo`` -O2 optimization with debug symbols
-  - ``Release`` -O2 optimization without debug symbols
-  - ``Debug`` -O0 optimization with debug symbols
-  - ``MinSizeRel`` -Os optimization without debug symbols
-
-**UA_LOGLEVEL**
-   The SDK logs events of the level defined in ``UA_LOGLEVEL`` and above only.
-   The logging event levels are as follows:
-
-     - 600: Fatal
-     - 500: Error
-     - 400: Warning
-     - 300: Info
-     - 200: Debug
-     - 100: Trace
-
-Select build artefacts
-^^^^^^^^^^^^^^^^^^^^^^
-
-By default only the main library shared object libopen62541.so (open62541.dll)
-or static linking archive open62541.a (open62541.lib) is built. Additional
-artifacts can be specified by the following options:
-
-**UA_BUILD_EXAMPLES**
-   Compile example servers and clients from :file:`examples/*.c`.
-
-**UA_BUILD_UNIT_TESTS**
-   Compile unit tests. The tests can be executed with ``make test``
-
-**UA_BUILD_SELFSIGNED_CERTIFICATE**
-   Generate a self-signed certificate for the server (openSSL required)
-
-Detailed SDK Features
-^^^^^^^^^^^^^^^^^^^^^
-
-**UA_ENABLE_SUBSCRIPTIONS**
-   Enable subscriptions
-
-**UA_ENABLE_SUBSCRIPTIONS_EVENTS (EXPERIMENTAL)**
-    Enable the use of events for subscriptions. This is a new feature and currently marked as EXPERIMENTAL.
-
-**UA_ENABLE_METHODCALLS**
-   Enable the Method service set
-
-**UA_ENABLE_NODEMANAGEMENT**
-   Enable dynamic addition and removal of nodes at runtime
-
-**UA_ENABLE_AMALGAMATION**
-   Compile a single-file release into the files :file:`open62541.c` and :file:`open62541.h`. Not receommended for installation.
-
-**UA_MULTITHREADING (EXPERIMENTAL)**
-   Enable multi-threading support. This is a new feature and currently marked as EXPERIMENTAL.
-   The supported levels are as follows:
-
-        - 0: Multithreading support disabled.
-        - 100: Functions marked with the UA_THREADSAFE-macro are protected with a lock-based enhancement using mutexes.
-        Multiple threads are allowed to call these functions of the SDK at the same time without causing race conditions.
-        - 200: Work is distributed to a number of worker threads. Those worker threads are created within the SDK.
-
-**UA_ENABLE_IMMUTABLE_NODES**
-   Nodes in the information model are not edited but copied and replaced. The
-   replacement is done with atomic operations so that the information model is
-   always consistent and can be accessed from an interrupt or parallel thread
-   (depends on the node storage plugin implementation). This feature is a
-   prerequisite for ``UA_MULTITHREADING``.
-
-**UA_ENABLE_COVERAGE**
-   Measure the coverage of unit tests
-**UA_ENABLE_DISCOVERY**
-   Enable Discovery Service (LDS)
-**UA_ENABLE_DISCOVERY_MULTICAST**
-   Enable Discovery Service with multicast support (LDS-ME)
-**UA_ENABLE_DISCOVERY_SEMAPHORE**
-   Enable Discovery Semaphore support
-
-**UA_NAMESPACE_ZERO**
-
-   Namespace zero contains the standard-defined nodes. The full namespace zero
-   may not be required for all applications. The selectable options are as follows:
-
-   - ``MINIMAL``: A barebones namespace zero that is compatible with most
-     clients. But this namespace 0 is so small that it does not pass the CTT
-     (Conformance Testing Tools of the OPC Foundation).
-   - ``REDUCED``: Small namespace zero that passes the CTT.
-   - ``FULL``: Full namespace zero generated from the official XML definitions.
-
-   The advanced build option ``UA_FILE_NS0`` can be used to override the XML
-   file used for namespace zero generation.
-
-Some options are marked as advanced. The advanced options need to be toggled to
-be visible in the cmake GUIs.
-
-**UA_ENABLE_TYPEDESCRIPTION**
-   Add the type and member names to the UA_DataType structure. Enabled by default.
-
-**UA_ENABLE_STATUSCODE_DESCRIPTIONS**
-   Compile the human-readable name of the StatusCodes into the binary. Enabled by default.
-**UA_ENABLE_FULL_NS0**
-   Use the full NS0 instead of a minimal Namespace 0 nodeset
-   ``UA_FILE_NS0`` is used to specify the file for NS0 generation from namespace0 folder. Default value is ``Opc.Ua.NodeSet2.xml``
-
-Debug Build Options
-^^^^^^^^^^^^^^^^^^^
-
-This group contains build options mainly useful for development of the library itself.
-
-**UA_DEBUG**
-   Enable assertions and additional definitions not intended for production builds
-
-**UA_DEBUG_DUMP_PKGS**
-   Dump every package received by the server as hexdump format
-
-Building a shared library
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-open62541 is small enough that most users will want to statically link the
-library into their programs. If a shared library (.dll, .so) is required, this
-can be enabled in CMake with the ``BUILD_SHARED_LIBS`` option. Note that this
-option modifies the :file:`ua_config.h` file that is also included in
-:file:`open62541.h` for the single-file distribution.
-
-
-Minimizing the binary size
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The size of the generated binary can be reduced considerably by adjusting the
-build configuration. With open2541, it is possible to configure minimal servers
-that require less than 100kB of RAM and ROM.
-
-The following options influence the ROM requirements:
-
-First, in CMake, the build type can be set to ``CMAKE_BUILD_TYPE=MinSizeRel``.
-This sets the compiler flags to minimize the binary size. The build type also
-strips out debug information. Second, the binary size can be reduced by removing
-features via the build-flags described above.
-
-Second, setting ``UA_NAMESPACE_ZERO`` to ``MINIMAL`` reduces the size of the
-builtin information model. Setting this option can reduce the binary size by
-half in some cases.
-
-Third, some features might not be needed and can be disabled to reduce the
-binary footprint. Examples for this are Subscriptions or encrypted
-communication.
-
-Last, logging messages take up a lot of space in the binary and might not be
-needed in embedded scenarios. Setting ``UA_LOGLEVEL`` to a value above 600
-(``FATAL``) disables all logging. In addition, the feature-flags
-``UA_ENABLE_TYPEDESCRIPTION`` and ``UA_ENABLE_STATUSCODE_DESCRIPTIONS`` add static
-information to the binary that is only used for human-readable logging and
-debugging.
-
-The RAM requirements of a server are mostly due to the following settings:
-
-- The size of the information model
-- The number of connected clients
-- The configured maximum message size that is preallocated
diff --git a/ext/open62541/doc/conf.py b/ext/open62541/doc/conf.py
deleted file mode 100644
index e2bf275..0000000
--- a/ext/open62541/doc/conf.py
+++ /dev/null
@@ -1,292 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this 
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# -*- coding: utf-8 -*-
-#
-# open62541 documentation build configuration file, created by
-# sphinx-quickstart on Sat May 23 19:39:37 2015.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-import shlex
-import sphinx_rtd_theme
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = ['sphinx.ext.graphviz']
-
-numfig = True
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'toc'
-
-# General information about the project.
-project = u'open62541'
-copyright = u'2016, The open62541 authors'
-author = u'The open62541 authors'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = "${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}"
-# The full version, including alpha/beta/rc tags.
-release = "${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}.${OPEN62541_VER_PATCH}${OPEN62541_VER_LABEL}"
-# The full version, including alpha/beta/rc tags.
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = "en"
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ["client_config.rst", "server_config.rst"]
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-html_theme = 'sphinx_rtd_theme'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-html_logo = "open62541_html.png"
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['.']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Language to be used for generating the HTML full-text search index.
-# Sphinx supports the following languages:
-#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
-#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
-#html_search_language = 'en'
-
-# A dictionary with options for the search language support, empty by default.
-# Now only 'ja' uses this config value
-#html_search_options = {'type': 'default'}
-
-# The name of a javascript file (relative to the configuration directory) that
-# implements a search results scorer. If empty, the default will be used.
-#html_search_scorer = 'scorer.js'
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'doc/open62541doc'
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-'papersize': 'a4paper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-
-# Latex figure (float) alignment
-#'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto, manual, or own class]).
-latex_documents = [
-  (master_doc, 'open62541.tex', u'open62541 Documentation',
-   u'The open62541 authors', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-latex_logo = "open62541.png"
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    (master_doc, 'open62541', u'open62541 Documentation',
-     [author], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-  (master_doc, 'open62541', u'open62541 Documentation',
-   author, 'open62541', 'One line description of project.',
-   'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
diff --git a/ext/open62541/doc/index.rst b/ext/open62541/doc/index.rst
deleted file mode 100644
index 98b1816..0000000
--- a/ext/open62541/doc/index.rst
+++ /dev/null
@@ -1,107 +0,0 @@
-Introduction
-============
-
-open62541 (http://open62541.org) is an open source and free implementation of
-OPC UA (OPC Unified Architecture) written in the common subset of the C99 and
-C++98 languages. The library is usable with all major compilers and provides the
-necessary tools to implement dedicated OPC UA clients and servers, or to
-integrate OPC UA-based communication into existing applications. open62541
-library is platform independent. All platform-specific functionality is
-implemented via exchangeable plugins. Plugin implementations are provided for
-the major operating systems.
-
-open62541 is licensed under the Mozilla Public License v2.0. So the *open62541
-library can be used in projects that are not open source*. Only changes to the
-open62541 library itself need to published under the same license. The plugins,
-as well as the server and client examples are in the public domain (CC0
-license). They can be reused under any license and changes do not have to be
-published.
-
-OPC Unified Architecture
-------------------------
-
-`OPC UA <http://en.wikipedia.org/wiki/OPC_Unified_Architecture>`_ is a protocol
-for industrial communication and has been standardized in the IEC 62541 series.
-At its core, OPC UA defines
-
-- an asynchronous :ref:`protocol<protocol>` (built upon TCP, HTTP or SOAP) that
-  defines the exchange of messages via sessions, (on top of) secure
-  communication channels, (on top of) raw connections,
-- a :ref:`type system<types>` for protocol messages with a binary and XML-based
-  encoding scheme,
-- a meta-model for :ref:`information modeling<information-modelling>`, that
-  combines object-orientation with semantic triple-relations, and
-- a set of 37 standard :ref:`services<services>` to interact with server-side
-  information models. The signature of each service is defined as a request and
-  response message in the protocol type system.
-
-The standard itself can be purchased from IEC or downloaded for free on the
-website of the OPC Foundation at https://opcfoundation.org/ (you need to
-register with a valid email).
-
-The OPC Foundation drives the continuous improvement of the standard and the
-development of companion specifications. Companion specifications translate
-established concepts and reusable components from an application domain into OPC
-UA. They are created jointly with an established industry council or
-standardization body from the application domain. Furthermore, the OPC
-Foundation organizes events for the dissemination of the standard and provides
-the infrastructure and tools for compliance certification.
-
-open62541 Features
-------------------
-
-open62541 implements the OPC UA binary protocol stack as well as a client and
-server SDK. It currently supports the Micro Embedded Device Server Profile plus
-some additional features. Server binaries can be well under 100kb in size,
-depending on the contained information model.
-
-- Communication Stack
-
-  - OPC UA binary protocol
-  - Chunking (splitting of large messages)
-  - Exchangeable network layer (plugin) for using custom networking APIs (e.g. on embedded targets)
-  - Encrypted communication
-  - Asynchronous service requests in the client
-
-- Information model
-
-  - Support for all OPC UA node types (including method nodes)
-  - Support for adding and removing nodes and references also at runtime.
-  - Support for inheritance and instantiation of object- and variable-types (custom constructor/destructor, instantiation of child nodes)
-  - Access control for individual nodes
-
-- Subscriptions
-
-  - Support for subscriptions/monitoreditems for data change notifications
-  - Very low resource consumption for each monitored value (event-based server architecture)
-
-- Code-Generation
-
-  - Support for generating data types from standard XML definitions
-  - Support for generating server-side information models (nodesets) from standard XML definitions
-
-Features on the roadmap for the 0.3 release series but missing in the initial v0.3 release are:
-
-- Encrypted communication in the client
-- Events (notifications emitted by objects, data change notifications are implemented)
-- Event-loop (background tasks) in the client
-
-Getting Help
-------------
-
-For discussion and help besides this documentation, you can reach the open62541 community via
-
-- the `mailing list <https://groups.google.com/d/forum/open62541>`_
-- our `IRC channel <http://webchat.freenode.net/?channels=%23open62541>`_
-- the `bugtracker <https://github.com/open62541/open62541/issues>`_
-
-Contributing
-------------
-
-As an open source project, we invite new contributors to help improve open62541.
-Issue reports, bugfixes and new features are very welcome. The following are
-good starting points for new contributors:
-
-- `Report bugs <https://github.com/open62541/open62541/issues>`_
-- Improve the `documentation <http://open62541.org/doc/current>`_
-- Work on issues marked as `good first issue <https://github.com/open62541/open62541/labels/good%20first%20issue>`_
diff --git a/ext/open62541/doc/installing.rst b/ext/open62541/doc/installing.rst
deleted file mode 100644
index 93c2ab6..0000000
--- a/ext/open62541/doc/installing.rst
+++ /dev/null
@@ -1,106 +0,0 @@
-.. _installing:
-
-Installing open62541
-====================
-
-Manual installation
--------------------
-
-You can install open62541 using the well known `make install` command.
-This allows you to use pre-built libraries and headers for your own project.
-
-To override the default installation directory use ``cmake -DCMAKE_INSTALL_PREFIX=/some/path``.
-Based on the SDK Features you selected, as described in :ref:`build_options`, these features will also
-be included in the installation. Thus we recommend to enable as many non-experimental features as possible
-for the installed binary.
-
-The recommended cmake options for a default installation are:
-
-.. code-block:: bash
-
-   git submodule update --init --recursive
-   mkdir build && cd build
-   cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUA_NAMESPACE_ZERO=FULL ..
-   make
-   sudo make install
-
-This will enable the following features in 0.4:
-
- * Discovery
- * FullNamespace
- * Methods
- * Subscriptions
-
-The following features are not enabled and can be optionally enabled using the build options as described in :ref:`build_options`:
-
- * Amalgamation
- * DiscoveryMulticast
- * Encryption
- * Multithreading
- * Subscriptions
-
-.. important::
-   We strongly recommend to not use ``UA_ENABLE_AMALGAMATION=ON`` for your installation. This will only generate a single ``open62541.h`` header file instead of the single header files.
-   We encourage our users to use the non-amalgamated version to reduce the header size and simplify dependency management.
-
-
-In your own CMake project you can then include the open62541 library using:
-
-.. code-block:: cmake
-
-   # optionally you can also specify a specific version
-   # e.g. find_package(open62541 1.0.0)
-   find_package(open62541 REQUIRED COMPONENTS Events FullNamespace)
-   add_executable(main main.cpp)
-   target_link_libraries(main open62541::open62541)
-
-
-A full list of enabled features during build time is stored in the CMake Variable ``open62541_COMPONENTS_ALL``
-
-
-Prebuilt packages
------------------
-
-Pack branches
-^^^^^^^^^^^^^
-
-Github allows you to download a specific branch as .zip package. Just using this .zip package for open62541 will likely fail:
-
- * CMake uses ``git describe --tags`` to automatically detect the version string. The .zip package does not include any git information
- * Specific options during the build stack require additional git submodules which are not inlined in the .zip
-
-Therefore we provide packaging branches. They have the prefix `pack/` and are automatically updated to match the referenced branch.
-
-Here are some examples:
-
- * `pack/master.zip <https://github.com/open62541/open62541/archive/pack/master.zip>`_
- * `pack/1.0.zip <https://github.com/open62541/open62541/archive/pack/1.0.zip>`_
-
-These pack branches have inlined submodules and the version string is hardcoded. If you need to build from source but do not want to use git,
-use these specific pack versions.
-
-Prebuild binaries
-^^^^^^^^^^^^^^^^^
-
-You can always find prebuild binaries for every release on our `Github Release Page <https://github.com/open62541/open62541/releases>`_.
-
-
-Nightly single file releases for Linux and Windows of the last 50 commits can be found here: https://open62541.org/releases/
-
-
-OS Specific packages
-^^^^^^^^^^^^^^^^^^^^
-
-Debian packages can be found in our official PPA:
-
- * Daily Builds (based on master branch): https://launchpad.net/~open62541-team/+archive/ubuntu/daily
- * Release Builds (starting with Version 0.4): https://launchpad.net/~open62541-team/+archive/ubuntu/ppa
-
-Install them with:
-
-
-.. code-block:: bash
-
-    sudo add-apt-repository ppa:open62541-team/ppa
-    sudo apt-get update
-    sudo apt-get install libopen62541-dev
diff --git a/ext/open62541/doc/internal.rst b/ext/open62541/doc/internal.rst
deleted file mode 100644
index 80ba052..0000000
--- a/ext/open62541/doc/internal.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-Internals
-=========
-
-.. toctree::
-
-   statuscodes
-   plugin_network
-   plugin_accesscontrol
-   plugin_log
-   plugin_pubsub_connection
-   pubsub
diff --git a/ext/open62541/doc/nodeset_compiler.rst b/ext/open62541/doc/nodeset_compiler.rst
deleted file mode 100644
index dd752cc..0000000
--- a/ext/open62541/doc/nodeset_compiler.rst
+++ /dev/null
@@ -1,478 +0,0 @@
-XML Nodeset Compiler
---------------------
-
-When writing an application, it is more comfortable to create information models using some GUI tools. Most tools can export data according the OPC UA Nodeset XML schema. open62541 contains a python based nodeset compiler that can transform these information model definitions into a working server.
-
-Note that the nodeset compiler you can find in the *tools/nodeset_compiler* subfolder is *not* an XML transformation tool but a compiler. That means that it will create an internal representation when parsing the XML files and attempt to understand and verify the correctness of this representation in order to generate C Code.
-
-Getting started
-...............
-
-We take the following information model snippet as the starting point of the following tutorial. A more detailed tutorial on how to create your own information model and NodeSet2.xml can be found in this blog post: https://opcua.rocks/custom-information-models/
-
-.. code-block:: xml
-
-    <UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-               xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
-               xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd"
-               xmlns:s1="http://yourorganisation.org/example_nodeset/"
-               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-        <NamespaceUris>
-            <Uri>http://yourorganisation.org/example_nodeset/</Uri>
-        </NamespaceUris>
-        <Aliases>
-            <Alias Alias="Boolean">i=1</Alias>
-            <Alias Alias="UInt32">i=7</Alias>
-            <Alias Alias="String">i=12</Alias>
-            <Alias Alias="HasModellingRule">i=37</Alias>
-            <Alias Alias="HasTypeDefinition">i=40</Alias>
-            <Alias Alias="HasSubtype">i=45</Alias>
-            <Alias Alias="HasProperty">i=46</Alias>
-            <Alias Alias="HasComponent">i=47</Alias>
-            <Alias Alias="Argument">i=296</Alias>
-        </Aliases>
-        <Extensions>
-            <Extension>
-                <ModelInfo Tool="UaModeler" Hash="Zs8w1AQI71W8P/GOk3k/xQ=="
-                           Version="1.3.4"/>
-            </Extension>
-        </Extensions>
-        <UAReferenceType NodeId="ns=1;i=4001" BrowseName="1:providesInputTo">
-            <DisplayName>providesInputTo</DisplayName>
-            <References>
-                <Reference ReferenceType="HasSubtype" IsForward="false">
-                    i=33
-                </Reference>
-            </References>
-            <InverseName Locale="en-US">inputProcidedBy</InverseName>
-        </UAReferenceType>
-        <UAObjectType IsAbstract="true" NodeId="ns=1;i=1001"
-                      BrowseName="1:FieldDevice">
-            <DisplayName>FieldDevice</DisplayName>
-            <References>
-                <Reference ReferenceType="HasSubtype" IsForward="false">
-                    i=58
-                </Reference>
-                <Reference ReferenceType="HasComponent">ns=1;i=6001</Reference>
-                <Reference ReferenceType="HasComponent">ns=1;i=6002</Reference>
-            </References>
-        </UAObjectType>
-        <UAVariable DataType="String" ParentNodeId="ns=1;i=1001"
-                    NodeId="ns=1;i=6001" BrowseName="1:ManufacturerName"
-                    UserAccessLevel="3" AccessLevel="3">
-            <DisplayName>ManufacturerName</DisplayName>
-            <References>
-                <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasComponent" IsForward="false">
-                    ns=1;i=1001
-                </Reference>
-            </References>
-        </UAVariable>
-        <UAVariable DataType="String" ParentNodeId="ns=1;i=1001"
-                    NodeId="ns=1;i=6002" BrowseName="1:ModelName"
-                    UserAccessLevel="3" AccessLevel="3">
-            <DisplayName>ModelName</DisplayName>
-            <References>
-                <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasComponent" IsForward="false">
-                    ns=1;i=1001
-                </Reference>
-            </References>
-        </UAVariable>
-        <UAObjectType NodeId="ns=1;i=1002" BrowseName="1:Pump">
-            <DisplayName>Pump</DisplayName>
-            <References>
-                <Reference ReferenceType="HasComponent">ns=1;i=6003</Reference>
-                <Reference ReferenceType="HasComponent">ns=1;i=6004</Reference>
-                <Reference ReferenceType="HasSubtype" IsForward="false">
-                    ns=1;i=1001
-                </Reference>
-                <Reference ReferenceType="HasComponent">ns=1;i=7001</Reference>
-                <Reference ReferenceType="HasComponent">ns=1;i=7002</Reference>
-            </References>
-        </UAObjectType>
-        <UAVariable DataType="Boolean" ParentNodeId="ns=1;i=1002"
-                    NodeId="ns=1;i=6003" BrowseName="1:isOn" UserAccessLevel="3"
-                    AccessLevel="3">
-            <DisplayName>isOn</DisplayName>
-            <References>
-                <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasComponent" IsForward="false">
-                    ns=1;i=1002
-                </Reference>
-            </References>
-        </UAVariable>
-        <UAVariable DataType="UInt32" ParentNodeId="ns=1;i=1002"
-                    NodeId="ns=1;i=6004" BrowseName="1:MotorRPM"
-                    UserAccessLevel="3" AccessLevel="3">
-            <DisplayName>MotorRPM</DisplayName>
-            <References>
-                <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasComponent" IsForward="false">
-                    ns=1;i=1002
-                </Reference>
-            </References>
-        </UAVariable>
-        <UAMethod ParentNodeId="ns=1;i=1002" NodeId="ns=1;i=7001"
-                  BrowseName="1:startPump">
-            <DisplayName>startPump</DisplayName>
-            <References>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasProperty">ns=1;i=6005</Reference>
-                <Reference ReferenceType="HasComponent" IsForward="false">
-                    ns=1;i=1002
-                </Reference>
-            </References>
-        </UAMethod>
-        <UAVariable DataType="Argument" ParentNodeId="ns=1;i=7001" ValueRank="1"
-                    NodeId="ns=1;i=6005" ArrayDimensions="1"
-                    BrowseName="OutputArguments">
-            <DisplayName>OutputArguments</DisplayName>
-            <References>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasProperty"
-                           IsForward="false">ns=1;i=7001</Reference>
-                <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-            </References>
-            <Value>
-                <ListOfExtensionObject>
-                    <ExtensionObject>
-                        <TypeId>
-                            <Identifier>i=297</Identifier>
-                        </TypeId>
-                        <Body>
-                            <Argument>
-                                <Name>started</Name>
-                                <DataType>
-                                    <Identifier>i=1</Identifier>
-                                </DataType>
-                                <ValueRank>-1</ValueRank>
-                                <ArrayDimensions></ArrayDimensions>
-                                <Description/>
-                            </Argument>
-                        </Body>
-                    </ExtensionObject>
-                </ListOfExtensionObject>
-            </Value>
-        </UAVariable>
-        <UAMethod ParentNodeId="ns=1;i=1002" NodeId="ns=1;i=7002"
-                  BrowseName="1:stopPump">
-            <DisplayName>stopPump</DisplayName>
-            <References>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasProperty">ns=1;i=6006</Reference>
-                <Reference ReferenceType="HasComponent"
-                           IsForward="false">ns=1;i=1002</Reference>
-            </References>
-        </UAMethod>
-        <UAVariable DataType="Argument" ParentNodeId="ns=1;i=7002" ValueRank="1"
-                    NodeId="ns=1;i=6006" ArrayDimensions="1"
-                    BrowseName="OutputArguments">
-            <DisplayName>OutputArguments</DisplayName>
-            <References>
-                <Reference ReferenceType="HasModellingRule">i=78</Reference>
-                <Reference ReferenceType="HasProperty" IsForward="false">
-                    ns=1;i=7002
-                </Reference>
-                <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-            </References>
-            <Value>
-                <ListOfExtensionObject>
-                    <ExtensionObject>
-                        <TypeId>
-                            <Identifier>i=297</Identifier>
-                        </TypeId>
-                        <Body>
-                            <Argument>
-                                <Name>stopped</Name>
-                                <DataType>
-                                    <Identifier>i=1</Identifier>
-                                </DataType>
-                                <ValueRank>-1</ValueRank>
-                                <ArrayDimensions></ArrayDimensions>
-                                <Description/>
-                            </Argument>
-                        </Body>
-                    </ExtensionObject>
-                </ListOfExtensionObject>
-            </Value>
-        </UAVariable>
-    </UANodeSet>
-
-Take the previous snippet and save it to a file ``myNS.xml``. To compile this nodeset into the corresponding C code, which can then be used by the open62541 stack, the nodeset compiler needs some arguments when you call it. The output of the help command gives you the following info:
-
-.. code-block:: bash
-
-    $ python ./nodeset_compiler.py -h
-    usage: nodeset_compiler.py [-h] [-e <existingNodeSetXML>] [-x <nodeSetXML>]
-                               [--internal-headers]
-                               [-b <blacklistFile>] [-i <ignoreFile>]
-                               [-t <typesArray>]
-                               [-v]
-                               <outputFile>
-
-    positional arguments:
-      <outputFile>          The path/basename for the <output file>.c and <output
-                            file>.h files to be generated. This will also be the
-                            function name used in the header and c-file.
-
-    optional arguments:
-      -h, --help            show this help message and exit
-      -e <existingNodeSetXML>, --existing <existingNodeSetXML>
-                            NodeSet XML files with nodes that are already present
-                            on the server.
-      -x <nodeSetXML>, --xml <nodeSetXML>
-                            NodeSet XML files with nodes that shall be generated.
-      --internal-headers    Include internal headers instead of amalgamated header
-      -b <blacklistFile>, --blacklist <blacklistFile>
-                            Loads a list of NodeIDs stored in blacklistFile (one
-                            NodeID per line). Any of the nodeIds encountered in
-                            this file will be removed from the nodeset prior to
-                            compilation. Any references to these nodes will also
-                            be removed
-      -i <ignoreFile>, --ignore <ignoreFile>
-                            Loads a list of NodeIDs stored in ignoreFile (one
-                            NodeID per line). Any of the nodeIds encountered in
-                            this file will be kept in the nodestore but not
-                            printed in the generated code
-      -t <typesArray>, --types-array <typesArray>
-                            Types array for the given namespace. Can be used
-                            mutliple times to define (in the same order as the
-                            .xml files, first for --existing, then --xml) the type
-                            arrays
-      --max-string-length MAX_STRING_LENGTH
-                            Maximum allowed length of a string literal. If longer,
-                            it will be set to an empty string
-      -v, --verbose         Make the script more verbose. Can be applied up to 4
-                            times
-
-So the resulting call looks like this:
-
-.. code-block:: bash
-
-    $ python ./nodeset_compiler.py --types-array=UA_TYPES --existing ../../deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml --xml myNS.xml myNS
-
-And the output of the command:
-
-.. code-block:: bash
-
-    INFO:__main__:Preprocessing (existing) ../../deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml
-    INFO:__main__:Preprocessing myNS.xml
-    INFO:__main__:Generating Code
-    INFO:__main__:NodeSet generation code successfully printed
-
-The first argument ``--types-array=UA_TYPES`` defines the name of the global array in open62541 which contains the corresponding types used within the nodeset in ``NodeSet2.xml``. If you do not define your own datatypes, you can always use the ``UA_TYPES`` value. More on that later in this tutorial.
-The next argument ``--existing ../../deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml`` points to the XML definition of the standard-defined namespace 0 (NS0). Namespace 0 is assumed to be loaded beforehand and provides definitions for data type, reference types, and so. Since we reference nodes from NS0 in our myNS.xml we need to tell the nodeset compiler that it should also load that nodeset, but not compile it into the output.
-Note that you may need to initialize the git submodule to get the ``deps/ua-nodeset`` folder (``git submodule update --init``) or download the full ``NodeSet2.xml`` manually.
-The argument ``--xml myNS.xml`` points to the user-defined information model, whose nodes will be added to the abstract syntax tree. The script will then create the files ``myNS.c`` and ``myNS.h`` (indicated by the last argument ``myNS``) containing the C code necessary to instantiate those namespaces.
-
-Although it is possible to run the compiler this way, it is highly discouraged. If you care to examine the CMakeLists.txt (examples/nodeset/CMakeLists.txt), you will find out that the file ``server_nodeset.xml`` is compiled using the following function::
-
-    ua_generate_nodeset(
-        NAME "example"
-        FILE "${PROJECT_SOURCE_DIR}/examples/nodeset/server_nodeset.xml"
-        DEPENDS_TYPES "UA_TYPES"
-        DEPENDS_NS    "${UA_FILE_NS0}"
-    )
-
-If you look into the files generated by the nodeset compiler, you will see that it generated a method called ``extern UA_StatusCode myNS(UA_Server *server);``. You need to include the header and source file and then call the ``myNS(server)`` method right after creating the server instance with ``UA_Server_new``. This will automatically add all the nodes to the server and return ``UA_STATUSCODE_GOOD`` if there weren't any errors. Additionally you need to compile the open62541 stack with the full NS0 by setting ``UA_NAMESPACE_ZERO=FULL`` in CMake. Otherwise the stack uses a subset where many nodes are not included and thus adding a custom nodeset may fail.
-
-This is how you can use the nodeset compiler to compile simple NodeSet XMLs to be used by the open62541 stack.
-
-For your convenience and for simpler use we also provide a CMake function which simplifies the use of the ``ua_generate_datatypes`` and ``ua_generate_nodeset`` function even more.
-It is highly recommended to use this function: ``ua_generate_nodeset_and_datatypes``. It uses some best practice settings and you only need to pass a name, the namespace index ``NAMESPACE_IDX`` (as described above) and the nodeset files.
-Passing the .csv and .bsd files is optional and if not given, generating datatypes for that noteset will be skipped. You can also define dependencies between nodesets using the ``DEPENDS`` argument.
-
-Here are some examples for the ``DI`` and ``PLCOpen`` nodesets::
-
-    # Generate types and namespace for DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "di"
-        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/OpcUaDiModel.csv"
-        FILE_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd"
-        NAMESPACE_IDX 2
-        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-    )
-
-    # generate PLCopen namespace which is using DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "plc"
-        # PLCopen does not define custom types. Only generate the nodeset
-        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
-        # PLCopen depends on the di nodeset, which must be generated before
-        DEPENDS "di"
-    )
-
-Creating object instances
-.........................
-
-One of the key benefits of defining object types is being able to create object instances fairly easily. Object instantiation is handled automatically when the typedefinition NodeId points to a valid ObjectType node. All Attributes and Methods contained in the objectType definition will be instantiated along with the object node.
-
-While variables are copied from the objetType definition (allowing the user for example to attach new dataSources to them), methods are always only linked. This paradigm is identical to languages like C++: The method called is always the same piece of code, but the first argument is a pointer to an object. Likewise, in OPC UA, only one methodCallback can be attached to a specific methodNode. If that methodNode is called, the parent objectId will be passed to the method - it is the methods job to derefence which object instance it belongs to in that moment.
-
-Let's look at an example that will create a pump instance given the newly defined objectType from myNS.xml:
-
-.. code-block:: c
-
-    /* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
-     * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-    #include <signal.h>
-    #include <stdio.h>
-    #include "open62541.h"
-
-    /* Files myNS.h and myNS.c are created from myNS.xml */
-    #include "myNS.h"
-
-    UA_Boolean running = true;
-
-    static void stopHandler(int sign) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-        running = false;
-    }
-
-    int main(int argc, char **argv) {
-        signal(SIGINT, stopHandler);
-        signal(SIGTERM, stopHandler);
-
-        UA_ServerConfig *config = UA_ServerConfig_new_default();
-        UA_Server *server = UA_Server_new(config);
-
-        UA_StatusCode retval;
-        /* create nodes from nodeset */
-        if (myNS(server) != UA_STATUSCODE_GOOD) {
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Could not add the example nodeset. "
-                "Check previous output for any error.");
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-        } else {
-
-
-            UA_NodeId createdNodeId;
-            UA_ObjectAttributes object_attr = UA_ObjectAttributes_default;
-
-            object_attr.description = UA_LOCALIZEDTEXT("en-US", "A pump!");
-            object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "Pump1");
-
-            // we assume that the myNS nodeset was added in namespace 2.
-            // You should always use UA_Server_addNamespace to check what the
-            // namespace index is for a given namespace URI. UA_Server_addNamespace
-            // will just return the index if it is already added.
-            UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                    UA_QUALIFIEDNAME(1, "Pump1"),
-                                    UA_NODEID_NUMERIC(2, 1002),
-                                    object_attr, NULL, &createdNodeId);
-
-
-            retval = UA_Server_run(server, &running);
-        }
-        UA_Server_delete(server);
-        UA_ServerConfig_delete(config);
-        return (int) retval;
-    }
-
-Make sure you have updated the headers and libs in your project, then recompile and run the server. Make especially sure you have added ``myNS.h`` to your include folder.
-
-As you can see instantiating an object is not much different from creating an object node. The main difference is that you *must* use an objectType node as typeDefinition.
-
-If you start the server and inspect the nodes with UA Expert, you will find the pump in the objects folder, which look like this :numref:`nodeset-compiler-pump`.
-
-.. _nodeset-compiler-pump:
-
-.. figure:: nodeset_compiler_pump.png
-   :alt: Instantiated Pump Object with inherited children
-
-   Instantiated Pump Object with inherited children
-
-As you can see the pump has inherited it's parents attributes (ManufacturerName and ModelName). Methods, in contrast to objects and variables, are never cloned but instead only linked. The reason is that you will quite propably attach a method callback to a central method, not each object. Objects are instantiated if they are *below* the object you are creating, so any object (like an object called associatedServer of ServerType) that is part of pump will be instantiated as well. Objects *above* you object are never instantiated, so the same ServerType object in Fielddevices would have been ommitted (the reason is that the recursive instantiation function protects itself from infinite recursions, which are hard to track when first ascending, then redescending into a tree).
-
-
-Combination of multiple nodesets
-................................
-
-In previous section you have seen how you can use the nodeset compiler with one single nodeset which depends on the default nodeset (NS0) ``Opc.Ua.NodeSet2.xml``. The nodeset compiler also supports nodesets which depend on more than one nodeset. We will show this use-case with the PLCopen nodeset. The PLCopen nodeset ``Opc.Ua.Plc.NodeSet2.xml`` depends on the DI nodeset ``Opc.Ua.Di.NodeSet2.xml`` which then depends on NS0. This example is also shown in ``examples/nodeset/CMakeLists.txt``.
-
-This DI nodeset makes use of some additional data types in ``deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd``. Since we also need these types within the generated code, we first need to compile the types into C code. The generated code is mainly a definition of the binary representation of the types required for encoding and decoding. The generation can be done using the ``ua_generate_datatypes`` CMake function, which uses the ``tools/generate_datatypes.py`` script::
-
-    ua_generate_datatypes(
-        NAME "ua_types_di"
-        TARGET_SUFFIX "types-di"
-        NAMESPACE_IDX 2
-        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/OpcUaDiModel.csv"
-        FILES_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd"
-    )
-
-The ``NAMESPACE_IDX`` parameter indicates the namespace index of the generated node IDs for the type definitions. Currently we need to rely that the namespace is also added at this position in the final server. There is no automatic inferring yet (pull requests are warmly welcome).
-The CSV and BSD files contain the metadata and definition for the types. ``TARGET_SUFFIX`` is used to create a new target with the name ``open62541-generator-TARGET_SUFFIX``.
-
-Now you can compile the DI nodeset XML using the following command::
-
-    ua_generate_nodeset(
-        NAME "di"
-        FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-        TYPES_ARRAY "UA_TYPES_DI"
-        INTERNAL
-        DEPENDS_TYPES "UA_TYPES"
-        DEPENDS_NS    "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml"
-        DEPENDS_TARGET "open62541-generator-types-di"
-    )
-
-There are now two new arguments: ``INTERNAL`` indicates that internal headers (and non public API) should be included within the generated source code. This is currently required for nodesets which use structures as data values, and will probably be fixed in the future.
-The ``DEPENDS_TYPES`` types array argument is matched with the nodesets in the same order as they appear on the ``DEPENDS_TARGET`` parameter. It tells the nodeset compiler which types array it should use: ``UA_TYPES`` for ``Opc.Ua.NodeSet2.xml`` and ``UA_TYPES_DI`` for ``Opc.Ua.Di.NodeSet2.xml``. This is the type array generated by the ``generate_datatypes.py`` script. The rest is similar to the example in previous section: ``Opc.Ua.NodeSet2.xml`` is assumed to exist already and only needs to be loaded for consistency checks, ``Opc.Ua.Di.NodeSet2.xml`` will be generated in the output file ``ua_namespace_di.c/.h``
-
-Next we can generate the PLCopen nodeset. Since it doesn't require any additional datatype definitions, we can immediately start with the nodeset compiler command::
-
-    ua_generate_nodeset(
-        NAME "plc"
-        FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
-        INTERNAL
-        DEPENDS_TYPES
-            "UA_TYPES" "UA_TYPES_DI"
-        DEPENDS_NS
-            "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml"
-            "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-        DEPENDS_TARGET "open62541-generator-ns-di"
-    )
-
-This call is quite similar to the compilation of the DI nodeset. As you can see, we do not define any specific types array for the PLCopen nodeset. Since the PLCopen nodeset depends on the NS0 and DI nodeset, we need to tell the nodeset compiler that these two nodesets should be seen as already existing. Make sure that the order is the same as in your XML file, e.g., in this case the order indicated in ``Opc.Ua.Plc.NodeSet2.xml -> UANodeSet -> Models -> Model``.
-
-As a result of the previous scripts you will have multiple source files:
-
-* ua_types_di_generated.c
-* ua_types_di_generated.h
-* ua_types_di_generated_encoding_binary.h
-* ua_types_di_generated_handling.h
-* ua_namespace_di.c
-* ua_namespace_di.h
-* ua_namespace_plc.c
-* ua_namespace_plc.h
-
-Finally you need to include all these files in your build process and call the corresponding initialization methods for the nodesets. An example application could look like this:
-
-.. code-block:: c
-
-    UA_ServerConfig *config = UA_ServerConfig_new_default();
-    UA_Server *server = UA_Server_new(config);
-
-    /* create nodes from nodeset */
-    UA_StatusCode retval = ua_namespace_di(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Adding the DI namespace failed. Please check previous error output.");
-        UA_Server_delete(server);
-        UA_ServerConfig_delete(config);
-        return (int)UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    retval |= ua_namespace_plc(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Adding the PLCopen namespace failed. Please check previous error output.");
-        UA_Server_delete(server);
-        UA_ServerConfig_delete(config);
-        return (int)UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    retval = UA_Server_run(server, &running);
diff --git a/ext/open62541/doc/nodeset_compiler_pump.png b/ext/open62541/doc/nodeset_compiler_pump.png
deleted file mode 100644
index 58ccc5c..0000000
--- a/ext/open62541/doc/nodeset_compiler_pump.png
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/doc/open62541.png b/ext/open62541/doc/open62541.png
deleted file mode 100644
index 41b12a6..0000000
--- a/ext/open62541/doc/open62541.png
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/doc/open62541_html.png b/ext/open62541/doc/open62541_html.png
deleted file mode 100644
index 5e3e732..0000000
--- a/ext/open62541/doc/open62541_html.png
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/doc/protocol.rst b/ext/open62541/doc/protocol.rst
deleted file mode 100644
index 135580d..0000000
--- a/ext/open62541/doc/protocol.rst
+++ /dev/null
@@ -1,136 +0,0 @@
-.. _protocol:
-
-Protocol
-========
-
-In this section, we give an overview on the OPC UA binary protocol. We focus on
-binary since that is what has been implemented in open62541. The TCP-based
-binary protocol is by far the most common transport layer for OPC UA. The
-general concepts also translate to HTTP and SOAP-based communication defined in
-the standard. Communication in OPC UA is best understood by starting with the
-following key principles:
-
-Request / Response
-  All communication is based on the Request/Response pattern. Only clients can
-  send a request to a server. And servers can only send responses to a request.
-  Usually, the server is hosted on the (physical) device, such as a sensor or a
-  machine tool.
-
-Asynchronous Responses
-  A server does not have to immediately respond to requests and responses may be
-  sent in a different order. This keeps the server responsive when it takes time
-  until a specific request has been processed (e.g. a method call or when
-  reading from a sensor with delay). Furthermore, Subscriptions (aka
-  push-notifications) are implemented via special requests where the response is
-  delayed until a notification is generated.
-
-Establishing a Connection
--------------------------
-
-A client-server connection in OPC UA consists of three nested levels: The raw
-connection, a SecureChannel and the Session. For full details, see Part 6 of the
-OPC UA standard.
-
-Raw Connection
-  The raw connection is created by opening a TCP connection to the corresponding
-  hostname and port and an initial HEL/ACK handshake. The handshake establishes
-  the basic settings of the connection, such as the maximum message length.
-
-SecureChannel
-  SecureChannels are created on top of the raw TCP connection. A SecureChannel
-  is established with an *OpenSecureChannel* request and response message pair.
-  **Attention!** Even though a SecureChannel is mandatory, encryption might
-  still be disabled. The *SecurityMode* of a SecureChannel can be either
-  ``None``, ``Sign``, or ``SignAndEncrypt``. As of version 0.2 of open62541,
-  message signing and encryption is still under ongoing development.
-
-  With message signing or encryption enabled, the *OpenSecureChannel* messages
-  are encrypted using an asymmetric encryption algorithm (public-key
-  cryptography) [#key-mgmnt]_. As part of the *OpenSecureChannel* messages,
-  client and server establish a common secret over an initially unsecure
-  channel. For subsequent messages, the common secret is used for symmetric
-  encryption, which has the advantage of being much faster.
-
-  Different *SecurityPolicies* -- defined in part 7 of the OPC UA standard --
-  specify the algorithms for asymmetric and symmetric encryption, encryption key
-  lengths, hash functions for message signing, and so on. Example
-  SecurityPolicies are ``None`` for transmission of cleartext and
-  ``Basic256Sha256`` which mandates a variant of RSA with SHA256 certificate
-  hashing for asymmetric encryption and AES256 for symmetric encryption.
-
-  The possible SecurityPolicies of a server are described with a list of
-  *Endpoints*. An endpoint jointly defines the SecurityMode, SecurityPolicy and
-  means for authenticating a session (discussed in the next section) in order to
-  connect to a certain server. The *GetEndpoints* service returns a list of
-  available endpoints. This service can usually be invoked without a session and
-  from an unencrypted SecureChannel. This allows clients to first discover
-  available endpoints and then use an appropriate SecurityPolicy that might be
-  required to open a session.
-
-Session
-  Sessions are created on top of a SecureChannel. This ensures that users may
-  authenticate without sending their credentials, such as username and password,
-  in cleartext. Currently defined authentication mechanisms are anonymous login,
-  username/password, Kerberos and x509 certificates. The latter requires that
-  the request message is accompanied by a signature to prove that the sender is
-  in possession of the private key with which the certificate was created.
-
-  There are two message exchanges required to establish a session:
-  *CreateSession* and *ActicateSession*. The ActivateSession service can be used
-  to switch an existing session to a different SecureChannel. This is important,
-  for example when the connection broke down and the existing session is
-  reused with a new SecureChannel.
-
-.. [#key-mgmnt] This entails that the client and server exchange so-called
-   public keys. The public keys might come with a certificate from a key-signing
-   authority or be verified against an external key repository. But we will not
-   discuss certificate management in detail in this section.
-
-Structure of a protocol message
--------------------------------
-
-For the following introduction to the structure of OPC UA protocol messages,
-consider the example OPC UA binary conversation, recorded and displayed with the
-`Wireshark <https://www.wireshark.org/>`_ tool, shown in :numref:`ua-wireshark`.
-
-.. _ua-wireshark:
-
-.. figure:: ua-wireshark.png
-   :figwidth: 100 %
-   :alt: OPC UA conversation in Wireshark
-
-   OPC UA conversation displayed in Wireshark
-
-The top part of the Wireshark window shows the messages from the conversation in
-order. The green line contains the applied filter. Here, we want to see the OPC
-UA protocol messages only. The first messages (from TCP packets 49 to 56) show
-the client opening an unencrypted SecureChannel and retrieving the server's
-endpoints. Then, starting with packet 63, a new connection and SecureChannel are
-created in conformance with one of the endpoints. On top of this SecureChannel,
-the client can then create and activate a session. The following *ReadRequest*
-message is selected and covered in more detail in the bottom windows.
-
-The bottom left window shows the structure of the selected *ReadRequest*
-message. The purpose of the message is invoking the *Read* :ref:`service
-<services>`. The message is structured into a header and a message body. Note
-that we do not consider encryption or signing of messages here.
-
-Message Header
-  As stated before, OPC UA defines an asynchronous protocol. So responses may be
-  out of order. The message header contains some basic information, such as the
-  length of the message, as well as necessary information to relate messages to
-  a SecureChannel and each request to the corresponding response. "Chunking"
-  refers to the splitting and reassembling of messages that are longer than the
-  maximum network packet size.
-
-Message Body
-  Every OPC UA :ref:`service <services>` has a signature in the form of a
-  request and response data structure. These are defined according to the OPC UA
-  protocol :ref:`type system <types>`. See especially the :ref:`auto-generated
-  type definitions<generated-types>` for the data types corresponding to service
-  requests and responses. The message body begins with the identifier of the
-  following data type. Then, the main payload of the message follows.
-
-The bottom right window shows the binary payload of the selected *ReadRequest*
-message. The message header is highlighted in light-grey. The message body in
-blue highlighting shows the encoded *ReadRequest* data structure.
diff --git a/ext/open62541/doc/toc.rst b/ext/open62541/doc/toc.rst
deleted file mode 100644
index 47b6b60..0000000
--- a/ext/open62541/doc/toc.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-open62541 Documentation
-#######################
-
-.. toctree::
-
-   index
-   building
-   installing
-   tutorials
-   protocol
-   types
-   services
-   nodestore
-   server
-   client
-   constants
-   nodeset_compiler
-   internal
diff --git a/ext/open62541/doc/tutorials.rst b/ext/open62541/doc/tutorials.rst
deleted file mode 100644
index 6c6a51f..0000000
--- a/ext/open62541/doc/tutorials.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-.. _tutorials:
-
-Tutorials
-=========
-
-.. toctree::
-
-   tutorial_datatypes.rst
-   tutorial_server_firststeps.rst
-   tutorial_server_variable.rst
-   tutorial_server_datasource.rst
-   tutorial_server_variabletype.rst
-   tutorial_server_object.rst
-   tutorial_server_method.rst
-   tutorial_server_monitoreditems.rst
-   tutorial_server_events.rst
-   tutorial_client_firststeps.rst
-   tutorial_pubsub_publish.rst
diff --git a/ext/open62541/doc/ua-wireshark-pubsub.png b/ext/open62541/doc/ua-wireshark-pubsub.png
deleted file mode 100644
index 675c80d..0000000
--- a/ext/open62541/doc/ua-wireshark-pubsub.png
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/doc/ua-wireshark.png b/ext/open62541/doc/ua-wireshark.png
deleted file mode 100644
index a2af94f..0000000
--- a/ext/open62541/doc/ua-wireshark.png
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/examples/CMakeLists.txt b/ext/open62541/examples/CMakeLists.txt
deleted file mode 100644
index 9f6a6e4..0000000
--- a/ext/open62541/examples/CMakeLists.txt
+++ /dev/null
@@ -1,193 +0,0 @@
-cmake_minimum_required(VERSION 3.0...3.12)
-project(open62541-examples)
-if(${CMAKE_VERSION} VERSION_LESS 3.12)
-    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
-endif()
-# This examples folder can also be built standalone.
-# First install open62541 using `make install` then
-# copy this folder to any other location and call CMake directly:
-#
-# cp -r open62541/examples $HOME/open62541_examples
-# cd $HOME/open62541_examples
-# mkdir build && cd build
-# cmake -DUA_NAMESPACE_ZERO=FULL ..
-# make -j
-
-if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
-    # Examples are built standalone. Find installed open62541
-
-    if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-        find_package(open62541 REQUIRED COMPONENTS FullNamespace)
-    else()
-        find_package(open62541 REQUIRED)
-    endif()
-
-    if(NOT UA_TOOLS_DIR)
-        set(UA_TOOLS_DIR ${open62541_TOOLS_DIR})
-    endif()
-
-    if(NOT UA_NODESET_DIR)
-        set(UA_NODESET_DIR ${open62541_NODESET_DIR})
-    endif()
-
-    function(assign_source_group)
-        # define empty function. We don't need it in standalone
-    endfunction(assign_source_group)
-
-    include_directories(${PROJECT_BINARY_DIR}/src_generated)
-endif()
-
-# Required for common.h header file used in examples
-include_directories(${CMAKE_CURRENT_LIST_DIR})
-
-if(UA_ENABLE_AMALGAMATION)
-    add_definitions(-DUA_ENABLE_AMALGAMATION)
-endif()
-
-#############################
-# Compiled binaries folders #
-#############################
-
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/examples)
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin/examples)
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin/examples)
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/bin/examples)
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/bin/examples)
-
-macro(add_example EXAMPLE_NAME EXAMPLE_SOURCE)
-  add_executable(${EXAMPLE_NAME} ${STATIC_OBJECTS} ${EXAMPLE_SOURCE} ${ARGN} ${PROJECT_SOURCE_DIR}/common.h)
-  target_link_libraries(${EXAMPLE_NAME} open62541::open62541)
-  assign_source_group(${EXAMPLE_SOURCE})
-  set_target_properties(${EXAMPLE_NAME} PROPERTIES FOLDER "open62541/examples")
-  set_target_properties(${EXAMPLE_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
-  if(UA_COMPILE_AS_CXX)
-      set_source_files_properties(${EXAMPLE_SOURCE} PROPERTIES LANGUAGE CXX)
-  endif()
-endmacro()
-
-#############
-# Tutorials #
-#############
-
-add_example(tutorial_datatypes tutorial_datatypes.c)
-
-add_example(tutorial_server_firststeps tutorial_server_firststeps.c)
-
-add_example(tutorial_server_variable tutorial_server_variable.c)
-
-add_example(tutorial_server_datasource tutorial_server_datasource.c)
-
-if(UA_ENABLE_SUBSCRIPTIONS)
-    add_example(tutorial_server_monitoreditems tutorial_server_monitoreditems.c)
-endif()
-
-add_example(tutorial_server_variabletype tutorial_server_variabletype.c)
-
-add_example(tutorial_server_object tutorial_server_object.c)
-
-if(UA_ENABLE_METHODCALLS)
-    add_example(tutorial_server_method tutorial_server_method.c)
-endif()
-
-add_example(tutorial_client_firststeps tutorial_client_firststeps.c)
-
-add_example(tutorial_client_events tutorial_client_events.c)
-
-if(UA_ENABLE_SUBSCRIPTIONS_EVENTS)
-    add_example(tutorial_server_events tutorial_server_events.c)
-endif()
-
-##################
-# Example Server #
-##################
-
-add_example(server_ctt server_ctt.c)
-
-install(PROGRAMS $<TARGET_FILE:server_ctt>
-        DESTINATION bin
-        RENAME ua_server_ctt.exe)
-
-##################
-# Example Client #
-##################
-
-add_example(client client.c)
-
-add_example(client_connect client_connect.c)
-
-if(UA_ENABLE_HISTORIZING)
-    add_example(client_historical client_historical.c)
-endif()
-
-install(PROGRAMS $<TARGET_FILE:client>
-        DESTINATION bin
-        RENAME ua_client)
-
-add_example(client_async client_async.c)
-
-add_example(client_connect_loop client_connect_loop.c)
-
-add_example(client_connectivitycheck_loop client_connectivitycheck_loop.c)
-
-if(UA_ENABLE_SUBSCRIPTIONS)
-    add_example(client_subscription_loop client_subscription_loop.c)
-endif()
-
-####################
-# Feature Examples #
-####################
-
-add_example(server_mainloop server_mainloop.c)
-
-add_example(server_instantiation server_instantiation.c)
-
-add_example(server_repeated_job server_repeated_job.c)
-
-add_example(server_inheritance server_inheritance.c)
-
-if(UA_ENABLE_HISTORIZING)
-    add_example(tutorial_server_historicaldata tutorial_server_historicaldata.c)
-endif()
-
-if(UA_ENABLE_ENCRYPTION)
-    add_example(server_encryption encryption/server_encryption.c)
-    add_example(client_encryption encryption/client_encryption.c)
-    target_include_directories(server_encryption PRIVATE "${PROJECT_SOURCE_DIR}/examples")
-    target_include_directories(client_encryption PRIVATE "${PROJECT_SOURCE_DIR}/examples")
-endif()
-
-add_example(custom_datatype_client custom_datatype/client_types_custom.c)
-add_example(custom_datatype_server custom_datatype/server_types_custom.c)
-
-if(UA_ENABLE_NODEMANAGEMENT)
-    add_example(access_control_server access_control/server_access_control.c)
-    add_example(access_control_client access_control/client_access_control.c)
-    if(UA_ENABLE_ENCRYPTION)
-    add_example(access_control_client_encrypt access_control_encrypt/client_access_control_encrypt.c)
-    endif()
-endif()
-
-if(UA_ENABLE_DISCOVERY_MULTICAST)
-    add_example(discovery_server_lds discovery/server_lds.c)
-    add_example(discovery_server_register discovery/server_register.c)
-    add_example(discovery_client_find_servers discovery/client_find_servers.c)
-    add_example(discovery_server_multicast discovery/server_multicast.c)
-endif()
-
-add_subdirectory(nodeset)
-
-####################
-#  Example PubSub  #
-####################
-
-if(UA_ENABLE_PUBSUB)
-    add_example(tutorial_pubsub_connection pubsub/tutorial_pubsub_connection.c)
-    add_example(tutorial_pubsub_publish pubsub/tutorial_pubsub_publish.c)
-	add_example(server_pubsub_publisher_iop pubsub/server_pubsub_publisher_iop.c)
-    if(UA_ENABLE_AMALGAMATION)
-        message(WARNING "PubSub subscriber tutorial (preview) can not be used with AMALGAMATION. Skipping tutorial_pubsub_subscribe.")
-    else(NOT UA_ENABLE_AMALGAMATION)
-        add_example(tutorial_pubsub_subscribe pubsub/tutorial_pubsub_subscribe.c)
-        add_example(pubsub_subscribe_standalone pubsub/pubsub_subscribe_standalone.c)
-    endif()
-endif()
diff --git a/ext/open62541/examples/access_control/client_access_control.c b/ext/open62541/examples/access_control/client_access_control.c
deleted file mode 100644
index 2a0c37f..0000000
--- a/ext/open62541/examples/access_control/client_access_control.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Using access_control_server
- */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-
-#include <stdlib.h>
-
-int main(void) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect_username(client, "opc.tcp://localhost:4840", "paula", "paula123");
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-    UA_NodeId newVariableIdRequest = UA_NODEID_NUMERIC(1, 1001);
-    UA_NodeId newVariableId = UA_NODEID_NULL;
-
-    UA_VariableAttributes newVariableAttributes = UA_VariableAttributes_default;
-
-    newVariableAttributes.accessLevel = UA_ACCESSLEVELMASK_READ;
-    newVariableAttributes.description = UA_LOCALIZEDTEXT_ALLOC("en-US", "NewVariable desc");
-    newVariableAttributes.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US", "NewVariable");
-    newVariableAttributes.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
-    UA_UInt32 value = 50;
-    UA_Variant_setScalarCopy(&newVariableAttributes.value, &value, &UA_TYPES[UA_TYPES_UINT32]);
-
-    UA_StatusCode retCode;
-
-    retCode = UA_Client_addVariableNode(client, newVariableIdRequest,
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, "newVariable"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                            newVariableAttributes, &newVariableId);
-
-    printf("addVariable returned: %s\n", UA_StatusCode_name(retCode));
-
-    UA_ExpandedNodeId extNodeId = UA_EXPANDEDNODEID_NUMERIC(0, 0);
-    extNodeId.nodeId = newVariableId;
-
-    retCode = UA_Client_addReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_TRUE,
-                            UA_STRING_NULL, extNodeId, UA_NODECLASS_VARIABLE);
-
-    printf("addReference returned: %s\n", UA_StatusCode_name(retCode));
-
-    retCode = UA_Client_deleteReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_TRUE, extNodeId,
-                            UA_TRUE);
-
-    printf("deleteReference returned: %s\n", UA_StatusCode_name(retCode));
-
-    retCode = UA_Client_deleteNode(client, newVariableId, UA_TRUE);
-    printf("deleteNode returned: %s\n", UA_StatusCode_name(retCode));
-
-    /* Clean up */
-    UA_VariableAttributes_clear(&newVariableAttributes);
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/access_control/server_access_control.c b/ext/open62541/examples/access_control/server_access_control.c
deleted file mode 100644
index 1c4b450..0000000
--- a/ext/open62541/examples/access_control/server_access_control.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/accesscontrol_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static UA_Boolean
-allowAddNode(UA_Server *server, UA_AccessControl *ac,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_AddNodesItem *item) {
-    printf("Called allowAddNode\n");
-    return UA_TRUE;
-}
-
-static UA_Boolean
-allowAddReference(UA_Server *server, UA_AccessControl *ac,
-                  const UA_NodeId *sessionId, void *sessionContext,
-                  const UA_AddReferencesItem *item) {
-    printf("Called allowAddReference\n");
-    return UA_TRUE;
-}
-
-static UA_Boolean
-allowDeleteNode(UA_Server *server, UA_AccessControl *ac,
-                const UA_NodeId *sessionId, void *sessionContext,
-                const UA_DeleteNodesItem *item) {
-    printf("Called allowDeleteNode\n");
-    return UA_FALSE; // Do not allow deletion from client
-}
-
-static UA_Boolean
-allowDeleteReference(UA_Server *server, UA_AccessControl *ac,
-                     const UA_NodeId *sessionId, void *sessionContext,
-                     const UA_DeleteReferencesItem *item) {
-    printf("Called allowDeleteReference\n");
-    return UA_TRUE;
-}
-
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-static UA_UsernamePasswordLogin logins[2] = {
-    {UA_STRING_STATIC("peter"), UA_STRING_STATIC("peter123")},
-    {UA_STRING_STATIC("paula"), UA_STRING_STATIC("paula123")}
-};
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    /* Disable anonymous logins, enable two user/password logins */
-    config->accessControl.deleteMembers(&config->accessControl);
-    UA_StatusCode retval = UA_AccessControl_default(config, false,
-             &config->securityPolicies[config->securityPoliciesSize-1].policyUri, 2, logins);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Set accessControl functions for nodeManagement */
-    config->accessControl.allowAddNode = allowAddNode;
-    config->accessControl.allowAddReference = allowAddReference;
-    config->accessControl.allowDeleteNode = allowDeleteNode;
-    config->accessControl.allowDeleteReference = allowDeleteReference;
-
-    retval = UA_Server_run(server, &running);
-
- cleanup:
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/access_control_encrypt/client_access_control_encrypt.c b/ext/open62541/examples/access_control_encrypt/client_access_control_encrypt.c
deleted file mode 100644
index 45c3307..0000000
--- a/ext/open62541/examples/access_control_encrypt/client_access_control_encrypt.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- *
- */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/securitypolicy.h>
-
-#include <stdlib.h>
-#include "common.h"
-
-#define MIN_ARGS 4
-
-int main(int argc, char* argv[]) {
-    if(argc < MIN_ARGS) {
-        UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                     "Arguments are missing. The required arguments are "
-                     "<opc.tcp://host:port> "
-                     "<client-certificate.der> <client-private-key.der> "
-                     "[<trustlist1.crl>, ...]");
-        return EXIT_FAILURE;
-    }
-
-    const char *endpointUrl = argv[1];
-
-    /* Load certificate and private key */
-    UA_ByteString certificate = loadFile(argv[2]);
-    UA_ByteString privateKey  = loadFile(argv[3]);
-
-    /* Load the trustList. Load revocationList is not supported now */
-    size_t trustListSize = 0;
-    if(argc > MIN_ARGS)
-        trustListSize = (size_t)argc-MIN_ARGS;
-    UA_STACKARRAY(UA_ByteString, trustList, trustListSize);
-    for(size_t trustListCount = 0; trustListCount < trustListSize; trustListCount++)
-        trustList[trustListCount] = loadFile(argv[trustListCount+4]);
-
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *config = UA_Client_getConfig(client);
-    config->securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-    UA_ClientConfig_setDefaultEncryption(config, certificate, privateKey,
-                                         trustList, trustListSize,
-                                         revocationList, revocationListSize);
-
-    UA_ByteString_clear(&certificate);
-    UA_ByteString_clear(&privateKey);
-    for(size_t deleteCount = 0; deleteCount < trustListSize; deleteCount++) {
-        UA_ByteString_clear(&trustList[deleteCount]);
-    }
-
-    UA_StatusCode retval = UA_Client_connect_username(client, endpointUrl, "paula", "paula123");
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-    UA_NodeId newVariableIdRequest = UA_NODEID_NUMERIC(1, 1001);
-    UA_NodeId newVariableId = UA_NODEID_NULL;
-
-    UA_VariableAttributes newVariableAttributes = UA_VariableAttributes_default;
-
-    newVariableAttributes.accessLevel = UA_ACCESSLEVELMASK_READ;
-    newVariableAttributes.description = UA_LOCALIZEDTEXT_ALLOC("en-US", "NewVariable desc");
-    newVariableAttributes.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US", "NewVariable");
-    newVariableAttributes.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
-    UA_UInt32 value = 50;
-    UA_Variant_setScalarCopy(&newVariableAttributes.value, &value, &UA_TYPES[UA_TYPES_UINT32]);
-
-    UA_StatusCode retCode;
-
-    retCode = UA_Client_addVariableNode(client, newVariableIdRequest,
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, "newVariable"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                            newVariableAttributes, &newVariableId);
-
-    printf("addVariable returned: %s\n", UA_StatusCode_name(retCode));
-
-    UA_ExpandedNodeId extNodeId = UA_EXPANDEDNODEID_NUMERIC(0, 0);
-    extNodeId.nodeId = newVariableId;
-
-    retCode = UA_Client_addReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_TRUE,
-                                     UA_STRING_NULL, extNodeId, UA_NODECLASS_VARIABLE);
-
-    printf("addReference returned: %s\n", UA_StatusCode_name(retCode));
-
-    retCode = UA_Client_deleteReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_TRUE, extNodeId,
-                                        UA_TRUE);
-
-    printf("deleteReference returned: %s\n", UA_StatusCode_name(retCode));
-
-    retCode = UA_Client_deleteNode(client, newVariableId, UA_TRUE);
-    printf("deleteNode returned: %s\n", UA_StatusCode_name(retCode));
-
-    /* Clean up */
-    UA_VariableAttributes_clear(&newVariableAttributes);
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/client.c b/ext/open62541/examples/client.c
deleted file mode 100644
index f33cf8b..0000000
--- a/ext/open62541/examples/client.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include <stdlib.h>
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-static void
-handler_TheAnswerChanged(UA_Client *client, UA_UInt32 subId, void *subContext,
-                         UA_UInt32 monId, void *monContext, UA_DataValue *value) {
-    printf("The Answer has changed!\n");
-}
-#endif
-
-static UA_StatusCode
-nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle) {
-    if(isInverse)
-        return UA_STATUSCODE_GOOD;
-    UA_NodeId *parent = (UA_NodeId *)handle;
-    printf("%d, %d --- %d ---> NodeId %d, %d\n",
-           parent->namespaceIndex, parent->identifier.numeric,
-           referenceTypeId.identifier.numeric, childId.namespaceIndex,
-           childId.identifier.numeric);
-    return UA_STATUSCODE_GOOD;
-}
-
-int main(int argc, char *argv[]) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    /* Listing endpoints */
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_StatusCode retval = UA_Client_getEndpoints(client, "opc.tcp://localhost:4840",
-                                                  &endpointArraySize, &endpointArray);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Array_delete(endpointArray, endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-    printf("%i endpoints found\n", (int)endpointArraySize);
-    for(size_t i=0;i<endpointArraySize;i++) {
-        printf("URL of endpoint %i is %.*s\n", (int)i,
-               (int)endpointArray[i].endpointUrl.length,
-               endpointArray[i].endpointUrl.data);
-    }
-    UA_Array_delete(endpointArray,endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-
-    /* Connect to a server */
-    /* anonymous connect would be: retval = UA_Client_connect(client, "opc.tcp://localhost:4840"); */
-    retval = UA_Client_connect_username(client, "opc.tcp://localhost:4840", "user1", "password");
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-    /* Browse some objects */
-    printf("Browsing nodes in objects folder:\n");
-    UA_BrowseRequest bReq;
-    UA_BrowseRequest_init(&bReq);
-    bReq.requestedMaxReferencesPerNode = 0;
-    bReq.nodesToBrowse = UA_BrowseDescription_new();
-    bReq.nodesToBrowseSize = 1;
-    bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); /* browse objects folder */
-    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; /* return everything */
-    UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);
-    printf("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME");
-    for(size_t i = 0; i < bResp.resultsSize; ++i) {
-        for(size_t j = 0; j < bResp.results[i].referencesSize; ++j) {
-            UA_ReferenceDescription *ref = &(bResp.results[i].references[j]);
-            if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC) {
-                printf("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,
-                       ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length,
-                       ref->browseName.name.data, (int)ref->displayName.text.length,
-                       ref->displayName.text.data);
-            } else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING) {
-                printf("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,
-                       (int)ref->nodeId.nodeId.identifier.string.length,
-                       ref->nodeId.nodeId.identifier.string.data,
-                       (int)ref->browseName.name.length, ref->browseName.name.data,
-                       (int)ref->displayName.text.length, ref->displayName.text.data);
-            }
-            /* TODO: distinguish further types */
-        }
-    }
-    UA_BrowseRequest_clear(&bReq);
-    UA_BrowseResponse_clear(&bResp);
-
-    /* Same thing, this time using the node iterator... */
-    UA_NodeId *parent = UA_NodeId_new();
-    *parent = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_Client_forEachChildNodeCall(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                   nodeIter, (void *) parent);
-    UA_NodeId_delete(parent);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-
-    UA_UInt32 subId = response.subscriptionId;
-    if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
-        printf("Create subscription succeeded, id %u\n", subId);
-
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_STRING(1, "the.answer"));
-
-    UA_MonitoredItemCreateResult monResponse =
-    UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                              UA_TIMESTAMPSTORETURN_BOTH,
-                                              monRequest, NULL, handler_TheAnswerChanged, NULL);
-    if(monResponse.statusCode == UA_STATUSCODE_GOOD)
-        printf("Monitoring 'the.answer', id %u\n", monResponse.monitoredItemId);
-
-
-    /* The first publish request should return the initial value of the variable */
-    UA_Client_run_iterate(client, 1000);
-#endif
-
-    /* Read attribute */
-    UA_Int32 value = 0;
-    printf("\nReading the value of node (1, \"the.answer\"):\n");
-    UA_Variant *val = UA_Variant_new();
-    retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "the.answer"), val);
-    if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&
-       val->type == &UA_TYPES[UA_TYPES_INT32]) {
-            value = *(UA_Int32*)val->data;
-            printf("the value is: %i\n", value);
-    }
-    UA_Variant_delete(val);
-
-    /* Write node attribute */
-    value++;
-    printf("\nWriting a value of node (1, \"the.answer\"):\n");
-    UA_WriteRequest wReq;
-    UA_WriteRequest_init(&wReq);
-    wReq.nodesToWrite = UA_WriteValue_new();
-    wReq.nodesToWriteSize = 1;
-    wReq.nodesToWrite[0].nodeId = UA_NODEID_STRING_ALLOC(1, "the.answer");
-    wReq.nodesToWrite[0].attributeId = UA_ATTRIBUTEID_VALUE;
-    wReq.nodesToWrite[0].value.hasValue = true;
-    wReq.nodesToWrite[0].value.value.type = &UA_TYPES[UA_TYPES_INT32];
-    wReq.nodesToWrite[0].value.value.storageType = UA_VARIANT_DATA_NODELETE; /* do not free the integer on deletion */
-    wReq.nodesToWrite[0].value.value.data = &value;
-    UA_WriteResponse wResp = UA_Client_Service_write(client, wReq);
-    if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
-            printf("the new value is: %i\n", value);
-    UA_WriteRequest_clear(&wReq);
-    UA_WriteResponse_clear(&wResp);
-
-    /* Write node attribute (using the highlevel API) */
-    value++;
-    UA_Variant *myVariant = UA_Variant_new();
-    UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
-    UA_Client_writeValueAttribute(client, UA_NODEID_STRING(1, "the.answer"), myVariant);
-    UA_Variant_delete(myVariant);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* Take another look at the.answer */
-    UA_Client_run_iterate(client, 100);
-    /* Delete the subscription */
-    if(UA_Client_Subscriptions_deleteSingle(client, subId) == UA_STATUSCODE_GOOD)
-        printf("Subscription removed\n");
-#endif
-
-#ifdef UA_ENABLE_METHODCALLS
-    /* Call a remote method */
-    UA_Variant input;
-    UA_String argString = UA_STRING("Hello Server");
-    UA_Variant_init(&input);
-    UA_Variant_setScalarCopy(&input, &argString, &UA_TYPES[UA_TYPES_STRING]);
-    size_t outputSize;
-    UA_Variant *output;
-    retval = UA_Client_call(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(1, 62541), 1, &input, &outputSize, &output);
-    if(retval == UA_STATUSCODE_GOOD) {
-        printf("Method call was successful, and %lu returned values available.\n",
-               (unsigned long)outputSize);
-        UA_Array_delete(output, outputSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    } else {
-        printf("Method call was unsuccessful, and %x returned values available.\n", retval);
-    }
-    UA_Variant_clear(&input);
-#endif
-
-#ifdef UA_ENABLE_NODEMANAGEMENT
-    /* Add new nodes*/
-    /* New ReferenceType */
-    UA_NodeId ref_id;
-    UA_ReferenceTypeAttributes ref_attr = UA_ReferenceTypeAttributes_default;
-    ref_attr.displayName = UA_LOCALIZEDTEXT("en-US", "NewReference");
-    ref_attr.description = UA_LOCALIZEDTEXT("en-US", "References something that might or might not exist");
-    ref_attr.inverseName = UA_LOCALIZEDTEXT("en-US", "IsNewlyReferencedBy");
-    retval = UA_Client_addReferenceTypeNode(client,
-                                            UA_NODEID_NUMERIC(1, 12133),
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                            UA_QUALIFIEDNAME(1, "NewReference"),
-                                            ref_attr, &ref_id);
-    if(retval == UA_STATUSCODE_GOOD )
-        printf("Created 'NewReference' with numeric NodeID %u\n", ref_id.identifier.numeric);
-
-    /* New ObjectType */
-    UA_NodeId objt_id;
-    UA_ObjectTypeAttributes objt_attr = UA_ObjectTypeAttributes_default;
-    objt_attr.displayName = UA_LOCALIZEDTEXT("en-US", "TheNewObjectType");
-    objt_attr.description = UA_LOCALIZEDTEXT("en-US", "Put innovative description here");
-    retval = UA_Client_addObjectTypeNode(client,
-                                         UA_NODEID_NUMERIC(1, 12134),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "NewObjectType"),
-                                         objt_attr, &objt_id);
-    if(retval == UA_STATUSCODE_GOOD)
-        printf("Created 'NewObjectType' with numeric NodeID %u\n", objt_id.identifier.numeric);
-
-    /* New Object */
-    UA_NodeId obj_id;
-    UA_ObjectAttributes obj_attr = UA_ObjectAttributes_default;
-    obj_attr.displayName = UA_LOCALIZEDTEXT("en-US", "TheNewGreatNode");
-    obj_attr.description = UA_LOCALIZEDTEXT("de-DE", "Hier koennte Ihre Webung stehen!");
-    retval = UA_Client_addObjectNode(client,
-                                     UA_NODEID_NUMERIC(1, 0),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                     UA_QUALIFIEDNAME(1, "TheGreatNode"),
-                                     UA_NODEID_NUMERIC(1, 12134),
-                                     obj_attr, &obj_id);
-    if(retval == UA_STATUSCODE_GOOD )
-        printf("Created 'NewObject' with numeric NodeID %u\n", obj_id.identifier.numeric);
-
-    /* New Integer Variable */
-    UA_NodeId var_id;
-    UA_VariableAttributes var_attr = UA_VariableAttributes_default;
-    var_attr.displayName = UA_LOCALIZEDTEXT("en-US", "TheNewVariableNode");
-    var_attr.description =
-        UA_LOCALIZEDTEXT("en-US", "This integer is just amazing - it has digits and everything.");
-    UA_Int32 int_value = 1234;
-    /* This does not copy the value */
-    UA_Variant_setScalar(&var_attr.value, &int_value, &UA_TYPES[UA_TYPES_INT32]);
-    var_attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    retval = UA_Client_addVariableNode(client,
-                                       UA_NODEID_NUMERIC(1, 0), // Assign new/random NodeID
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                       UA_QUALIFIEDNAME(0, "VariableNode"),
-                                       UA_NODEID_NULL, // no variable type
-                                       var_attr, &var_id);
-    if(retval == UA_STATUSCODE_GOOD )
-        printf("Created 'NewVariable' with numeric NodeID %u\n", var_id.identifier.numeric);
-#endif
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/client_async.c b/ext/open62541/examples/client_async.c
deleted file mode 100644
index acceff6..0000000
--- a/ext/open62541/examples/client_async.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel_async.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server_config_default.h>
-
-#include <stdlib.h>
-
-#define NODES_EXIST
-/* async connection callback, it only gets called after the completion of the whole
- * connection process*/
-static void
-onConnect(UA_Client *client, void *userdata, UA_UInt32 requestId,
-          void *status) {
-    printf("Async connect returned with status code %s\n",
-           UA_StatusCode_name(*(UA_StatusCode *) status));
-}
-
-static
-void
-fileBrowsed(UA_Client *client, void *userdata, UA_UInt32 requestId,
-            UA_BrowseResponse *response) {
-    printf("%-50s%i\n", "Received BrowseResponse for request ", requestId);
-    UA_String us = *(UA_String *) userdata;
-    printf("---%.*s passed safely \n", (int) us.length, us.data);
-}
-
-/*high-level function callbacks*/
-static
-void
-readValueAttributeCallback(UA_Client *client, void *userdata,
-                           UA_UInt32 requestId, UA_Variant *var) {
-    printf("%-50s%i\n", "Read value attribute for request", requestId);
-
-    if(UA_Variant_hasScalarType(var, &UA_TYPES[UA_TYPES_INT32])) {
-        UA_Int32 int_val = *(UA_Int32*) var->data;
-        printf("---%-40s%-8i\n",
-               "Reading the value of node (1, \"the.answer\"):", int_val);
-    }
-
-    /*more type distinctions possible*/
-    return;
-}
-
-static
-void
-attrWritten(UA_Client *client, void *userdata, UA_UInt32 requestId,
-            UA_WriteResponse *response) {
-    /*assuming no data to be retrieved by writing attributes*/
-    printf("%-50s%i\n", "Wrote value attribute for request ", requestId);
-    UA_WriteResponse_clear(response);
-}
-
-#ifdef NODES_EXIST
-#ifdef UA_ENABLE_METHODCALLS
-static void
-methodCalled(UA_Client *client, void *userdata, UA_UInt32 requestId,
-             UA_CallResponse *response) {
-
-    printf("%-50s%i\n", "Called method for request ", requestId);
-    size_t outputSize;
-    UA_Variant *output;
-    UA_StatusCode retval = response->responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        if(response->resultsSize == 1)
-            retval = response->results[0].statusCode;
-        else
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_CallResponse_clear(response);
-    }
-
-    /* Move the output arguments */
-    output = response->results[0].outputArguments;
-    outputSize = response->results[0].outputArgumentsSize;
-    response->results[0].outputArguments = NULL;
-    response->results[0].outputArgumentsSize = 0;
-
-    if(retval == UA_STATUSCODE_GOOD) {
-        printf("---Method call was successful, returned %lu values.\n",
-               (unsigned long) outputSize);
-        UA_Array_delete(output, outputSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    } else {
-        printf("---Method call was unsuccessful, returned %x values.\n",
-                retval);
-    }
-    UA_CallResponse_clear(response);
-}
-
-static void
-translateCalled(UA_Client *client, void *userdata, UA_UInt32 requestId,
-                UA_TranslateBrowsePathsToNodeIdsResponse *response) {
-    printf("%-50s%i\n", "Translated path for request ", requestId);
-
-    if(response->results[0].targetsSize == 1)
-        return;
-    UA_TranslateBrowsePathsToNodeIdsResponse_clear(response);
-}
-#endif /* UA_ENABLE_METHODCALLS */
-#endif
-
-int
-main(int argc, char *argv[]) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_UInt32 reqId = 0;
-    UA_String userdata = UA_STRING("userdata");
-
-    UA_BrowseRequest bReq;
-    UA_BrowseRequest_init(&bReq);
-    bReq.requestedMaxReferencesPerNode = 0;
-    bReq.nodesToBrowse = UA_BrowseDescription_new();
-    bReq.nodesToBrowseSize = 1;
-    bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; /* return everything */
-
-    UA_Client_connect_async(client, "opc.tcp://localhost:4840", onConnect, NULL);
-
-    /*Windows needs time to response*/
-    UA_sleep_ms(100);
-
-    /* What happens if client tries to send request before connected? */
-    UA_Client_sendAsyncBrowseRequest(client, &bReq, fileBrowsed, &userdata, &reqId);
-
-    UA_DateTime startTime = UA_DateTime_nowMonotonic();
-    do {
-        /*TODO: fix memory-related bugs if condition not checked*/
-        if(UA_Client_getState(client) == UA_CLIENTSTATE_SESSION) {
-            /* If not connected requests are not sent */
-            UA_Client_sendAsyncBrowseRequest(client, &bReq, fileBrowsed, &userdata, &reqId);
-        }
-        /* Requests are processed */
-        UA_BrowseRequest_clear(&bReq);
-        UA_Client_run_iterate(client, 0);
-        UA_sleep_ms(100);
-
-        /* Break loop if server cannot be connected within 2s -- prevents build timeout */
-        if(UA_DateTime_nowMonotonic() - startTime > 2000 * UA_DATETIME_MSEC)
-            break;
-    } while(reqId < 10);
-
-    /* Demo: high-level functions */
-    UA_Int32 value = 0;
-    UA_Variant myVariant;
-    UA_Variant_init(&myVariant);
-
-    UA_Variant input;
-    UA_Variant_init(&input);
-
-    for(UA_UInt16 i = 0; i < 5; i++) {
-        if(UA_Client_getState(client) == UA_CLIENTSTATE_SESSION) {
-            /* writing and reading value 1 to 5 */
-            UA_Variant_setScalarCopy(&myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);
-            value++;
-            UA_Client_writeValueAttribute_async(client,
-                                                UA_NODEID_STRING(1, "the.answer"),
-                                                &myVariant, attrWritten, NULL,
-                                                &reqId);
-            UA_Variant_clear(&myVariant);
-
-            UA_Client_readValueAttribute_async(client,
-                                               UA_NODEID_STRING(1, "the.answer"),
-                                               readValueAttributeCallback, NULL,
-                                               &reqId);
-
-//TODO: check the existance of the nodes inside these functions (otherwise seg faults)
-#ifdef NODES_EXIST
-#ifdef UA_ENABLE_METHODCALLS
-            UA_String stringValue = UA_String_fromChars("World");
-            UA_Variant_setScalar(&input, &stringValue, &UA_TYPES[UA_TYPES_STRING]);
-
-            UA_Client_call_async(client,
-                                 UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                 UA_NODEID_NUMERIC(1, 62541), 1, &input,
-                                 methodCalled, NULL, &reqId);
-            UA_String_clear(&stringValue);
-
-    #define pathSize 3
-            char *paths[pathSize] = { "Server", "ServerStatus", "State" };
-            UA_UInt32 ids[pathSize] = { UA_NS0ID_ORGANIZES,
-            UA_NS0ID_HASCOMPONENT, UA_NS0ID_HASCOMPONENT };
-
-            UA_Cient_translateBrowsePathsToNodeIds_async(client, paths, ids, pathSize,
-                                                         translateCalled, NULL, &reqId);
-#endif /* UA_ENABLE_METHODCALLS */
-#endif
-            /* How often UA_Client_run_iterate is called depends on the number of request sent */
-            UA_Client_run_iterate(client, 0);
-            UA_Client_run_iterate(client, 0);
-        }
-    }
-    UA_Client_run_iterate(client, 0);
-
-    /* Async disconnect kills unprocessed requests */
-    // UA_Client_disconnect_async (client, &reqId); //can only be used when connected = true
-    // UA_Client_run_iterate (client, &timedOut);
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/client_connect.c b/ext/open62541/examples/client_connect.c
deleted file mode 100644
index 40bccba..0000000
--- a/ext/open62541/examples/client_connect.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include "common.h"
-
-static void usage(void) {
-    printf("Usage: client [-username name] [-password password] ");
-#ifdef UA_ENABLE_ENCRYPTION
-    printf("[-cert certfile.der] [-key keyfile.der] "
-           "[-securityMode <0-3>] [-securityPolicy policyUri] ");
-#endif
-    printf("opc.tcp://<host>:<port>\n");
-}
-
-int main(int argc, char *argv[]) {
-    UA_String securityPolicyUri = UA_STRING_NULL;
-    UA_MessageSecurityMode securityMode = UA_MESSAGESECURITYMODE_INVALID; /* allow everything */
-    char *serverurl = NULL;
-    char *username = NULL;
-    char *password = NULL;
-#ifdef UA_ENABLE_ENCRYPTION
-    char *certfile = NULL;
-    char *keyfile = NULL;
-#endif
-
-    /* At least one argument is required for the server uri */
-    if(argc <= 1) {
-        usage();
-        return EXIT_FAILURE;
-    }
-
-    /* Parse the arguments */
-    for(int argpos = 1; argpos < argc; argpos++) {
-        if(strcmp(argv[argpos], "--help") == 0 ||
-           strcmp(argv[argpos], "-h") == 0) {
-            usage();
-            return EXIT_SUCCESS;
-        }
-
-        if(argpos + 1 == argc) {
-            serverurl = argv[argpos];
-            continue;
-        }
-
-        if(strcmp(argv[argpos], "-username") == 0) {
-            argpos++;
-            username = argv[argpos];
-            continue;
-        }
-
-        if(strcmp(argv[argpos], "-password") == 0) {
-            argpos++;
-            password = argv[argpos];
-            continue;
-        }
-
-#ifdef UA_ENABLE_ENCRYPTION
-        if(strcmp(argv[argpos], "-cert") == 0) {
-            argpos++;
-            certfile = argv[argpos];
-            continue;
-        }
-
-        if(strcmp(argv[argpos], "-key") == 0) {
-            argpos++;
-            keyfile = argv[argpos];
-            continue;
-        }
-
-        if(strcmp(argv[argpos], "-securityMode") == 0) {
-            argpos++;
-            if(sscanf(argv[argpos], "%i", (int*)&securityMode) != 1) {
-                usage();
-                return EXIT_FAILURE;
-            }
-            continue;
-        }
-
-        if(strcmp(argv[argpos], "-securityPolicy") == 0) {
-            argpos++;
-            securityPolicyUri = UA_STRING(argv[argpos]);
-            continue;
-        }
-#endif
-
-        usage();
-        return EXIT_FAILURE;
-    }
-
-    /* Create the server and set its config */
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-
-#ifdef UA_ENABLE_ENCRYPTION
-    if(certfile) {
-        UA_ByteString certificate = loadFile(certfile);
-        UA_ByteString privateKey  = loadFile(keyfile);
-        UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,
-                                             NULL, 0, NULL, 0);
-        UA_ByteString_deleteMembers(&certificate);
-        UA_ByteString_deleteMembers(&privateKey);
-    } else {
-        UA_ClientConfig_setDefault(cc);
-    }
-#else
-    UA_ClientConfig_setDefault(cc);
-#endif
-
-    cc->securityMode = securityMode;
-    cc->securityPolicyUri = securityPolicyUri;
-
-    /* Connect to the server */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(username)
-        retval = UA_Client_connect_username(client, serverurl, username, password);
-    else
-        retval = UA_Client_connect(client, serverurl);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Connected!");
-
-    /* Read the server-time */
-    UA_Variant value;
-    UA_Variant_init(&value);
-    UA_Client_readValueAttribute(client,
-              UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME),
-              &value);
-    if(UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
-        UA_DateTimeStruct dts = UA_DateTime_toStruct(*(UA_DateTime *)value.data);
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                    "The server date is: %02u-%02u-%04u %02u:%02u:%02u.%03u",
-                    dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-    }
-    UA_Variant_clear(&value);
-
-    /* Clean up */
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/client_connect_loop.c b/ext/open62541/examples/client_connect_loop.c
deleted file mode 100644
index 75b822d..0000000
--- a/ext/open62541/examples/client_connect_loop.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Client disconnect handling
- * --------------------------
- * This example shows you how to handle a client disconnect, e.g., if the server
- * is shut down while the client is connected. You just need to call connect
- * again and the client will automatically reconnect.
- *
- * This example is very similar to the tutorial_client_firststeps.c. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_CLIENT, "Received Ctrl-C");
-    running = 0;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_ClientConfig_setDefault(cc);
-
-    /* default timeout is 5 seconds. Set it to 1 second here for demo */
-    cc->timeout = 1000;
-
-    /* Read the value attribute of the node. UA_Client_readValueAttribute is a
-     * wrapper for the raw read service available as UA_Client_Service_read. */
-    UA_Variant value; /* Variants can hold scalar values and arrays of any type */
-    UA_Variant_init(&value);
-
-    /* Endless loop reading the server time */
-    while(running) {
-        /* if already connected, this will return GOOD and do nothing */
-        /* if the connection is closed/errored, the connection will be reset and then reconnected */
-        /* Alternatively you can also use UA_Client_getState to get the current state */
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_CLIENT, "Not connected. Retrying to connect in 1 second");
-            /* The connect may timeout after 1 second (see above) or it may fail immediately on network errors */
-            /* E.g. name resolution errors or unreachable network. Thus there should be a small sleep here */
-            UA_sleep_ms(1000);
-            continue;
-        }
-
-        /* NodeId of the variable holding the current time */
-        const UA_NodeId nodeId =
-                UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-
-        retval = UA_Client_readValueAttribute(client, nodeId, &value);
-        if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) {
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_CLIENT,
-                         "Connection was closed. Reconnecting ...");
-            continue;
-        }
-        if(retval == UA_STATUSCODE_GOOD &&
-           UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
-            UA_DateTime raw_date = *(UA_DateTime *) value.data;
-            UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "date is: %02u-%02u-%04u %02u:%02u:%02u.%03u",
-                        dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-        }
-        UA_Variant_clear(&value);
-        UA_sleep_ms(1000);
-    };
-
-    /* Clean up */
-    UA_Variant_clear(&value);
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/client_connectivitycheck_loop.c b/ext/open62541/examples/client_connectivitycheck_loop.c
deleted file mode 100644
index 676b458..0000000
--- a/ext/open62541/examples/client_connectivitycheck_loop.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Received Ctrl-C");
-    running = 0;
-}
-
-static void
-inactivityCallback (UA_Client *client) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Server Inactivity");
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_ClientConfig_setDefault(cc);
-
-    cc->inactivityCallback = inactivityCallback; /* Set stateCallback */
-    cc->connectivityCheckInterval = 2000; /* Perform a connectivity check every 2 seconds */
-
-    /* Endless loop runAsync */
-    while (running) {
-        /* if already connected, this will return GOOD and do nothing */
-        /* if the connection is closed/errored, the connection will be reset and then reconnected */
-        /* Alternatively you can also use UA_Client_getState to get the current state */
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                         "Not connected. Retrying to connect in 1 second");
-            /* The connect may timeout after 1 second (see above) or it may fail immediately on network errors */
-            /* E.g. name resolution errors or unreachable network. Thus there should be a small sleep here */
-            UA_sleep_ms(1000);
-            continue;
-        }
-
-        UA_Client_run_iterate(client, 1000);
-    };
-
-    /* Clean up */
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/client_historical.c b/ext/open62541/examples/client_historical.c
deleted file mode 100644
index 0bf594d..0000000
--- a/ext/open62541/examples/client_historical.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-static void
-printUpdateType(UA_HistoryUpdateType type) {
-    switch (type) {
-    case UA_HISTORYUPDATETYPE_INSERT:
-        printf("Insert\n");
-        return;
-    case UA_HISTORYUPDATETYPE_REPLACE:
-        printf("Replace\n");
-        return;
-    case UA_HISTORYUPDATETYPE_UPDATE:
-        printf("Update\n");
-        return;
-    case UA_HISTORYUPDATETYPE_DELETE:
-        printf("Delete\n");
-        return;
-    default:
-        printf("Unknown\n");
-        return;
-    }
-}
-#endif
-
-static void
-printTimestamp(char *name, UA_DateTime date) {
-    UA_DateTimeStruct dts = UA_DateTime_toStruct(date);
-    if (name)
-        printf("%s: %02u-%02u-%04u %02u:%02u:%02u.%03u, ", name,
-               dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-    else
-        printf("%02u-%02u-%04u %02u:%02u:%02u.%03u, ",
-               dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-}
-
-static void
-printDataValue(UA_DataValue *value) {
-    /* Print status and timestamps */
-    if (value->hasServerTimestamp)
-        printTimestamp("ServerTime", value->serverTimestamp);
-
-    if (value->hasSourceTimestamp)
-        printTimestamp("SourceTime", value->sourceTimestamp);
-
-    if (value->hasStatus)
-        printf("Status 0x%08x, ", value->status);
-
-    if (value->value.type == &UA_TYPES[UA_TYPES_UINT32]) {
-        UA_UInt32 hrValue = *(UA_UInt32 *)value->value.data;
-        printf("Uint32Value %u\n", hrValue);
-    }
-
-    if (value->value.type == &UA_TYPES[UA_TYPES_DOUBLE]) {
-        UA_Double hrValue = *(UA_Double *)value->value.data;
-        printf("DoubleValue %f\n", hrValue);
-    }
-}
-
-static UA_Boolean
-readRaw(const UA_HistoryData *data) {
-    printf("readRaw Value count: %lu\n", (long unsigned)data->dataValuesSize);
-
-    /* Iterate over all values */
-    for (UA_UInt32 i = 0; i < data->dataValuesSize; ++i)
-    {
-        printDataValue(&data->dataValues[i]);
-    }
-
-    /* We want more data! */
-    return true;
-}
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-static UA_Boolean
-readRawModified(const UA_HistoryModifiedData *data) {
-    printf("readRawModified Value count: %lu\n", (long unsigned)data->dataValuesSize);
-
-    /* Iterate over all values */
-    for (size_t i = 0; i < data->dataValuesSize; ++i) {
-        printDataValue(&data->dataValues[i]);
-    }
-    printf("Modificaton Value count: %lu\n", data->modificationInfosSize);
-    for (size_t j = 0; j < data->modificationInfosSize; ++j) {
-        if (data->modificationInfos[j].userName.data)
-            printf("Username: %s, ", data->modificationInfos[j].userName.data);
-
-        printTimestamp("Modtime", data->modificationInfos[j].modificationTime);
-        printUpdateType(data->modificationInfos[j].updateType);
-    }
-
-    /* We want more data! */
-    return true;
-}
-
-static UA_Boolean
-readEvents(const UA_HistoryEvent *data) {
-    printf("readEvent Value count: %lu\n", (long unsigned)data->eventsSize);
-    for (size_t i = 0; i < data->eventsSize; ++i) {
-        printf("Processing event: %lu\n", (long unsigned)i);
-        for (size_t j = 0; j < data->events[i].eventFieldsSize; ++j) {
-             printf("Processing %lu: %s\n", (long unsigned)j, data->events[i].eventFields[j].type->typeName);
-        }
-    }
-    return true;
-}
-#endif
-
-static UA_Boolean
-readHist(UA_Client *client, const UA_NodeId *nodeId,
-         UA_Boolean moreDataAvailable,
-         const UA_ExtensionObject *data, void *unused) {
-    printf("\nRead historical callback:\n");
-    printf("\tHas more data:\t%d\n\n", moreDataAvailable);
-    if (data->content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYDATA]) {
-        return readRaw((UA_HistoryData*)data->content.decoded.data);
-    }
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-    if (data->content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYMODIFIEDDATA]) {
-        return readRawModified((UA_HistoryModifiedData*)data->content.decoded.data);
-    }
-    if (data->content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYEVENT]) {
-        return readEvents((UA_HistoryEvent*)data->content.decoded.data);
-    }
-#endif
-    return true;
-}
-
-int main(int argc, char *argv[]) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    /* Connect to the Unified Automation demo server */
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:53530/OPCUA/SimulationServer");
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-    /* Read historical values (uint32) */
-    printf("\nStart historical read (1, \"myUintValue\"):\n");
-    UA_NodeId node = UA_NODEID_STRING(2, "MyLevel");
-    retval = UA_Client_HistoryRead_raw(client, &node, readHist,
-                                       UA_DateTime_fromUnixTime(0), UA_DateTime_now(), UA_STRING_NULL, false, 10, UA_TIMESTAMPSTORETURN_BOTH, (void *)UA_FALSE);
-
-    if (retval != UA_STATUSCODE_GOOD) {
-        printf("Failed. %s\n", UA_StatusCode_name(retval));
-    }
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-    printf("\nStart historical modified read (1, \"myUintValue\"):\n");
-    retval = UA_Client_HistoryRead_modified(client, &node, readHist,
-                                       UA_DateTime_fromUnixTime(0), UA_DateTime_now(), UA_STRING_NULL, false, 10, UA_TIMESTAMPSTORETURN_BOTH, (void *)UA_FALSE);
-
-    if (retval != UA_STATUSCODE_GOOD) {
-        printf("Failed. %s\n", UA_StatusCode_name(retval));
-    }
-
-    printf("\nStart historical event read (1, \"myUintValue\"):\n");
-    UA_EventFilter filter;
-    UA_EventFilter_init(&filter);
-    UA_NodeId eventNode = UA_NODEID_NUMERIC(0, 2253);
-    retval = UA_Client_HistoryRead_events(client, &eventNode, readHist,
-                                       UA_DateTime_fromUnixTime(0), UA_DateTime_now(), UA_STRING_NULL, filter, 10, UA_TIMESTAMPSTORETURN_BOTH, (void *)UA_FALSE);
-
-    if (retval != UA_STATUSCODE_GOOD) {
-        printf("Failed. %s\n", UA_StatusCode_name(retval));
-    }
-#endif
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/client_subscription_loop.c b/ext/open62541/examples/client_subscription_loop.c
deleted file mode 100644
index b3cfd15..0000000
--- a/ext/open62541/examples/client_subscription_loop.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Client disconnect handling
- * --------------------------
- * This example shows you how to handle a client disconnect, e.g., if the server
- * is shut down while the client is connected. You just need to call connect
- * again and the client will automatically reconnect.
- *
- * This example is very similar to the tutorial_client_firststeps.c. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Received Ctrl-C");
-    running = 0;
-}
-
-static void
-handler_currentTimeChanged(UA_Client *client, UA_UInt32 subId, void *subContext,
-                           UA_UInt32 monId, void *monContext, UA_DataValue *value) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "currentTime has changed!");
-    if(UA_Variant_hasScalarType(&value->value, &UA_TYPES[UA_TYPES_DATETIME])) {
-        UA_DateTime raw_date = *(UA_DateTime *) value->value.data;
-        UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                    "date is: %02u-%02u-%04u %02u:%02u:%02u.%03u",
-                    dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-    }
-}
-
-static void
-deleteSubscriptionCallback(UA_Client *client, UA_UInt32 subscriptionId, void *subscriptionContext) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "Subscription Id %u was deleted", subscriptionId);
-}
-
-static void
-subscriptionInactivityCallback (UA_Client *client, UA_UInt32 subId, void *subContext) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Inactivity for subscription %u", subId);
-}
-
-static void
-stateCallback (UA_Client *client, UA_ClientState clientState) {
-    switch(clientState) {
-        case UA_CLIENTSTATE_DISCONNECTED:
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "The client is disconnected");
-        break;
-        case UA_CLIENTSTATE_WAITING_FOR_ACK:
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Waiting for ack");
-        break;
-        case UA_CLIENTSTATE_CONNECTED:
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "A TCP connection to the server is open");
-        break;
-        case UA_CLIENTSTATE_SECURECHANNEL:
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "A SecureChannel to the server is open");
-        break;
-        case UA_CLIENTSTATE_SESSION:{
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "A session with the server is open");
-            /* A new session was created. We need to create the subscription. */
-            /* Create a subscription */
-            UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-            UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                                    NULL, NULL, deleteSubscriptionCallback);
-
-            if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
-                UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                            "Create subscription succeeded, id %u", response.subscriptionId);
-            else
-                return;
-
-            /* Add a MonitoredItem */
-            UA_MonitoredItemCreateRequest monRequest =
-                UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME));
-
-            UA_MonitoredItemCreateResult monResponse =
-                UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                          UA_TIMESTAMPSTORETURN_BOTH,
-                                                          monRequest, NULL, handler_currentTimeChanged, NULL);
-            if(monResponse.statusCode == UA_STATUSCODE_GOOD)
-                UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                            "Monitoring UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME', id %u",
-                            monResponse.monitoredItemId);
-        }
-        break;
-        case UA_CLIENTSTATE_SESSION_RENEWED:
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "A session with the server is open (renewed)");
-            /* The session was renewed. We don't need to recreate the subscription. */
-        break;
-        case UA_CLIENTSTATE_SESSION_DISCONNECTED:
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Session disconnected");
-        break;
-    }
-    return;
-}
-
-int
-main(void) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_ClientConfig_setDefault(cc);
-
-    /* Set stateCallback */
-    cc->stateCallback = stateCallback;
-    cc->subscriptionInactivityCallback = subscriptionInactivityCallback;
-
-    /* Endless loop runAsync */
-    while(running) {
-        /* if already connected, this will return GOOD and do nothing */
-        /* if the connection is closed/errored, the connection will be reset and then reconnected */
-        /* Alternatively you can also use UA_Client_getState to get the current state */
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                         "Not connected. Retrying to connect in 1 second");
-            /* The connect may timeout after 1 second (see above) or it may fail immediately on network errors */
-            /* E.g. name resolution errors or unreachable network. Thus there should be a small sleep here */
-            UA_sleep_ms(1000);
-            continue;
-        }
-
-        UA_Client_run_iterate(client, 1000);
-    };
-
-    /* Clean up */
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/common.h b/ext/open62541/examples/common.h
deleted file mode 100644
index 820ffce..0000000
--- a/ext/open62541/examples/common.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/types.h>
-#include <open62541/types_generated_handling.h>
-
-/* loadFile parses the certificate file.
- *
- * @param  path               specifies the file name given in argv[]
- * @return Returns the file content after parsing */
-static UA_INLINE UA_ByteString
-loadFile(const char *const path) {
-    UA_ByteString fileContents = UA_STRING_NULL;
-
-    /* Open the file */
-    FILE *fp = fopen(path, "rb");
-    if(!fp) {
-        errno = 0; /* We read errno also from the tcp layer... */
-        return fileContents;
-    }
-
-    /* Get the file length, allocate the data and read */
-    fseek(fp, 0, SEEK_END);
-    fileContents.length = (size_t)ftell(fp);
-    fileContents.data = (UA_Byte *)UA_malloc(fileContents.length * sizeof(UA_Byte));
-    if(fileContents.data) {
-        fseek(fp, 0, SEEK_SET);
-        size_t read = fread(fileContents.data, sizeof(UA_Byte), fileContents.length, fp);
-        if(read != fileContents.length)
-            UA_ByteString_clear(&fileContents);
-    } else {
-        fileContents.length = 0;
-    }
-    fclose(fp);
-
-    return fileContents;
-}
diff --git a/ext/open62541/examples/custom_datatype/client_types_custom.c b/ext/open62541/examples/custom_datatype/client_types_custom.c
deleted file mode 100644
index 2aed9a1..0000000
--- a/ext/open62541/examples/custom_datatype/client_types_custom.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-
-#include <stdlib.h>
-
-#include "custom_datatype.h"
-
-int main(void) {
-    /* Make your custom datatype known to the stack */
-    UA_DataType types[1];
-    types[0] = PointType;
-
-    /* Attention! Here the custom datatypes are allocated on the stack. So they
-     * cannot be accessed from parallel (worker) threads. */
-    UA_DataTypeArray customDataTypes = {NULL, 1, types};
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_ClientConfig_setDefault(cc);
-    cc->customDataTypes = &customDataTypes;
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return (int)retval;
-    }
-    
-    UA_Variant value; /* Variants can hold scalar values and arrays of any type */
-    UA_Variant_init(&value);
-    
-     UA_NodeId nodeId =
-        UA_NODEID_STRING(1, "3D.Point");
-
-    retval = UA_Client_readValueAttribute(client, nodeId, &value);
-            
-    if(retval == UA_STATUSCODE_GOOD) {
-        Point *p = (Point *)value.data;
-        printf("Point = %f, %f, %f \n", p->x, p->y, p->z);
-    }
-
-    /* Clean up */
-    UA_Variant_clear(&value);
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/custom_datatype/custom_datatype.h b/ext/open62541/examples/custom_datatype/custom_datatype.h
deleted file mode 100644
index e28ba16..0000000
--- a/ext/open62541/examples/custom_datatype/custom_datatype.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-typedef struct {
-    UA_Float x;
-    UA_Float y;
-    UA_Float z;
-} Point;
-
-/* The datatype description for the Point datatype */
-#define Point_padding_y offsetof(Point,y) - offsetof(Point,x) - sizeof(UA_Float)
-#define Point_padding_z offsetof(Point,z) - offsetof(Point,y) - sizeof(UA_Float)
-
-static UA_DataTypeMember Point_members[3] = {
-        /* x */
-        {
-                UA_TYPENAME("x") /* .memberName */
-                UA_TYPES_FLOAT,  /* .memberTypeIndex, points into UA_TYPES since namespaceZero is true */
-                0,               /* .padding */
-                true,            /* .namespaceZero, see .memberTypeIndex */
-                false            /* .isArray */
-        },
-
-        /* y */
-        {
-                UA_TYPENAME("y")
-                UA_TYPES_FLOAT, Point_padding_y, true, false
-        },
-
-        /* z */
-        {
-                UA_TYPENAME("z")
-                UA_TYPES_FLOAT, Point_padding_z, true, false
-        }
-};
-
-static const UA_DataType PointType = {
-        UA_TYPENAME("Point")             /* .typeName */
-        {1, UA_NODEIDTYPE_NUMERIC, {4242}}, /* .typeId */
-        sizeof(Point),                   /* .memSize */
-        0,                               /* .typeIndex, in the array of custom types */
-        UA_DATATYPEKIND_STRUCTURE,       /* .typeKind */
-        true,                            /* .pointerFree */
-        false,                           /* .overlayable (depends on endianness and
-                                         the absence of padding) */
-        3,                               /* .membersSize */
-        0,                               /* .binaryEncodingId, the numeric
-                                         identifier used on the wire (the
-                                         namespaceindex is from .typeId) */
-        Point_members
-};
diff --git a/ext/open62541/examples/custom_datatype/server_types_custom.c b/ext/open62541/examples/custom_datatype/server_types_custom.c
deleted file mode 100644
index 2be51aa..0000000
--- a/ext/open62541/examples/custom_datatype/server_types_custom.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-#include "custom_datatype.h"
-
-UA_Boolean running = true;
-
-static void stopHandler(int sig) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "received ctrl-c");
-    running = false;
-}
-
-static void
-add3PointDataType(UA_Server *server) {
-    UA_VariableTypeAttributes dattr = UA_VariableTypeAttributes_default;
-    dattr.description = UA_LOCALIZEDTEXT("en-US", "3D Point");
-    dattr.displayName = UA_LOCALIZEDTEXT("en-US", "3D Point");
-    dattr.dataType = PointType.typeId;
-    dattr.valueRank = UA_VALUERANK_SCALAR;
-
-    Point p;
-    p.x = 0.0;
-    p.y = 0.0;
-    p.z = 0.0;
-    UA_Variant_setScalar(&dattr.value, &p, &PointType);
-
-    UA_Server_addVariableTypeNode(server, PointType.typeId,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                  UA_QUALIFIEDNAME(1, "3D.Point"),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                  dattr, NULL, NULL);
-
-}
-
-static void
-add3DPointVariable(UA_Server *server) {
-    Point p;
-    p.x = 3.0;
-    p.y = 4.0;
-    p.z = 5.0;
-    UA_VariableAttributes vattr = UA_VariableAttributes_default;
-    vattr.description = UA_LOCALIZEDTEXT("en-US", "3D Point");
-    vattr.displayName = UA_LOCALIZEDTEXT("en-US", "3D Point");
-    vattr.dataType = PointType.typeId;
-    vattr.valueRank = UA_VALUERANK_SCALAR;
-    UA_Variant_setScalar(&vattr.value, &p, &PointType);
-
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "3D.Point"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              UA_QUALIFIEDNAME(1, "3D.Point"),
-                              PointType.typeId, vattr, NULL, NULL);
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    /* Make your custom datatype known to the stack */
-    UA_DataType *types = (UA_DataType*)UA_malloc(sizeof(UA_DataType));
-    UA_DataTypeMember *members = (UA_DataTypeMember*)UA_malloc(sizeof(UA_DataTypeMember) * 3);
-    members[0] = Point_members[0];
-    members[1] = Point_members[1];
-    members[2] = Point_members[2];
-    types[0] = PointType;
-    types[0].members = members;
-
-    /* Attention! Here the custom datatypes are allocated on the stack. So they
-     * cannot be accessed from parallel (worker) threads. */
-    UA_DataTypeArray customDataTypes = {config->customDataTypes, 1, types};
-    config->customDataTypes = &customDataTypes;
-
-    add3PointDataType(server);
-    add3DPointVariable(server);
-
-    UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    UA_free(members);
-    UA_free(types);
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/discovery/client_find_servers.c b/ext/open62541/examples/discovery/client_find_servers.c
deleted file mode 100644
index 40a50a8..0000000
--- a/ext/open62541/examples/discovery/client_find_servers.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-/**
- * This client requests all the available servers from the discovery server (see server_lds.c)
- * and then calls GetEndpoints on the returned list of servers.
- */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include <stdlib.h>
-
-#define DISCOVERY_SERVER_ENDPOINT "opc.tcp://localhost:4840"
-
-int main(void) {
-
-    /*
-     * Example for calling FindServersOnNetwork
-     */
-
-    {
-        UA_ServerOnNetwork *serverOnNetwork = NULL;
-        size_t serverOnNetworkSize = 0;
-
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        UA_StatusCode retval = UA_Client_findServersOnNetwork(client, DISCOVERY_SERVER_ENDPOINT, 0, 0,
-                                                              0, NULL, &serverOnNetworkSize, &serverOnNetwork);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                         "Could not call FindServersOnNetwork service. "
-                         "Is the discovery server started? StatusCode %s",
-                         UA_StatusCode_name(retval));
-            UA_Client_delete(client);
-            return EXIT_FAILURE;
-        }
-
-        // output all the returned/registered servers
-        for(size_t i = 0; i < serverOnNetworkSize; i++) {
-            UA_ServerOnNetwork *server = &serverOnNetwork[i];
-            printf("Server[%lu]: %.*s", (unsigned long) i,
-                   (int) server->serverName.length, server->serverName.data);
-            printf("\n\tRecordID: %d", server->recordId);
-            printf("\n\tDiscovery URL: %.*s", (int) server->discoveryUrl.length,
-                   server->discoveryUrl.data);
-            printf("\n\tCapabilities: ");
-            for(size_t j = 0; j < server->serverCapabilitiesSize; j++) {
-                printf("%.*s,", (int) server->serverCapabilities[j].length,
-                       server->serverCapabilities[j].data);
-            }
-            printf("\n\n");
-        }
-
-        UA_Array_delete(serverOnNetwork, serverOnNetworkSize,
-                        &UA_TYPES[UA_TYPES_SERVERONNETWORK]);
-    }
-
-    /* Example for calling FindServers */
-    UA_ApplicationDescription *applicationDescriptionArray = NULL;
-    size_t applicationDescriptionArraySize = 0;
-
-    UA_StatusCode retval;
-    {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        retval = UA_Client_findServers(client, DISCOVERY_SERVER_ENDPOINT, 0, NULL, 0, NULL,
-                                       &applicationDescriptionArraySize, &applicationDescriptionArray);
-        UA_Client_delete(client);
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Could not call FindServers service. "
-                "Is the discovery server started? StatusCode %s", UA_StatusCode_name(retval));
-        return EXIT_FAILURE;
-    }
-
-    // output all the returned/registered servers
-    for(size_t i = 0; i < applicationDescriptionArraySize; i++) {
-        UA_ApplicationDescription *description = &applicationDescriptionArray[i];
-        printf("Server[%lu]: %.*s", (unsigned long) i, (int) description->applicationUri.length,
-               description->applicationUri.data);
-        printf("\n\tName: %.*s", (int) description->applicationName.text.length,
-               description->applicationName.text.data);
-        printf("\n\tApplication URI: %.*s", (int) description->applicationUri.length,
-               description->applicationUri.data);
-        printf("\n\tProduct URI: %.*s", (int) description->productUri.length,
-               description->productUri.data);
-        printf("\n\tType: ");
-        switch(description->applicationType) {
-            case UA_APPLICATIONTYPE_SERVER:
-                printf("Server");
-                break;
-            case UA_APPLICATIONTYPE_CLIENT:
-                printf("Client");
-                break;
-            case UA_APPLICATIONTYPE_CLIENTANDSERVER:
-                printf("Client and Server");
-                break;
-            case UA_APPLICATIONTYPE_DISCOVERYSERVER:
-                printf("Discovery Server");
-                break;
-            default:
-                printf("Unknown");
-        }
-        printf("\n\tDiscovery URLs:");
-        for(size_t j = 0; j < description->discoveryUrlsSize; j++) {
-            printf("\n\t\t[%lu]: %.*s", (unsigned long) j,
-                   (int) description->discoveryUrls[j].length,
-                   description->discoveryUrls[j].data);
-        }
-        printf("\n\n");
-    }
-
-
-    /*
-     * Now that we have the list of available servers, call get endpoints on all of them
-     */
-
-    printf("-------- Server Endpoints --------\n");
-
-    for(size_t i = 0; i < applicationDescriptionArraySize; i++) {
-        UA_ApplicationDescription *description = &applicationDescriptionArray[i];
-        if(description->discoveryUrlsSize == 0) {
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_CLIENT,
-                        "[GetEndpoints] Server %.*s did not provide any discovery urls. Skipping.",
-                        (int)description->applicationUri.length, description->applicationUri.data);
-            continue;
-        }
-
-        printf("\nEndpoints for Server[%lu]: %.*s\n", (unsigned long) i,
-               (int) description->applicationUri.length, description->applicationUri.data);
-
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-        char *discoveryUrl = (char *) UA_malloc(sizeof(char) * description->discoveryUrls[0].length + 1);
-        memcpy(discoveryUrl, description->discoveryUrls[0].data, description->discoveryUrls[0].length);
-        discoveryUrl[description->discoveryUrls[0].length] = '\0';
-
-        UA_EndpointDescription *endpointArray = NULL;
-        size_t endpointArraySize = 0;
-        //TODO: adapt to the new async getEndpoint
-        retval = UA_Client_getEndpoints(client, discoveryUrl, &endpointArraySize, &endpointArray);
-        UA_free(discoveryUrl);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_Client_disconnect(client);
-            UA_Client_delete(client);
-            break;
-        }
-
-        for(size_t j = 0; j < endpointArraySize; j++) {
-            UA_EndpointDescription *endpoint = &endpointArray[j];
-            printf("\n\tEndpoint[%lu]:", (unsigned long) j);
-            printf("\n\t\tEndpoint URL: %.*s", (int) endpoint->endpointUrl.length, endpoint->endpointUrl.data);
-            printf("\n\t\tTransport profile URI: %.*s", (int) endpoint->transportProfileUri.length,
-                   endpoint->transportProfileUri.data);
-            printf("\n\t\tSecurity Mode: ");
-            switch(endpoint->securityMode) {
-            case UA_MESSAGESECURITYMODE_INVALID:
-                printf("Invalid");
-                break;
-            case UA_MESSAGESECURITYMODE_NONE:
-                printf("None");
-                break;
-            case UA_MESSAGESECURITYMODE_SIGN:
-                printf("Sign");
-                break;
-            case UA_MESSAGESECURITYMODE_SIGNANDENCRYPT:
-                printf("Sign and Encrypt");
-                break;
-            default:
-                printf("No valid security mode");
-                break;
-            }
-            printf("\n\t\tSecurity profile URI: %.*s", (int) endpoint->securityPolicyUri.length,
-                   endpoint->securityPolicyUri.data);
-            printf("\n\t\tSecurity Level: %d", endpoint->securityLevel);
-        }
-
-        UA_Array_delete(endpointArray, endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-        UA_Client_delete(client);
-    }
-
-    printf("\n");
-
-    UA_Array_delete(applicationDescriptionArray, applicationDescriptionArraySize,
-                    &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]);
-
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/discovery/server_lds.c b/ext/open62541/examples/discovery/server_lds.c
deleted file mode 100644
index ca995e8..0000000
--- a/ext/open62541/examples/discovery/server_lds.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-/*
- * Server representing a local discovery server as a central instance.
- * Any other server can register with this server (see server_register.c). Clients can then call the
- * find servers service to get all registered servers (see client_find_servers.c).
- */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-static void stopHandler(int sig) {
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    // This is an LDS server only. Set the application type to DISCOVERYSERVER.
-    // NOTE: This will cause UaExpert to not show this instance in the server list.
-    // See also: https://forum.unified-automation.com/topic1987.html
-    config->applicationDescription.applicationType = UA_APPLICATIONTYPE_DISCOVERYSERVER;
-    UA_String_clear(&config->applicationDescription.applicationUri);
-    config->applicationDescription.applicationUri =
-            UA_String_fromChars("urn:open62541.example.local_discovery_server");
-
-    // Enable the mDNS announce and response functionality
-    config->discovery.mdnsEnable = true;
-
-    config->discovery.mdns.mdnsServerName = UA_String_fromChars("LDS");
-
-    // See http://www.opcfoundation.org/UA/schemas/1.03/ServerCapabilities.csv
-    // For a LDS server, you should only indicate the LDS capability.
-    // If this instance is an LDS and at the same time a normal OPC UA server, you also have to indicate
-    // the additional capabilities.
-    // NOTE: UaExpert does not show LDS-only servers in the list.
-    // See also: https://forum.unified-automation.com/topic1987.html
-
-    // E.g. here we only set LDS, and you will not see it in UaExpert
-    config->discovery.mdns.serverCapabilitiesSize = 1;
-    UA_String *caps = (UA_String *) UA_Array_new(1, &UA_TYPES[UA_TYPES_STRING]);
-    caps[0] = UA_String_fromChars("LDS");
-    config->discovery.mdns.serverCapabilities = caps;
-
-    /* timeout in seconds when to automatically remove a registered server from
-     * the list, if it doesn't re-register within the given time frame. A value
-     * of 0 disables automatic removal. Default is 60 Minutes (60*60). Must be
-     * bigger than 10 seconds, because cleanup is only triggered approximately
-     * every 10 seconds. The server will still be removed depending on the
-     * state of the semaphore file. */
-    // config->discoveryCleanupTimeout = 60*60;
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/discovery/server_multicast.c b/ext/open62541/examples/discovery/server_multicast.c
deleted file mode 100644
index 44ef225..0000000
--- a/ext/open62541/examples/discovery/server_multicast.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/*
- * A simple server instance which registers with the discovery server.
- * Compared to server_register.c this example waits until the LDS server announces
- * itself through mDNS. Therefore the LDS server needs to support multicast extension
- * (i.e., LDS-ME).
- */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-const UA_ByteString UA_SECURITY_POLICY_BASIC128_URI =
-    {56, (UA_Byte *)"http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15"};
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-char *discovery_url = NULL;
-
-static void
-serverOnNetworkCallback(const UA_ServerOnNetwork *serverOnNetwork, UA_Boolean isServerAnnounce,
-                        UA_Boolean isTxtReceived, void *data) {
-
-    if(discovery_url != NULL || !isServerAnnounce) {
-        UA_LOG_DEBUG(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "serverOnNetworkCallback called, but discovery URL "
-                     "already initialized or is not announcing. Ignoring.");
-        return; // we already have everything we need or we only want server announces
-    }
-
-    if(!isTxtReceived)
-        return; // we wait until the corresponding TXT record is announced.
-                // Problem: how to handle if a Server does not announce the
-                // optional TXT?
-
-    // here you can filter for a specific LDS server, e.g. call FindServers on
-    // the serverOnNetwork to make sure you are registering with the correct
-    // LDS. We will ignore this for now
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Another server announced itself on %.*s",
-                (int)serverOnNetwork->discoveryUrl.length, serverOnNetwork->discoveryUrl.data);
-
-    if(discovery_url != NULL)
-        UA_free(discovery_url);
-    discovery_url = (char*)UA_malloc(serverOnNetwork->discoveryUrl.length + 1);
-    memcpy(discovery_url, serverOnNetwork->discoveryUrl.data, serverOnNetwork->discoveryUrl.length);
-    discovery_url[serverOnNetwork->discoveryUrl.length] = 0;
-}
-
-/*
- * Get the endpoint from the server, where we can call RegisterServer2 (or RegisterServer).
- * This is normally the endpoint with highest supported encryption mode.
- *
- * @param discoveryServerUrl The discovery url from the remote server
- * @return The endpoint description (which needs to be freed) or NULL
- */
-static
-UA_EndpointDescription *getRegisterEndpointFromServer(const char *discoveryServerUrl) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_EndpointDescription *endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_StatusCode retval = UA_Client_getEndpoints(client, discoveryServerUrl,
-                                                  &endpointArraySize, &endpointArray);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Array_delete(endpointArray, endpointArraySize,
-                        &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "GetEndpoints failed with %s", UA_StatusCode_name(retval));
-        UA_Client_delete(client);
-        return NULL;
-    }
-
-    UA_LOG_DEBUG(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Server has %lu endpoints", (unsigned long)endpointArraySize);
-    UA_EndpointDescription *foundEndpoint = NULL;
-    for(size_t i = 0; i < endpointArraySize; i++) {
-        UA_LOG_DEBUG(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "\tURL = %.*s, SecurityMode = %s",
-                     (int) endpointArray[i].endpointUrl.length,
-                     endpointArray[i].endpointUrl.data,
-                     endpointArray[i].securityMode == UA_MESSAGESECURITYMODE_NONE ? "None" :
-                     endpointArray[i].securityMode == UA_MESSAGESECURITYMODE_SIGN ? "Sign" :
-                     endpointArray[i].securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT ? "SignAndEncrypt" :
-                     "Invalid"
-        );
-        // find the endpoint with highest supported security mode
-        if((UA_String_equal(&endpointArray[i].securityPolicyUri, &UA_SECURITY_POLICY_NONE_URI) ||
-            UA_String_equal(&endpointArray[i].securityPolicyUri, &UA_SECURITY_POLICY_BASIC128_URI)) && (
-            foundEndpoint == NULL || foundEndpoint->securityMode < endpointArray[i].securityMode))
-            foundEndpoint = &endpointArray[i];
-    }
-    UA_EndpointDescription *returnEndpoint = NULL;
-    if(foundEndpoint != NULL) {
-        returnEndpoint = UA_EndpointDescription_new();
-        UA_EndpointDescription_copy(foundEndpoint, returnEndpoint);
-    }
-    UA_Array_delete(endpointArray, endpointArraySize,
-                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-    UA_Client_delete(client);
-    return returnEndpoint;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-/* loadFile parses the certificate file.
- *
- * @param  path               specifies the file name given in argv[]
- * @return Returns the file content after parsing */
-static UA_ByteString loadFile(const char *const path) {
-    UA_ByteString fileContents = UA_BYTESTRING_NULL;
-    if(path == NULL)
-        return fileContents;
-
-    /* Open the file */
-    FILE *fp = fopen(path, "rb");
-    if(!fp) {
-        errno = 0; /* We read errno also from the tcp layer */
-        return fileContents;
-    }
-
-    /* Get the file length, allocate the data and read */
-    fseek(fp, 0, SEEK_END);
-    fileContents.length = (size_t) ftell(fp);
-    fileContents.data = (UA_Byte *) UA_malloc(fileContents.length * sizeof(UA_Byte));
-    if(fileContents.data) {
-        fseek(fp, 0, SEEK_SET);
-        size_t read = fread(fileContents.data, sizeof(UA_Byte), fileContents.length, fp);
-        if(read != fileContents.length)
-            UA_ByteString_clear(&fileContents);
-    } else {
-        fileContents.length = 0;
-    }
-
-    fclose(fp);
-    return fileContents;
-}
-#endif
-
-/**
- * Initialize a client instance which is used for calling the registerServer service.
- * If the given endpoint has securityMode NONE, a client with default configuration
- * is returned.
- * If it is using SignAndEncrypt, the client certificates must be provided as a
- * command line argument and then the client is initialized using these certificates.
- * @param endpointRegister The remote endpoint where this server should register
- * @param argc from the main method
- * @param argv from the main method
- * @return NULL or the initialized non-connected client
- */
-static
-UA_Client *getRegisterClient(UA_EndpointDescription *endpointRegister, int argc, char **argv) {
-    if(endpointRegister->securityMode == UA_MESSAGESECURITYMODE_NONE) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Using LDS endpoint with security None");
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        return client;
-    }
-#ifdef UA_ENABLE_ENCRYPTION
-    if(endpointRegister->securityMode == UA_MESSAGESECURITYMODE_SIGN) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                    "LDS endpoint which only supports Sign is currently not supported");
-        return NULL;
-    }
-
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                "Using LDS endpoint with security SignAndEncrypt");
-
-    UA_ByteString certificate = UA_BYTESTRING_NULL;
-    UA_ByteString privateKey = UA_BYTESTRING_NULL;
-    UA_ByteString *trustList = NULL;
-    size_t trustListSize = 0;
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-
-    if(argc < 3) {
-        UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                     "The Certificate and key is missing."
-                         "The required arguments are "
-                         "<client-certificate.der> <client-private-key.der> "
-                         "[<trustlist1.crl>, ...]");
-        return NULL;
-    }
-    certificate = loadFile(argv[1]);
-    privateKey = loadFile(argv[2]);
-
-    /* Load the trustList. Load revocationList is not supported now */
-    if(argc > 3) {
-        trustListSize = (size_t) argc - 3;
-        UA_StatusCode retval = UA_ByteString_allocBuffer(trustList, trustListSize);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_ByteString_clear(&certificate);
-            UA_ByteString_clear(&privateKey);
-            return NULL;
-        }
-
-        for(size_t trustListCount = 0; trustListCount < trustListSize; trustListCount++) {
-            trustList[trustListCount] = loadFile(argv[trustListCount + 3]);
-        }
-    }
-
-    /* Secure client initialization */
-    UA_Client *clientRegister = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(clientRegister);
-    UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,
-                                         trustList, trustListSize,
-                                         revocationList, revocationListSize);
-    cc->securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-
-    UA_ByteString_clear(&certificate);
-    UA_ByteString_clear(&privateKey);
-    for(size_t deleteCount = 0; deleteCount < trustListSize; deleteCount++)
-        UA_ByteString_clear(&trustList[deleteCount]);
-
-    return clientRegister;
-#else
-    return NULL;
-#endif
-}
-
-int main(int argc, char **argv) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    // use port 0 to dynamically assign port
-    UA_ServerConfig_setMinimal(config, 0, NULL);
-
-    // An LDS server normally has the application type to DISCOVERYSERVER.
-    // Since this instance implements LDS and other OPC UA services, we set the type to SERVER.
-    // NOTE: Using DISCOVERYSERVER will cause UaExpert to not show this instance in the server list.
-    // See also: https://forum.unified-automation.com/topic1987.html
-
-    config->applicationDescription.applicationType = UA_APPLICATIONTYPE_SERVER;
-    UA_String_clear(&config->applicationDescription.applicationUri);
-    config->applicationDescription.applicationUri =
-        UA_String_fromChars("urn:open62541.example.server_multicast");
-
-    // Enable the mDNS announce and response functionality
-    config->discovery.mdnsEnable = true;
-
-    config->discovery.mdns.mdnsServerName = UA_String_fromChars("Sample Multicast Server");
-
-    //setting custom outbound interface
-    config->discovery.mdnsInterfaceIP = UA_String_fromChars("42.42.42.42"); //this line will produce an error and set the interface to 0.0.0.0
-
-    // See http://www.opcfoundation.org/UA/schemas/1.03/ServerCapabilities.csv
-    // For a LDS server, you should only indicate the LDS capability.
-    // If this instance is an LDS and at the same time a normal OPC UA server, you also have to indicate
-    // the additional capabilities.
-    // NOTE: UaExpert does not show LDS-only servers in the list.
-    // See also: https://forum.unified-automation.com/topic1987.html
-
-    config->discovery.mdns.serverCapabilitiesSize = 2;
-    UA_String *caps = (UA_String *) UA_Array_new(2, &UA_TYPES[UA_TYPES_STRING]);
-    caps[0] = UA_String_fromChars("LDS");
-    caps[1] = UA_String_fromChars("NA");
-    config->discovery.mdns.serverCapabilities = caps;
-
-    // Start the server and call iterate to wait for the multicast discovery of the LDS
-    UA_StatusCode retval = UA_Server_run_startup(server);
-
-    // callback which is called when a new server is detected through mDNS
-    // needs to be set after UA_Server_run_startup or UA_Server_run
-    UA_Server_setServerOnNetworkCallback(server, serverOnNetworkCallback, NULL);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not start the server. StatusCode %s",
-                     UA_StatusCode_name(retval));
-        UA_Server_delete(server);
-        UA_free(discovery_url);
-        return EXIT_FAILURE;
-    }
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                "Server started. Waiting for announce of LDS Server.");
-    while (running && discovery_url == NULL)
-        UA_Server_run_iterate(server, true);
-    if(!running) {
-        UA_Server_delete(server);
-        UA_free(discovery_url);
-        return EXIT_FAILURE;
-    }
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "LDS-ME server found on %s", discovery_url);
-
-    /* Check if the server supports sign and encrypt. OPC Foundation LDS
-     * requires an encrypted session for RegisterServer call, our server
-     * currently uses encrpytion optionally */
-    UA_EndpointDescription *endpointRegister = getRegisterEndpointFromServer(discovery_url);
-    UA_free(discovery_url);
-    if(endpointRegister == NULL || endpointRegister->securityMode == UA_MESSAGESECURITYMODE_INVALID) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not find any suitable endpoints on discovery server");
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    UA_Client *clientRegister = getRegisterClient(endpointRegister, argc, argv);
-    if(!clientRegister) {
-        UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                     "Could not create the client for remote registering");
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    /* Connect the client */
-    char *endpointUrl = (char*)UA_malloc(endpointRegister->endpointUrl.length + 1);
-    memcpy(endpointUrl, endpointRegister->endpointUrl.data, endpointRegister->endpointUrl.length);
-    endpointUrl[endpointRegister->endpointUrl.length] = 0;
-    UA_EndpointDescription_delete(endpointRegister);
-    retval = UA_Server_addPeriodicServerRegisterCallback(server, clientRegister, endpointUrl,
-                                                         10 * 60 * 1000, 500, NULL);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not create periodic job for server register. StatusCode %s",
-                     UA_StatusCode_name(retval));
-        UA_free(endpointUrl);
-        UA_Client_disconnect(clientRegister);
-        UA_Client_delete(clientRegister);
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    while (running)
-        UA_Server_run_iterate(server, true);
-
-    UA_Server_run_shutdown(server);
-
-    // UNregister the server from the discovery server.
-    retval = UA_Server_unregister_discovery(server, clientRegister);
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not unregister server from discovery server. "
-                     "StatusCode %s", UA_StatusCode_name(retval));
-
-    UA_free(endpointUrl);
-    UA_Client_disconnect(clientRegister);
-    UA_Client_delete(clientRegister);
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/discovery/server_register.c b/ext/open62541/examples/discovery/server_register.c
deleted file mode 100644
index 033e3dc..0000000
--- a/ext/open62541/examples/discovery/server_register.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-/*
- * A simple server instance which registers with the discovery server (see server_lds.c).
- * Before shutdown it has to unregister itself.
- */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-#define DISCOVERY_SERVER_ENDPOINT "opc.tcp://localhost:4840"
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-static UA_StatusCode
-readInteger(UA_Server *server, const UA_NodeId *sessionId,
-            void *sessionContext, const UA_NodeId *nodeId,
-            void *nodeContext, UA_Boolean includeSourceTimeStamp,
-            const UA_NumericRange *range, UA_DataValue *value) {
-    UA_Int32 *myInteger = (UA_Int32*)nodeContext;
-    value->hasValue = true;
-    UA_Variant_setScalarCopy(&value->value, myInteger, &UA_TYPES[UA_TYPES_INT32]);
-
-    // we know the nodeid is a string
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Node read %.*s",
-                (int)nodeId->identifier.string.length,
-                nodeId->identifier.string.data);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "read value %i", *(UA_UInt32 *)myInteger);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeInteger(UA_Server *server, const UA_NodeId *sessionId,
-             void *sessionContext, const UA_NodeId *nodeId,
-             void *nodeContext, const UA_NumericRange *range,
-             const UA_DataValue *value) {
-    UA_Int32 *myInteger = (UA_Int32*)nodeContext;
-    if(value->hasValue && UA_Variant_isScalar(&value->value) &&
-       value->value.type == &UA_TYPES[UA_TYPES_INT32] && value->value.data)
-        *myInteger = *(UA_Int32 *)value->value.data;
-
-    // we know the nodeid is a string
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Node written %.*s",
-                (int)nodeId->identifier.string.length,
-                nodeId->identifier.string.data);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "written value %i", *(UA_UInt32 *)myInteger);
-    return UA_STATUSCODE_GOOD;
-}
-
-int main(int argc, char **argv) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    // use port 0 to dynamically assign port
-    UA_ServerConfig_setMinimal(config, 0, NULL);
-
-    UA_String_clear(&config->applicationDescription.applicationUri);
-    config->applicationDescription.applicationUri =
-        UA_String_fromChars("urn:open62541.example.server_register");
-    config->discovery.mdns.mdnsServerName = UA_String_fromChars("Sample Server");
-    // See http://www.opcfoundation.org/UA/schemas/1.03/ServerCapabilities.csv
-    //config.serverCapabilitiesSize = 1;
-    //UA_String caps = UA_String_fromChars("LDS");
-    //config.serverCapabilities = &caps;
-
-    /* add a variable node to the address space */
-    UA_Int32 myInteger = 42;
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_DataSource dateDataSource;
-    dateDataSource.read = readInteger;
-    dateDataSource.write = writeInteger;
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.description = UA_LOCALIZEDTEXT("en-US", "the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "the answer");
-
-    UA_Server_addDataSourceVariableNode(server, myIntegerNodeId,
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                        myIntegerName, UA_NODEID_NULL, attr, dateDataSource,
-                                        &myInteger, NULL);
-
-    UA_Client *clientRegister = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(clientRegister));
-
-    // periodic server register after 10 Minutes, delay first register for 500ms
-    UA_StatusCode retval =
-        UA_Server_addPeriodicServerRegisterCallback(server, clientRegister, DISCOVERY_SERVER_ENDPOINT,
-                                                    10 * 60 * 1000, 500, NULL);
-    // UA_StatusCode retval = UA_Server_addPeriodicServerRegisterJob(server,
-    // "opc.tcp://localhost:4840", 10*60*1000, 500, NULL);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not create periodic job for server register. StatusCode %s",
-                     UA_StatusCode_name(retval));
-        UA_Client_disconnect(clientRegister);
-        UA_Client_delete(clientRegister);
-        UA_Server_delete(server);
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    retval = UA_Server_run(server, &running);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not start the server. StatusCode %s",
-                     UA_StatusCode_name(retval));
-        UA_Client_disconnect(clientRegister);
-        UA_Client_delete(clientRegister);
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    // Unregister the server from the discovery server.
-    retval = UA_Server_unregister_discovery(server, clientRegister);
-    //retval = UA_Server_unregister_discovery(server, "opc.tcp://localhost:4840" );
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not unregister server from discovery server. StatusCode %s",
-                     UA_StatusCode_name(retval));
-
-    UA_Client_disconnect(clientRegister);
-    UA_Client_delete(clientRegister);
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;;
-}
diff --git a/ext/open62541/examples/encryption/client_encryption.c b/ext/open62541/examples/encryption/client_encryption.c
deleted file mode 100644
index c27ceaa..0000000
--- a/ext/open62541/examples/encryption/client_encryption.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/securitypolicy.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <stdlib.h>
-
-#include "common.h"
-
-#define MIN_ARGS 4
-
-int main(int argc, char* argv[]) {
-    if(argc < MIN_ARGS) {
-        UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                     "Arguments are missing. The required arguments are "
-                     "<opc.tcp://host:port> "
-                     "<client-certificate.der> <client-private-key.der> "
-                     "[<trustlist1.crl>, ...]");
-        return EXIT_FAILURE;
-    }
-
-    const char *endpointUrl = argv[1];
-
-    /* Load certificate and private key */
-    UA_ByteString certificate = loadFile(argv[2]);
-    UA_ByteString privateKey  = loadFile(argv[3]);
-
-    /* Load the trustList. Load revocationList is not supported now */
-    size_t trustListSize = 0;
-    if(argc > MIN_ARGS)
-        trustListSize = (size_t)argc-MIN_ARGS;
-    UA_STACKARRAY(UA_ByteString, trustList, trustListSize);
-    for(size_t trustListCount = 0; trustListCount < trustListSize; trustListCount++)
-        trustList[trustListCount] = loadFile(argv[trustListCount+4]);
-
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    cc->securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-    UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,
-                                         trustList, trustListSize,
-                                         revocationList, revocationListSize);
-
-    UA_ByteString_clear(&certificate);
-    UA_ByteString_clear(&privateKey);
-    for(size_t deleteCount = 0; deleteCount < trustListSize; deleteCount++) {
-        UA_ByteString_clear(&trustList[deleteCount]);
-    }
-
-    /* Secure client connect */
-    cc->securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT; /* require encryption */
-    UA_StatusCode retval = UA_Client_connect(client, endpointUrl);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-    UA_Variant value;
-    UA_Variant_init(&value);
-
-    /* NodeId of the variable holding the current time */
-    const UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    retval = UA_Client_readValueAttribute(client, nodeId, &value);
-
-    if(retval == UA_STATUSCODE_GOOD &&
-       UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
-        UA_DateTime raw_date  = *(UA_DateTime *) value.data;
-        UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "date is: %u-%u-%u %u:%u:%u.%03u\n",
-                    dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-    }
-
-    /* Clean up */
-    UA_Variant_clear(&value);
-    UA_Client_delete(client);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/encryption/server_encryption.c b/ext/open62541/examples/encryption/server_encryption.c
deleted file mode 100644
index 8b40d29..0000000
--- a/ext/open62541/examples/encryption/server_encryption.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- *
- */
-
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/securitypolicy.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-#include "common.h"
-
-UA_Boolean running = true;
-static void stopHandler(int sig) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "received ctrl-c");
-    running = false;
-}
-
-int main(int argc, char* argv[]) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    if(argc < 3) {
-        UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                     "Missing arguments. Arguments are "
-                     "<server-certificate.der> <private-key.der> "
-                     "[<trustlist1.crl>, ...]");
-        return EXIT_FAILURE;
-    }
-
-    /* Load certificate and private key */
-    UA_ByteString certificate = loadFile(argv[1]);
-    UA_ByteString privateKey = loadFile(argv[2]);
-
-    /* Load the trustlist */
-    size_t trustListSize = 0;
-    if(argc > 3)
-        trustListSize = (size_t)argc-3;
-    UA_STACKARRAY(UA_ByteString, trustList, trustListSize);
-    for(size_t i = 0; i < trustListSize; i++)
-        trustList[i] = loadFile(argv[i+3]);
-
-    /* Loading of a issuer list, not used in this application */
-    size_t issuerListSize = 0;
-    UA_ByteString *issuerList = NULL;
-
-    /* Loading of a revocation list currently unsupported */
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-
-    UA_StatusCode retval =
-        UA_ServerConfig_setDefaultWithSecurityPolicies(config, 4840,
-                                                       &certificate, &privateKey,
-                                                       trustList, trustListSize,
-                                                       issuerList, issuerListSize,
-                                                       revocationList, revocationListSize);
-    UA_ByteString_clear(&certificate);
-    UA_ByteString_clear(&privateKey);
-    for(size_t i = 0; i < trustListSize; i++)
-        UA_ByteString_clear(&trustList[i]);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    retval = UA_Server_run(server, &running);
-
- cleanup:
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/nodeset/CMakeLists.txt b/ext/open62541/examples/nodeset/CMakeLists.txt
deleted file mode 100644
index 1c2becf..0000000
--- a/ext/open62541/examples/nodeset/CMakeLists.txt
+++ /dev/null
@@ -1,134 +0,0 @@
-####################
-# Nodeset Examples #
-####################
-
-###################
-# Custom XML      #
-###################
-
-set(FILE_CSV_DIRPREFIX ${PROJECT_SOURCE_DIR}/nodeset)
-set(FILE_BSD_DIRPREFIX ${PROJECT_SOURCE_DIR}/nodeset)
-set(FILE_NS_DIRPREFIX ${PROJECT_SOURCE_DIR}/nodeset)
-
-if(NOT CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
-    # needed or cmake doesn't recognize dependencies of generated files
-    set(PROJECT_BINARY_DIR ${CMAKE_BINARY_DIR})
-endif()
-
-# generate namespace from XML file
-if(NOT CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
-    ua_generate_nodeset_and_datatypes(
-        NAME "example"
-        FILE_NS "${FILE_NS_DIRPREFIX}/server_nodeset.xml"
-        DEPENDS "${CMAKE_SOURCE_DIR}/tools/schema/Opc.Ua.NodeSet2.Minimal.xml"
-    )
-else()
-    # standalone examples build expects already installed Opc.Ua.NodeSet2.Minimal.xml
-    ua_generate_nodeset_and_datatypes(
-        NAME "example"
-        FILE_NS "${FILE_NS_DIRPREFIX}/server_nodeset.xml"
-    )
-endif()
-
-# The .csv file can be created from within UaModeler or manually
-ua_generate_nodeid_header(
-    NAME "example_nodeids"
-    ID_PREFIX "EXAMPLE_NS"
-    TARGET_SUFFIX "ids_example"
-    FILE_CSV "${FILE_CSV_DIRPREFIX}/server_nodeset.csv"
-)
-
-add_example(server_nodeset server_nodeset.c
-            ${UA_NODESET_EXAMPLE_SOURCES}
-            ${PROJECT_BINARY_DIR}/src_generated/open62541/example_nodeids.h)
-
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-    ua_generate_nodeset_and_datatypes(
-        NAME "testnodeset"
-        FILE_CSV "${FILE_CSV_DIRPREFIX}/testnodeset.csv"
-        FILE_BSD "${FILE_BSD_DIRPREFIX}/testtypes.bsd"
-        NAMESPACE_IDX 2
-        FILE_NS "${FILE_NS_DIRPREFIX}/testnodeset.xml"
-        INTERNAL
-    )
-    add_example(server_testnodeset server_testnodeset.c
-                ${UA_NODESET_TESTNODESET_SOURCES}
-                ${UA_TYPES_TESTNODESET_SOURCES})
-    add_dependencies(server_testnodeset open62541-generator-ns-testnodeset)
-endif()
-
-
-###################
-# PLCopen Nodeset #
-###################
-
-if(NOT CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
-    set(FILE_CSV_DIRPREFIX ${CMAKE_SOURCE_DIR}/deps/ua-nodeset)
-    set(FILE_BSD_PLCOPEN_DIRPREFIX ${CMAKE_SOURCE_DIR}/deps/ua-nodeset)
-    set(FILE_BSD_POWERLINK_DIRPREFIX ${PROJECT_SOURCE_DIR}/nodeset)
-    set(FILE_NS_DIRPREFIX ${CMAKE_SOURCE_DIR}/deps/ua-nodeset)
-else()
-    set(FILE_CSV_DIRPREFIX ${UA_NODESET_DIR})
-    set(FILE_BSD_PLCOPEN_DIRPREFIX ${UA_NODESET_DIR})
-    set(FILE_BSD_POWERLINK_DIRPREFIX ${PROJECT_SOURCE_DIR}/nodeset)
-    set(FILE_NS_DIRPREFIX ${UA_NODESET_DIR})
-endif()
-
-# PLCopen requires the full ns0 as basis
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-
-    # Generate types and namespace for DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "di"
-        FILE_CSV "${FILE_CSV_DIRPREFIX}/DI/OpcUaDiModel.csv"
-        FILE_BSD "${FILE_BSD_PLCOPEN_DIRPREFIX}/DI/Opc.Ua.Di.Types.bsd"
-        NAMESPACE_IDX 2
-        FILE_NS "${FILE_NS_DIRPREFIX}/DI/Opc.Ua.Di.NodeSet2.xml"
-        INTERNAL
-    )
-
-    # generate PLCopen namespace which is using DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "plc"
-        # PLCopen does not define custom types. Only generate the nodeset
-        FILE_NS "${FILE_NS_DIRPREFIX}/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
-        # PLCopen depends on the di nodeset, which must be generated before
-        DEPENDS "di"
-        INTERNAL
-    )
-
-    add_example(server_nodeset_plcopen server_nodeset_plcopen.c
-                ${UA_NODESET_DI_SOURCES}
-                ${UA_NODESET_PLC_SOURCES}
-                ${UA_TYPES_DI_SOURCES}
-                ${UA_TYPES_PLC_SOURCES})
-    add_dependencies(server_nodeset_plcopen open62541-generator-ns-plc)
-    
-
-endif()
-
-# POWERLINK requires the full ns0 as basis
-
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-
-    # generate powerlink namespace which is using DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "powerlink"
-        FILE_CSV "${FILE_CSV_DIRPREFIX}/POWERLINK/Opc.Ua.POWERLINK.NodeIds.csv"
-        FILE_BSD "${FILE_BSD_POWERLINK_DIRPREFIX}/Opc.Ua.POWERLINK.NodeSet2.bsd"
-        NAMESPACE_IDX 3
-        FILE_NS "${FILE_NS_DIRPREFIX}/POWERLINK/Opc.Ua.POWERLINK.NodeSet2.xml"
-        # POWERLINK depends on the di nodeset, which must be generated before
-        DEPENDS "di"
-        INTERNAL
-    )
-
-    add_example(server_nodeset_powerlink server_nodeset_powerlink.c
-                ${UA_NODESET_DI_SOURCES}
-                ${UA_NODESET_POWERLINK_SOURCES}
-                ${UA_TYPES_DI_SOURCES}
-                ${UA_TYPES_POWERLINK_SOURCES})
-    add_dependencies(server_nodeset_powerlink open62541-generator-ns-powerlink)
-    
-
-endif()
diff --git a/ext/open62541/examples/nodeset/Opc.Ua.POWERLINK.NodeSet2.bsd b/ext/open62541/examples/nodeset/Opc.Ua.POWERLINK.NodeSet2.bsd
deleted file mode 100644
index 7134198..0000000
--- a/ext/open62541/examples/nodeset/Opc.Ua.POWERLINK.NodeSet2.bsd
+++ /dev/null
@@ -1,58 +0,0 @@
-<opc:TypeDictionary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://opcfoundation.org/UA/POWERLINK/" DefaultByteOrder="LittleEndian" xmlns:opc="http://opcfoundation.org/BinarySchema/" xmlns:ua="http://opcfoundation.org/UA/" TargetNamespace="http://opcfoundation.org/UA/POWERLINK/">
-    <opc:Import Namespace="http://opcfoundation.org/UA/"/>
-    <opc:StructuredType BaseType="ua:ExtensionObject" Name="ErrorRegisterBits">
-        <opc:Documentation>Represents the values of the POWERLINK ErrorRegister </opc:Documentation>
-        <opc:Field TypeName="opc:ByteString" Name="Value"/>
-        <opc:Field TypeName="opc:ByteString" Name="ValidBits"/>
-    </opc:StructuredType>
-    <opc:StructuredType BaseType="ua:ExtensionObject" Name="PowerlinkAttribute">
-        <opc:Documentation>Represents the POWERLINK entry attributes</opc:Documentation>
-        <opc:Field TypeName="opc:ByteString" Name="Value"/>
-        <opc:Field TypeName="opc:ByteString" Name="ValidBits"/>
-    </opc:StructuredType>
-    <opc:StructuredType BaseType="ua:ExtensionObject" Name="PowerlinkErrorEntryDataType">
-        <opc:Documentation>Represents the entries of the POWERLINK Object ERR_History_ADOM (Object 1003h, SubIndex 1..254)</opc:Documentation>
-        <opc:Field TypeName="opc:UInt16" Name="entryType"/>
-        <opc:Field TypeName="opc:UInt16" Name="errorCode"/>
-        <opc:Field TypeName="opc:UInt64" Name="timeStamp"/>
-        <opc:Field TypeName="opc:UInt64" Name="additionalInformation"/>
-    </opc:StructuredType>
-    <opc:StructuredType BaseType="ua:ExtensionObject" Name="PowerlinkIpAddressDataType">
-        <opc:Documentation>Structure DataType PowerlinkIpAddressDataType to represent POWERLINK Objects of the POWERLINK data type IP_ADDRESS</opc:Documentation>
-        <opc:Field TypeName="opc:Byte" Name="b1"/>
-        <opc:Field TypeName="opc:Byte" Name="b2"/>
-        <opc:Field TypeName="opc:Byte" Name="b3"/>
-        <opc:Field TypeName="opc:Byte" Name="b4"/>
-    </opc:StructuredType>
-    <opc:StructuredType BaseType="ua:ExtensionObject" Name="PowerlinkPDOMappingEntryDataType">
-        <opc:Documentation>Structure DataType PowerlinkPDOMappingEntryDataType to represent the entries of POWERLINK Objects like PDO_RxCommParam_00h_REC</opc:Documentation>
-        <opc:Field TypeName="opc:UInt16" Name="length"/>
-        <opc:Field TypeName="opc:UInt16" Name="offset"/>
-        <opc:Field TypeName="opc:Byte" Name="reserved"/>
-        <opc:Field TypeName="opc:Byte" Name="subIndex"/>
-        <opc:Field TypeName="opc:UInt16" Name="index"/>
-    </opc:StructuredType>
-    <opc:EnumeratedType LengthInBits="32" Name="PowerlinkNMTResetCmdEnumeration">
-        <opc:Documentation>This DataType is an Enumeration that represents the NMT reset commands for POWERLINK</opc:Documentation>
-        <opc:EnumeratedValue Name="NMTResetNode" Value="40"/>
-        <opc:EnumeratedValue Name="NMTResetCommunication" Value="41"/>
-        <opc:EnumeratedValue Name="NMTResetConfiguration" Value="42"/>
-        <opc:EnumeratedValue Name="NMTSwReset" Value="43"/>
-        <opc:EnumeratedValue Name="NMTInvalidService" Value="255"/>
-    </opc:EnumeratedType>
-    <opc:EnumeratedType LengthInBits="32" Name="PowerlinkNMTStateEnumeration">
-        <opc:Documentation>This DataType is an enumeration that represents the NMT State</opc:Documentation>
-        <opc:EnumeratedValue Name="NMT_GS_OFF " Value="0"/>
-        <opc:EnumeratedValue Name="NMT_GS_INITIALISING" Value="25"/>
-        <opc:EnumeratedValue Name="NMT_GS_RESET_APPLICATION" Value="41"/>
-        <opc:EnumeratedValue Name="NMT_GS_RESET_COMMUNICATION" Value="57"/>
-        <opc:EnumeratedValue Name="NMT_GS_RESET_CONFIGURATION" Value="121"/>
-        <opc:EnumeratedValue Name="NMT_XS_NOT_ACTIVE" Value="28"/>
-        <opc:EnumeratedValue Name="NMT_XS_PRE_OPERATIONAL_1" Value="29"/>
-        <opc:EnumeratedValue Name="NMT_XS_PRE_OPERATIONAL_2" Value="93"/>
-        <opc:EnumeratedValue Name="NMT_XS_READY_TO_OPERATE" Value="109"/>
-        <opc:EnumeratedValue Name="NMT_XS_OPERATIONAL" Value="253"/>
-        <opc:EnumeratedValue Name="NMT_CS_STOPPED" Value="77"/>
-        <opc:EnumeratedValue Name="NMT_XS_BASIC_ETHERNET" Value="30"/>
-    </opc:EnumeratedType>
-</opc:TypeDictionary>
diff --git a/ext/open62541/examples/nodeset/server_nodeset.c b/ext/open62541/examples/nodeset/server_nodeset.c
deleted file mode 100644
index a85d4b7..0000000
--- a/ext/open62541/examples/nodeset/server_nodeset.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-/* Files example_namespace.h and example_namespace.c are created from server_nodeset.xml in the
- * /src_generated directory by CMake */
-#include "open62541/example_nodeids.h"
-#include "open62541/namespace_example_generated.h"
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(int argc, char** argv) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-    
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_StatusCode retval;
-    /* create nodes from nodeset */
-    if(namespace_example_generated(server) != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Could not add the example nodeset. "
-        "Check previous output for any error.");
-        retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    } else {
-
-        // Do some additional stuff with the nodes
-
-        // this will just get the namespace index, since it is already added to the server
-        UA_UInt16 nsIdx = UA_Server_addNamespace(server, "http://yourorganisation.org/test/");
-
-        UA_NodeId testInstanceId = UA_NODEID_NUMERIC(nsIdx, UA_EXAMPLE_NSID_TESTINSTANCE);
-
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "The testInstance has ns=%d;id=%d",
-                    testInstanceId.namespaceIndex, testInstanceId.identifier.numeric);
-
-        retval = UA_Server_run(server, &running);
-    }
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/nodeset/server_nodeset.csv b/ext/open62541/examples/nodeset/server_nodeset.csv
deleted file mode 100644
index 8d7ac48..0000000
--- a/ext/open62541/examples/nodeset/server_nodeset.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-testType,1001,ObjectType
-testInstance,5001,Object
-testFolder,5002,Object
-testType_Var1,6001,Variable
-testInstance_Var1,6002,Variable
diff --git a/ext/open62541/examples/nodeset/server_nodeset.xml b/ext/open62541/examples/nodeset/server_nodeset.xml
deleted file mode 100644
index eb6eb32..0000000
--- a/ext/open62541/examples/nodeset/server_nodeset.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:s1="http://yourorganisation.org/test/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-    <NamespaceUris>
-        <Uri>http://yourorganisation.org/test/</Uri>
-    </NamespaceUris>
-    <Aliases>
-        <Alias Alias="Double">i=11</Alias>
-        <Alias Alias="Organizes">i=35</Alias>
-        <Alias Alias="HasModellingRule">i=37</Alias>
-        <Alias Alias="HasTypeDefinition">i=40</Alias>
-        <Alias Alias="HasSubtype">i=45</Alias>
-        <Alias Alias="HasComponent">i=47</Alias>
-    </Aliases>
-    <!-- Following object has only references to nodes defined after itself -->
-    <UAObject NodeId="ns=1;i=5001" BrowseName="1:testInstance">
-        <DisplayName>testInstance</DisplayName>
-        <References>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5002</Reference>
-            <Reference ReferenceType="HasTypeDefinition">ns=1;i=1001</Reference>
-            <Reference ReferenceType="HasComponent">ns=1;i=6002</Reference>
-        </References>
-    </UAObject>
-    <UAObject NodeId="ns=1;i=5002" BrowseName="1:testFolder">
-        <DisplayName>testFolder</DisplayName>
-        <References>
-            <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-        </References>
-    </UAObject>
-    <UAObjectType NodeId="ns=1;i=1001" BrowseName="1:testType">
-        <DisplayName>testType</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-            <Reference ReferenceType="HasComponent">ns=1;i=6001</Reference>
-        </References>
-    </UAObjectType>
-    <UAVariable DataType="Double" ParentNodeId="ns=1;i=1001" NodeId="ns=1;i=6001" BrowseName="1:Var1" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>Var1</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasModellingRule">i=78</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=1001</Reference>
-        </References>
-        <Value>
-            <uax:Double>42.0</uax:Double>
-        </Value>
-    </UAVariable>
-    <UAVariable ParentNodeId="ns=1;i=5001" NodeId="ns=1;i=6002" BrowseName="1:Var1" DataType="i=7" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>Var2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <Value>
-            <ListOfUInt32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-                <uax:UInt32>1</uax:UInt32>
-                <uax:UInt32>2</uax:UInt32>
-                <uax:UInt32>3</uax:UInt32>
-            </ListOfUInt32>
-        </Value>
-    </UAVariable>
-</UANodeSet>
diff --git a/ext/open62541/examples/nodeset/server_nodeset_plcopen.c b/ext/open62541/examples/nodeset/server_nodeset_plcopen.c
deleted file mode 100644
index 1aa76be..0000000
--- a/ext/open62541/examples/nodeset/server_nodeset_plcopen.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#ifdef UA_ENABLE_AMALGAMATION
-#include "open62541.h"
-#else
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#endif
-
-#include "open62541/namespace_di_generated.h"
-#include "open62541/namespace_plc_generated.h"
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(int argc, char** argv) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* create nodes from nodeset */
-    UA_StatusCode retval = namespace_di_generated(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Adding the DI namespace failed. Please check previous error output.");
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-    retval |= namespace_plc_generated(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Adding the PLCopen namespace failed. Please check previous error output.");
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/nodeset/server_nodeset_powerlink.c b/ext/open62541/examples/nodeset/server_nodeset_powerlink.c
deleted file mode 100644
index ae1de7b..0000000
--- a/ext/open62541/examples/nodeset/server_nodeset_powerlink.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#ifdef UA_ENABLE_AMALGAMATION
-#include "open62541.h"
-#else
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#endif
-
-#include "open62541/namespace_di_generated.h"
-#include "open62541/namespace_powerlink_generated.h"
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(int argc, char** argv) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* create nodes from nodeset */
-    UA_StatusCode retval = namespace_di_generated(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Adding the DI namespace failed. Please check previous error output.");
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-    retval |= namespace_powerlink_generated(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Adding the Powerlink namespace failed. Please check previous error output.");
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/nodeset/server_testnodeset.c b/ext/open62541/examples/nodeset/server_testnodeset.c
deleted file mode 100644
index e05966a..0000000
--- a/ext/open62541/examples/nodeset/server_testnodeset.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "open62541/namespace_testnodeset_generated.h"
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-
-UA_DataTypeArray customTypesArray = { NULL, UA_TYPES_TESTNODESET_COUNT, UA_TYPES_TESTNODESET};
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(int argc, char **argv)
-{
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->customDataTypes = &customTypesArray;
-
-    UA_StatusCode retval;
-    /* create nodes from nodeset */
-    if(namespace_testnodeset_generated(server) != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not add the example nodeset. "
-                     "Check previous output for any error.");
-        retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    } else {
-        UA_Variant out;
-        UA_Variant_init(&out);
-        UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 10002), &out);
-        UA_Point *p = (UA_Point *)out.data;
-        printf("point 2d x: %f y: %f \n", p->x, p->y);
-        retval = UA_Server_run(server, &running);
-    }
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/nodeset/testnodeset.csv b/ext/open62541/examples/nodeset/testnodeset.csv
deleted file mode 100644
index 52ef85c..0000000
--- a/ext/open62541/examples/nodeset/testnodeset.csv
+++ /dev/null
@@ -1,19 +0,0 @@
-Structs,5001,Object
-Point_Encoding_DefaultBinary,5002,Object
-NestedPoint_Encoding_DefaultBinary,5003,Object
-PointWithArray_Encoding_DefaultBinary,5004,Object
-BaseDataTypes,5100,Object
-BaseDataTypes_Double,5101,Variable
-BaseDataTypes_Uint32,5102,Variable
-Point,10001,DataType
-Structs_PointA,10002,Variable
-Structs_PointC_Array,10004,Variable
-Structs_PointB,10005,Variable
-Structs_InputArguments,11493,Variable
-Structs_StaticNodeIdTypes,15962,Variable
-Structs_StaticNodeIdTypes,15963,Variable
-BaseDataTypes_String1_scalar,16001,Variable
-BaseDataTypes_ByteString_Scalar,16002,Variable
-PointWithArray,3003,DataType
-NestedPoint,10008,DataType
-PointWithPointArray,3004,DataType
diff --git a/ext/open62541/examples/nodeset/testnodeset.xml b/ext/open62541/examples/nodeset/testnodeset.xml
deleted file mode 100644
index 36dbeb3..0000000
--- a/ext/open62541/examples/nodeset/testnodeset.xml
+++ /dev/null
@@ -1,556 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-->A more complete example can be found in tools/test/nodeset_compiler<-->
-<UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:s1="http://yourorganisation.org/test/Types.xsd" xmlns:ua="http://unifiedautomation.com/Configuration/NodeSet.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-    <NamespaceUris>
-        <Uri>http://yourorganisation.org/test/</Uri>
-    </NamespaceUris>
-    <Aliases>
-        <Alias Alias="Int32">i=6</Alias>
-        <Alias Alias="UInt32">i=7</Alias>
-        <Alias Alias="Double">i=11</Alias>
-        <Alias Alias="Organizes">i=35</Alias>
-        <Alias Alias="HasModellingRule">i=37</Alias>
-        <Alias Alias="HasEncoding">i=38</Alias>
-        <Alias Alias="HasTypeDefinition">i=40</Alias>
-        <Alias Alias="HasSubtype">i=45</Alias>
-        <Alias Alias="HasComponent">i=47</Alias>
-        <Alias Alias="IdType">i=256</Alias>
-        <Alias Alias="Argument">i=296</Alias>
-        <Alias Alias="Point3D">ns=1;i=3002</Alias>
-        <Alias Alias="Point">ns=1;i=10001</Alias>
-    </Aliases>
-    <Extensions>
-        <Extension>
-            <ua:ModelInfo Tool="UaModeler" Hash="NY/CbF6sk/OjLXFpjvfTAA==" Version="1.6.2"/>
-        </Extension>
-    </Extensions>
-    <!-->Struct with builtin members<-->
-    <UADataType NodeId="ns=1;i=10001" BrowseName="1:Point">
-        <DisplayName>Point</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-        </References>
-        <Definition Name="1:Point">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-        </Definition>
-    </UADataType>
-    <UAVariable NodeId="ns=1;i=12213" BrowseName="1:Point" ParentNodeId="ns=1;i=7617" DataType="String">
-        <DisplayName>Point</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=69</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=7617</Reference>
-        </References>
-        <Value>
-            <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">Point</String>
-        </Value>
-    </UAVariable>
-    <UAVariable NodeId="ns=1;i=12214" BrowseName="1:NestedPoint" ParentNodeId="ns=1;i=7617" DataType="String">
-        <DisplayName>NestedPoint</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=69</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=7617</Reference>
-        </References>
-        <Value>
-            <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">NestedPoint</String>
-        </Value>
-    </UAVariable>
-    <UAVariable NodeId="ns=1;i=12215" BrowseName="1:PointWithArray" ParentNodeId="ns=1;i=7617" DataType="String">
-        <DisplayName>PointWithArray</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=69</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=7617</Reference>
-        </References>
-        <Value>
-            <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">PointWithArray</String>
-        </Value>
-    </UAVariable>
-    <UAVariable NodeId="ns=1;i=7617" BrowseName="1:Opc.Ua.Testnodeset" SymbolicName="OpcUa_BinarySchema" DataType="ByteString">
-        <DisplayName>Opc.Ua.Testnodeset</DisplayName>
-        <References>
-            <Reference ReferenceType="HasComponent" IsForward="false">i=93</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=72</Reference>
-        </References>
-        <Value>
-        <!-- This is the Base64 Encoded content of testtypes.bsd -->
-        <ByteString xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">PG9wYzpUeXBlRGljdGlvbmFyeQogIHhtbG5zOm9wYz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL0JpbmFyeVNjaGVtYS8iCiAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLyIKICB4bWxuczp0bnM9Imh0dHA6Ly95b3Vyb3JnYW5pc2F0aW9uLm9yZy90ZXN0LyIKICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iCiAgVGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veW91cm9yZ2FuaXNhdGlvbi5vcmcvdGVzdC8iCj4KICA8b3BjOkltcG9ydCBOYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8iIExvY2F0aW9uPSJPcGMuVWEuQmluYXJ5U2NoZW1hLmJzZCIvPgoKICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlBvaW50IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4KICAgIDxvcGM6RmllbGQgTmFtZT0ieCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+CiAgICA8b3BjOkZpZWxkIE5hbWU9InkiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPgogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPgoKICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik5lc3RlZFBvaW50IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4KICAgIDxvcGM6RmllbGQgTmFtZT0ieCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+CiAgICA8b3BjOkZpZWxkIE5hbWU9InkiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPgogICAgPG9wYzpGaWVsZCBOYW1lPSJwb2ludDEiIFR5cGVOYW1lPSJ0bnM6UG9pbnQiIC8+CiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+CgogICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlBvaW50V2l0aEFycmF5IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4KICAgIDxvcGM6RmllbGQgTmFtZT0ieCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+CiAgICA8b3BjOkZpZWxkIE5hbWU9InkiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPgogICAgPG9wYzpGaWVsZCBOYW1lPSJ6IiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4KICAgIDxvcGM6RmllbGQgTmFtZT0iYXJyYXkxU2l6ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+CiAgICA8b3BjOkZpZWxkIE5hbWU9ImFycmF5MSIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIExlbmd0aEZpZWxkPSJhcnJheTFTaXplIiAvPgogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPgoKPC9vcGM6VHlwZURpY3Rpb25hcnk+</ByteString>
-        </Value>
-    </UAVariable>    
-    <UADataType NodeId="ns=1;i=10008" BrowseName="1:NestedPoint">
-        <DisplayName>NestedPoint</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-            <!--<Reference ReferenceType="HasDescription">ns=1;i=12213</Reference><-->
-        </References>
-        <Definition Name="1:Point">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-            <Field DataType="ns=1;i=10001" Name="Point1" />
-        </Definition>
-    </UADataType>
-    <UAObject SymbolicName="DefaultBinary" NodeId="ns=1;i=5002" BrowseName="Default Binary">
-        <DisplayName>Default Binary</DisplayName>
-        <References>
-            <Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=10001</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=76</Reference>
-            <Reference ReferenceType="HasDescription">ns=1;i=12213</Reference>
-        </References>
-    </UAObject>
-     <UAObject SymbolicName="DefaultBinary" NodeId="ns=1;i=5003" BrowseName="Default Binary">
-        <DisplayName>Default Binary</DisplayName>
-        <References>
-            <Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=10008</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=76</Reference>
-            <Reference ReferenceType="HasDescription">ns=1;i=12214</Reference>
-        </References>
-    </UAObject>
-    <UAObject SymbolicName="DefaultBinary" NodeId="ns=1;i=5004" BrowseName="Default Binary">
-        <DisplayName>Default Binary</DisplayName>
-        <References>
-            <Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=3003</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=76</Reference>
-            <Reference ReferenceType="HasDescription">ns=1;i=12215</Reference>
-        </References>
-    </UAObject>    
-    <UAObject NodeId="ns=1;i=5100" BrowseName="1:BuiltinTypes">
-        <DisplayName>BuiltinTypes</DisplayName>
-        <References>
-            <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-        </References>
-    </UAObject>
-    <UAVariable DataType="ByteString" NodeId="ns=1;i=16002" BrowseName="1:ByteString_scalar_init" AccessLevel="3">
-        <DisplayName>ByteString_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ByteString>SGVsbG9Xb3JsZA==</ByteString>
-        </Value>
-    </UAVariable>
-    <!--ValueRank>
-    OPC UA spec part 3, NodeClass Variable
-    -3: Scalar or 1-dim
-    -2: Any, value can be a scalar or an array with any number of dimensions
-    -1: scalar
-     0: value is array with one or more dimensions
-     1: array with one dimension
-     n>1: array with with the specified numbers of dimensions
-    <-->
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8001" BrowseName="1:Int32_scalar_noInit_withoutValueRank" AccessLevel="3">
-        <DisplayName>Int32_scalar_noInit_withoutValueRank</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8002" BrowseName="1:Int32_scalar_Init_ValueRank=-3" AccessLevel="3" ValueRank="-3">
-        <DisplayName>Int32_scalar_Init_ValueRank=-3</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>            
-            <Int32>1</Int32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8003" BrowseName="1:Int32_1dim_Init_ValueRank=-3" AccessLevel="3" ValueRank="-3">
-        <DisplayName>Int32_1dim_Init_ValueRank=-3</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ListOfInt32>
-                <Int32>1</Int32>
-                <Int32>2</Int32>
-            </ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8004" BrowseName="1:Int32_scalar_noInit_ValueRank=-2" AccessLevel="3" ValueRank="-2">
-        <DisplayName>Int32_scalar_noInit_ValueRank=-2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8005" BrowseName="1:Int32_scalar_noInit_ValueRank=-1" AccessLevel="3" ValueRank="-1">
-        <DisplayName>Int32_scalar_noInit_ValueRank=-1</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ListOfInt32>
-                <Int32>1</Int32>
-                <Int32>2</Int32>
-            </ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8006" BrowseName="1:Int32_OneOrMoreDim_noInit_ValueRank=0" AccessLevel="3" ValueRank="0">
-        <DisplayName>Int32_scalar_noInit_ValueRank=0</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8007" BrowseName="1:Int32_1dim_noInit_ValueRank=1" AccessLevel="3" ValueRank="1">
-        <DisplayName>Int32_1dim_noInit_ValueRank=1</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8008" BrowseName="1:Int32_2dim_noInit_ValueRank=2" AccessLevel="3" ValueRank="2">
-        <DisplayName>Int32_2dim_noInit_ValueRank=2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8009" BrowseName="1:Int32_3dim_noInit_ValueRank=2" AccessLevel="3" ValueRank="3">
-        <DisplayName>Int32_3dim_noInit_ValueRank=2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="String" NodeId="ns=1;i=16001" BrowseName="1:String_scalar_init" AccessLevel="3">
-        <DisplayName>String_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <uax:String>Hello World</uax:String>
-        </Value>
-    </UAVariable>
-    <UAObject NodeId="ns=1;i=5001" BrowseName="1:NotBuiltinTypes">
-        <DisplayName>NotBuiltinTypes</DisplayName>
-        <References>            
-            <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
-        </References>
-    </UAObject>   
-    <UAVariable DataType="Argument" NodeId="ns=1;i=11493" BrowseName="InputArguments_scalar_init">
-        <DisplayName>InputArguments_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>i=297</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <Argument xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-                        <Name>argName</Name>
-                        <DataType>
-                            <Identifier>i=1</Identifier>
-                        </DataType>
-                        <ValueRank>-1</ValueRank>                        
-                        <ArrayDimensions>0</ArrayDimensions>
-                        <Description>
-                            <Locale>en</Locale>
-                            <Text>myDescritipon</Text>
-                        </Description>
-                    </Argument>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" NodeId="ns=1;i=10002" BrowseName="1:Point_scalar_init" AccessLevel="3">
-        <DisplayName>Point_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>            
-        </References>
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                        <x>1</x>
-                        <y>2</y>
-                    </Point>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>
-    </UAVariable>
-    <!-->uninitialized scalar point<-->
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="-1" NodeId="ns=1;i=10005" BrowseName="1:Point_scalar_noInit" AccessLevel="3">
-        <DisplayName>Point_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="1" NodeId="ns=1;i=10007" BrowseName="1:Point_1dim_noInit" AccessLevel="3">
-        <DisplayName>Point_1dim_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="1" NodeId="ns=1;i=10004" ArrayDimensions="4" BrowseName="1:Point_1dim_init" AccessLevel="3">
-        <DisplayName>Point_1dim_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <Value>
-            <uax:ListOfExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>1</x>
-                            <y>2</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>3</x>
-                            <y>4</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>5</x>
-                            <y>6</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>7</x>
-                            <y>8</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-            </uax:ListOfExtensionObject>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="2" NodeId="ns=1;i=10006" ArrayDimensions="2,2" BrowseName="1:Point_2dim_init" AccessLevel="3">
-        <DisplayName>Point_2dim_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <Value>
-            <uax:ListOfExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>1</x>
-                            <y>2</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>3</x>
-                            <y>4</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>5</x>
-                            <y>6</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>7</x>
-                            <y>8</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-            </uax:ListOfExtensionObject>
-        </Value>
-    </UAVariable>    
-    <UAVariable DataType="Double" ParentNodeId="ns=1;i=5100" NodeId="ns=1;i=5101" BrowseName="1:Double_init" AccessLevel="3">
-        <DisplayName>Double_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasModellingRule">i=78</Reference>
-        </References>
-        <Value>
-            <uax:Double>42</uax:Double>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="UInt32" ParentNodeId="ns=1;i=5100" ValueRank="1" NodeId="ns=1;i=5102" ArrayDimensions="3" BrowseName="1:UInt32_init" AccessLevel="3">
-        <DisplayName>UInt32_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-        </References>
-        <Value>
-            <uax:ListOfUInt32>
-                <uax:UInt32>1</uax:UInt32>
-                <uax:UInt32>2</uax:UInt32>
-                <uax:UInt32>3</uax:UInt32>
-            </uax:ListOfUInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="IdType" ParentNodeId="ns=1;i=5001" ValueRank="1" NodeId="ns=1;i=15962" ArrayDimensions="7" BrowseName="Enum_1dim_init">
-        <DisplayName>Enum_init</DisplayName>
-        <Description>A list of IdTypes for nodes which are the same in every server that exposes them.</Description>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-        </References>
-        <Value>
-            <uax:ListOfInt32>
-                <uax:Int32>0</uax:Int32>
-                <uax:Int32>1</uax:Int32>
-                <uax:Int32>3</uax:Int32>
-                <uax:Int32>4</uax:Int32>
-                <uax:Int32>5</uax:Int32>
-                <uax:Int32>6</uax:Int32>
-                <uax:Int32>7</uax:Int32>
-            </uax:ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="IdType" ParentNodeId="ns=1;i=5001" NodeId="ns=1;i=15963" BrowseName="Enum_scalar_noInit">
-        <DisplayName>Enum_scalar_noInit</DisplayName>
-        <Description>A list of IdTypes for nodes which are the same in every server that exposes them.</Description>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-        </References>
-    </UAVariable>
-    <UAVariable DataType="i=307" NodeId="ns=1;i=16003" BrowseName="1:ApplicationTye_1dim_noInit" UserAccessLevel="3" AccessLevel="3" ValueRank="1">
-        <DisplayName>ApplicationTye_1dim_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ListOfInt32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-                <Int32>0</Int32>
-                <Int32>1</Int32>
-                <Int32>2</Int32>
-                <Int32>3</Int32>
-            </ListOfInt32>
-        </Value>
-    </UAVariable>
-    
-    <UAVariable DataType="Int32" ValueRank="2" NodeId="ns=1;i=6003" ArrayDimensions="3,2" BrowseName="1:Int32_2dim_init" AccessLevel="3">
-        <DisplayName>Int32_2dim_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <uax:ListOfInt32>
-                <uax:Int32>11</uax:Int32>
-                <uax:Int32>21</uax:Int32>
-                <uax:Int32>31</uax:Int32>
-                <uax:Int32>12</uax:Int32>
-                <uax:Int32>22</uax:Int32>
-                <uax:Int32>32</uax:Int32>
-            </uax:ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UADataType NodeId="ns=1;i=3003" BrowseName="1:PointWithArray">
-        <DisplayName>PointWithArray</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-        </References>
-        <Definition Name="1:PointWithArray">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-            <Field DataType="Double" Name="z"/>
-            <Field DataType="Int32" Name="array1Size"/>
-            <Field DataType="Double" ValueRank="1" Name="array1"/>
-        </Definition>
-    </UADataType>
-    <UADataType NodeId="ns=1;i=3004" BrowseName="1:PointWithPointArray">
-        <DisplayName>PointWithPointArray</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-        </References>
-        <Definition Name="1:PointWithPointArray">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-            <Field DataType="Double" Name="z"/>
-            <Field DataType="Int32" Name="array1Size"/>
-            <Field DataType="Double" ValueRank="1" Name="array1"/>
-        </Definition>
-    </UADataType>
-    <UAVariable DataType="ns=1;i=3004" NodeId="ns=1;i=6010" BrowseName="1:PointWithPointArray_scalar_noInit" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>PointWithArray_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5001</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="ns=1;i=3003" NodeId="ns=1;i=6008" BrowseName="1:PointWithArray_scalar_noInit" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>PointWithArray_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>ns=1;i=3003</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <PointWithArray xmlns="http://yourorganisation.org/exported2/Types.xsd">
-                        <x>1.1</x>
-                        <y>2.2</y>
-                        <z>3.3</z>
-                        <array1Size>2</array1Size>
-                        <array1>                        
-                            <Double>11.1</Double>
-                            <Double>12.1</Double>
-                        </array1>
-                    </PointWithArray>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="ns=1;i=10008" NodeId="ns=1;i=6009" BrowseName="1:NestedPoint_scalar_noInit" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>NestedPoint_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-    </UAVariable>
-</UANodeSet>
diff --git a/ext/open62541/examples/nodeset/testtypes.bsd b/ext/open62541/examples/nodeset/testtypes.bsd
deleted file mode 100644
index 8f6c97d..0000000
--- a/ext/open62541/examples/nodeset/testtypes.bsd
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2018 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- * 
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- * 
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<opc:TypeDictionary
-  xmlns:opc="http://opcfoundation.org/BinarySchema/"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:ua="http://opcfoundation.org/UA/"
-  xmlns:tns="http://yourorganisation.org/test/"
-  DefaultByteOrder="LittleEndian"
-  TargetNamespace="http://yourorganisation.org/test/"
->
-  <opc:Import Namespace="http://opcfoundation.org/UA/" Location="Opc.Ua.BinarySchema.bsd"/>
-
-  <opc:StructuredType Name="Point" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NestedPoint" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-    <opc:Field Name="point1" TypeName="tns:Point" />
-  </opc:StructuredType>
-
-   <opc:StructuredType Name="PointWithArray" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-    <opc:Field Name="z" TypeName="opc:Double" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="array1" TypeName="opc:Double" LengthField="NoOfArrayDimensions" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PointWithPointArray" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-    <opc:Field Name="z" TypeName="opc:Double" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="array1" TypeName="tns:Point" LengthField="NoOfArrayDimensions" />
-  </opc:StructuredType>
-
-</opc:TypeDictionary>
diff --git a/ext/open62541/examples/pubsub/pubsub_subscribe_standalone.c b/ext/open62541/examples/pubsub/pubsub_subscribe_standalone.c
deleted file mode 100644
index d8aac23..0000000
--- a/ext/open62541/examples/pubsub/pubsub_subscribe_standalone.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- */
-
-/**
- * IMPORTANT ANNOUNCEMENT
- * The PubSub subscriber API is currently not finished. This examples can be used to receive
- * and print the values, which are published by the tutorial_pubsub_publish example.
- * The following code uses internal API which will be later replaced by the higher-level
- * PubSub subscriber API.
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "ua_pubsub_networkmessage.h"
-
-#include <signal.h>
-
-#ifdef UA_ENABLE_PUBSUB_ETH_UADP
-#include <open62541/plugin/pubsub_ethernet.h>
-#endif
-
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                "received ctrl-c");
-    running = false;
-}
-
-static UA_StatusCode
-subscriberListen(UA_PubSubChannel *psc) {
-    UA_ByteString buffer;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&buffer, 512);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Message buffer allocation failed!");
-        return retval;
-    }
-
-    /* Receive the message. Blocks for 100ms */
-    retval = psc->receive(psc, &buffer, NULL, 100);
-    if(retval != UA_STATUSCODE_GOOD || buffer.length == 0) {
-        /* Workaround!! Reset buffer length. Receive can set the length to zero.
-         * Then the buffer is not deleted because no memory allocation is
-         * assumed.
-         * TODO: Return an error code in 'receive' instead of setting the buf
-         * length to zero. */
-        buffer.length = 512;
-        UA_ByteString_clear(&buffer);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Decode the message */
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "Message length: %lu", (unsigned long) buffer.length);
-    UA_NetworkMessage networkMessage;
-    memset(&networkMessage, 0, sizeof(UA_NetworkMessage));
-    size_t currentPosition = 0;
-    UA_NetworkMessage_decodeBinary(&buffer, &currentPosition, &networkMessage);
-    UA_ByteString_clear(&buffer);
-
-    /* Is this the correct message type? */
-    if(networkMessage.networkMessageType != UA_NETWORKMESSAGE_DATASET)
-        goto cleanup;
-
-    /* At least one DataSetMessage in the NetworkMessage? */
-    if(networkMessage.payloadHeaderEnabled &&
-       networkMessage.payloadHeader.dataSetPayloadHeader.count < 1)
-        goto cleanup;
-
-    /* Is this a KeyFrame-DataSetMessage? */
-    for(size_t j = 0; j < networkMessage.payloadHeader.dataSetPayloadHeader.count; j++) {
-        UA_DataSetMessage *dsm = &networkMessage.payload.dataSetPayload.dataSetMessages[j];
-        if(dsm->header.dataSetMessageType != UA_DATASETMESSAGE_DATAKEYFRAME)
-            continue;
-
-        /* Loop over the fields and print well-known content types */
-        for(int i = 0; i < dsm->data.keyFrameData.fieldCount; i++) {
-            const UA_DataType *currentType = dsm->data.keyFrameData.dataSetFields[i].value.type;
-            if(currentType == &UA_TYPES[UA_TYPES_BYTE]) {
-                UA_Byte value = *(UA_Byte *)dsm->data.keyFrameData.dataSetFields[i].value.data;
-                UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                            "Message content: [Byte] \tReceived data: %i", value);
-            } else if (currentType == &UA_TYPES[UA_TYPES_DATETIME]) {
-                UA_DateTime value = *(UA_DateTime *)dsm->data.keyFrameData.dataSetFields[i].value.data;
-                UA_DateTimeStruct receivedTime = UA_DateTime_toStruct(value);
-                UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                            "Message content: [DateTime] \t"
-                            "Received date: %02i-%02i-%02i Received time: %02i:%02i:%02i",
-                            receivedTime.year, receivedTime.month, receivedTime.day,
-                            receivedTime.hour, receivedTime.min, receivedTime.sec);
-            }
-        }
-    }
-
-    cleanup:
-    UA_NetworkMessage_clear(&networkMessage);
-    return retval;
-}
-
-int main(int argc, char **argv) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_PubSubTransportLayer udpLayer = UA_PubSubTransportLayerUDPMP();
-
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(connectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection 1");
-    connectionConfig.transportProfileUri =
-        UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    connectionConfig.enabled = UA_TRUE;
-
-    UA_NetworkAddressUrlDataType networkAddressUrl =
-        {UA_STRING_NULL , UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-
-    UA_PubSubChannel *psc =
-        udpLayer.createPubSubChannel(&connectionConfig);
-    psc->regist(psc, NULL, NULL);
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    while(running && retval == UA_STATUSCODE_GOOD)
-        retval = subscriberListen(psc);
-
-    psc->close(psc);
-        
-    return 0;
-}
diff --git a/ext/open62541/examples/pubsub/server_pubsub_publisher_iop.c b/ext/open62541/examples/pubsub/server_pubsub_publisher_iop.c
deleted file mode 100644
index 1bbba60..0000000
--- a/ext/open62541/examples/pubsub/server_pubsub_publisher_iop.c
+++ /dev/null
@@ -1,884 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_udp.h>
-#ifdef UA_ENABLE_PUBSUB_ETH_UADP
-#include <open62541/plugin/pubsub_ethernet.h>
-#endif
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-#define Publisher_ID 60
-
-static void addPublisher1(UA_Server *server, UA_NodeId publishedDataSetId);
-static void addPublisher2(UA_Server *server, UA_NodeId publishedDataSetId);
-
-static UA_NodeId ds1BoolToggleId;
-static int ds1BoolToggleCount = 0;
-static UA_Boolean ds1BoolToggleVal = false;
-static UA_NodeId ds1Int32Id;
-static UA_Int32 ds1Int32Val = 0;
-static UA_NodeId ds1Int32FastId;
-static UA_Int32 ds1Int32FastVal = 0;
-static UA_NodeId ds1DateTimeId;
-
-static UA_NodeId ds2BoolToggleId;
-static UA_Boolean ds2BoolToggleVal = false;
-static UA_NodeId ds2ByteId;
-static UA_Byte ds2ByteVal = 0;
-static UA_NodeId ds2Int16Id;
-static UA_Int16 ds2Int16Val = 0;
-static UA_NodeId ds2Int32Id;
-static UA_Int32 ds2Int32Val = 0;
-static UA_NodeId ds2Int64Id;
-static UA_Int64 ds2Int64Val = 0;
-static UA_NodeId ds2SByteId;
-static UA_SByte ds2SByteVal = 0;
-static UA_NodeId ds2UInt16Id;
-static UA_UInt16 ds2UInt16Val = 0;
-static UA_NodeId ds2UInt32Id;
-static UA_UInt32 ds2UInt32Val = 0;
-static UA_NodeId ds2UInt64Id;
-static UA_UInt64 ds2UInt64Val = 0;
-static UA_NodeId ds2FloatId;
-static UA_Float ds2FloatVal = 0;
-static UA_NodeId ds2DoubleId;
-static UA_Double ds2DoubleVal = 0;
-static UA_String *ds2StringArray = NULL;
-static size_t ds2StringArrayLen = 0;
-static size_t ds2StringIndex = 0;
-static UA_NodeId ds2StringId;
-static UA_NodeId ds2ByteStringId;
-static UA_NodeId ds2GuidId;
-static UA_NodeId ds2DateTimeId;
-static UA_NodeId ds2UInt32ArrId;
-static UA_UInt32 ds2UInt32ArrValue[10] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
-
-UA_NodeId connectionIdent;
-
-void
-timerCallback(UA_Server *server, void *data);
-
-static void
-addPubSubConnection(UA_Server *server, UA_String *transportProfile,
-    UA_NetworkAddressUrlDataType *networkAddressUrl) {
-    /* Details about the connection configuration and handling are located
-    * in the pubsub connection tutorial */
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(connectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection 1");
-    connectionConfig.transportProfileUri = *transportProfile;
-    connectionConfig.enabled = UA_TRUE;
-    UA_Variant_setScalar(&connectionConfig.address, networkAddressUrl,
-        &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.publisherId.numeric = Publisher_ID;
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdent);
-}
-
-static void addPublisher1(UA_Server *server, UA_NodeId publishedDataSetId) {
-    UA_NodeId folderId;
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Publisher 1");
-    UA_Server_addObjectNode(server, UA_NODEID_NULL,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-        UA_QUALIFIEDNAME(1, "Publisher 1"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-        oAttr, NULL, &folderId);
-
-    UA_NodeId_init(&ds1BoolToggleId);
-    UA_VariableAttributes boolToggleAttr = UA_VariableAttributes_default;
-    boolToggleAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_BOOLEAN].typeId, &boolToggleAttr.dataType);
-    UA_Variant_setScalar(&boolToggleAttr.value, &ds1BoolToggleVal, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    boolToggleAttr.displayName = UA_LOCALIZEDTEXT("en-US", "BoolToggle");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher1.BoolToggle"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "BoolToggle"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), boolToggleAttr, NULL, &ds1BoolToggleId);
-
-    UA_NodeId_init(&ds1Int32Id);
-    UA_VariableAttributes int32Attr = UA_VariableAttributes_default;
-    int32Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT32].typeId, &int32Attr.dataType);
-    int32Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&int32Attr.value, &ds1Int32Val, &UA_TYPES[UA_TYPES_INT32]);
-    int32Attr.displayName = UA_LOCALIZEDTEXT("en-US", "Int32");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher1.Int32"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Int32"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), int32Attr, NULL, &ds1Int32Id);
-
-    UA_NodeId_init(&ds1Int32FastId);
-    UA_VariableAttributes int32FastAttr = UA_VariableAttributes_default;
-    int32FastAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT32].typeId, &int32FastAttr.dataType);
-    int32FastAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&int32FastAttr.value, &ds1Int32FastVal, &UA_TYPES[UA_TYPES_INT32]);
-    int32FastAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Int32Fast");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher1.Int32Fast"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Int32Fast"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), int32FastAttr, NULL, &ds1Int32FastId);
-
-    UA_NodeId_init(&ds1DateTimeId);
-    UA_VariableAttributes dateTimeAttr = UA_VariableAttributes_default;
-    dateTimeAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_DATETIME].typeId, &dateTimeAttr.dataType);
-    dateTimeAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_DateTime dateTimeVal = UA_DateTime_now();
-    UA_Variant_setScalar(&dateTimeAttr.value, &dateTimeVal, &UA_TYPES[UA_TYPES_DATETIME]);
-    dateTimeAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DateTime");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher1.DateTime"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "DateTime"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), dateTimeAttr, NULL, &ds1DateTimeId);
-
-    if (!UA_NodeId_equal(&publishedDataSetId, &UA_NODEID_NULL))
-    {
-        // Create and add fields to the PublishedDataSet
-        UA_DataSetFieldConfig boolToggleConfig;
-        memset(&boolToggleConfig, 0, sizeof(UA_DataSetFieldConfig));
-        boolToggleConfig.field.variable.fieldNameAlias = UA_STRING("BoolToggle");
-        boolToggleConfig.field.variable.promotedField = false;
-        boolToggleConfig.field.variable.publishParameters.publishedVariable = ds1BoolToggleId;
-        boolToggleConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig int32Config;
-        memset(&int32Config, 0, sizeof(UA_DataSetFieldConfig));
-        int32Config.field.variable.fieldNameAlias = UA_STRING("Int32");
-        int32Config.field.variable.promotedField = false;
-        int32Config.field.variable.publishParameters.publishedVariable = ds1Int32Id;
-        int32Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig int32FastConfig;
-        memset(&int32FastConfig, 0, sizeof(UA_DataSetFieldConfig));
-        int32FastConfig.field.variable.fieldNameAlias = UA_STRING("Int32Fast");
-        int32FastConfig.field.variable.promotedField = false;
-        int32FastConfig.field.variable.publishParameters.publishedVariable = ds1Int32FastId;
-        int32FastConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig dateTimeConfig;
-        memset(&dateTimeConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dateTimeConfig.field.variable.fieldNameAlias = UA_STRING("DateTime");
-        dateTimeConfig.field.variable.promotedField = false;
-        dateTimeConfig.field.variable.publishParameters.publishedVariable = ds1DateTimeId;
-        dateTimeConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_NodeId f1, f2, f3, f4;
-        // add fields in reverse order, because all fields are added to the beginning of the list
-        UA_Server_addDataSetField(server, publishedDataSetId, &dateTimeConfig, &f4);
-        UA_Server_addDataSetField(server, publishedDataSetId, &int32FastConfig, &f3);
-        UA_Server_addDataSetField(server, publishedDataSetId, &int32Config, &f2);
-        UA_Server_addDataSetField(server, publishedDataSetId, &boolToggleConfig, &f1);
-    }
-}
-
-static void addPublisher2(UA_Server *server, UA_NodeId publishedDataSetId) {
-    UA_NodeId folderId;
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Publisher 2");
-    UA_Server_addObjectNode(server, UA_NODEID_NULL,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-        UA_QUALIFIEDNAME(1, "Publisher 2"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-        oAttr, NULL, &folderId);
-
-    UA_NodeId_init(&ds2BoolToggleId);
-    UA_VariableAttributes boolToggleAttr = UA_VariableAttributes_default;
-    boolToggleAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_BOOLEAN].typeId, &boolToggleAttr.dataType);
-    UA_Variant_setScalar(&boolToggleAttr.value, &ds2BoolToggleVal, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    boolToggleAttr.displayName = UA_LOCALIZEDTEXT("en-US", "BoolToggle");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.BoolToggle"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "BoolToggle"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), boolToggleAttr, NULL, &ds2BoolToggleId);
-
-    UA_NodeId_init(&ds2ByteId);
-    UA_VariableAttributes byteAttr = UA_VariableAttributes_default;
-    byteAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_BYTE].typeId, &byteAttr.dataType);
-    byteAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&byteAttr.value, &ds2ByteVal, &UA_TYPES[UA_TYPES_BYTE]);
-    byteAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Byte");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Byte"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Byte"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), byteAttr, NULL, &ds2ByteId);
-
-    UA_NodeId_init(&ds2Int16Id);
-    UA_VariableAttributes int16Attr = UA_VariableAttributes_default;
-    int16Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT16].typeId, &int16Attr.dataType);
-    int16Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&int16Attr.value, &ds2Int16Val, &UA_TYPES[UA_TYPES_INT16]);
-    int16Attr.displayName = UA_LOCALIZEDTEXT("en-US", "Int16");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Int16"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Int16"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), int16Attr, NULL, &ds2Int16Id);
-
-    UA_NodeId_init(&ds2Int32Id);
-    UA_VariableAttributes int32Attr = UA_VariableAttributes_default;
-    int32Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT32].typeId, &int32Attr.dataType);
-    int32Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&int32Attr.value, &ds2Int32Val, &UA_TYPES[UA_TYPES_INT32]);
-    int32Attr.displayName = UA_LOCALIZEDTEXT("en-US", "Int32");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Int32"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Int32"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), int32Attr, NULL, &ds2Int32Id);
-
-    UA_NodeId_init(&ds2Int64Id);
-    UA_VariableAttributes int64Attr = UA_VariableAttributes_default;
-    int64Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT64].typeId, &int64Attr.dataType);
-    int64Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&int64Attr.value, &ds2Int64Val, &UA_TYPES[UA_TYPES_INT64]);
-    int64Attr.displayName = UA_LOCALIZEDTEXT("en-US", "Int64");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Int64"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Int64"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), int64Attr, NULL, &ds2Int64Id);
-
-    UA_NodeId_init(&ds2SByteId);
-    UA_VariableAttributes sbyteAttr = UA_VariableAttributes_default;
-    sbyteAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_SBYTE].typeId, &sbyteAttr.dataType);
-    sbyteAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&sbyteAttr.value, &ds2SByteVal, &UA_TYPES[UA_TYPES_SBYTE]);
-    sbyteAttr.displayName = UA_LOCALIZEDTEXT("en-US", "SByte");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.SByte"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "SByte"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), sbyteAttr, NULL, &ds2SByteId);
-
-    UA_NodeId_init(&ds2UInt16Id);
-    UA_VariableAttributes uint16Attr = UA_VariableAttributes_default;
-    uint16Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_UINT16].typeId, &uint16Attr.dataType);
-    uint16Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&uint16Attr.value, &ds2UInt16Val, &UA_TYPES[UA_TYPES_UINT16]);
-    uint16Attr.displayName = UA_LOCALIZEDTEXT("en-US", "UInt16");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.UInt16"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "UInt16"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), uint16Attr, NULL, &ds2UInt16Id);
-
-    UA_NodeId_init(&ds2UInt32Id);
-    UA_VariableAttributes uint32Attr = UA_VariableAttributes_default;
-    uint32Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_UINT32].typeId, &uint32Attr.dataType);
-    uint32Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&uint32Attr.value, &ds2UInt32Val, &UA_TYPES[UA_TYPES_UINT32]);
-    uint32Attr.displayName = UA_LOCALIZEDTEXT("en-US", "UInt32");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.UInt32"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "UInt32"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), uint32Attr, NULL, &ds2UInt32Id);
-
-    UA_NodeId_init(&ds2UInt64Id);
-    UA_VariableAttributes uint64Attr = UA_VariableAttributes_default;
-    uint64Attr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_UINT64].typeId, &uint64Attr.dataType);
-    uint64Attr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&uint64Attr.value, &ds2UInt64Val, &UA_TYPES[UA_TYPES_UINT64]);
-    uint64Attr.displayName = UA_LOCALIZEDTEXT("en-US", "UInt64");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.UInt64"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "UInt64"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), uint64Attr, NULL, &ds2UInt64Id);
-
-    UA_NodeId_init(&ds2FloatId);
-    UA_VariableAttributes floatAttr = UA_VariableAttributes_default;
-    floatAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_FLOAT].typeId, &floatAttr.dataType);
-    floatAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&floatAttr.value, &ds2FloatVal, &UA_TYPES[UA_TYPES_FLOAT]);
-    floatAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Float");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Float"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Float"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), floatAttr, NULL, &ds2FloatId);
-
-    UA_NodeId_init(&ds2DoubleId);
-    UA_VariableAttributes doubleAttr = UA_VariableAttributes_default;
-    doubleAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_DOUBLE].typeId, &doubleAttr.dataType);
-    doubleAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&doubleAttr.value, &ds2DoubleVal, &UA_TYPES[UA_TYPES_DOUBLE]);
-    doubleAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Double");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Double"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Double"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), doubleAttr, NULL, &ds2DoubleId);
-
-    ds2StringArrayLen = 26;
-    ds2StringArray = (UA_String*)UA_Array_new(ds2StringArrayLen, &UA_TYPES[UA_TYPES_STRING]);
-    ds2StringArray[0] = UA_STRING_ALLOC("Alpha");
-    ds2StringArray[1] = UA_STRING_ALLOC("Bravo");
-    ds2StringArray[2] = UA_STRING_ALLOC("Charlie");
-    ds2StringArray[3] = UA_STRING_ALLOC("Delta");
-    ds2StringArray[4] = UA_STRING_ALLOC("Echo");
-    ds2StringArray[5] = UA_STRING_ALLOC("Foxtrot");
-    ds2StringArray[6] = UA_STRING_ALLOC("Golf");
-    ds2StringArray[7] = UA_STRING_ALLOC("Hotel");
-    ds2StringArray[8] = UA_STRING_ALLOC("India");
-    ds2StringArray[9] = UA_STRING_ALLOC("Juliet");
-    ds2StringArray[10] = UA_STRING_ALLOC("Kilo");
-    ds2StringArray[11] = UA_STRING_ALLOC("Lima");
-    ds2StringArray[12] = UA_STRING_ALLOC("Mike");
-    ds2StringArray[13] = UA_STRING_ALLOC("November");
-    ds2StringArray[14] = UA_STRING_ALLOC("Oscar");
-    ds2StringArray[15] = UA_STRING_ALLOC("Papa");
-    ds2StringArray[16] = UA_STRING_ALLOC("Quebec");
-    ds2StringArray[17] = UA_STRING_ALLOC("Romeo");
-    ds2StringArray[18] = UA_STRING_ALLOC("Sierra");
-    ds2StringArray[19] = UA_STRING_ALLOC("Tango");
-    ds2StringArray[20] = UA_STRING_ALLOC("Uniform");
-    ds2StringArray[21] = UA_STRING_ALLOC("Victor");
-    ds2StringArray[22] = UA_STRING_ALLOC("Whiskey");
-    ds2StringArray[23] = UA_STRING_ALLOC("X-ray");
-    ds2StringArray[24] = UA_STRING_ALLOC("Yankee");
-    ds2StringArray[25] = UA_STRING_ALLOC("Zulu");
-
-    UA_String stringVal;
-    UA_String_init(&stringVal);
-
-    UA_NodeId_init(&ds2StringId);
-    UA_VariableAttributes stringAttr = UA_VariableAttributes_default;
-    stringAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_STRING].typeId, &stringAttr.dataType);
-    stringAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&stringAttr.value, &stringVal, &UA_TYPES[UA_TYPES_STRING]);
-    stringAttr.displayName = UA_LOCALIZEDTEXT("en-US", "String");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.String"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "String"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), stringAttr, NULL, &ds2StringId);
-
-    UA_Byte data[] = { 0x00 };
-    UA_ByteString byteStringVal = { 1, data };
-
-    UA_NodeId_init(&ds2ByteStringId);
-    UA_VariableAttributes byteStringAttr = UA_VariableAttributes_default;
-    byteStringAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_BYTESTRING].typeId, &byteStringAttr.dataType);
-    byteStringAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&byteStringAttr.value, &byteStringVal, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    byteStringAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ByteString");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.ByteString"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "ByteString"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), byteStringAttr, NULL, &ds2ByteStringId);
-
-    UA_Guid guidVal = UA_Guid_random();
-    UA_NodeId_init(&ds2GuidId);
-    UA_VariableAttributes guidAttr = UA_VariableAttributes_default;
-    guidAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_GUID].typeId, &guidAttr.dataType);
-    guidAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&guidAttr.value, &guidVal, &UA_TYPES[UA_TYPES_GUID]);
-    guidAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Guid");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.Guid"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "Guid"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), guidAttr, NULL, &ds2GuidId);
-
-    UA_NodeId_init(&ds2DateTimeId);
-    UA_VariableAttributes dateTimeAttr = UA_VariableAttributes_default;
-    dateTimeAttr.valueRank = -1;
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_DATETIME].typeId, &dateTimeAttr.dataType);
-    dateTimeAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-    UA_DateTime dateTimeVal = UA_DateTime_now();
-    UA_Variant_setScalar(&dateTimeAttr.value, &dateTimeVal, &UA_TYPES[UA_TYPES_DATETIME]);
-    dateTimeAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DateTime");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.DateTime"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "DateTime"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), dateTimeAttr, NULL, &ds2DateTimeId);
-
-    // UInt32Array
-    UA_NodeId_init(&ds2UInt32ArrId);
-    UA_VariableAttributes uint32ArrAttr = UA_VariableAttributes_default;
-    uint32ArrAttr.valueRank = 1;    // 1-dimensional array
-    uint32ArrAttr.arrayDimensionsSize = 1;
-    UA_UInt32 arrayDims[1] = { 10 };
-    uint32ArrAttr.arrayDimensions = arrayDims;
-
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_UINT32].typeId, &uint32ArrAttr.dataType);
-    uint32ArrAttr.accessLevel = UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE;
-
-    UA_Variant_setArray(&uint32ArrAttr.value, ds2UInt32ArrValue, 10, &UA_TYPES[UA_TYPES_UINT32]);
-    uint32ArrAttr.displayName = UA_LOCALIZEDTEXT("en-US", "UInt32Array");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "Publisher2.UInt32Array"), folderId,
-        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-        UA_QUALIFIEDNAME(1, "UInt32Array"),
-        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), uint32ArrAttr, NULL, &ds2UInt32ArrId);
-
-    if (!UA_NodeId_equal(&publishedDataSetId, &UA_NODEID_NULL))
-    {
-        // Create and add fields to the PublishedDataSet
-        UA_DataSetFieldConfig boolToggleConfig;
-        memset(&boolToggleConfig, 0, sizeof(UA_DataSetFieldConfig));
-        boolToggleConfig.field.variable.fieldNameAlias = UA_STRING("BoolToggle");
-        boolToggleConfig.field.variable.promotedField = false;
-        boolToggleConfig.field.variable.publishParameters.publishedVariable = ds2BoolToggleId;
-        boolToggleConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig byteConfig;
-        memset(&byteConfig, 0, sizeof(UA_DataSetFieldConfig));
-        byteConfig.field.variable.fieldNameAlias = UA_STRING("Byte");
-        byteConfig.field.variable.promotedField = false;
-        byteConfig.field.variable.publishParameters.publishedVariable = ds2ByteId;
-        byteConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig int16Config;
-        memset(&int16Config, 0, sizeof(UA_DataSetFieldConfig));
-        int16Config.field.variable.fieldNameAlias = UA_STRING("Int16");
-        int16Config.field.variable.promotedField = false;
-        int16Config.field.variable.publishParameters.publishedVariable = ds2Int16Id;
-        int16Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig int32Config;
-        memset(&int32Config, 0, sizeof(UA_DataSetFieldConfig));
-        int32Config.field.variable.fieldNameAlias = UA_STRING("Int32");
-        int32Config.field.variable.promotedField = false;
-        int32Config.field.variable.publishParameters.publishedVariable = ds2Int32Id;
-        int32Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig int64Config;
-        memset(&int64Config, 0, sizeof(UA_DataSetFieldConfig));
-        int64Config.field.variable.fieldNameAlias = UA_STRING("Int64");
-        int64Config.field.variable.promotedField = false;
-        int64Config.field.variable.publishParameters.publishedVariable = ds2Int64Id;
-        int64Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig sbyteConfig;
-        memset(&sbyteConfig, 0, sizeof(UA_DataSetFieldConfig));
-        sbyteConfig.field.variable.fieldNameAlias = UA_STRING("SByte");
-        sbyteConfig.field.variable.promotedField = false;
-        sbyteConfig.field.variable.publishParameters.publishedVariable = ds2SByteId;
-        sbyteConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig uint16Config;
-        memset(&uint16Config, 0, sizeof(UA_DataSetFieldConfig));
-        uint16Config.field.variable.fieldNameAlias = UA_STRING("UInt16");
-        uint16Config.field.variable.promotedField = false;
-        uint16Config.field.variable.publishParameters.publishedVariable = ds2UInt16Id;
-        uint16Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig uint32Config;
-        memset(&uint32Config, 0, sizeof(UA_DataSetFieldConfig));
-        uint32Config.field.variable.fieldNameAlias = UA_STRING("UInt32");
-        uint32Config.field.variable.promotedField = false;
-        uint32Config.field.variable.publishParameters.publishedVariable = ds2UInt32Id;
-        uint32Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig uint64Config;
-        memset(&uint64Config, 0, sizeof(UA_DataSetFieldConfig));
-        uint64Config.field.variable.fieldNameAlias = UA_STRING("UInt64");
-        uint64Config.field.variable.promotedField = false;
-        uint64Config.field.variable.publishParameters.publishedVariable = ds2UInt64Id;
-        uint64Config.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig floatConfig;
-        memset(&floatConfig, 0, sizeof(UA_DataSetFieldConfig));
-        floatConfig.field.variable.fieldNameAlias = UA_STRING("Float");
-        floatConfig.field.variable.promotedField = false;
-        floatConfig.field.variable.publishParameters.publishedVariable = ds2FloatId;
-        floatConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig doubleConfig;
-        memset(&doubleConfig, 0, sizeof(UA_DataSetFieldConfig));
-        doubleConfig.field.variable.fieldNameAlias = UA_STRING("Double");
-        doubleConfig.field.variable.promotedField = false;
-        doubleConfig.field.variable.publishParameters.publishedVariable = ds2DoubleId;
-        doubleConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig stringConfig;
-        memset(&stringConfig, 0, sizeof(UA_DataSetFieldConfig));
-        stringConfig.field.variable.fieldNameAlias = UA_STRING("String");
-        stringConfig.field.variable.promotedField = false;
-        stringConfig.field.variable.publishParameters.publishedVariable = ds2StringId;
-        stringConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig byteStringConfig;
-        memset(&byteStringConfig, 0, sizeof(UA_DataSetFieldConfig));
-        byteStringConfig.field.variable.fieldNameAlias = UA_STRING("ByteString");
-        byteStringConfig.field.variable.promotedField = false;
-        byteStringConfig.field.variable.publishParameters.publishedVariable = ds2ByteStringId;
-        byteStringConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig guidConfig;
-        memset(&guidConfig, 0, sizeof(UA_DataSetFieldConfig));
-        guidConfig.field.variable.fieldNameAlias = UA_STRING("Guid");
-        guidConfig.field.variable.promotedField = false;
-        guidConfig.field.variable.publishParameters.publishedVariable = ds2GuidId;
-        guidConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig dateTimeConfig;
-        memset(&dateTimeConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dateTimeConfig.field.variable.fieldNameAlias = UA_STRING("DateTime");
-        dateTimeConfig.field.variable.promotedField = false;
-        dateTimeConfig.field.variable.publishParameters.publishedVariable = ds2DateTimeId;
-        dateTimeConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataSetFieldConfig uint32ArrConfig;
-        memset(&uint32ArrConfig, 0, sizeof(UA_DataSetFieldConfig));
-        uint32ArrConfig.field.variable.fieldNameAlias = UA_STRING("UInt32Array");
-        uint32ArrConfig.field.variable.promotedField = false;
-        uint32ArrConfig.field.variable.publishParameters.publishedVariable = ds2UInt32ArrId;
-        uint32ArrConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_NodeId f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16;
-        // add fields in reverse order, because all fields are added to the beginning of the list
-        UA_Server_addDataSetField(server, publishedDataSetId, &uint32ArrConfig, &f16);
-        UA_Server_addDataSetField(server, publishedDataSetId, &dateTimeConfig, &f15);
-        UA_Server_addDataSetField(server, publishedDataSetId, &guidConfig, &f14);
-        UA_Server_addDataSetField(server, publishedDataSetId, &byteStringConfig, &f13);
-        UA_Server_addDataSetField(server, publishedDataSetId, &stringConfig, &f12);
-        UA_Server_addDataSetField(server, publishedDataSetId, &doubleConfig, &f11);
-        UA_Server_addDataSetField(server, publishedDataSetId, &floatConfig, &f10);
-        UA_Server_addDataSetField(server, publishedDataSetId, &uint64Config, &f9);
-        UA_Server_addDataSetField(server, publishedDataSetId, &uint32Config, &f8);
-        UA_Server_addDataSetField(server, publishedDataSetId, &uint16Config, &f7);
-        UA_Server_addDataSetField(server, publishedDataSetId, &sbyteConfig, &f6);
-        UA_Server_addDataSetField(server, publishedDataSetId, &int64Config, &f5);
-        UA_Server_addDataSetField(server, publishedDataSetId, &int32Config, &f4);
-        UA_Server_addDataSetField(server, publishedDataSetId, &int16Config, &f3);
-        UA_Server_addDataSetField(server, publishedDataSetId, &byteConfig, &f2);
-        UA_Server_addDataSetField(server, publishedDataSetId, &boolToggleConfig, &f1);
-    }
-}
-
-void
-timerCallback(UA_Server *server, void *data) {
-    // DataSet 1
-    // BoolToggle
-    ds1BoolToggleCount++;
-    UA_Variant tmpVari;
-    if (ds1BoolToggleCount >= 3) {
-        if (ds1BoolToggleVal) {
-            ds1BoolToggleVal = false;
-        }
-        else {
-            ds1BoolToggleVal = true;
-        }
-
-        // neuen Wert schreiben
-        UA_Variant_init(&tmpVari);
-
-        UA_Variant_setScalar(&tmpVari, &ds1BoolToggleVal, &UA_TYPES[UA_TYPES_BOOLEAN]);
-        UA_Server_writeValue(server, ds1BoolToggleId, tmpVari);
-        //UA_Variant_clear(&tmpVari);
-        ds1BoolToggleCount = 0;
-    }
-
-    // Int32
-    UA_Variant_init(&tmpVari);
-    ds1Int32Val++;
-    if (ds1Int32Val > 10000) {
-        ds1Int32Val = 0;
-    }
-    UA_Variant_setScalar(&tmpVari, &ds1Int32Val, &UA_TYPES[UA_TYPES_INT32]);
-    UA_Server_writeValue(server, ds1Int32Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Int32Fast
-    UA_Variant_init(&tmpVari);
-    ds1Int32FastVal += 100;
-    if (ds1Int32FastVal > 10000) {
-        ds1Int32FastVal = 0;
-    }
-    UA_Variant_setScalar(&tmpVari, &ds1Int32FastVal, &UA_TYPES[UA_TYPES_INT32]);
-    UA_Server_writeValue(server, ds1Int32FastId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // DateTime
-    UA_Variant_init(&tmpVari);
-    UA_DateTime tmpTime = UA_DateTime_now();
-    UA_Variant_setScalar(&tmpVari, &tmpTime, &UA_TYPES[UA_TYPES_DATETIME]);
-    UA_Server_writeValue(server, ds1DateTimeId, tmpVari);
-
-    // DataSet 2
-    UA_Server_writeValue(server, ds2DateTimeId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // BoolToggle
-    if (ds2BoolToggleVal)
-    {
-        ds2BoolToggleVal = false;
-    }
-    else
-    {
-        ds2BoolToggleVal = true;
-    }
-
-    // neuen Wert schreiben 
-    UA_Variant_init(&tmpVari);
-
-    UA_Variant_setScalar(&tmpVari, &ds2BoolToggleVal, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    UA_Server_writeValue(server, ds2BoolToggleId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Byte
-    UA_Variant_init(&tmpVari);
-    ds2ByteVal++;
-    UA_Variant_setScalar(&tmpVari, &ds2ByteVal, &UA_TYPES[UA_TYPES_BYTE]);
-    UA_Server_writeValue(server, ds2ByteId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Int16
-    UA_Variant_init(&tmpVari);
-    ds2Int16Val++;
-    UA_Variant_setScalar(&tmpVari, &ds2Int16Val, &UA_TYPES[UA_TYPES_INT16]);
-    UA_Server_writeValue(server, ds2Int16Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Int32
-    UA_Variant_init(&tmpVari);
-    ds2Int32Val++;
-    UA_Variant_setScalar(&tmpVari, &ds2Int32Val, &UA_TYPES[UA_TYPES_INT32]);
-    UA_Server_writeValue(server, ds2Int32Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Int64
-    UA_Variant_init(&tmpVari);
-    ds2Int64Val++;
-    UA_Variant_setScalar(&tmpVari, &ds2Int64Val, &UA_TYPES[UA_TYPES_INT64]);
-    UA_Server_writeValue(server, ds2Int64Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // SByte
-    UA_Variant_init(&tmpVari);
-    ds2SByteVal++;
-    UA_Variant_setScalar(&tmpVari, &ds2SByteVal, &UA_TYPES[UA_TYPES_SBYTE]);
-    UA_Server_writeValue(server, ds2SByteId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // UInt16
-    UA_Variant_init(&tmpVari);
-    ds2UInt16Val++;
-    UA_Variant_setScalar(&tmpVari, &ds2UInt16Val, &UA_TYPES[UA_TYPES_UINT16]);
-    UA_Server_writeValue(server, ds2UInt16Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // UInt32
-    UA_Variant_init(&tmpVari);
-    ds2UInt32Val++;
-    UA_Variant_setScalar(&tmpVari, &ds2UInt32Val, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_Server_writeValue(server, ds2UInt32Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // UInt64
-    UA_Variant_init(&tmpVari);
-    ds2UInt64Val++;
-    UA_Variant_setScalar(&tmpVari, &ds2UInt64Val, &UA_TYPES[UA_TYPES_UINT64]);
-    UA_Server_writeValue(server, ds2UInt64Id, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Float
-    UA_Variant_init(&tmpVari);
-    ds2FloatVal++;
-    UA_Variant_setScalar(&tmpVari, &ds2FloatVal, &UA_TYPES[UA_TYPES_FLOAT]);
-    UA_Server_writeValue(server, ds2FloatId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // Double
-    UA_Variant_init(&tmpVari);
-    ds2DoubleVal++;
-    UA_Variant_setScalar(&tmpVari, &ds2DoubleVal, &UA_TYPES[UA_TYPES_DOUBLE]);
-    UA_Server_writeValue(server, ds2DoubleId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // String 
-    UA_Variant_init(&tmpVari);
-    ds2StringIndex++;
-    if (ds2StringIndex >= ds2StringArrayLen)
-    {
-        ds2StringIndex = 0;
-    }
-
-    UA_Variant_setScalar(&tmpVari, &ds2StringArray[ds2StringIndex], &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_writeValue(server, ds2StringId, tmpVari);
-    //UA_Variant_deleteMembers(&tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // ByteString 
-    UA_Variant_init(&tmpVari);
-    UA_ByteString bs;
-    UA_ByteString_init(&bs);
-    UA_ByteString_allocBuffer(&bs, 4);
-    UA_UInt32 ui2 = UA_UInt32_random();
-    memcpy(bs.data, &ui2, 4);
-
-    UA_Variant_setScalar(&tmpVari, &bs, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    UA_Server_writeValue(server, ds2ByteStringId, tmpVari);
-    UA_ByteString_deleteMembers(&bs);
-    //UA_Variant_clear(&tmpVari);
-
-    // Guid 
-    UA_Variant_init(&tmpVari);
-    UA_Guid g = UA_Guid_random();
-    UA_Variant_setScalar(&tmpVari, &g, &UA_TYPES[UA_TYPES_GUID]);
-    UA_Server_writeValue(server, ds2GuidId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-
-    // UInt32Array
-    for (size_t i = 0; i < 10; i++)
-    {
-        ds2UInt32ArrValue[i]++;
-    }
-
-    UA_Variant_init(&tmpVari);
-    UA_Variant_setArray(&tmpVari, ds2UInt32ArrValue, 10, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_Server_writeValue(server, ds2UInt32ArrId, tmpVari);
-    //UA_Variant_clear(&tmpVari);
-}
-
-UA_Boolean running = true;
-static void stopHandler(int sig) {
-    running = false;
-}
-
-static int run(UA_String *transportProfile,
-    UA_NetworkAddressUrlDataType *networkAddressUrl) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setMinimal(config, 4802, NULL);
-
-    /* Details about the connection configuration and handling are located in
-    * the pubsub connection tutorial */
-    config->pubsubTransportLayers =
-        (UA_PubSubTransportLayer *)UA_calloc(2, sizeof(UA_PubSubTransportLayer));
-    if (!config->pubsubTransportLayers) {
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-#ifdef UA_ENABLE_PUBSUB_ETH_UADP
-    config->pubsubTransportLayers[1] = UA_PubSubTransportLayerEthernet();
-    config->pubsubTransportLayersSize++;
-#endif
-
-    addPubSubConnection(server, transportProfile, networkAddressUrl);
-    
-    /* Create a PublishedDataSet based on a PublishedDataSetConfig. */
-    UA_PublishedDataSetConfig publishedDataSetConfig;
-    publishedDataSetConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    publishedDataSetConfig.name = UA_STRING("DataSet 1 (Simple)");
-
-    UA_NodeId publishedDataSetIdent;
-    UA_Server_addPublishedDataSet(server, &publishedDataSetConfig, &publishedDataSetIdent);
-
-    addPublisher1(server, publishedDataSetIdent);
-
-    /* Create a new WriterGroup and configure parameters like the publish interval. */
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig));
-    writerGroupConfig.name = UA_STRING("DataSet WriterGroup");
-    writerGroupConfig.publishingInterval = 500;
-    writerGroupConfig.enabled = UA_FALSE;
-    writerGroupConfig.writerGroupId = 100;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    writerGroupConfig.maxEncapsulatedDataSetMessageCount = 3;
-
-    /* Add the new WriterGroup to an existing Connection. */
-    UA_NodeId writerGroupIdent;
-    UA_Server_addWriterGroup(server, connectionIdent, &writerGroupConfig, &writerGroupIdent);
-
-    /* Create a new Writer and connect it with an existing PublishedDataSet */
-    // DataSetWriter ID 1 with Variant Encoding 
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(UA_DataSetWriterConfig));
-    dataSetWriterConfig.name = UA_STRING("DataSet 1 DataSetWriter");
-    dataSetWriterConfig.dataSetWriterId = 1;
-    //The creation of delta messages is configured in the following line. Value
-    // 0 -> no delta messages are created. 
-    dataSetWriterConfig.keyFrameCount = 10;
-
-    UA_NodeId writerIdentifier;
-    UA_Server_addDataSetWriter(server, writerGroupIdent, publishedDataSetIdent,
-        &dataSetWriterConfig, &writerIdentifier);
-
-    // Published DataSet 2
-    UA_PublishedDataSetConfig publishedDataSetConfig2;
-    publishedDataSetConfig2.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    publishedDataSetConfig2.name = UA_STRING("DataSet 2 (AllTypes)");
-
-    UA_NodeId publishedDataSetIdent2;
-    UA_Server_addPublishedDataSet(server, &publishedDataSetConfig2, &publishedDataSetIdent2);
-
-    addPublisher2(server, publishedDataSetIdent2);
-
-    // DataSet Writer 2
-    // Create a new Writer and connect it with an existing PublishedDataSet
-    UA_DataSetWriterConfig dataSetWriterConfig2;
-
-    memset(&dataSetWriterConfig2, 0, sizeof(UA_DataSetWriterConfig));
-    dataSetWriterConfig2.name = UA_STRING("DataSet 2 DataSetWriter");
-    dataSetWriterConfig2.dataSetWriterId = 2;
-    //The creation of delta messages is configured in the following line. Value
-    // 0 -> no delta messages are created. 
-    dataSetWriterConfig2.keyFrameCount = 10;
-
-    UA_NodeId writerIdentifier2;
-    UA_Server_addDataSetWriter(server, writerGroupIdent, publishedDataSetIdent2,
-        &dataSetWriterConfig2, &writerIdentifier2);
-
-    UA_UInt64 timerCallbackId = 0;
-    UA_Server_addRepeatedCallback(server, (UA_ServerCallback)timerCallback, NULL, 1000, &timerCallbackId);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-static void
-usage(char *progname) {
-    printf("usage: %s <uri> [device]\n", progname);
-}
-
-int main(int argc, char **argv) {
-    UA_String transportProfile =
-        UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_NetworkAddressUrlDataType networkAddressUrl =
-    { UA_STRING_NULL, UA_STRING("opc.udp://239.0.0.1:4840/") };
-
-    if (argc > 1) {
-        if (strcmp(argv[1], "-h") == 0) {
-            usage(argv[0]);
-            return EXIT_SUCCESS;
-        }
-        else if (strncmp(argv[1], "opc.udp://", 10) == 0) {
-            networkAddressUrl.url = UA_STRING(argv[1]);
-        }
-        else if (strncmp(argv[1], "opc.eth://", 10) == 0) {
-            transportProfile =
-                UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp");
-            if (argc < 3) {
-                printf("Error: UADP/ETH needs an interface name\n");
-                return EXIT_FAILURE;
-            }
-            networkAddressUrl.networkInterface = UA_STRING(argv[2]);
-            networkAddressUrl.url = UA_STRING(argv[1]);
-        }
-        else {
-            printf("Error: unknown URI\n");
-            return EXIT_FAILURE;
-        }
-    }
-
-    return run(&transportProfile, &networkAddressUrl);
-}
diff --git a/ext/open62541/examples/pubsub/tutorial_pubsub_connection.c b/ext/open62541/examples/pubsub/tutorial_pubsub_connection.c
deleted file mode 100644
index 9ad0347..0000000
--- a/ext/open62541/examples/pubsub/tutorial_pubsub_connection.c
+++ /dev/null
@@ -1,86 +0,0 @@
-
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-/**
- * The PubSub connection example demonstrate the PubSub TransportLayer configuration and
- * the dynamic creation of PubSub Connections on runtime.
- */
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    /* Add the PubSubTransportLayer implementation to the server config.
-     * The PubSubTransportLayer is a factory to create new connections
-     * on runtime. The UA_PubSubTransportLayer is used for all kinds of
-     * concrete connections e.g. UDP, MQTT, AMQP...
-     */
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *) UA_malloc(sizeof(UA_PubSubTransportLayer));
-    if(!config->pubsubTransportLayers) {
-        UA_Server_delete(server);
-        return -1;
-    }
-    /* It is possible to use multiple PubSubTransportLayers on runtime. The correct factory
-     * is selected on runtime by the standard defined PubSub TransportProfileUri's. */
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    /* Create a new ConnectionConfig. The addPubSubConnection function takes the
-     * config and create a new connection. The Connection identifier is
-     * copied to the NodeId parameter.*/
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(connectionConfig));
-    connectionConfig.name = UA_STRING("UDP-UADP Connection 1");
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    connectionConfig.enabled = UA_TRUE;
-    /* The address and interface is part of the standard
-     * defined UA_NetworkAddressUrlDataType. */
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL , UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.publisherId.numeric = UA_UInt32_random();
-    /* Connection options are given as Key/Value Pairs. The available options are
-     * maybe standard or vendor defined. */
-    UA_KeyValuePair connectionOptions[3];
-    connectionOptions[0].key = UA_QUALIFIEDNAME(0, "ttl");
-    UA_UInt32 ttl = 10;
-    UA_Variant_setScalar(&connectionOptions[0].value, &ttl, &UA_TYPES[UA_TYPES_UINT32]);
-    connectionOptions[1].key = UA_QUALIFIEDNAME(0, "loopback");
-    UA_Boolean loopback = UA_FALSE;
-    UA_Variant_setScalar(&connectionOptions[1].value, &loopback, &UA_TYPES[UA_TYPES_UINT32]);
-    connectionOptions[2].key = UA_QUALIFIEDNAME(0, "reuse");
-    UA_Boolean reuse = UA_TRUE;
-    UA_Variant_setScalar(&connectionOptions[2].value, &reuse, &UA_TYPES[UA_TYPES_UINT32]);
-    connectionConfig.connectionProperties = connectionOptions;
-    connectionConfig.connectionPropertiesSize = 3;
-    /* Create a new concrete connection and add the connection
-     * to the current PubSub configuration. */
-    UA_NodeId connectionIdentifier;
-    UA_StatusCode retval = UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdentifier);
-    if(retval == UA_STATUSCODE_GOOD){
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                    "The PubSub Connection was created successfully!");
-    }
-
-    retval |= UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/pubsub/tutorial_pubsub_publish.c b/ext/open62541/examples/pubsub/tutorial_pubsub_publish.c
deleted file mode 100644
index 6d08681..0000000
--- a/ext/open62541/examples/pubsub/tutorial_pubsub_publish.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * .. _pubsub-tutorial:
- *
- * Working with Publish/Subscribe
- * ------------------------------
- *
- * Work in progress: This Tutorial will be continuously extended during the next
- * PubSub batches. More details about the PubSub extension and corresponding
- * open62541 API are located here: :ref:`pubsub`.
- *
- * Publishing Fields
- * ^^^^^^^^^^^^^^^^^
- * The PubSub publish example demonstrate the simplest way to publish
- * informations from the information model over UDP multicast using the UADP
- * encoding.
- *
- * **Connection handling**
- *
- * PubSubConnections can be created and deleted on runtime. More details about
- * the system preconfiguration and connection can be found in
- * ``tutorial_pubsub_connection.c``.
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_ethernet.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-
-UA_NodeId connectionIdent, publishedDataSetIdent, writerGroupIdent;
-
-static void
-addPubSubConnection(UA_Server *server, UA_String *transportProfile,
-                    UA_NetworkAddressUrlDataType *networkAddressUrl){
-    /* Details about the connection configuration and handling are located
-     * in the pubsub connection tutorial */
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(connectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection 1");
-    connectionConfig.transportProfileUri = *transportProfile;
-    connectionConfig.enabled = UA_TRUE;
-    UA_Variant_setScalar(&connectionConfig.address, networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    /* Changed to static publisherId from random generation to identify
-     * the publisher on Subscriber side */
-    connectionConfig.publisherId.numeric = 2234;
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdent);
-}
-
-/**
- * **PublishedDataSet handling**
- *
- * The PublishedDataSet (PDS) and PubSubConnection are the toplevel entities and
- * can exist alone. The PDS contains the collection of the published fields. All
- * other PubSub elements are directly or indirectly linked with the PDS or
- * connection. */
-static void
-addPublishedDataSet(UA_Server *server) {
-    /* The PublishedDataSetConfig contains all necessary public
-    * informations for the creation of a new PublishedDataSet */
-    UA_PublishedDataSetConfig publishedDataSetConfig;
-    memset(&publishedDataSetConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    publishedDataSetConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    publishedDataSetConfig.name = UA_STRING("Demo PDS");
-    /* Create new PublishedDataSet based on the PublishedDataSetConfig. */
-    UA_Server_addPublishedDataSet(server, &publishedDataSetConfig, &publishedDataSetIdent);
-}
-
-/**
- * **DataSetField handling**
- *
- * The DataSetField (DSF) is part of the PDS and describes exactly one published
- * field. */
-static void
-addDataSetField(UA_Server *server) {
-    /* Add a field to the previous created PublishedDataSet */
-    UA_NodeId dataSetFieldIdent;
-    UA_DataSetFieldConfig dataSetFieldConfig;
-    memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-    dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-    dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-    dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-    dataSetFieldConfig.field.variable.publishParameters.publishedVariable =
-    UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_Server_addDataSetField(server, publishedDataSetIdent,
-                              &dataSetFieldConfig, &dataSetFieldIdent);
-}
-
-/**
- * **WriterGroup handling**
- *
- * The WriterGroup (WG) is part of the connection and contains the primary
- * configuration parameters for the message creation. */
-static void
-addWriterGroup(UA_Server *server) {
-    /* Now we create a new WriterGroupConfig and add the group to the existing
-     * PubSubConnection. */
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig));
-    writerGroupConfig.name = UA_STRING("Demo WriterGroup");
-    writerGroupConfig.publishingInterval = 100;
-    writerGroupConfig.enabled = UA_FALSE;
-    writerGroupConfig.writerGroupId = 100;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    writerGroupConfig.messageSettings.encoding             = UA_EXTENSIONOBJECT_DECODED;
-    writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-    /* The configuration flags for the messages are encapsulated inside the
-     * message- and transport settings extension objects. These extension
-     * objects are defined by the standard. e.g.
-     * UadpWriterGroupMessageDataType */
-    UA_UadpWriterGroupMessageDataType *writerGroupMessage  = UA_UadpWriterGroupMessageDataType_new();
-    /* Change message settings of writerGroup to send PublisherId,
-     * WriterGroupId in GroupHeader and DataSetWriterId in PayloadHeader
-     * of NetworkMessage */
-    writerGroupMessage->networkMessageContentMask          = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
-                                                              (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
-                                                              (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
-                                                              (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
-    writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
-    UA_Server_addWriterGroup(server, connectionIdent, &writerGroupConfig, &writerGroupIdent);
-    UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
-}
-
-/**
- * **DataSetWriter handling**
- *
- * A DataSetWriter (DSW) is the glue between the WG and the PDS. The DSW is
- * linked to exactly one PDS and contains additional informations for the
- * message generation. */
-static void
-addDataSetWriter(UA_Server *server) {
-    /* We need now a DataSetWriter within the WriterGroup. This means we must
-     * create a new DataSetWriterConfig and add call the addWriterGroup function. */
-    UA_NodeId dataSetWriterIdent;
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(UA_DataSetWriterConfig));
-    dataSetWriterConfig.name = UA_STRING("Demo DataSetWriter");
-    dataSetWriterConfig.dataSetWriterId = 62541;
-    dataSetWriterConfig.keyFrameCount = 10;
-    UA_Server_addDataSetWriter(server, writerGroupIdent, publishedDataSetIdent,
-                               &dataSetWriterConfig, &dataSetWriterIdent);
-}
-
-/**
- * That's it! You're now publishing the selected fields. Open a packet
- * inspection tool of trust e.g. wireshark and take a look on the outgoing
- * packages. The following graphic figures out the packages created by this
- * tutorial.
- *
- * .. figure:: ua-wireshark-pubsub.png
- *     :figwidth: 100 %
- *     :alt: OPC UA PubSub communication in wireshark
- *
- * The open62541 subscriber API will be released later. If you want to process
- * the the datagrams, take a look on the ua_network_pubsub_networkmessage.c
- * which already contains the decoding code for UADP messages.
- *
- * It follows the main server code, making use of the above definitions. */
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-static int run(UA_String *transportProfile,
-               UA_NetworkAddressUrlDataType *networkAddressUrl) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    /* Details about the connection configuration and handling are located in
-     * the pubsub connection tutorial */
-    config->pubsubTransportLayers =
-        (UA_PubSubTransportLayer *) UA_calloc(2, sizeof(UA_PubSubTransportLayer));
-    if(!config->pubsubTransportLayers) {
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-#ifdef UA_ENABLE_PUBSUB_ETH_UADP
-    config->pubsubTransportLayers[1] = UA_PubSubTransportLayerEthernet();
-    config->pubsubTransportLayersSize++;
-#endif
-
-    addPubSubConnection(server, transportProfile, networkAddressUrl);
-    addPublishedDataSet(server);
-    addDataSetField(server);
-    addWriterGroup(server);
-    addDataSetWriter(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-static void
-usage(char *progname) {
-    printf("usage: %s <uri> [device]\n", progname);
-}
-
-int main(int argc, char **argv) {
-    UA_String transportProfile =
-        UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_NetworkAddressUrlDataType networkAddressUrl =
-        {UA_STRING_NULL , UA_STRING("opc.udp://224.0.0.22:4840/")};
-
-    if (argc > 1) {
-        if (strcmp(argv[1], "-h") == 0) {
-            usage(argv[0]);
-            return EXIT_SUCCESS;
-        } else if (strncmp(argv[1], "opc.udp://", 10) == 0) {
-            networkAddressUrl.url = UA_STRING(argv[1]);
-        } else if (strncmp(argv[1], "opc.eth://", 10) == 0) {
-            transportProfile =
-                UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp");
-            if (argc < 3) {
-                printf("Error: UADP/ETH needs an interface name\n");
-                return EXIT_FAILURE;
-            }
-            networkAddressUrl.networkInterface = UA_STRING(argv[2]);
-            networkAddressUrl.url = UA_STRING(argv[1]);
-        } else {
-            printf("Error: unknown URI\n");
-            return EXIT_FAILURE;
-        }
-    }
-
-    return run(&transportProfile, &networkAddressUrl);
-}
diff --git a/ext/open62541/examples/pubsub/tutorial_pubsub_subscribe.c b/ext/open62541/examples/pubsub/tutorial_pubsub_subscribe.c
deleted file mode 100644
index c3821d1..0000000
--- a/ext/open62541/examples/pubsub/tutorial_pubsub_subscribe.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-/**
- * IMPORTANT ANNOUNCEMENT
- * The PubSub Subscriber API is currently not finished. This example can be used
- * to receive and display values that are published by tutorial_pubsub_publish
- * example in the TargetVariables of Subscriber Information Model .
- */
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types_generated.h>
-
-#include "ua_pubsub.h"
-
-#ifdef UA_ENABLE_PUBSUB_ETH_UADP
-#include <open62541/plugin/pubsub_ethernet.h>
-#endif
-
-#include <stdio.h>
-#include <signal.h>
-#include <stdlib.h>
-
-UA_NodeId connectionIdentifier;
-UA_NodeId readerGroupIdentifier;
-UA_NodeId readerIdentifier;
-
-UA_DataSetReaderConfig readerConfig;
-
-static void fillTestDataSetMetaData(UA_DataSetMetaDataType *pMetaData);
-
-/* Add new connection to the server */
-static UA_StatusCode
-addPubSubConnection(UA_Server *server, UA_String *transportProfile,
-                    UA_NetworkAddressUrlDataType *networkAddressUrl) {
-    if((server == NULL) || (transportProfile == NULL) ||
-        (networkAddressUrl == NULL)) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    /* Configuration creation for the connection */
-    UA_PubSubConnectionConfig connectionConfig;
-    memset (&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UDPMC Connection 1");
-    connectionConfig.transportProfileUri = *transportProfile;
-    connectionConfig.enabled = UA_TRUE;
-    UA_Variant_setScalar(&connectionConfig.address, networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.publisherId.numeric = UA_UInt32_random ();
-    retval |= UA_Server_addPubSubConnection (server, &connectionConfig, &connectionIdentifier);
-    if (retval != UA_STATUSCODE_GOOD) {
-        return retval;
-    }
-    retval |= UA_PubSubConnection_regist(server, &connectionIdentifier);
-    return retval;
-}
-
-/* Add ReaderGroup to the created connection */
-static UA_StatusCode
-addReaderGroup(UA_Server *server) {
-    if(server == NULL) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_ReaderGroupConfig readerGroupConfig;
-    memset (&readerGroupConfig, 0, sizeof(UA_ReaderGroupConfig));
-    readerGroupConfig.name = UA_STRING("ReaderGroup1");
-    retval |= UA_Server_addReaderGroup(server, connectionIdentifier, &readerGroupConfig,
-                                       &readerGroupIdentifier);
-    return retval;
-}
-
-/* Add DataSetReader to the ReaderGroup */
-static UA_StatusCode
-addDataSetReader(UA_Server *server) {
-    if(server == NULL) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    memset (&readerConfig, 0, sizeof(UA_DataSetReaderConfig));
-    readerConfig.name = UA_STRING("DataSet Reader 1");
-    /* Parameters to filter which DataSetMessage has to be processed
-     * by the DataSetReader */
-    /* The following parameters are used to show that the data published by
-     * tutorial_pubsub_publish.c is being subscribed and is being updated in
-     * the information model */
-    UA_UInt16 publisherIdentifier = 2234;
-    readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
-    readerConfig.publisherId.data = &publisherIdentifier;
-    readerConfig.writerGroupId    = 100;
-    readerConfig.dataSetWriterId  = 62541;
-
-    /* Setting up Meta data configuration in DataSetReader */
-    fillTestDataSetMetaData(&readerConfig.dataSetMetaData);
-    retval |= UA_Server_addDataSetReader(server, readerGroupIdentifier, &readerConfig,
-                                         &readerIdentifier);
-    return retval;
-}
-
-/* Set SubscribedDataSet type to TargetVariables data type
- * Add subscribedvariables to the DataSetReader */
-static UA_StatusCode
-addSubscribedVariables (UA_Server *server, UA_NodeId dataSetReaderId) {
-    if(server == NULL) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_NodeId folderId;
-    UA_String folderName = readerConfig.dataSetMetaData.name;
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    UA_QualifiedName folderBrowseName;
-    if(folderName.length > 0) {
-        oAttr.displayName.locale = UA_STRING ("en-US");
-        oAttr.displayName.text = folderName;
-        folderBrowseName.namespaceIndex = 1;
-        folderBrowseName.name = folderName;
-    }
-    else {
-        oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
-        folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-    }
-
-    UA_Server_addObjectNode (server, UA_NODEID_NULL,
-                             UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER),
-                             UA_NODEID_NUMERIC (0, UA_NS0ID_ORGANIZES),
-                             folderBrowseName, UA_NODEID_NUMERIC (0,
-                             UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-
-    retval |= UA_Server_DataSetReader_addTargetVariables (server, &folderId,
-                                                          dataSetReaderId,
-                                                          UA_PUBSUB_SDS_TARGET);
-    UA_free(readerConfig.dataSetMetaData.fields);
-    return retval;
-}
-
-/* Define MetaData for TargetVariables */
-static void fillTestDataSetMetaData(UA_DataSetMetaDataType *pMetaData) {
-    if(pMetaData == NULL) {
-        return;
-    }
-
-    UA_DataSetMetaDataType_init (pMetaData);
-    pMetaData->name = UA_STRING ("DataSet 1");
-
-    /* Static definition of number of fields size to 4 to create four different
-     * targetVariables of distinct datatype
-     * Currently the publisher sends only DateTime data type */
-    pMetaData->fieldsSize = 4;
-    pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                         &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-
-    /* DateTime DataType */
-    UA_FieldMetaData_init (&pMetaData->fields[0]);
-    UA_NodeId_copy (&UA_TYPES[UA_TYPES_DATETIME].typeId,
-                    &pMetaData->fields[0].dataType);
-    pMetaData->fields[0].builtInType = UA_NS0ID_DATETIME;
-    pMetaData->fields[0].name =  UA_STRING ("DateTime");
-    pMetaData->fields[0].valueRank = -1; /* scalar */
-
-    /* Int32 DataType */
-    UA_FieldMetaData_init (&pMetaData->fields[1]);
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT32].typeId,
-                   &pMetaData->fields[1].dataType);
-    pMetaData->fields[1].builtInType = UA_NS0ID_INT32;
-    pMetaData->fields[1].name =  UA_STRING ("Int32");
-    pMetaData->fields[1].valueRank = -1; /* scalar */
-
-    /* Int64 DataType */
-    UA_FieldMetaData_init (&pMetaData->fields[2]);
-    UA_NodeId_copy(&UA_TYPES[UA_TYPES_INT64].typeId,
-                   &pMetaData->fields[2].dataType);
-    pMetaData->fields[2].builtInType = UA_NS0ID_INT64;
-    pMetaData->fields[2].name =  UA_STRING ("Int64");
-    pMetaData->fields[2].valueRank = -1; /* scalar */
-
-    /* Boolean DataType */
-    UA_FieldMetaData_init (&pMetaData->fields[3]);
-    UA_NodeId_copy (&UA_TYPES[UA_TYPES_BOOLEAN].typeId,
-                    &pMetaData->fields[3].dataType);
-    pMetaData->fields[3].builtInType = UA_NS0ID_BOOLEAN;
-    pMetaData->fields[3].name =  UA_STRING ("BoolToggle");
-    pMetaData->fields[3].valueRank = -1; /* scalar */
-}
-
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-static int
-run(UA_String *transportProfile, UA_NetworkAddressUrlDataType *networkAddressUrl) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-    /* Return value initialized to Status Good */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setMinimal(config, 4801, NULL);
-
-    /* Add the PubSub network layer implementation to the server config.
-     * The TransportLayer is acting as factory to create new connections
-     * on runtime. Details about the PubSubTransportLayer can be found inside the
-     * tutorial_pubsub_connection */
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *)
-        UA_calloc(2, sizeof(UA_PubSubTransportLayer));
-    if(!config->pubsubTransportLayers) {
-        UA_Server_delete(server);
-        return EXIT_FAILURE;
-    }
-
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-#ifdef UA_ENABLE_PUBSUB_ETH_UADP
-    config->pubsubTransportLayers[1] = UA_PubSubTransportLayerEthernet();
-    config->pubsubTransportLayersSize++;
-#endif
-
-    /* API calls */
-    /* Add PubSubConnection */
-    retval |= addPubSubConnection(server, transportProfile, networkAddressUrl);
-    if (retval != UA_STATUSCODE_GOOD)
-        return EXIT_FAILURE;
-
-    /* Add ReaderGroup to the created PubSubConnection */
-    retval |= addReaderGroup(server);
-    if (retval != UA_STATUSCODE_GOOD)
-        return EXIT_FAILURE;
-
-    /* Add DataSetReader to the created ReaderGroup */
-    retval |= addDataSetReader(server);
-    if (retval != UA_STATUSCODE_GOOD)
-        return EXIT_FAILURE;
-
-    /* Add SubscribedVariables to the created DataSetReader */
-    retval |= addSubscribedVariables(server, readerIdentifier);
-    if (retval != UA_STATUSCODE_GOOD)
-        return EXIT_FAILURE;
-
-    retval = UA_Server_run(server, &running);
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-static void
-usage(char *progname) {
-    printf("usage: %s <uri> [device]\n", progname);
-}
-
-int main(int argc, char **argv) {
-    UA_String transportProfile = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL , UA_STRING("opc.udp://224.0.0.22:4840/")};
-    if(argc > 1) {
-        if(strcmp(argv[1], "-h") == 0) {
-            usage(argv[0]);
-            return EXIT_SUCCESS;
-        } else if(strncmp(argv[1], "opc.udp://", 10) == 0) {
-            networkAddressUrl.url = UA_STRING(argv[1]);
-        } else if(strncmp(argv[1], "opc.eth://", 10) == 0) {
-            transportProfile =
-                UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp");
-            if(argc < 3) {
-                printf("Error: UADP/ETH needs an interface name\n");
-                return EXIT_FAILURE;
-            }
-
-            networkAddressUrl.networkInterface = UA_STRING(argv[2]);
-            networkAddressUrl.url = UA_STRING(argv[1]);
-        } else {
-            printf ("Error: unknown URI\n");
-            return EXIT_FAILURE;
-        }
-    }
-
-    return run(&transportProfile, &networkAddressUrl);
-}
-
diff --git a/ext/open62541/examples/pubsub_realtime/README.md b/ext/open62541/examples/pubsub_realtime/README.md
deleted file mode 100644
index 0f1ca65..0000000
--- a/ext/open62541/examples/pubsub_realtime/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# open62541 Realtime OPC UA PubSub Publisher
-
-This example is a self-contained PubSub publisher over raw Ethernet. It
-showcases the realtime-capabilities of OPC UA PubSub. The core idea is that the
-publisher callback can be triggered from a time-triggered system interrupt and
-sends out the PubSub message within the interrupt.
-
-The publisher retrieves its configuration and the payload data from the
-information model of an OPC UA server. (It could also be run in a standalone
-mode without an OPC UA server.) Since the publisher interrupt preempts the
-execution of the normal OPC UA server, the information model needs to be
-consistent at every time (reentrant). The specific techniques used to make the
-OPC UA server reentrant are described in this publication:
-
-```
-@inproceedings{pfrommer2018open,
-  title={Open source OPC UA PubSub over TSN for realtime industrial communication},
-  author={Pfrommer, Julius and Ebner, Andreas and Ravikumar, Siddharth and Karunakaran, Bhagath},
-  booktitle={2018 IEEE 23rd International Conference on Emerging Technologies and Factory Automation (ETFA)},
-  pages={1087--1090},
-  year={2018},
-  organization={IEEE}
-}
-```
-
-Please cite if you use this work.
-
-OPC UA PubSub for open62541 is funded by an industry consortium in the context
-of an OSADL project (Open Source Automation Development Lab). Technical
-development is conducted by Fraunhofer IOSB and Kalycito Infotech.
-
-https://www.osadl.org/OPC-UA-TSN.opcua-tsn.0.html
-
-## Realtime communication with Time-Sensitive Networking (TSN)
-
-OPC UA PubSub can be used together with TSN for hard-realtime Ethernet-based
-communication. Vendor-specific APIs are commonly used for TSN capabilities. This
-example only uses the standard Linux API for raw Ethernet. Vendor-specific
-examples may be added at a later time.
-
-## Building the RT Publisher
-
-The main open62541 library needs to be built with the following build options
-enabled for the realtime PubSub example. Note that some of the other examples
-supplied with open62541 will not link against the library with these build
-options. For good timings, ensure that the `CMAKE_BUILD_TYPE` is set to
-`Release`.
-
-- UA_ENABLE_PUBSUB
-- UA_ENABLE_PUBSUB_ETH_UADP
-- UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING
-- UA_ENABLE_MALLOC_SINGLETON
-- UA_ENABLE_IMMUTABLE_NODES
-
-The publisher contains some hard-coded values that need to be adjusted to
-specific systems. Please check the top definitions in
-`pubsub_interrupt_publish.c` and `start_rt_publish.sh`.
-
-The publisher code is built and linked against the main open62541 library as follows:
-
-`gcc -O2 ../examples/pubsub_realtime/pubsub_interrupt_publish.c ../examples/pubsub_realtime/bufmalloc.c -I../include -I../plugins/include -Isrc_generated -I../arch/posix -I../arch -I../plugins/networking bin/libopen62541.a -lrt -o rt_publisher`
-
-## Running the RT Publisher
-
-The publisher must be run as root for direct access to the Ethernet interface.
-
-`# ./rt_publisher`
-
-The example contains a script to be used with RT-Preempt Linux kernel. The
-following command starts the publisher, locks the process to a specific CPU, and
-sets the scheduling policy.
-
-`# start_rt_publish.sh ./rt_publisher`
-
-The measurements are written to a file (publisher_measurement.csv) with the
-following fields for every publish callback:
-
-- Counter
-- Publication Interval
-- Nominal time for the current publish
-- Start delay from the nominal time
-- Duration of the publish callback
diff --git a/ext/open62541/examples/pubsub_realtime/bufmalloc.c b/ext/open62541/examples/pubsub_realtime/bufmalloc.c
deleted file mode 100644
index 015b6e7..0000000
--- a/ext/open62541/examples/pubsub_realtime/bufmalloc.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include "bufmalloc.h"
-
-#define MALLOCMEMBUFSIZE 16384
-
-/* Every element has the memory layout [length (size_t) | buf (length * sizeof(char)) ... ].
- * The pointer to buf is returned. */
-static char membuf[MALLOCMEMBUFSIZE];
-static size_t pos;
-
-static void * membufMalloc(size_t size) {
-    if(pos + size + sizeof(size_t) > MALLOCMEMBUFSIZE)
-        return NULL;
-    char *begin = &membuf[pos];
-    *((size_t*)begin) = size;
-    pos += size + sizeof(size_t);
-    return &begin[sizeof(size_t)];
-}
-
-static void membufFree(void *ptr) {
-    /* Don't do anyting */
-}
-
-static void * membufCalloc(size_t nelem, size_t elsize) {
-    size_t total = nelem * elsize;
-    void *mem = membufMalloc(total);
-    if(!mem)
-        return NULL;
-    memset(mem, 0, total);
-    return mem;
-}
-
-static void * (membufRealloc)(void *ptr, size_t size) {
-    size_t orig_size = ((size_t*)ptr)[-1];
-    if(size <= orig_size)
-        return ptr;
-    void *mem = membufMalloc(size);
-    if(!mem)
-        return NULL;
-    memcpy(mem, ptr, orig_size);
-    return mem;
-}
-
-void resetMembuf(void) {
-    pos = 0;
-}
-
-void useMembufAlloc(void) {
-    pos = 0;
-    UA_globalMalloc = membufMalloc;
-    UA_globalFree = membufFree;
-    UA_globalCalloc = membufCalloc;
-    UA_globalRealloc = membufRealloc;
-}
-
-void useNormalAlloc(void) {
-    UA_globalMalloc = malloc;
-    UA_globalFree = free;
-    UA_globalCalloc = calloc;
-    UA_globalRealloc = realloc;
-}
diff --git a/ext/open62541/examples/pubsub_realtime/bufmalloc.h b/ext/open62541/examples/pubsub_realtime/bufmalloc.h
deleted file mode 100644
index 4ea905a..0000000
--- a/ext/open62541/examples/pubsub_realtime/bufmalloc.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include <open62541/config.h>
-
-void resetMembuf(void);
-void useMembufAlloc(void);
-void useNormalAlloc(void);
diff --git a/ext/open62541/examples/pubsub_realtime/etfa18-pfrommer-tsn-pubsub.pdf b/ext/open62541/examples/pubsub_realtime/etfa18-pfrommer-tsn-pubsub.pdf
deleted file mode 100644
index 26b434e..0000000
--- a/ext/open62541/examples/pubsub_realtime/etfa18-pfrommer-tsn-pubsub.pdf
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/examples/pubsub_realtime/pubsub_interrupt_publish.c b/ext/open62541/examples/pubsub_realtime/pubsub_interrupt_publish.c
deleted file mode 100644
index 4275f93..0000000
--- a/ext/open62541/examples/pubsub_realtime/pubsub_interrupt_publish.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018-2019 (c) Kalycito Infotech
- *    Copyright 2019 (c) Fraunhofer IOSB (Author: Andreas Ebner)
- *    Copyright 2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include <signal.h>
-#include <stdio.h>
-#include <time.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_ethernet.h>
-#include "bufmalloc.h"
-
-#define ETH_PUBLISH_ADDRESS      "opc.eth://0a-00-27-00-00-08"
-#define ETH_INTERFACE            "enp0s8"
-#define MAX_MEASUREMENTS         10000
-#define MILLI_AS_NANO_SECONDS    (1000 * 1000)
-#define SECONDS_AS_NANO_SECONDS  (1000 * 1000 * 1000)
-#define CLOCKID                  CLOCK_MONOTONIC_RAW
-#define SIG                      SIGUSR1
-#define PUB_INTERVAL             0.25 /* Publish interval in milliseconds */
-#define DATA_SET_WRITER_ID       62541
-#define MEASUREMENT_OUTPUT       "publisher_measurement.csv"
-
-UA_NodeId counterNodePublisher = {1, UA_NODEIDTYPE_NUMERIC, {1234}};
-UA_Int64 pubIntervalNs;
-UA_ServerCallback pubCallback = NULL;
-UA_Server *pubServer;
-UA_Boolean running = true;
-void *pubData;
-timer_t pubEventTimer;
-struct sigevent pubEvent;
-struct sigaction signalAction;
-
-/* Arrays to store measurement data */
-UA_Int32 currentPublishCycleTime[MAX_MEASUREMENTS+1];
-struct timespec calculatedCycleStartTime[MAX_MEASUREMENTS+1];
-struct timespec cycleStartDelay[MAX_MEASUREMENTS+1];
-struct timespec cycleDuration[MAX_MEASUREMENTS+1];
-size_t publisherMeasurementsCounter  = 0;
-
-static void
-timespec_diff(struct timespec *start, struct timespec *stop,
-              struct timespec *result) {
-    if((stop->tv_nsec - start->tv_nsec) < 0) {
-        result->tv_sec = stop->tv_sec - start->tv_sec - 1;
-        result->tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000;
-    } else {
-        result->tv_sec = stop->tv_sec - start->tv_sec;
-        result->tv_nsec = stop->tv_nsec - start->tv_nsec;
-    }
-}
-
-/* Used to adjust the nanosecond > 1s field value */
-static void
-nanoSecondFieldConversion(struct timespec *timeSpecValue) {
-    while(timeSpecValue->tv_nsec > (SECONDS_AS_NANO_SECONDS - 1)) {
-        timeSpecValue->tv_sec += 1;
-        timeSpecValue->tv_nsec -= SECONDS_AS_NANO_SECONDS;
-    }
-}
-
-/* Signal handler */
-static void
-publishInterrupt(int sig, siginfo_t* si, void* uc) {
-    if(si->si_value.sival_ptr != &pubEventTimer) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "stray signal");
-        return;
-    }
-
-    /* Execute the publish callback in the interrupt */
-    struct timespec begin, end;
-    clock_gettime(CLOCKID, &begin);
-    useMembufAlloc();
-    pubCallback(pubServer, pubData);
-    useNormalAlloc();
-    clock_gettime(CLOCKID, &end);
-
-    if(publisherMeasurementsCounter >= MAX_MEASUREMENTS)
-        return;
-
-    /* Save current configured publish interval */
-    currentPublishCycleTime[publisherMeasurementsCounter] = pubIntervalNs;
-
-    /* Save the difference to the calculated time */
-    timespec_diff(&calculatedCycleStartTime[publisherMeasurementsCounter],
-                  &begin, &cycleStartDelay[publisherMeasurementsCounter]);
-
-    /* Save the duration of the publish callback */
-    timespec_diff(&begin, &end, &cycleDuration[publisherMeasurementsCounter]);
-
-    publisherMeasurementsCounter++;
-
-    /* Save the calculated starting time for the next cycle */
-    calculatedCycleStartTime[publisherMeasurementsCounter].tv_nsec =
-        calculatedCycleStartTime[publisherMeasurementsCounter - 1].tv_nsec + pubIntervalNs;
-    calculatedCycleStartTime[publisherMeasurementsCounter].tv_sec =
-        calculatedCycleStartTime[publisherMeasurementsCounter - 1].tv_sec;
-    nanoSecondFieldConversion(&calculatedCycleStartTime[publisherMeasurementsCounter]);
-
-    /* Write the pubsub measurement data */
-    if(publisherMeasurementsCounter == MAX_MEASUREMENTS) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                    "Logging the measurements to %s", MEASUREMENT_OUTPUT);
-
-        FILE *fpPublisher = fopen(MEASUREMENT_OUTPUT, "w");
-        for(UA_UInt32 i = 0; i < publisherMeasurementsCounter; i++) {
-            fprintf(fpPublisher, "%u, %u, %ld.%09ld, %ld.%09ld, %ld.%09ld\n",
-                    i,
-                    currentPublishCycleTime[i],
-                    calculatedCycleStartTime[i].tv_sec,
-                    calculatedCycleStartTime[i].tv_nsec,
-                    cycleStartDelay[i].tv_sec,
-                    cycleStartDelay[i].tv_nsec,
-                    cycleDuration[i].tv_sec,
-                    cycleDuration[i].tv_nsec);
-        }
-        fclose(fpPublisher);
-    }
-}
-
-/* The following three methods are originally defined in
- * /src/pubsub/ua_pubsub_manager.c. We provide a custom implementation here to
- * use system interrupts instead if time-triggered callbacks in the OPC UA
- * server control flow. */
-
-UA_StatusCode
-UA_PubSubManager_addRepeatedCallback(UA_Server *server,
-                                     UA_ServerCallback callback,
-                                     void *data, UA_Double interval_ms,
-                                     UA_UInt64 *callbackId) {
-    if(pubCallback) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                       "At most one publisher can be registered for interrupt callbacks");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "Adding a publisher with a cycle time of %lf milliseconds", interval_ms);
-
-    /* Set global values for the publish callback */
-    int resultTimerCreate = 0;
-    pubServer = server;
-    pubCallback = callback;
-    pubData = data;
-    pubIntervalNs = (UA_Int64) (interval_ms * MILLI_AS_NANO_SECONDS);
-
-    /* Handle the signal */
-    memset(&signalAction, 0, sizeof(signalAction));
-    signalAction.sa_flags = SA_SIGINFO;
-    signalAction.sa_sigaction = publishInterrupt;
-    sigemptyset(&signalAction.sa_mask);
-    sigaction(SIG, &signalAction, NULL);
-
-    /* Create the timer */
-    memset(&pubEventTimer, 0, sizeof(pubEventTimer));
-    pubEvent.sigev_notify = SIGEV_SIGNAL;
-    pubEvent.sigev_signo = SIG;
-    pubEvent.sigev_value.sival_ptr = &pubEventTimer;
-    resultTimerCreate = timer_create(CLOCKID, &pubEvent, &pubEventTimer);
-    if(resultTimerCreate != 0) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                       "Failed to create a system event");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Arm the timer */
-    struct itimerspec timerspec;
-    timerspec.it_interval.tv_sec = (long int) (pubIntervalNs / (SECONDS_AS_NANO_SECONDS));
-    timerspec.it_interval.tv_nsec = (long int) (pubIntervalNs % SECONDS_AS_NANO_SECONDS);
-    timerspec.it_value.tv_sec = (long int) (pubIntervalNs / (SECONDS_AS_NANO_SECONDS));
-    timerspec.it_value.tv_nsec = (long int) (pubIntervalNs % SECONDS_AS_NANO_SECONDS);
-    resultTimerCreate = timer_settime(pubEventTimer, 0, &timerspec, NULL);
-    if(resultTimerCreate != 0) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                       "Failed to arm the system timer");
-        timer_delete(pubEventTimer);
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Start taking measurements */
-    publisherMeasurementsCounter = 0;
-    clock_gettime(CLOCKID, &calculatedCycleStartTime[0]);
-    calculatedCycleStartTime[0].tv_nsec += pubIntervalNs;
-    nanoSecondFieldConversion(&calculatedCycleStartTime[0]);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_PubSubManager_changeRepeatedCallbackInterval(UA_Server *server,
-                                                UA_UInt64 callbackId,
-                                                UA_Double interval_ms) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "Switching the publisher cycle to %lf milliseconds", interval_ms);
-
-    struct itimerspec timerspec;
-    int resultTimerCreate = 0;
-    pubIntervalNs = (UA_Int64) (interval_ms * MILLI_AS_NANO_SECONDS);
-    timerspec.it_interval.tv_sec = (long int) (pubIntervalNs % SECONDS_AS_NANO_SECONDS);
-    timerspec.it_interval.tv_nsec = (long int) (pubIntervalNs % SECONDS_AS_NANO_SECONDS);
-    timerspec.it_value.tv_sec = (long int) (pubIntervalNs / (SECONDS_AS_NANO_SECONDS));
-    timerspec.it_value.tv_nsec = (long int) (pubIntervalNs % SECONDS_AS_NANO_SECONDS);
-    resultTimerCreate = timer_settime(pubEventTimer, 0, &timerspec, NULL);
-    if(resultTimerCreate != 0) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                       "Failed to arm the system timer");
-        timer_delete(pubEventTimer);
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    clock_gettime(CLOCKID, &calculatedCycleStartTime[publisherMeasurementsCounter]);
-    calculatedCycleStartTime[publisherMeasurementsCounter].tv_nsec += pubIntervalNs;
-    nanoSecondFieldConversion(&calculatedCycleStartTime[publisherMeasurementsCounter]);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_PubSubManager_removeRepeatedPubSubCallback(UA_Server *server, UA_UInt64 callbackId) {
-    timer_delete(pubEventTimer);
-    pubCallback = NULL; /* So that a new callback can be registered */
-}
-
-static void
-addPubSubConfiguration(UA_Server* server) {
-    UA_NodeId connectionIdent;
-    UA_NodeId publishedDataSetIdent;
-    UA_NodeId writerGroupIdent;
-
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(connectionConfig));
-    connectionConfig.name = UA_STRING("UDP-UADP Connection 1");
-    connectionConfig.transportProfileUri =
-        UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp");
-    connectionConfig.enabled = true;
-    UA_NetworkAddressUrlDataType networkAddressUrl =
-        {UA_STRING(ETH_INTERFACE), UA_STRING(ETH_PUBLISH_ADDRESS)};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.publisherId.numeric = UA_UInt32_random();
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdent);
-
-    UA_PublishedDataSetConfig publishedDataSetConfig;
-    memset(&publishedDataSetConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    publishedDataSetConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    publishedDataSetConfig.name = UA_STRING("Demo PDS");
-    UA_Server_addPublishedDataSet(server, &publishedDataSetConfig,
-                                  &publishedDataSetIdent);
-
-    UA_NodeId dataSetFieldIdentCounter;
-    UA_DataSetFieldConfig counterValue;
-    memset(&counterValue, 0, sizeof(UA_DataSetFieldConfig));
-    counterValue.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-    counterValue.field.variable.fieldNameAlias = UA_STRING ("Counter Variable 1");
-    counterValue.field.variable.promotedField = UA_FALSE;
-    counterValue.field.variable.publishParameters.publishedVariable = counterNodePublisher;
-    counterValue.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_Server_addDataSetField(server, publishedDataSetIdent, &counterValue,
-                              &dataSetFieldIdentCounter);
-
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig));
-    writerGroupConfig.name = UA_STRING("Demo WriterGroup");
-    writerGroupConfig.publishingInterval = PUB_INTERVAL;
-    writerGroupConfig.enabled = UA_FALSE;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    UA_Server_addWriterGroup(server, connectionIdent,
-                             &writerGroupConfig, &writerGroupIdent);
-
-    UA_NodeId dataSetWriterIdent;
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(UA_DataSetWriterConfig));
-    dataSetWriterConfig.name = UA_STRING("Demo DataSetWriter");
-    dataSetWriterConfig.dataSetWriterId = DATA_SET_WRITER_ID;
-    dataSetWriterConfig.keyFrameCount = 10;
-    UA_Server_addDataSetWriter(server, writerGroupIdent, publishedDataSetIdent,
-                               &dataSetWriterConfig, &dataSetWriterIdent);
-}
-
-static void
-addServerNodes(UA_Server* server) {
-    UA_UInt64 publishValue = 0;
-    UA_VariableAttributes publisherAttr = UA_VariableAttributes_default;
-    UA_Variant_setScalar(&publisherAttr.value, &publishValue, &UA_TYPES[UA_TYPES_UINT64]);
-    publisherAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Publisher Counter");
-    publisherAttr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_Server_addVariableNode(server, counterNodePublisher,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              UA_QUALIFIEDNAME(1, "Publisher Counter"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              publisherAttr, NULL, NULL);
-}
-
-/* Stop signal */
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = UA_FALSE;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerEthernet();
-    config->pubsubTransportLayersSize++;
-
-    addServerNodes(server);
-    addPubSubConfiguration(server);
-
-    /* Run the server */
-    UA_StatusCode retval = UA_Server_run(server, &running);
-    UA_Server_delete(server);
-    UA_ServerConfig_delete(config);
-
-    return (int)retval;
-}
diff --git a/ext/open62541/examples/pubsub_realtime/start_rt_publish.sh b/ext/open62541/examples/pubsub_realtime/start_rt_publish.sh
deleted file mode 100644
index 4589f25..0000000
--- a/ext/open62541/examples/pubsub_realtime/start_rt_publish.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash
-
-#program path or install dir
-IF=enp0s8
-CPU_NR=3
-PRIO=90
-OLDDIR=$(pwd)
-
-reset() {
-  #standard on most systems. ondemand -> Dynamic CPU-Freq.
-  echo ondemand >/sys/devices/system/cpu/cpu$CPU_NR/cpufreq/scaling_governor
-  cd /sys/devices/system/cpu/cpu$CPU_NR/cpuidle
-  for i in *
-  do
-    #~disable sleep state
-    echo 0 >$i/disable
-  done
-
-  phy=$IF #get interface name
-  #get pid's from interface irq
-  for i in `ps ax | grep -v grep | grep $phy | sed "s/^ //" | cut -d" " -f1`
-  do
-    #retrive or set a process's CPU affinity
-    taskset -pc 0-$CPU_NR $i >/dev/null
-    #manipulate the real-time attributes of a process -p priority -f scheduling policy to SCHED_FIFO
-    chrt -pf 50 $i
-  done
-  #distribute hardware interrupts across processsors on a muliprocessor system
-  systemctl start irqbalance
-}
-
-trap reset ERR
-systemctl stop irqbalance
-
-phy=$IF
-for i in `ps ax | grep -v grep | grep $phy | sed "s/^ //" | cut -d" " -f1`
-do
-  taskset -pc $CPU_NR $i >/dev/null
-  chrt -pf $PRIO $i
-done
-
-cd /sys/devices/system/cpu/cpu$CPU_NR/cpuidle
-for i in `ls -1r`
-do
-  echo 1 >$i/disable
-done
-
-echo performance >/sys/devices/system/cpu/cpu$CPU_NR/cpufreq/scaling_governor
-
-cd $OLDDIR
-taskset -c $CPU_NR chrt -f $PRIO $1
diff --git a/ext/open62541/examples/server.cpp b/ext/open62541/examples/server.cpp
deleted file mode 100644
index 08d55da..0000000
--- a/ext/open62541/examples/server.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include "open62541.h"
-
-#include <signal.h>
-#include <stdlib.h>
-
-/* Build Instructions (Linux)
- * - gcc -std=c99 -c open62541.c
- * - g++ server.cpp open62541.o -o server */
-
-using namespace std;
-
-UA_Boolean running = true;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main() {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    // add a variable node to the adresspace
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalarCopy(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT_ALLOC("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US","the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING_ALLOC(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME_ALLOC(1, "the answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                              parentReferenceNodeId, myIntegerName,
-                              UA_NODEID_NULL, attr, NULL, NULL);
-
-    /* allocations on the heap need to be freed */
-    UA_VariableAttributes_clear(&attr);
-    UA_NodeId_clear(&myIntegerNodeId);
-    UA_QualifiedName_clear(&myIntegerName);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/server_ctt.c b/ext/open62541/examples/server_ctt.c
deleted file mode 100644
index 43e633f..0000000
--- a/ext/open62541/examples/server_ctt.c
+++ /dev/null
@@ -1,1263 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- * Copyright 2019 (c) Kalycito Infotech Private Limited
- * Copyright 2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifdef _MSC_VER
-#define _CRT_SECURE_NO_WARNINGS /* disable fopen deprication warning in msvs */
-#endif
-
-#include <open62541/server.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/pki_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-#include "common.h"
-
-#define MAX_OPERATION_LIMIT 10000
-
-/* This server is configured to the Compliance Testing Tools (CTT) against. The
- * corresponding CTT configuration is available at
- * https://github.com/open62541/open62541-ctt */
-
-static const UA_NodeId baseDataVariableType = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEDATAVARIABLETYPE}};
-static const UA_NodeId accessDenied = {1, UA_NODEIDTYPE_NUMERIC, {1337}};
-
-/* Custom AccessControl policy that disallows access to one specific node */
-static UA_Byte
-getUserAccessLevel_disallowSpecific(UA_Server *server, UA_AccessControl *ac,
-                                    const UA_NodeId *sessionId, void *sessionContext,
-                                    const UA_NodeId *nodeId, void *nodeContext) {
-    if(UA_NodeId_equal(nodeId, &accessDenied))
-        return 0x00;
-    return 0xFF;
-}
-
-/* Datasource Example */
-static UA_StatusCode
-readTimeData(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_DateTime currentTime = UA_DateTime_now();
-    UA_Variant_setScalarCopy(&value->value, &currentTime, &UA_TYPES[UA_TYPES_DATETIME]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = currentTime;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomBoolData(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_Boolean toggle = !((UA_UInt32_random() % 10 ) % 2);
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomInt16Data(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_Int16 toggle = (UA_Int16)UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_INT16]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomInt32Data(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_Int32 toggle = (UA_Int32)UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_INT32]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomInt64Data(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-    value->hasStatus = true;
-    value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-    return UA_STATUSCODE_GOOD;
-    }
-        UA_Int64 toggle = (UA_Int64)UA_UInt32_random();
-        UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_INT64]);
-        value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomUInt16Data(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_UInt16 toggle = (UA_UInt16)UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_UINT16]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomUInt32Data(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_UInt32 toggle = UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_UINT32]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomUInt64Data(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_UInt64 toggle = UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_UINT64]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomStringData (UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    char randomName[12];
-    UA_snprintf(randomName, 12, "Random%d", UA_UInt32_random());
-    UA_String toggle = UA_STRING(randomName);
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_STRING]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-   return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomFloatData (UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_Float toggle = (UA_Float)UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_FLOAT]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-   return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readRandomDoubleData (UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_Double toggle = (UA_Double)UA_UInt32_random();
-    UA_Variant_setScalarCopy(&value->value, &toggle, &UA_TYPES[UA_TYPES_DOUBLE]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-   return UA_STATUSCODE_GOOD;
-}
-static UA_StatusCode
-readByteString (UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext,
-             UA_Boolean sourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    char randomName[8];
-    UA_snprintf(randomName, 8, "%d%d", UA_UInt32_random(), UA_UInt32_random());
-    UA_ByteString randomByte = UA_BYTESTRING(randomName);
-    UA_Variant_setScalarCopy(&value->value, &randomByte, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-   return UA_STATUSCODE_GOOD;
-}
-
-/* Method Node Example */
-#ifdef UA_ENABLE_METHODCALLS
-
-static UA_StatusCode
-helloWorld(UA_Server *server,
-           const UA_NodeId *sessionId, void *sessionContext,
-           const UA_NodeId *methodId, void *methodContext,
-           const UA_NodeId *objectId, void *objectContext,
-           size_t inputSize, const UA_Variant *input,
-           size_t outputSize, UA_Variant *output) {
-    /* input is a scalar string (checked by the server) */
-    UA_String *name = (UA_String *)input[0].data;
-    UA_String hello = UA_STRING("Hello ");
-    UA_String greet;
-    greet.length = hello.length + name->length;
-    greet.data = (UA_Byte *)UA_malloc(greet.length);
-    memcpy(greet.data, hello.data, hello.length);
-    memcpy(greet.data + hello.length, name->data, name->length);
-    UA_Variant_setScalarCopy(output, &greet, &UA_TYPES[UA_TYPES_STRING]);
-    UA_String_clear(&greet);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-noargMethod(UA_Server *server,
-            const UA_NodeId *sessionId, void *sessionContext,
-            const UA_NodeId *methodId, void *methodContext,
-            const UA_NodeId *objectId, void *objectContext,
-            size_t inputSize, const UA_Variant *input,
-            size_t outputSize, UA_Variant *output) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-outargMethod(UA_Server *server,
-             const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *methodId, void *methodContext,
-             const UA_NodeId *objectId, void *objectContext,
-             size_t inputSize, const UA_Variant *input,
-             size_t outputSize, UA_Variant *output) {
-    UA_Int32 out = 42;
-    UA_Variant_setScalarCopy(output, &out, &UA_TYPES[UA_TYPES_INT32]);
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-static void
-setInformationModel(UA_Server *server) {
-    /* add a static variable node to the server */
-    UA_VariableAttributes myVar = UA_VariableAttributes_default;
-    myVar.description = UA_LOCALIZEDTEXT("en-US", "the answer");
-    myVar.displayName = UA_LOCALIZEDTEXT("en-US", "the answer");
-    myVar.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    myVar.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    myVar.valueRank = UA_VALUERANK_SCALAR;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId,
-                              myIntegerName, baseDataVariableType, myVar, NULL, NULL);
-
-    /* add a static variable that is readable but not writable*/
-    myVar = UA_VariableAttributes_default;
-    myVar.description = UA_LOCALIZEDTEXT("en-US", "the answer - not readable");
-    myVar.displayName = UA_LOCALIZEDTEXT("en-US", "the answer - not readable");
-    myVar.accessLevel = UA_ACCESSLEVELMASK_WRITE;
-    myVar.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    myVar.valueRank = UA_VALUERANK_SCALAR;
-    UA_Variant_setScalar(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    const UA_QualifiedName myInteger2Name = UA_QUALIFIEDNAME(1, "the answer - not readable");
-    const UA_NodeId myInteger2NodeId = UA_NODEID_STRING(1, "the.answer.no.read");
-    UA_Server_addVariableNode(server, myInteger2NodeId, parentNodeId, parentReferenceNodeId,
-                              myInteger2Name, baseDataVariableType, myVar, NULL, NULL);
-
-    /* add a variable that is not readable or writable for the current user */
-    myVar = UA_VariableAttributes_default;
-    myVar.description = UA_LOCALIZEDTEXT("en-US", "the answer - not current user");
-    myVar.displayName = UA_LOCALIZEDTEXT("en-US", "the answer - not current user");
-    myVar.accessLevel = UA_ACCESSLEVELMASK_WRITE;
-    myVar.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    myVar.valueRank = UA_VALUERANK_SCALAR;
-    myVar.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&myVar.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    const UA_QualifiedName accessDeniedName = UA_QUALIFIEDNAME(1, "the answer - not current user");
-    UA_Server_addVariableNode(server, accessDenied, parentNodeId, parentReferenceNodeId,
-                              accessDeniedName, baseDataVariableType, myVar, NULL, NULL);
-
-    /* add a variable with the datetime data source */
-    UA_DataSource dateDataSource;
-    dateDataSource.read = readTimeData;
-    dateDataSource.write = NULL;
-    UA_VariableAttributes v_attr = UA_VariableAttributes_default;
-    v_attr.description = UA_LOCALIZEDTEXT("en-US", "current time");
-    v_attr.displayName = UA_LOCALIZEDTEXT("en-US", "current time");
-    v_attr.accessLevel = UA_ACCESSLEVELMASK_READ;
-    v_attr.dataType = UA_TYPES[UA_TYPES_DATETIME].typeId;
-    v_attr.valueRank = UA_VALUERANK_SCALAR;
-    const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
-    UA_Server_addDataSourceVariableNode(server, UA_NODEID_NUMERIC(1, 2345),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), dateName,
-                                        baseDataVariableType, v_attr, dateDataSource, NULL, NULL);
-
-    /* add a bytestring variable with some content */
-    myVar = UA_VariableAttributes_default;
-    myVar.description = UA_LOCALIZEDTEXT("", "");
-    myVar.displayName = UA_LOCALIZEDTEXT("", "example bytestring");
-    myVar.dataType = UA_TYPES[UA_TYPES_BYTESTRING].typeId;
-    myVar.valueRank = UA_VALUERANK_SCALAR;
-    myVar.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_ByteString myByteString = UA_BYTESTRING("test123\0test123");
-    UA_Variant_setScalar(&myVar.value, &myByteString, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    const UA_QualifiedName byteStringName = UA_QUALIFIEDNAME(1, "example bytestring");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "myByteString"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), byteStringName,
-                              baseDataVariableType, myVar, NULL, NULL);
-
-    /* Add HelloWorld method to the server */
-#ifdef UA_ENABLE_METHODCALLS
-    /* Method with IO Arguments */
-    UA_Argument inputArguments;
-    UA_Argument_init(&inputArguments);
-    inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-    inputArguments.description = UA_LOCALIZEDTEXT("en-US", "Say your name");
-    inputArguments.name = UA_STRING("Name");
-    inputArguments.valueRank = UA_VALUERANK_SCALAR; /* scalar argument */
-
-    UA_Argument outputArguments;
-    UA_Argument_init(&outputArguments);
-    outputArguments.arrayDimensionsSize = 0;
-    outputArguments.arrayDimensions = NULL;
-    outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-    outputArguments.description = UA_LOCALIZEDTEXT("en-US", "Receive a greeting");
-    outputArguments.name = UA_STRING("greeting");
-    outputArguments.valueRank = UA_VALUERANK_SCALAR;
-
-    UA_MethodAttributes addmethodattributes = UA_MethodAttributes_default;
-    addmethodattributes.displayName = UA_LOCALIZEDTEXT("en-US", "Hello World");
-    addmethodattributes.executable = true;
-    addmethodattributes.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, 62541),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "hello_world"), addmethodattributes,
-                            &helloWorld, /* callback of the method node */
-                            1, &inputArguments, 1, &outputArguments, NULL, NULL);
-#endif
-
-    /* Add folders for demo information model */
-#define DEMOID 50000
-#define SCALARID 50001
-#define ARRAYID 50002
-#define MATRIXID 50003
-#define DEPTHID 50004
-#define SCALETESTID 40005
-
-    UA_ObjectAttributes object_attr = UA_ObjectAttributes_default;
-    object_attr.description = UA_LOCALIZEDTEXT("en-US", "Demo");
-    object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "Demo");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Demo"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-
-    object_attr.description = UA_LOCALIZEDTEXT("en-US", "Scalar");
-    object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "Scalar");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALARID),
-                            UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, "Scalar"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-
-    object_attr.description = UA_LOCALIZEDTEXT("en-US", "Array");
-    object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "Array");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, ARRAYID),
-                            UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, "Array"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-
-    object_attr.description = UA_LOCALIZEDTEXT("en-US", "Matrix");
-    object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "Matrix");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Matrix"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-
-    object_attr.description = UA_LOCALIZEDTEXT("en-US", "ScaleTest");
-    object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "ScaleTest");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALETESTID), UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "ScaleTest"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-
-    /* Fill demo nodes for each type*/
-    UA_UInt32 matrixDims[2] = {3, 3};
-    UA_UInt32 id = 51000; // running id in namespace 0
-    for(UA_UInt32 type = 0; type < UA_TYPES_DIAGNOSTICINFO; type++) {
-        if(type == UA_TYPES_VARIANT || type == UA_TYPES_DIAGNOSTICINFO)
-            continue;
-
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.dataType = UA_TYPES[type].typeId;
-#ifndef UA_ENABLE_TYPEDESCRIPTION
-        char name[15];
-        UA_snprintf(name, 15, "%02d", type);
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", name);
-        UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
-#else
-        attr.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US", UA_TYPES[type].typeName);
-        UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME_ALLOC(1, UA_TYPES[type].typeName);
-#endif
-        attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-        attr.writeMask = UA_WRITEMASK_DISPLAYNAME | UA_WRITEMASK_DESCRIPTION;
-        attr.userWriteMask = UA_WRITEMASK_DISPLAYNAME | UA_WRITEMASK_DESCRIPTION;
-
-        /* add a scalar node for every built-in type */
-        attr.valueRank = UA_VALUERANK_SCALAR;
-        void *value = UA_new(&UA_TYPES[type]);
-        UA_Variant_setScalar(&attr.value, value, &UA_TYPES[type]);
-        UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id),
-                                  UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                  qualifiedName, baseDataVariableType, attr, NULL, NULL);
-        UA_Variant_clear(&attr.value);
-
-        /* add an array node for every built-in type */
-        UA_UInt32 arrayDims = 0;
-        attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-        attr.arrayDimensions = &arrayDims;
-        attr.arrayDimensionsSize = 1;
-        UA_Variant_setArray(&attr.value, UA_Array_new(10, &UA_TYPES[type]), 10, &UA_TYPES[type]);
-        UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), UA_NODEID_NUMERIC(1, ARRAYID),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), qualifiedName,
-                                  baseDataVariableType, attr, NULL, NULL);
-        UA_Variant_clear(&attr.value);
-
-        /* add an matrix node for every built-in type */
-        attr.valueRank = UA_VALUERANK_TWO_DIMENSIONS;
-        attr.arrayDimensions = matrixDims;
-        attr.arrayDimensionsSize = 2;
-        void *myMultiArray = UA_Array_new(9, &UA_TYPES[type]);
-        attr.value.arrayDimensions = (UA_UInt32 *)UA_Array_new(2, &UA_TYPES[UA_TYPES_INT32]);
-        attr.value.arrayDimensions[0] = 3;
-        attr.value.arrayDimensions[1] = 3;
-        attr.value.arrayDimensionsSize = 2;
-        attr.value.arrayLength = 9;
-        attr.value.data = myMultiArray;
-        attr.value.type = &UA_TYPES[type];
-        UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), UA_NODEID_NUMERIC(1, MATRIXID),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), qualifiedName,
-                                  baseDataVariableType, attr, NULL, NULL);
-        UA_Variant_clear(&attr.value);
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-        UA_LocalizedText_clear(&attr.displayName);
-        UA_QualifiedName_clear(&qualifiedName);
-#endif
-    }
-
-    /* Add Integer and UInteger variables */
-    UA_VariableAttributes iattr = UA_VariableAttributes_default;
-    iattr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_INTEGER);
-    iattr.displayName = UA_LOCALIZEDTEXT("en-US", "Integer");
-    iattr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    iattr.writeMask = UA_WRITEMASK_DISPLAYNAME | UA_WRITEMASK_DESCRIPTION;
-    iattr.userWriteMask = UA_WRITEMASK_DISPLAYNAME | UA_WRITEMASK_DESCRIPTION;
-    iattr.valueRank = UA_VALUERANK_SCALAR;
-    UA_QualifiedName iQualifiedName = UA_QUALIFIEDNAME(1, "integer");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "integer"),
-                              UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              iQualifiedName, baseDataVariableType, iattr, NULL, NULL);
-
-    iattr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_UINTEGER);
-    iattr.displayName = UA_LOCALIZEDTEXT("en-US", "UInteger");
-    UA_QualifiedName uQualifiedName = UA_QUALIFIEDNAME(1, "uinteger");
-    UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "uinteger"),
-                              UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                              uQualifiedName, baseDataVariableType, iattr, NULL, NULL);
-    UA_Variant_clear(&iattr.value);
-
-    /* Hierarchy of depth 10 for CTT testing with forward and inverse references */
-    /* Enter node "depth 9" in CTT configuration - Project->Settings->Server
-       Test->NodeIds->Paths->Starting Node 1 */
-    object_attr.description = UA_LOCALIZEDTEXT("en-US", "DepthDemo");
-    object_attr.displayName = UA_LOCALIZEDTEXT("en-US", "DepthDemo");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEPTHID), UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "DepthDemo"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-
-    id = DEPTHID; // running id in namespace 0 - Start with Matrix NODE
-    for(UA_UInt32 i = 1; i <= 20; i++) {
-        char name[15];
-        UA_snprintf(name, 15, "depth%i", i);
-        object_attr.description = UA_LOCALIZEDTEXT("en-US", name);
-        object_attr.displayName = UA_LOCALIZEDTEXT("en-US", name);
-        UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, id + i),
-                                UA_NODEID_NUMERIC(1, i == 1 ? DEPTHID : id + i - 1),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                UA_QUALIFIEDNAME(1, name),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), object_attr, NULL, NULL);
-    }
-
-    /* Scale Test: 100 nodes of each type */
-    int scale_i = 0;
-    UA_UInt32 scale_nodeid = 43000;
-    for(UA_UInt32 type = 0; type < 15; type++) {
-        if(type == UA_TYPES_SBYTE || type == UA_TYPES_BYTE
-                || type == UA_TYPES_GUID)
-            continue;
-
-        UA_DataSource scaleTestDataSource;
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.dataType = UA_TYPES[type].typeId;
-        attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-        attr.writeMask = UA_WRITEMASK_DISPLAYNAME | UA_WRITEMASK_DESCRIPTION;
-        attr.userWriteMask = UA_WRITEMASK_DISPLAYNAME | UA_WRITEMASK_DESCRIPTION;
-        attr.valueRank = UA_VALUERANK_SCALAR;
-        switch(UA_TYPES[type].typeIndex) {
-            case UA_TYPES_BOOLEAN: {
-                scaleTestDataSource.read = readRandomBoolData;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_INT16: {
-                scaleTestDataSource.read = readRandomInt16Data;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_UINT16: {
-                scaleTestDataSource.read = readRandomUInt16Data;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_INT32: {
-                scaleTestDataSource.read = readRandomInt32Data;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_UINT32: {
-                scaleTestDataSource.read = readRandomUInt32Data;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_INT64: {
-                scaleTestDataSource.read = readRandomInt64Data;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_UINT64: {
-                scaleTestDataSource.read = readRandomUInt64Data;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_STRING: {
-                scaleTestDataSource.read = readRandomStringData;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_FLOAT: {
-                scaleTestDataSource.read = readRandomFloatData;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_DOUBLE: {
-                scaleTestDataSource.read = readRandomDoubleData;
-                scaleTestDataSource.write = NULL;
-                break;
-            }
-            case UA_TYPES_DATETIME:
-                scaleTestDataSource.read = readTimeData;
-                scaleTestDataSource.write = NULL;
-                break;
-            case UA_TYPES_BYTESTRING:
-                scaleTestDataSource.read = readByteString;
-                scaleTestDataSource.write = NULL;
-                break;
-            default:
-                break;
-        }
-
-        for(size_t j = 0; j < 100; j++) {
-            char name[32];
-#ifndef UA_ENABLE_TYPEDESCRIPTION
-            UA_snprintf(name, 20, "%02d - %i", type, scale_i);
-#else
-            UA_snprintf(name, 20, "%s - %i", UA_TYPES[type].typeName, scale_i);
-#endif
-            attr.displayName = UA_LOCALIZEDTEXT("en-US", name);
-            UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
-            UA_Server_addDataSourceVariableNode(server, UA_NODEID_NUMERIC(1, ++scale_nodeid),
-                                      UA_NODEID_NUMERIC(1, SCALETESTID),
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),qualifiedName,
-                                      baseDataVariableType, attr, scaleTestDataSource, NULL, NULL);
-            scale_i++;
-        }
-        UA_Variant_clear(&attr.value);
-    }
-
-    /* Add the variable to some more places to get a node with three inverse references for the CTT */
-    UA_ExpandedNodeId answer_nodeid = UA_EXPANDEDNODEID_STRING(1, "the.answer");
-    UA_Server_addReference(server, UA_NODEID_NUMERIC(1, DEMOID),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), answer_nodeid, true);
-    UA_Server_addReference(server, UA_NODEID_NUMERIC(1, SCALARID),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), answer_nodeid, true);
-
-    /* Example for manually setting an attribute within the server */
-    UA_LocalizedText objectsName = UA_LOCALIZEDTEXT("en-US", "Objects");
-    UA_Server_writeDisplayName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), objectsName);
-
-#define NOARGID     60000
-#define INARGID     60001
-#define OUTARGID    60002
-#define INOUTARGID  60003
-#ifdef UA_ENABLE_METHODCALLS
-    /* adding some more method nodes to pass CTT */
-    /* Method without arguments */
-    addmethodattributes = UA_MethodAttributes_default;
-    addmethodattributes.displayName = UA_LOCALIZEDTEXT("en-US", "noarg");
-    addmethodattributes.executable = true;
-    addmethodattributes.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, NOARGID),
-                            UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "noarg"), addmethodattributes,
-                            &noargMethod, /* callback of the method node */
-                            0, NULL, 0, NULL, NULL, NULL);
-
-    /* Method with in arguments */
-    addmethodattributes = UA_MethodAttributes_default;
-    addmethodattributes.displayName = UA_LOCALIZEDTEXT("en-US", "inarg");
-    addmethodattributes.executable = true;
-    addmethodattributes.userExecutable = true;
-
-    UA_Argument_init(&inputArguments);
-    inputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    inputArguments.description = UA_LOCALIZEDTEXT("en-US", "Input");
-    inputArguments.name = UA_STRING("Input");
-    inputArguments.valueRank = UA_VALUERANK_SCALAR; //uaexpert will crash if set to 0 ;)
-
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, INARGID),
-                            UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "noarg"), addmethodattributes,
-                            &noargMethod, /* callback of the method node */
-                            1, &inputArguments, 0, NULL, NULL, NULL);
-
-    /* Method with out arguments */
-    addmethodattributes = UA_MethodAttributes_default;
-    addmethodattributes.displayName = UA_LOCALIZEDTEXT("en-US", "outarg");
-    addmethodattributes.executable = true;
-    addmethodattributes.userExecutable = true;
-
-    UA_Argument_init(&outputArguments);
-    outputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    outputArguments.description = UA_LOCALIZEDTEXT("en-US", "Output");
-    outputArguments.name = UA_STRING("Output");
-    outputArguments.valueRank = UA_VALUERANK_SCALAR;
-
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, OUTARGID),
-                            UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "outarg"), addmethodattributes,
-                            &outargMethod, /* callback of the method node */
-                            0, NULL, 1, &outputArguments, NULL, NULL);
-
-    /* Method with inout arguments */
-    addmethodattributes = UA_MethodAttributes_default;
-    addmethodattributes.displayName = UA_LOCALIZEDTEXT("en-US", "inoutarg");
-    addmethodattributes.executable = true;
-    addmethodattributes.userExecutable = true;
-
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, INOUTARGID),
-                            UA_NODEID_NUMERIC(1, DEMOID),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "inoutarg"), addmethodattributes,
-                            &outargMethod, /* callback of the method node */
-                            1, &inputArguments, 1, &outputArguments, NULL, NULL);
-#endif
-}
-
-static void
-disableAnonymous(UA_ServerConfig *config) {
-    for(size_t i = 0; i < config->endpointsSize; i++) {
-        UA_EndpointDescription *ep = &config->endpoints[i];
-
-        for(size_t j = 0; j < ep->userIdentityTokensSize; j++) {
-            UA_UserTokenPolicy *utp = &ep->userIdentityTokens[j];
-            if(utp->tokenType != UA_USERTOKENTYPE_ANONYMOUS)
-                continue;
-
-            UA_UserTokenPolicy_clear(utp);
-            /* Move the last to this position */
-            if(j + 1 < ep->userIdentityTokensSize) {
-                ep->userIdentityTokens[j] = ep->userIdentityTokens[ep->userIdentityTokensSize-1];
-                j--;
-            }
-            ep->userIdentityTokensSize--;
-        }
-
-        /* Delete the entire array if the last UserTokenPolicy was removed */
-        if(ep->userIdentityTokensSize == 0) {
-            UA_free(ep->userIdentityTokens);
-            ep->userIdentityTokens = NULL;
-        }
-    }
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-static void
-disableUnencrypted(UA_ServerConfig *config) {
-    for(size_t i = 0; i < config->endpointsSize; i++) {
-        UA_EndpointDescription *ep = &config->endpoints[i];
-        if(ep->securityMode != UA_MESSAGESECURITYMODE_NONE)
-            continue;
-
-        UA_EndpointDescription_clear(ep);
-        /* Move the last to this position */
-        if(i + 1 < config->endpointsSize) {
-            config->endpoints[i] = config->endpoints[config->endpointsSize-1];
-            i--;
-        }
-        config->endpointsSize--;
-    }
-    /* Delete the entire array if the last Endpoint was removed */
-    if(config->endpointsSize== 0) {
-        UA_free(config->endpoints);
-        config->endpoints = NULL;
-    }
-}
-
-static void
-disableOutdatedSecurityPolicy(UA_ServerConfig *config) {
-    for(size_t i = 0; i < config->endpointsSize; i++) {
-        UA_EndpointDescription *ep = &config->endpoints[i];
-        UA_ByteString basic128uri = UA_BYTESTRING("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15");
-        UA_ByteString basic256uri = UA_BYTESTRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256");
-        if(!UA_String_equal(&ep->securityPolicyUri, &basic128uri) &&
-           !UA_String_equal(&ep->securityPolicyUri, &basic256uri))
-            continue;
-
-        UA_EndpointDescription_clear(ep);
-        /* Move the last to this position */
-        if(i + 1 < config->endpointsSize) {
-            config->endpoints[i] = config->endpoints[config->endpointsSize-1];
-            i--;
-        }
-        config->endpointsSize--;
-    }
-    /* Delete the entire array if the last Endpoint was removed */
-    if(config->endpointsSize== 0) {
-        UA_free(config->endpoints);
-        config->endpoints = NULL;
-    }
-}
-
-static void
-disableBasic128SecurityPolicy(UA_ServerConfig *config) {
-    for(size_t i = 0; i < config->endpointsSize; i++) {
-        UA_EndpointDescription *ep = &config->endpoints[i];
-        UA_ByteString basic128uri = UA_BYTESTRING("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15");
-        if(!UA_String_equal(&ep->securityPolicyUri, &basic128uri))
-            continue;
-
-        UA_EndpointDescription_clear(ep);
-        /* Move the last to this position */
-        if(i + 1 < config->endpointsSize) {
-            config->endpoints[i] = config->endpoints[config->endpointsSize-1];
-            i--;
-        }
-        config->endpointsSize--;
-    }
-    /* Delete the entire array if the last Endpoint was removed */
-    if(config->endpointsSize== 0) {
-        UA_free(config->endpoints);
-        config->endpoints = NULL;
-    }
-}
-
-static void
-disableBasic256SecurityPolicy(UA_ServerConfig *config) {
-    for(size_t i = 0; i < config->endpointsSize; i++) {
-        UA_EndpointDescription *ep = &config->endpoints[i];
-        UA_ByteString basic256uri = UA_BYTESTRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256");
-        if(!UA_String_equal(&ep->securityPolicyUri, &basic256uri))
-            continue;
-
-        UA_EndpointDescription_clear(ep);
-        /* Move the last to this position */
-        if(i + 1 < config->endpointsSize) {
-            config->endpoints[i] = config->endpoints[config->endpointsSize-1];
-            i--;
-        }
-        config->endpointsSize--;
-    }
-    /* Delete the entire array if the last Endpoint was removed */
-    if(config->endpointsSize== 0) {
-        UA_free(config->endpoints);
-        config->endpoints = NULL;
-    }
-}
-
-
-static void
-disableBasic256Sha256SecurityPolicy(UA_ServerConfig *config) {
-    for(size_t i = 0; i < config->endpointsSize; i++) {
-        UA_EndpointDescription *ep = &config->endpoints[i];
-        UA_ByteString basic256sha256uri = UA_BYTESTRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256");
-        if(!UA_String_equal(&ep->securityPolicyUri, &basic256sha256uri))
-            continue;
-
-        UA_EndpointDescription_clear(ep);
-        /* Move the last to this position */
-        if(i + 1 < config->endpointsSize) {
-            config->endpoints[i] = config->endpoints[config->endpointsSize-1];
-            i--;
-        }
-        config->endpointsSize--;
-    }
-    /* Delete the entire array if the last Endpoint was removed */
-    if(config->endpointsSize== 0) {
-        UA_free(config->endpoints);
-        config->endpoints = NULL;
-    }
-}
-
-#endif
-
-UA_Boolean running = true;
-
-static void
-stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Received Ctrl-C");
-    running = 0;
-}
-
-static void
-usage(void) {
-    UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                   "Usage:\n"
-#ifndef UA_ENABLE_ENCRYPTION
-                   "server_ctt [<server-certificate.der>]\n"
-#else
-                   "server_ctt <server-certificate.der> <private-key.der>\n"
-#ifndef __linux__
-                   "\t[--trustlist <tl1.ctl> <tl2.ctl> ... ]\n"
-                   "\t[--issuerlist <il1.der> <il2.der> ... ]\n"
-                   "\t[--revocationlist <rv1.crl> <rv2.crl> ...]\n"
-#else
-                   "\t[--trustlistFolder <folder>]\n"
-                   "\t[--issuerlistFolder <folder>]\n"
-                   "\t[--revocationlistFolder <folder>]\n"
-#endif
-                   "\t[--enableUnencrypted]\n"
-                   "\t[--enableOutdatedSecurityPolicy]\n"
-                   "\t[--enableTimestampCheck]\n"
-                   "\t[--disableBasic128]\n"
-                   "\t[--disableBasic256]\n"
-                   "\t[--disableBasic256Sha256]\n"
-#endif
-                   "\t[--enableAnonymous]\n");
-}
-
-int main(int argc, char **argv) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-    signal(SIGTERM, stopHandler);
-
-    for(int i = 1; i < argc; i++) {
-        if(strcmp(argv[i], "--help") == 0 ||
-           strcmp(argv[i], "-h") == 0) {
-            usage();
-            return EXIT_SUCCESS;
-        }
-    }
-
-    UA_ServerConfig config;
-    memset(&config, 0, sizeof(UA_ServerConfig));
-
-    /* Load certificate */
-    size_t pos = 1;
-    UA_ByteString certificate = UA_BYTESTRING_NULL;
-    if((size_t)argc >= pos + 1) {
-        certificate = loadFile(argv[1]);
-        if(certificate.length == 0) {
-            UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                           "Unable to load file %s.", argv[pos]);
-            return EXIT_FAILURE;
-        }
-        pos++;
-    }
-
-#ifdef UA_ENABLE_ENCRYPTION
-    /* Load the private key */
-    UA_ByteString privateKey = UA_BYTESTRING_NULL;
-    if((size_t)argc >= pos + 1) {
-        privateKey = loadFile(argv[2]);
-        if(privateKey.length == 0) {
-            UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                           "Unable to load file %s.", argv[pos]);
-            return EXIT_FAILURE;
-        }
-        pos++;
-    }
-
-    char filetype = ' '; /* t==trustlist, l == issuerList, r==revocationlist */
-    UA_Boolean enableUnencr = false;
-    UA_Boolean enableSec = false;
-    UA_Boolean enableTime = false;
-    UA_Boolean disableBasic128 = false;
-    UA_Boolean disableBasic256 = false;
-    UA_Boolean disableBasic256Sha256 = false;
-
-#ifndef __linux__
-    UA_ByteString trustList[100];
-    size_t trustListSize = 0;
-    UA_ByteString issuerList[100];
-    size_t issuerListSize = 0;
-    UA_ByteString revocationList[100];
-    size_t revocationListSize = 0;
-#else
-    const char *trustlistFolder = NULL;
-    const char *issuerlistFolder = NULL;
-    const char *revocationlistFolder = NULL;
-#endif
-
-#endif
-
-    UA_Boolean enableAnon = false;
-
-    /* Loop over the remaining arguments */
-    for(; pos < (size_t)argc; pos++) {
-
-        if(strcmp(argv[pos], "--enableAnonymous") == 0) {
-            enableAnon = true;
-            continue;
-        }
-
-#ifdef UA_ENABLE_ENCRYPTION
-        if(strcmp(argv[pos], "--enableUnencrypted") == 0) {
-            enableUnencr = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--enableOutdatedSecurityPolicy") == 0) {
-            enableSec = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--enableTimestampCheck") == 0) {
-            enableTime = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--disableBasic128") == 0) {
-            disableBasic128 = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--disableBasic256") == 0) {
-            disableBasic256 = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--disableBasic256Sha256") == 0) {
-            disableBasic256Sha256 = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--disableBasic128") == 0) {
-            disableBasic128 = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--disableBasic256") == 0) {
-            disableBasic256 = true;
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--disableBasic256Sha256") == 0) {
-            disableBasic256Sha256 = true;
-            continue;
-        }
-
-#ifndef __linux__
-        if(strcmp(argv[pos], "--trustlist") == 0) {
-            filetype = 't';
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--issuerlist") == 0) {
-            filetype = 'l';
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--revocationlist") == 0) {
-            filetype = 'r';
-            continue;
-        }
-
-        if(filetype == 't') {
-            if(trustListSize >= 100) {
-                UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                             "Too many trust lists");
-                return EXIT_FAILURE;
-            }
-            trustList[trustListSize] = loadFile(argv[pos]);
-            if(trustList[trustListSize].data == NULL) {
-                UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                             "Unable to load trust list %s", argv[pos]);
-                return EXIT_FAILURE;
-            }
-            trustListSize++;
-            continue;
-        }
-
-        if(filetype == 'l') {
-            if(issuerListSize >= 100) {
-                UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                             "Too many trust lists");
-                return EXIT_FAILURE;
-            }
-            issuerList[issuerListSize] = loadFile(argv[pos]);
-            if(issuerList[issuerListSize].data == NULL) {
-                UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                             "Unable to load trust list %s", argv[pos]);
-                return EXIT_FAILURE;
-            }
-            issuerListSize++;
-            continue;
-        }
-
-        if(filetype == 'r') {
-            if(revocationListSize >= 100) {
-                UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                             "Too many revocation lists");
-                return EXIT_FAILURE;
-            }
-            revocationList[revocationListSize] = loadFile(argv[pos]);
-            if(revocationList[revocationListSize].data == NULL) {
-                UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                             "Unable to load revocationlist %s", argv[pos]);
-                return EXIT_FAILURE;
-            }
-            revocationListSize++;
-            continue;
-        }
-#else
-        if(strcmp(argv[pos], "--trustlistFolder") == 0) {
-            filetype = 't';
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--issuerlistFolder") == 0) {
-            filetype = 'l';
-            continue;
-        }
-
-        if(strcmp(argv[pos], "--revocationlistFolder") == 0) {
-            filetype = 'r';
-            continue;
-        }
-
-        if(filetype == 't') {
-            trustlistFolder = argv[pos];
-            continue;
-        }
-
-        if(filetype == 'l') {
-            issuerlistFolder = argv[pos];
-            continue;
-        }
-
-        if(filetype == 'r') {
-            revocationlistFolder = argv[pos];
-            continue;
-        }
-#endif
-
-#endif
-
-        usage();
-        return EXIT_FAILURE;
-    }
-
-#ifdef UA_ENABLE_ENCRYPTION
-#ifndef __linux__
-    UA_ServerConfig_setDefaultWithSecurityPolicies(&config, 4840,
-                                                   &certificate, &privateKey,
-                                                   trustList, trustListSize,
-                                                   issuerList, issuerListSize,
-                                                   revocationList, revocationListSize);
-#else
-    UA_ServerConfig_setDefaultWithSecurityPolicies(&config, 4840,
-                                                   &certificate, &privateKey,
-                                                   NULL, 0, NULL, 0, NULL, 0);
-    config.certificateVerification.deleteMembers(&config.certificateVerification);
-    UA_CertificateVerification_CertFolders(&config.certificateVerification,
-                                           trustlistFolder, issuerlistFolder,
-                                           revocationlistFolder);
-#endif
-
-    if(!enableUnencr)
-        disableUnencrypted(&config);
-    if(!enableSec)
-        disableOutdatedSecurityPolicy(&config);
-
-    if(disableBasic128)
-        disableBasic128SecurityPolicy(&config);
-    if(disableBasic256)
-        disableBasic256SecurityPolicy(&config);
-    if(disableBasic256Sha256)
-        disableBasic256Sha256SecurityPolicy(&config);
-
-    /* Set operation limits */
-    config.maxNodesPerRead = MAX_OPERATION_LIMIT;
-    config.maxNodesPerWrite = MAX_OPERATION_LIMIT;
-    config.maxNodesPerMethodCall = MAX_OPERATION_LIMIT;
-    config.maxNodesPerBrowse = MAX_OPERATION_LIMIT;
-    config.maxNodesPerRegisterNodes = MAX_OPERATION_LIMIT;
-    config.maxNodesPerTranslateBrowsePathsToNodeIds = MAX_OPERATION_LIMIT;
-    config.maxNodesPerNodeManagement = MAX_OPERATION_LIMIT;
-    config.maxMonitoredItemsPerCall = MAX_OPERATION_LIMIT;
-
-    /* If RequestTimestamp is '0', log the warning and proceed */
-    config.verifyRequestTimestamp = UA_RULEHANDLING_WARN;
-
-    if(enableTime)
-        config.verifyRequestTimestamp = UA_RULEHANDLING_DEFAULT;
-
-#else
-    UA_ServerConfig_setMinimal(&config, 4840, &certificate);
-#endif
-
-    if(!enableAnon)
-        disableAnonymous(&config);
-
-    /* Clean up temp values */
-    UA_ByteString_clear(&certificate);
-#if defined(UA_ENABLE_ENCRYPTION) && !defined(__linux__)
-    UA_ByteString_clear(&privateKey);
-    for(size_t i = 0; i < trustListSize; i++)
-        UA_ByteString_clear(&trustList[i]);
-    for(size_t i = 0; i < issuerListSize; i++)
-        UA_ByteString_clear(&issuerList[i]);
-    for(size_t i = 0; i < revocationListSize; i++)
-        UA_ByteString_clear(&revocationList[i]);
-#endif
-
-    /* Override with a custom access control policy */
-    config.accessControl.getUserAccessLevel = getUserAccessLevel_disallowSpecific;
-    UA_String_clear(&config.applicationDescription.applicationUri);
-    config.applicationDescription.applicationUri =
-        UA_String_fromChars("urn:open62541.server.application");
-
-    config.shutdownDelay = 5000.0; /* 5s */
-
-    UA_Server *server = UA_Server_newWithConfig(&config);
-    if(server == NULL)
-        return EXIT_FAILURE;
-
-    setInformationModel(server);
-
-    /* run server */
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/server_inheritance.c b/ext/open62541/examples/server_inheritance.c
deleted file mode 100644
index 97c97f6..0000000
--- a/ext/open62541/examples/server_inheritance.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-static void stopHandler(int sig) {
-    running = false;
-}
-
-/**
- * This will create a type structure and some instances of the types:
- *
- * Create a rudimentary objectType
- *
- * Type:
- * + MammalType
- *  v- Class  = "mamalia"
- *  v- Species
- *  o- Abilities
- *      v- MakeSound
- *      v- Breathe = True
- *  + DogType
- *      v- Species = "Canis"
- *      v- Name
- *      o- Abilities
- *          v- MakeSound = "Wuff"
- *           v- FetchNewPaper
- */
-static void createMammals(UA_Server *server) {
-
-
-    UA_ObjectTypeAttributes otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.description = UA_LOCALIZEDTEXT("en-US", "A mammal");
-    otAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MammalType");
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10000),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "MammalType"), otAttr, NULL, NULL);
-
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "This mammals class");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Class");
-    UA_String classVar = UA_STRING("mamalia");
-    UA_Variant_setScalar(&vAttr.value, &classVar, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10001),
-                              UA_NODEID_NUMERIC(1, 10000),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Class"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-
-    vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "This mammals species");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Species");
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10002),
-                              UA_NODEID_NUMERIC(1, 10000),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Species"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-
-    otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.description = UA_LOCALIZEDTEXT("en-US", "A dog, subtype of mammal");
-    otAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DogType");
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 20000),
-                                UA_NODEID_NUMERIC(1, 10000),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "DogType"), otAttr, NULL, NULL);
-
-    vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "This dogs species");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Species");
-    UA_String defaultSpecies = UA_STRING("Canis");
-    UA_Variant_setScalar(&vAttr.value, &defaultSpecies, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 20001),
-                              UA_NODEID_NUMERIC(1, 20000),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Species"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-
-    vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "This dogs name");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Name");
-    UA_String defaultName = UA_STRING("unnamed dog");
-    UA_Variant_setScalar(&vAttr.value, &defaultName, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 20002),
-                              UA_NODEID_NUMERIC(1, 20000),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Name"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-
-    /* Instatiate a dog named bello:
-     * (O) Objects
-     *   + O Bello <DogType>
-     *     + Age
-     *     + Name
-     */
-
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.description = UA_LOCALIZEDTEXT("en-US", "A dog named Bello");
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Bello");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "Bello"), UA_NODEID_NUMERIC(1, 20000),
-                            oAttr, NULL, NULL);
-
-    oAttr = UA_ObjectAttributes_default;
-    oAttr.description = UA_LOCALIZEDTEXT("en-US", "Another dog");
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Dog2");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "Dog2"), UA_NODEID_NUMERIC(1, 20000),
-                            oAttr, NULL, NULL);
-
-    oAttr = UA_ObjectAttributes_default;
-    oAttr.description = UA_LOCALIZEDTEXT("en-US", "A mmamal");
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Mmamal1");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "Mammal1"), UA_NODEID_NUMERIC(1, 10000),
-                            oAttr, NULL, NULL);
-
-}
-
-/**
- * This method shows the usage of _begin and _finish methods.
- * Normally, if you create an instance of an object type, all its
- * mandatory children are inherited and created.
- * It could be the case that you first need to create a node,
- * add some children with specific IDs and then all the remaining
- * inherited children should be created.
- * For this use-case you can use first the _begin method,
- * which creates the node, including its parent references.
- * Then you can add any children, and then you should
- * call _finish on that node, which then adds all the inherited children.
- *
- * For further details check the example below or the corresponding
- * method documentation.
- *
- * To demonstrate this, we use the following example:
- *
- * + ObjectType
- *      + LampType (Object)
- *          + IsOn (Variable, Boolean, Mandatory)
- *          + Brightness (Variable, UInt16, Mandatory)
- * + Objects
- *      + LampGreen
- *          Should inherit the mandatory IsOn and Brightness with a generated node ID
- *      + LampRed
- *          IsOn should have the node ID 30101, Brightness will be inherited with a generated node ID
- *
- */
-static void createCustomInheritance(UA_Server *server) {
-
-    /* Add LampType object type node */
-
-    UA_ObjectTypeAttributes otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.description = UA_LOCALIZEDTEXT("en-US", "A Lamp");
-    otAttr.displayName = UA_LOCALIZEDTEXT("en-US", "LampType");
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 30000),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "LampType"), otAttr, NULL, NULL);
-
-
-    /* Add the two mandatory children, IsOn and Brightness */
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "Switch lamp on/off");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "IsOn");
-    UA_Boolean isOn = UA_FALSE;
-    UA_Variant_setScalar(&vAttr.value, &isOn, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 30001),
-                              UA_NODEID_NUMERIC(1, 30000),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "IsOn"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-    UA_Server_addReference(server, UA_NODEID_NUMERIC(1, 30001),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-
-    vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "Lamp brightness");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Brightness");
-    UA_UInt16 brightness = 142;
-    UA_Variant_setScalar(&vAttr.value, &brightness, &UA_TYPES[UA_TYPES_UINT16]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 30002),
-                              UA_NODEID_NUMERIC(1, 30000),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Brightness"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-    UA_Server_addReference(server, UA_NODEID_NUMERIC(1, 30002),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-    
-    /* Now we want to inherit all the mandatory children for LampGreen and don't care about the node ids.
-     * These will be automatically generated. This will internally call the _begin and _finish methods */
-
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.description = UA_LOCALIZEDTEXT("en-US", "A green lamp");
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "LampGreen");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "LampGreen"), UA_NODEID_NUMERIC(1, 30000),
-                            oAttr, NULL, NULL);
-
-    /* For the red lamp we want to set the node ID of the IsOn child manually, thus we need to use
-     * the _begin method, add the child and then _finish: */
-
-    /* The call to UA_Server_addNode_begin will create the node and its parent references,
-     * but it will not instantiate the mandatory children */
-    oAttr = UA_ObjectAttributes_default;
-    oAttr.description = UA_LOCALIZEDTEXT("en-US", "A red lamp");
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "LampRed");
-    UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,
-                            UA_NODEID_NUMERIC(1, 30100),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "LampRed"),
-                            UA_NODEID_NUMERIC(1, 30000),
-                            (const UA_NodeAttributes*)&oAttr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],
-                            NULL, NULL);
-
-    /* Now we can add the IsOn with our own node ID */
-    vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "Switch lamp on/off");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "IsOn");
-    isOn = UA_FALSE;
-    UA_Variant_setScalar(&vAttr.value, &isOn, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 30101),
-                              UA_NODEID_NUMERIC(1, 30100),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "IsOn"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              vAttr, NULL, NULL);
-
-    /* And then we need to call the UA_Server_addNode_finish which adds all the remaining
-     * children and does some further initialization. It will not add the IsNode child,
-     * since a child with the same browse name already exists */
-    UA_Server_addNode_finish(server, UA_NODEID_NUMERIC(1, 30100));
-}
-
-int main(void) {
-    signal(SIGINT,  stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    createMammals(server);
-
-    createCustomInheritance(server);
-
-    /* Run the server */
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/server_instantiation.c b/ext/open62541/examples/server_instantiation.c
deleted file mode 100644
index e43ddbe..0000000
--- a/ext/open62541/examples/server_instantiation.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-static void stopHandler(int sig) {
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT,  stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* Create a rudimentary objectType
-     * 
-     * BaseObjectType
-     * |
-     * +- (OT) MamalType
-     *    + (V) Age
-     *    + (OT) DogType
-     *      |
-     *      + (V) Name
-     */ 
-    UA_StatusCode retval;
-    UA_ObjectTypeAttributes otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.description = UA_LOCALIZEDTEXT("en-US", "A mamal");
-    otAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MamalType");
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10000),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "MamalType"), otAttr, NULL, NULL);
-
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "This mamals Age in months");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Age");
-    UA_UInt32 ageVar = 0;
-    UA_Variant_setScalar(&vAttr.value, &ageVar, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10001),
-                              UA_NODEID_NUMERIC(1, 10000), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Age"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, NULL);
-
-    otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.description = UA_LOCALIZEDTEXT("en-US", "A dog, subtype of mamal");
-    otAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DogType");
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 10002),
-                                UA_NODEID_NUMERIC(1, 10000), UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "DogType"), otAttr, NULL, NULL);
-
-    vAttr = UA_VariableAttributes_default;
-    vAttr.description =  UA_LOCALIZEDTEXT("en-US", "This mamals Age in months");
-    vAttr.displayName =  UA_LOCALIZEDTEXT("en-US", "Name");
-    UA_String defaultName = UA_STRING("unnamed dog");
-    UA_Variant_setScalar(&vAttr.value, &defaultName, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, 10003),
-                              UA_NODEID_NUMERIC(1, 10002), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                              UA_QUALIFIEDNAME(1, "Name"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, NULL);
-
-    /* Instatiate a dog named bello:
-     * (O) Objects
-     *   + O Bello <DogType>
-     *     + Age 
-     *     + Name
-     */
-
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.description = UA_LOCALIZEDTEXT("en-US", "A dog named Bello");
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Bello");
-    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "Bello"), UA_NODEID_NUMERIC(1, 10002),
-                            oAttr, NULL, NULL);
-
-    retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/server_mainloop.c b/ext/open62541/examples/server_mainloop.c
deleted file mode 100644
index 0fa50e1..0000000
--- a/ext/open62541/examples/server_mainloop.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-/* In this example, we integrate the server into an external "mainloop". This
-   can be for example the event-loop used in GUI toolkits, such as Qt or GTK. */
-
-int main(int argc, char** argv) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* Should the server networklayer block (with a timeout) until a message
-       arrives or should it return immediately? */
-    UA_Boolean waitInternal = false;
-
-    UA_StatusCode retval = UA_Server_run_startup(server);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    while(running) {
-        /* timeout is the maximum possible delay (in millisec) until the next
-           _iterate call. Otherwise, the server might miss an internal timeout
-           or cannot react to messages with the promised responsiveness. */
-        /* If multicast discovery server is enabled, the timeout does not not consider new input data (requests) on the mDNS socket.
-         * It will be handled on the next call, which may be too late for requesting clients.
-         * if needed, the select with timeout on the multicast socket server->mdnsSocket (see example in mdnsd library)
-         */
-        UA_UInt16 timeout = UA_Server_run_iterate(server, waitInternal);
-
-        /* Now we can use the max timeout to do something else. In this case, we
-           just sleep. (select is used as a platform-independent sleep
-           function.) */
-        struct timeval tv;
-        tv.tv_sec = 0;
-        tv.tv_usec = timeout * 1000;
-        select(0, NULL, NULL, NULL, &tv);
-    }
-    retval = UA_Server_run_shutdown(server);
-
- cleanup:
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/server_repeated_job.c b/ext/open62541/examples/server_repeated_job.c
deleted file mode 100644
index f464780..0000000
--- a/ext/open62541/examples/server_repeated_job.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static void
-testCallback(UA_Server *server, void *data) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "testcallback");
-}
-
-UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* Add a repeated callback to the server */
-    UA_Server_addRepeatedCallback(server, testCallback, NULL, 2000, NULL); /* call every 2 sec */
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_client_events.c b/ext/open62541/examples/tutorial_client_events.c
deleted file mode 100644
index 7440c21..0000000
--- a/ext/open62541/examples/tutorial_client_events.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/util.h>
-
-#include <signal.h>
-
-#ifdef _MSC_VER
-#pragma warning(disable:4996) // warning C4996: 'UA_Client_Subscriptions_addMonitoredEvent': was declared deprecated
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif
-
-#ifdef __GNUC__
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
-
-static UA_Boolean running = true;
-static void stopHandler(int sig) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "received ctrl-c");
-    running = false;
-}
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-static void
-handler_events(UA_Client *client, UA_UInt32 subId, void *subContext,
-               UA_UInt32 monId, void *monContext,
-               size_t nEventFields, UA_Variant *eventFields) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Notification");
-
-    /* The context should point to the monId on the stack */
-    UA_assert(*(UA_UInt32*)monContext == monId);
-
-    for(size_t i = 0; i < nEventFields; ++i) {
-        if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_UINT16])) {
-            UA_UInt16 severity = *(UA_UInt16 *)eventFields[i].data;
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Severity: %u", severity);
-        } else if (UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_LOCALIZEDTEXT])) {
-            UA_LocalizedText *lt = (UA_LocalizedText *)eventFields[i].data;
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "Message: '%.*s'", (int)lt->text.length, lt->text.data);
-        }
-        else {
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "Don't know how to handle type: '%s'", eventFields[i].type->typeName);
-#else
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                        "Don't know how to handle type, enable UA_ENABLE_TYPEDESCRIPTION "
-                        "for typename");
-#endif
-        }
-    }
-}
-
-const size_t nSelectClauses = 2;
-
-static UA_SimpleAttributeOperand *
-setupSelectClauses(void) {
-    UA_SimpleAttributeOperand *selectClauses = (UA_SimpleAttributeOperand*)
-        UA_Array_new(nSelectClauses, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]);
-    if(!selectClauses)
-        return NULL;
-
-    for(size_t i =0; i<nSelectClauses; ++i) {
-        UA_SimpleAttributeOperand_init(&selectClauses[i]);
-    }
-
-    selectClauses[0].typeDefinitionId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-    selectClauses[0].browsePathSize = 1;
-    selectClauses[0].browsePath = (UA_QualifiedName*)
-        UA_Array_new(selectClauses[0].browsePathSize, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-    if(!selectClauses[0].browsePath) {
-        UA_SimpleAttributeOperand_delete(selectClauses);
-        return NULL;
-    }
-    selectClauses[0].attributeId = UA_ATTRIBUTEID_VALUE;
-    selectClauses[0].browsePath[0] = UA_QUALIFIEDNAME_ALLOC(0, "Message");
-
-    selectClauses[1].typeDefinitionId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-    selectClauses[1].browsePathSize = 1;
-    selectClauses[1].browsePath = (UA_QualifiedName*)
-        UA_Array_new(selectClauses[1].browsePathSize, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-    if(!selectClauses[1].browsePath) {
-        UA_SimpleAttributeOperand_delete(selectClauses);
-        return NULL;
-    }
-    selectClauses[1].attributeId = UA_ATTRIBUTEID_VALUE;
-    selectClauses[1].browsePath[0] = UA_QUALIFIEDNAME_ALLOC(0, "Severity");
-
-    return selectClauses;
-}
-
-#endif
-
-int main(int argc, char *argv[]) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    if(argc < 2) {
-        printf("Usage: tutorial_client_events <opc.tcp://server-url>\n");
-        return EXIT_FAILURE;
-    }
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    /* opc.tcp://uademo.prosysopc.com:53530/OPCUA/SimulationServer */
-    /* opc.tcp://opcua.demo-this.com:51210/UA/SampleServer */
-    UA_StatusCode retval = UA_Client_connect(client, argv[1]);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-        return EXIT_FAILURE;
-    }
-    UA_UInt32 subId = response.subscriptionId;
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Create subscription succeeded, id %u", subId);
-
-    /* Add a MonitoredItem */
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    item.itemToMonitor.nodeId = UA_NODEID_NUMERIC(0, 2253); // Root->Objects->Server
-    item.itemToMonitor.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-
-    UA_EventFilter filter;
-    UA_EventFilter_init(&filter);
-    filter.selectClauses = setupSelectClauses();
-    filter.selectClausesSize = nSelectClauses;
-
-    item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    item.requestedParameters.filter.content.decoded.data = &filter;
-    item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_EVENTFILTER];
-
-    UA_UInt32 monId = 0;
-
-    UA_MonitoredItemCreateResult result =
-        UA_Client_MonitoredItems_createEvent(client, subId,
-                                             UA_TIMESTAMPSTORETURN_BOTH, item,
-                                             &monId, handler_events, NULL);
-
-    if(result.statusCode != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                    "Could not add the MonitoredItem with %s", UA_StatusCode_name(retval));
-        goto cleanup;
-    } else {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                    "Monitoring 'Root->Objects->Server', id %u", response.subscriptionId);
-    }
-
-    monId = result.monitoredItemId;
-
-    while(running)
-        retval = UA_Client_run_iterate(client, 100);
-
-    /* Delete the subscription */
- cleanup:
-    UA_MonitoredItemCreateResult_clear(&result);
-    UA_Client_Subscriptions_deleteSingle(client, response.subscriptionId);
-    UA_Array_delete(filter.selectClauses, nSelectClauses, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]);
-#endif
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_client_firststeps.c b/ext/open62541/examples/tutorial_client_firststeps.c
deleted file mode 100644
index 06cc7bd..0000000
--- a/ext/open62541/examples/tutorial_client_firststeps.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Building a Simple Client
- * ------------------------
- * You should already have a basic server from the previous tutorials. open62541
- * provides both a server- and clientside API, so creating a client is as easy as
- * creating a server. Copy the following into a file `myClient.c`: */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/log_stdout.h>
-
-#include <stdlib.h>
-
-int main(void) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-        return (int)retval;
-    }
-
-    /* Read the value attribute of the node. UA_Client_readValueAttribute is a
-     * wrapper for the raw read service available as UA_Client_Service_read. */
-    UA_Variant value; /* Variants can hold scalar values and arrays of any type */
-    UA_Variant_init(&value);
-
-    /* NodeId of the variable holding the current time */
-    const UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    retval = UA_Client_readValueAttribute(client, nodeId, &value);
-
-    if(retval == UA_STATUSCODE_GOOD &&
-       UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
-        UA_DateTime raw_date = *(UA_DateTime *) value.data;
-        UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "date is: %u-%u-%u %u:%u:%u.%03u\n",
-                    dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
-    }
-
-    /* Clean up */
-    UA_Variant_clear(&value);
-    UA_Client_delete(client); /* Disconnects the client internally */
-    return EXIT_SUCCESS;
-}
-
-/**
- * Compilation is similar to the server example.
- *
- * .. code-block:: bash
- *
- *     $ gcc -std=c99 open62541.c myClient.c -o myClient
- *
- * In a MinGW environment, the Winsock library must be added.
- *
- * .. code-block:: bash
- *
- *    $ gcc -std=c99 open62541.c myClient.c -lws2_32 -o myClient.exe
- *
- * Further tasks
- * ^^^^^^^^^^^^^
- *
- * - Try to connect to some other OPC UA server by changing
- *   ``opc.tcp://localhost:4840`` to an appropriate address (remember that the
- *   queried node is contained in any OPC UA server).
- *
- * - Try to set the value of the variable node (ns=1,i="the.answer") containing
- *   an ``Int32`` from the example server (which is built in
- *   :doc:`tutorial_server_firststeps`) using "UA_Client_write" function. The
- *   example server needs some more modifications, i.e., changing request types.
- *   The answer can be found in "examples/client.c". */
diff --git a/ext/open62541/examples/tutorial_datatypes.c b/ext/open62541/examples/tutorial_datatypes.c
deleted file mode 100644
index 93c6755..0000000
--- a/ext/open62541/examples/tutorial_datatypes.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * .. _types-tutorial:
- *
- * Working with Data Types
- * -----------------------
- *
- * OPC UA defines a type system for values that can be encoded in the protocol
- * messages. This tutorial shows some examples for available data types and
- * their use. See the section on :ref:`types` for the full definitions.
- *
- * Basic Data Handling
- * ^^^^^^^^^^^^^^^^^^^
- * This section shows the basic interaction patterns for data types. Make
- * sure to compare with the type definitions in ``types.h``. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <stdlib.h>
-
-static void
-variables_basic(void) {
-    /* Int32 */
-    UA_Int32 i = 5;
-    UA_Int32 j;
-    UA_Int32_copy(&i, &j);
-
-    UA_Int32 *ip = UA_Int32_new();
-    UA_Int32_copy(&i, ip);
-    UA_Int32_delete(ip);
-
-    /* String */
-    UA_String s;
-    UA_String_init(&s); /* _init zeroes out the entire memory of the datatype */
-    char *test = "test";
-    s.length = strlen(test);
-    s.data = (UA_Byte*)test;
-
-    UA_String s2;
-    UA_String_copy(&s, &s2);
-    UA_String_clear(&s2); /* Copying heap-allocated the dynamic content */
-
-    UA_String s3 = UA_STRING("test2");
-    UA_String s4 = UA_STRING_ALLOC("test2"); /* Copies the content to the heap */
-    UA_Boolean eq = UA_String_equal(&s3, &s4);
-    UA_String_clear(&s4);
-    if(!eq)
-        return;
-
-    /* Structured Type */
-    UA_ReadRequest rr;
-    UA_init(&rr, &UA_TYPES[UA_TYPES_READREQUEST]); /* Generic method */
-    UA_ReadRequest_init(&rr); /* Shorthand for the previous line */
-
-    rr.requestHeader.timestamp = UA_DateTime_now(); /* Members of a structure */
-
-    rr.nodesToRead = (UA_ReadValueId *)UA_Array_new(5, &UA_TYPES[UA_TYPES_READVALUEID]);
-    rr.nodesToReadSize = 5; /* Array size needs to be made known */
-
-    UA_ReadRequest *rr2 = UA_ReadRequest_new();
-    UA_copy(&rr, rr2, &UA_TYPES[UA_TYPES_READREQUEST]);
-    UA_ReadRequest_clear(&rr);
-    UA_ReadRequest_delete(rr2);
-}
-
-/**
- * NodeIds
- * ^^^^^^^
- * An OPC UA information model is made up of nodes and references between nodes.
- * Every node has a unique :ref:`nodeid`. NodeIds refer to a namespace with an
- * additional identifier value that can be an integer, a string, a guid or a
- * bytestring. */
-
-static void
-variables_nodeids(void) {
-    UA_NodeId id1 = UA_NODEID_NUMERIC(1, 1234);
-    id1.namespaceIndex = 3;
-
-    UA_NodeId id2 = UA_NODEID_STRING(1, "testid"); /* the string is static */
-    UA_Boolean eq = UA_NodeId_equal(&id1, &id2);
-    if(eq)
-        return;
-
-    UA_NodeId id3;
-    UA_NodeId_copy(&id2, &id3);
-    UA_NodeId_clear(&id3);
-
-    UA_NodeId id4 = UA_NODEID_STRING_ALLOC(1, "testid"); /* the string is copied
-                                                            to the heap */
-    UA_NodeId_clear(&id4);
-}
-
-/**
- * Variants
- * ^^^^^^^^
- * The datatype :ref:`variant` belongs to the built-in datatypes of OPC UA and
- * is used as a container type. A variant can hold any other datatype as a
- * scalar (except variant) or as an array. Array variants can additionally
- * denote the dimensionality of the data (e.g. a 2x3 matrix) in an additional
- * integer array. */
-
-static void
-variables_variants(void) {
-    /* Set a scalar value */
-    UA_Variant v;
-    UA_Int32 i = 42;
-    UA_Variant_setScalar(&v, &i, &UA_TYPES[UA_TYPES_INT32]);
-
-    /* Make a copy */
-    UA_Variant v2;
-    UA_Variant_copy(&v, &v2);
-    UA_Variant_clear(&v2);
-
-    /* Set an array value */
-    UA_Variant v3;
-    UA_Double d[9] = {1.0, 2.0, 3.0,
-                      4.0, 5.0, 6.0,
-                      7.0, 8.0, 9.0};
-    UA_Variant_setArrayCopy(&v3, d, 9, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    /* Set array dimensions */
-    v3.arrayDimensions = (UA_UInt32 *)UA_Array_new(2, &UA_TYPES[UA_TYPES_UINT32]);
-    v3.arrayDimensionsSize = 2;
-    v3.arrayDimensions[0] = 3;
-    v3.arrayDimensions[1] = 3;
-    UA_Variant_clear(&v3);
-}
-
-/** It follows the main function, making use of the above definitions. */
-
-int main(void) {
-    variables_basic();
-    variables_nodeids();
-    variables_variants();
-    return EXIT_SUCCESS;
-}
diff --git a/ext/open62541/examples/tutorial_server_datasource.c b/ext/open62541/examples/tutorial_server_datasource.c
deleted file mode 100644
index 8078297..0000000
--- a/ext/open62541/examples/tutorial_server_datasource.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Connecting a Variable with a Physical Process
- * ---------------------------------------------
- *
- * In OPC UA-based architectures, servers are typically situated near the source
- * of information. In an industrial context, this translates into servers being
- * near the physical process and clients consuming the data at runtime. In the
- * previous tutorial, we saw how to add variables to an OPC UA information
- * model. This tutorial shows how to connect a variable to runtime information,
- * for example from measurements of a physical process. For simplicity, we take
- * the system clock as the underlying "process".
- *
- * The following code snippets are each concerned with a different way of
- * updating variable values at runtime. Taken together, the code snippets define
- * a compilable source file.
- *
- * Updating variables manually
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * As a starting point, assume that a variable for a value of type
- * :ref:`datetime` has been created in the server with the identifier
- * "ns=1,s=current-time". Assuming that our applications gets triggered when a
- * new value arrives from the underlying process, we can just write into the
- * variable. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static void
-updateCurrentTime(UA_Server *server) {
-    UA_DateTime now = UA_DateTime_now();
-    UA_Variant value;
-    UA_Variant_setScalar(&value, &now, &UA_TYPES[UA_TYPES_DATETIME]);
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-    UA_Server_writeValue(server, currentNodeId, value);
-}
-
-static void
-addCurrentTimeVariable(UA_Server *server) {
-    UA_DateTime now = 0;
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Current time - value callback");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&attr.value, &now, &UA_TYPES[UA_TYPES_DATETIME]);
-
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-    UA_QualifiedName currentName = UA_QUALIFIEDNAME(1, "current-time-value-callback");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId variableTypeNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
-    UA_Server_addVariableNode(server, currentNodeId, parentNodeId,
-                              parentReferenceNodeId, currentName,
-                              variableTypeNodeId, attr, NULL, NULL);
-
-    updateCurrentTime(server);
-}
-
-/**
- * Variable Value Callback
- * ^^^^^^^^^^^^^^^^^^^^^^^
- *
- * When a value changes continuously, such as the system time, updating the
- * value in a tight loop would take up a lot of resources. Value callbacks allow
- * to synchronize a variable value with an external representation. They attach
- * callbacks to the variable that are executed before every read and after every
- * write operation. */
-
-static void
-beforeReadTime(UA_Server *server,
-               const UA_NodeId *sessionId, void *sessionContext,
-               const UA_NodeId *nodeid, void *nodeContext,
-               const UA_NumericRange *range, const UA_DataValue *data) {
-    updateCurrentTime(server);
-}
-
-static void
-afterWriteTime(UA_Server *server,
-               const UA_NodeId *sessionId, void *sessionContext,
-               const UA_NodeId *nodeId, void *nodeContext,
-               const UA_NumericRange *range, const UA_DataValue *data) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "The variable was updated");
-}
-
-static void
-addValueCallbackToCurrentTimeVariable(UA_Server *server) {
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-    UA_ValueCallback callback ;
-    callback.onRead = beforeReadTime;
-    callback.onWrite = afterWriteTime;
-    UA_Server_setVariableNode_valueCallback(server, currentNodeId, callback);
-}
-
-/**
- * Variable Data Sources
- * ^^^^^^^^^^^^^^^^^^^^^
- *
- * With value callbacks, the value is still stored in the variable node.
- * So-called data sources go one step further. The server redirects every read
- * and write request to a callback function. Upon reading, the callback provides
- * copy of the current value. Internally, the data source needs to implement its
- * own memory management. */
-
-static UA_StatusCode
-readCurrentTime(UA_Server *server,
-                const UA_NodeId *sessionId, void *sessionContext,
-                const UA_NodeId *nodeId, void *nodeContext,
-                UA_Boolean sourceTimeStamp, const UA_NumericRange *range,
-                UA_DataValue *dataValue) {
-    UA_DateTime now = UA_DateTime_now();
-    UA_Variant_setScalarCopy(&dataValue->value, &now,
-                             &UA_TYPES[UA_TYPES_DATETIME]);
-    dataValue->hasValue = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeCurrentTime(UA_Server *server,
-                 const UA_NodeId *sessionId, void *sessionContext,
-                 const UA_NodeId *nodeId, void *nodeContext,
-                 const UA_NumericRange *range, const UA_DataValue *data) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "Changing the system time is not implemented");
-    return UA_STATUSCODE_BADINTERNALERROR;
-}
-
-static void
-addCurrentTimeDataSourceVariable(UA_Server *server) {
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Current time - data source");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-datasource");
-    UA_QualifiedName currentName = UA_QUALIFIEDNAME(1, "current-time-datasource");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId variableTypeNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
-
-    UA_DataSource timeDataSource;
-    timeDataSource.read = readCurrentTime;
-    timeDataSource.write = writeCurrentTime;
-    UA_Server_addDataSourceVariableNode(server, currentNodeId, parentNodeId,
-                                        parentReferenceNodeId, currentName,
-                                        variableTypeNodeId, attr,
-                                        timeDataSource, NULL, NULL);
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    addCurrentTimeVariable(server);
-    addValueCallbackToCurrentTimeVariable(server);
-    addCurrentTimeDataSourceVariable(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_events.c b/ext/open62541/examples/tutorial_server_events.c
deleted file mode 100644
index b08872a..0000000
--- a/ext/open62541/examples/tutorial_server_events.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-/**
- * Generating events
- * -----------------
- * To make sense of the many things going on in a server, monitoring items can be useful. Though in many cases, data
- * change does not convey enough information to be the optimal solution. Events can be generated at any time,
- * hold a lot of information and can be filtered so the client only receives the specific attributes he is interested in.
- *
- * Emitting events by calling methods
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * The following example will be based on the server method tutorial. We will be
- * creating a method node which generates an event from the server node.
- *
- * The event we want to generate should be very simple. Since the `BaseEventType` is abstract,
- * we will have to create our own event type. `EventTypes` are saved internally as `ObjectTypes`,
- * so add the type as you would a new `ObjectType`. */
-
-static UA_NodeId eventType;
-
-static UA_StatusCode
-addNewEventType(UA_Server *server) {
-    UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "SimpleEventType");
-    attr.description = UA_LOCALIZEDTEXT("en-US", "The simple event type we created");
-    return UA_Server_addObjectTypeNode(server, UA_NODEID_NULL,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                       UA_QUALIFIEDNAME(0, "SimpleEventType"),
-                                       attr, NULL, &eventType);
-}
-
-/**
- * Setting up an event
- * ^^^^^^^^^^^^^^^^^^^
- * In order to set up the event, we can first use ``UA_Server_createEvent`` to give us a node representation of the event.
- * All we need for this is our `EventType`. Once we have our event node, which is saved internally as an `ObjectNode`,
- * we can define the attributes the event has the same way we would define the attributes of an object node. It is not
- * necessary to define the attributes `EventId`, `ReceiveTime`, `SourceNode` or `EventType` since these are set
- * automatically by the server. In this example, we will be setting the fields 'Message' and 'Severity' in addition
- * to `Time` which is needed to make the example UaExpert compliant.
- */
-static UA_StatusCode
-setUpEvent(UA_Server *server, UA_NodeId *outId) {
-    UA_StatusCode retval = UA_Server_createEvent(server, eventType, outId);
-    if (retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                       "createEvent failed. StatusCode %s", UA_StatusCode_name(retval));
-        return retval;
-    }
-
-    /* Set the Event Attributes */
-    /* Setting the Time is required or else the event will not show up in UAExpert! */
-    UA_DateTime eventTime = UA_DateTime_now();
-    UA_Server_writeObjectProperty_scalar(server, *outId, UA_QUALIFIEDNAME(0, "Time"),
-                                         &eventTime, &UA_TYPES[UA_TYPES_DATETIME]);
-
-    UA_UInt16 eventSeverity = 100;
-    UA_Server_writeObjectProperty_scalar(server, *outId, UA_QUALIFIEDNAME(0, "Severity"),
-                                         &eventSeverity, &UA_TYPES[UA_TYPES_UINT16]);
-
-    UA_LocalizedText eventMessage = UA_LOCALIZEDTEXT("en-US", "An event has been generated.");
-    UA_Server_writeObjectProperty_scalar(server, *outId, UA_QUALIFIEDNAME(0, "Message"),
-                                         &eventMessage, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-
-    UA_String eventSourceName = UA_STRING("Server");
-    UA_Server_writeObjectProperty_scalar(server, *outId, UA_QUALIFIEDNAME(0, "SourceName"),
-                                         &eventSourceName, &UA_TYPES[UA_TYPES_STRING]);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Triggering an event
- * ^^^^^^^^^^^^^^^^^^^
- * First a node representing an event is generated using ``setUpEvent``. Once our event is good to go, we specify
- * a node which emits the event - in this case the server node. We can use ``UA_Server_triggerEvent`` to trigger our
- * event onto said node. Passing ``NULL`` as the second-last argument means we will not receive the `EventId`.
- * The last boolean argument states whether the node should be deleted. */
-static UA_StatusCode
-generateEventMethodCallback(UA_Server *server,
-                         const UA_NodeId *sessionId, void *sessionHandle,
-                         const UA_NodeId *methodId, void *methodContext,
-                         const UA_NodeId *objectId, void *objectContext,
-                         size_t inputSize, const UA_Variant *input,
-                         size_t outputSize, UA_Variant *output) {
-
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Creating event");
-
-    /* set up event */
-    UA_NodeId eventNodeId;
-    UA_StatusCode retval = setUpEvent(server, &eventNodeId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                       "Creating event failed. StatusCode %s", UA_StatusCode_name(retval));
-        return retval;
-    }
-
-    retval = UA_Server_triggerEvent(server, eventNodeId,
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
-                                    NULL, UA_TRUE);
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, 
-                       "Triggering event failed. StatusCode %s", UA_StatusCode_name(retval));
-
-    return retval;
-}
-
-/**
- * Now, all that is left to do is to create a method node which uses our callback. We do not
- * require any input and as output we will be using the `EventId` we receive from ``triggerEvent``. The `EventId` is
- * generated by the server internally and is a random unique ID which identifies that specific event.
- *
- * This method node will be added to a basic server setup.
- */
-
-static void
-addGenerateEventMethod(UA_Server *server) {
-    UA_MethodAttributes generateAttr = UA_MethodAttributes_default;
-    generateAttr.description = UA_LOCALIZEDTEXT("en-US","Generate an event.");
-    generateAttr.displayName = UA_LOCALIZEDTEXT("en-US","Generate Event");
-    generateAttr.executable = true;
-    generateAttr.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, 62541),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "Generate Event"),
-                            generateAttr, &generateEventMethodCallback,
-                            0, NULL, 0, NULL, NULL, NULL);
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sig) {
-    running = false;
-}
-
-int main (void) {
-    /* default server values */
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    addNewEventType(server);
-    addGenerateEventMethod(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_firststeps.c b/ext/open62541/examples/tutorial_server_firststeps.c
deleted file mode 100644
index f3db2ce..0000000
--- a/ext/open62541/examples/tutorial_server_firststeps.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Building a Simple Server
- * ------------------------
- *
- * This series of tutorial guide you through your first steps with open62541.
- * For compiling the examples, you need a compiler (MS Visual Studio 2015 or
- * newer, GCC, Clang and MinGW32 are all known to be working). The compilation
- * instructions are given for GCC but should be straightforward to adapt.
- *
- * It will also be very helpful to install an OPC UA Client with a graphical
- * frontend, such as UAExpert by Unified Automation. That will enable you to
- * examine the information model of any OPC UA server.
- *
- * To get started, downdload the open62541 single-file release from
- * http://open62541.org or generate it according to the :ref:`build instructions
- * <building>` with the "amalgamation" option enabled. From now on, we assume
- * you have the ``open62541.c/.h`` files in the current folder. Now create a new
- * C source-file called ``myServer.c`` with the following content: */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sig) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-/**
- * This is all that is needed for a simple OPC UA server. With the GCC compiler,
- * the following command produces an executable:
- *
- * .. code-block:: bash
- *
- *    $ gcc -std=c99 open62541.c myServer.c -o myServer
- *
- * In a MinGW environment, the Winsock library must be added.
- *
- * .. code-block:: bash
- *
- *    $ gcc -std=c99 open62541.c myServer.c -lws2_32 -o myServer.exe
- *
- * Now start the server (stop with ctrl-c):
- *
- * .. code-block:: bash
- *
- *    $ ./myServer
- *
- * You have now compiled and run your first OPC UA server. You can go ahead and
- * browse the information model with client. The server is listening on
- * ``opc.tcp://localhost:4840``. In the next two sections, we will continue to
- * explain the different parts of the code in detail.
- *
- * Server Configuration and Plugins
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- *
- * *open62541* provides a flexible framework for building OPC UA servers and
- * clients. The goals is to have a core library that accommodates for all use
- * cases and runs on all platforms. Users can then adjust the library to fit
- * their use case via configuration and by developing (platform-specific)
- * plugins. The core library is based on C99 only and does not even require
- * basic POSIX support. For example, the lowlevel networking code is implemented
- * as an exchangeable plugin. But don't worry. *open62541* provides plugin
- * implementations for most platforms and sensible default configurations
- * out-of-the-box.
- * 
- * In the above server code, we simply take the default server configuration and
- * add a single TCP network layer that is listerning on port 4840.
- *
- * Server Lifecycle
- * ^^^^^^^^^^^^^^^^
- *
- * The code in this example shows the three parts for server lifecycle
- * management: Creating a server, running the server, and deleting the server.
- * Creating and deleting a server is trivial once the configuration is set up.
- * The server is started with ``UA_Server_run``. Internally, the server then
- * uses timeouts to schedule regular tasks. Between the timeouts, the server
- * listens on the network layer for incoming messages.
- *
- * You might ask how the server knows when to stop running. For this, we have
- * created a global variable ``running``. Furthermore, we have registered the
- * method ``stopHandler`` that catches the signal (interrupt) the program
- * receives when the operating systems tries to close it. This happens for
- * example when you press ctrl-c in a terminal program. The signal handler then
- * sets the variable ``running`` to false and the server shuts down once it
- * takes back control.
- *
- * In order to integrated OPC UA in a single-threaded application with its own
- * mainloop (for example provided by a GUI toolkit), one can alternatively drive
- * the server manually. See the section of the server documentation on
- * :ref:`server-lifecycle` for details.
- *
- * The server configuration and lifecycle management is needed for all servers.
- * We will use it in the following tutorials without further comment.
- */
diff --git a/ext/open62541/examples/tutorial_server_historicaldata.c b/ext/open62541/examples/tutorial_server_historicaldata.c
deleted file mode 100644
index 26c8945..0000000
--- a/ext/open62541/examples/tutorial_server_historicaldata.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- * Copyright 2019 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/plugin/historydata/history_data_backend_memory.h>
-#include <open62541/plugin/historydata/history_data_gathering_default.h>
-#include <open62541/plugin/historydata/history_database_default.h>
-#include <open62541/plugin/historydatabase.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    (void)sign;
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    /* We need a gathering for the plugin to constuct.
-     * The UA_HistoryDataGathering is responsible to collect data and store it to the database.
-     * We will use this gathering for one node, only. initialNodeIdStoreSize = 1
-     * The store will grow if you register more than one node, but this is expensive. */
-    UA_HistoryDataGathering gathering = UA_HistoryDataGathering_Default(1);
-
-    /* We set the responsible plugin in the configuration. UA_HistoryDatabase is
-     * the main plugin which handles the historical data service. */
-    config->historyDatabase = UA_HistoryDatabase_default(gathering);
-
-    /* Define the attribute of the uint32 variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_UInt32 myUint32 = 40;
-    UA_Variant_setScalar(&attr.value, &myUint32, &UA_TYPES[UA_TYPES_UINT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","myUintValue");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","myUintValue");
-    attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
-    /* We set the access level to also support history read
-     * This is what will be reported to clients */
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD;
-    /* We also set this node to historizing, so the server internals also know from it. */
-    attr.historizing = true;
-
-    /* Add the variable node to the information model */
-    UA_NodeId uint32NodeId = UA_NODEID_STRING(1, "myUintValue");
-    UA_QualifiedName uint32Name = UA_QUALIFIEDNAME(1, "myUintValue");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId outNodeId;
-    UA_NodeId_init(&outNodeId);
-    UA_StatusCode retval = UA_Server_addVariableNode(server,
-                                                     uint32NodeId,
-                                                     parentNodeId,
-                                                     parentReferenceNodeId,
-                                                     uint32Name,
-                                                     UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                     attr,
-                                                     NULL,
-                                                     &outNodeId);
-
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                "UA_Server_addVariableNode %s", UA_StatusCode_name(retval));
-
-    /* Now we define the settings for our node */
-    UA_HistorizingNodeIdSettings setting;
-
-    /* There is a memory based database plugin. We will use that. We just
-     * reserve space for 3 nodes with 100 values each. This will also
-     * automaticaly grow if needed, but that is expensive, because all data must
-     * be copied. */
-    setting.historizingBackend = UA_HistoryDataBackend_Memory(3, 100);
-
-    /* We want the server to serve a maximum of 100 values per request. This
-     * value depend on the plattform you are running the server. A big server
-     * can serve more values, smaller ones less. */
-    setting.maxHistoryDataResponseSize = 100;
-
-    /* If we have a sensor which do not report updates
-     * and need to be polled we change the setting like that.
-     * The polling interval in ms.
-     *
-    setting.pollingInterval = 100;
-     *
-     * Set the update strategie to polling.
-     *
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_POLL;
-     */
-
-    /* If you want to insert the values to the database yourself, we can set the user strategy here.
-     * This is useful if you for example want a value stored, if a defined delta is reached.
-     * Then you should use a local monitored item with a fuzziness and store the value in the callback.
-     *
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-     */
-
-    /* We want the values stored in the database, when the nodes value is
-     * set. */
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_VALUESET;
-
-    /* At the end we register the node for gathering data in the database. */
-    retval = gathering.registerNodeId(server, gathering.context, &outNodeId, setting);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "registerNodeId %s", UA_StatusCode_name(retval));
-
-    /* If you use UA_HISTORIZINGUPDATESTRATEGY_POLL, then start the polling.
-     *
-    retval = gathering.startPoll(server, gathering.context, &outNodeId);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "startPoll %s", UA_StatusCode_name(retval));
-    */
-    retval = UA_Server_run(server, &running);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "UA_Server_run %s", UA_StatusCode_name(retval));
-    /*
-     * If you use UA_HISTORIZINGUPDATESTRATEGY_POLL, then stop the polling.
-     *
-    retval = gathering.stopPoll(server, gathering.context, &outNodeId);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "stopPoll %s", UA_StatusCode_name(retval));
-    */
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_method.c b/ext/open62541/examples/tutorial_server_method.c
deleted file mode 100644
index e83bac5..0000000
--- a/ext/open62541/examples/tutorial_server_method.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Adding Methods to Objects
- * -------------------------
- *
- * An object in an OPC UA information model may contain methods similar to
- * objects in a programming language. Methods are represented by a MethodNode.
- * Note that several objects may reference the same MethodNode. When an object
- * type is instantiated, a reference to the method is added instead of copying
- * the MethodNode. Therefore, the identifier of the context object is always
- * explicitly stated when a method is called.
- *
- * The method callback takes as input a custom data pointer attached to the
- * method node, the identifier of the object from which the method is called,
- * and two arrays for the input and output arguments. The input and output
- * arguments are all of type :ref:`variant`. Each variant may in turn contain a
- * (multi-dimensional) array or scalar of any data type.
- *
- * Constraints for the method arguments are defined in terms of data type, value
- * rank and array dimension (similar to variable definitions). The argument
- * definitions are stored in child VariableNodes of the MethodNode with the
- * respective BrowseNames ``(0, "InputArguments")`` and ``(0,
- * "OutputArguments")``.
- *
- * Example: Hello World Method
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * The method takes a string scalar and returns a string scalar with "Hello "
- * prepended. The type and length of the input arguments is checked internally
- * by the SDK, so that we don't have to verify the arguments in the callback. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static UA_StatusCode
-helloWorldMethodCallback(UA_Server *server,
-                         const UA_NodeId *sessionId, void *sessionHandle,
-                         const UA_NodeId *methodId, void *methodContext,
-                         const UA_NodeId *objectId, void *objectContext,
-                         size_t inputSize, const UA_Variant *input,
-                         size_t outputSize, UA_Variant *output) {
-    UA_String *inputStr = (UA_String*)input->data;
-    UA_String tmp = UA_STRING_ALLOC("Hello ");
-    if(inputStr->length > 0) {
-        tmp.data = (UA_Byte *)UA_realloc(tmp.data, tmp.length + inputStr->length);
-        memcpy(&tmp.data[tmp.length], inputStr->data, inputStr->length);
-        tmp.length += inputStr->length;
-    }
-    UA_Variant_setScalarCopy(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
-    UA_String_clear(&tmp);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Hello World was called");
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-addHellWorldMethod(UA_Server *server) {
-    UA_Argument inputArgument;
-    UA_Argument_init(&inputArgument);
-    inputArgument.description = UA_LOCALIZEDTEXT("en-US", "A String");
-    inputArgument.name = UA_STRING("MyInput");
-    inputArgument.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-    inputArgument.valueRank = UA_VALUERANK_SCALAR;
-
-    UA_Argument outputArgument;
-    UA_Argument_init(&outputArgument);
-    outputArgument.description = UA_LOCALIZEDTEXT("en-US", "A String");
-    outputArgument.name = UA_STRING("MyOutput");
-    outputArgument.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-    outputArgument.valueRank = UA_VALUERANK_SCALAR;
-
-    UA_MethodAttributes helloAttr = UA_MethodAttributes_default;
-    helloAttr.description = UA_LOCALIZEDTEXT("en-US","Say `Hello World`");
-    helloAttr.displayName = UA_LOCALIZEDTEXT("en-US","Hello World");
-    helloAttr.executable = true;
-    helloAttr.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "hello world"),
-                            helloAttr, &helloWorldMethodCallback,
-                            1, &inputArgument, 1, &outputArgument, NULL, NULL);
-}
-
-/**
- * Increase Array Values Method
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * The method takes an array of 5 integers and a scalar as input. It returns a
- * copy of the array with every entry increased by the scalar. */
-
-static UA_StatusCode
-IncInt32ArrayMethodCallback(UA_Server *server,
-                            const UA_NodeId *sessionId, void *sessionContext,
-                            const UA_NodeId *methodId, void *methodContext,
-                            const UA_NodeId *objectId, void *objectContext,
-                            size_t inputSize, const UA_Variant *input,
-                            size_t outputSize, UA_Variant *output) {
-    UA_Int32 *inputArray = (UA_Int32*)input[0].data;
-    UA_Int32 delta = *(UA_Int32*)input[1].data;
-
-    /* Copy the input array */
-    UA_StatusCode retval = UA_Variant_setArrayCopy(output, inputArray, 5,
-                                                   &UA_TYPES[UA_TYPES_INT32]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Increate the elements */
-    UA_Int32 *outputArray = (UA_Int32*)output->data;
-    for(size_t i = 0; i < input->arrayLength; i++)
-        outputArray[i] = inputArray[i] + delta;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-addIncInt32ArrayMethod(UA_Server *server) {
-    /* Two input arguments */
-    UA_Argument inputArguments[2];
-    UA_Argument_init(&inputArguments[0]);
-    inputArguments[0].description = UA_LOCALIZEDTEXT("en-US", "int32[5] array");
-    inputArguments[0].name = UA_STRING("int32 array");
-    inputArguments[0].dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    inputArguments[0].valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 pInputDimension = 5;
-    inputArguments[0].arrayDimensionsSize = 1;
-    inputArguments[0].arrayDimensions = &pInputDimension;
-
-    UA_Argument_init(&inputArguments[1]);
-    inputArguments[1].description = UA_LOCALIZEDTEXT("en-US", "int32 delta");
-    inputArguments[1].name = UA_STRING("int32 delta");
-    inputArguments[1].dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    inputArguments[1].valueRank = UA_VALUERANK_SCALAR;
-
-    /* One output argument */
-    UA_Argument outputArgument;
-    UA_Argument_init(&outputArgument);
-    outputArgument.description = UA_LOCALIZEDTEXT("en-US", "int32[5] array");
-    outputArgument.name = UA_STRING("each entry is incremented by the delta");
-    outputArgument.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    outputArgument.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 pOutputDimension = 5;
-    outputArgument.arrayDimensionsSize = 1;
-    outputArgument.arrayDimensions = &pOutputDimension;
-
-    /* Add the method node */
-    UA_MethodAttributes incAttr = UA_MethodAttributes_default;
-    incAttr.description = UA_LOCALIZEDTEXT("en-US", "IncInt32ArrayValues");
-    incAttr.displayName = UA_LOCALIZEDTEXT("en-US", "IncInt32ArrayValues");
-    incAttr.executable = true;
-    incAttr.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "IncInt32ArrayValues"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "IncInt32ArrayValues"),
-                            incAttr, &IncInt32ArrayMethodCallback,
-                            2, inputArguments, 1, &outputArgument,
-                            NULL, NULL);
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    addHellWorldMethod(server);
-    addIncInt32ArrayMethod(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_monitoreditems.c b/ext/open62541/examples/tutorial_server_monitoreditems.c
deleted file mode 100644
index 351bad1..0000000
--- a/ext/open62541/examples/tutorial_server_monitoreditems.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Observing Attributes with Local MonitoredItems
- * ----------------------------------------------
- *
- * A client that is interested in the current value of a variable does not need
- * to regularly poll the variable. Instead, he can use the Subscription
- * mechanism to be notified about changes.
- *
- * So-called MonitoredItems define which values (node attributes) and events the
- * client wants to monitor. Under the right conditions, a notification is
- * created and added to the Subscription. The notifications currently in the
- * queue are regularly send to the client.
- *
- * The local user can add MonitoredItems as well. Locally, the MonitoredItems to
- * not go via a Subscription and each have an individual callback method and a
- * context pointer.
- */
-
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static void
-dataChangeNotificationCallback(UA_Server *server, UA_UInt32 monitoredItemId,
-                               void *monitoredItemContext, const UA_NodeId *nodeId,
-                               void *nodeContext, UA_UInt32 attributeId,
-                               const UA_DataValue *value) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Received Notification");
-}
-
-static void
-addMonitoredItemToCurrentTimeVariable(UA_Server *server) {
-    UA_NodeId currentTimeNodeId =
-        UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(currentTimeNodeId);
-    monRequest.requestedParameters.samplingInterval = 100.0; /* 100 ms interval */
-    UA_Server_createDataChangeMonitoredItem(server, UA_TIMESTAMPSTORETURN_SOURCE,
-                                            monRequest, NULL, dataChangeNotificationCallback);
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    addMonitoredItemToCurrentTimeVariable(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-    UA_Server_delete(server);
-
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_object.c b/ext/open62541/examples/tutorial_server_object.c
deleted file mode 100644
index 23f19f1..0000000
--- a/ext/open62541/examples/tutorial_server_object.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Working with Objects and Object Types
- * -------------------------------------
- *
- * Using objects to structure information models
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Assume a situation where we want to model a set of pumps and their runtime
- * state in an OPC UA information model. Of course, all pump representations
- * should follow the same basic structure, For example, we might have graphical
- * representation of pumps in a SCADA visualisation that shall be resuable for
- * all pumps.
- *
- * Following the object-oriented programming paradigm, every pump is represented
- * by an object with the following layout:
- *
- * .. graphviz::
- *
- *    digraph tree {
- *
- *    fixedsize=true;
- *    node [width=2, height=0, shape=box, fillcolor="#E5E5E5", concentrate=true]
- *
- *    node_root [label=< <I>ObjectNode</I><BR/>Pump >]
- *
- *    { rank=same
- *      point_1 [shape=point]
- *      node_1 [label=< <I>VariableNode</I><BR/>ManufacturerName >] }
- *    node_root -> point_1 [arrowhead=none]
- *    point_1 -> node_1 [label="hasComponent"]
- *
- *    { rank=same
- *      point_2 [shape=point]
- *      node_2 [label=< <I>VariableNode</I><BR/>ModelName >] }
- *    point_1 -> point_2 [arrowhead=none]
- *    point_2 -> node_2 [label="hasComponent"]
- *
- *    {  rank=same
- *       point_4 [shape=point]
- *       node_4 [label=< <I>VariableNode</I><BR/>Status >] }
- *    point_2 -> point_4 [arrowhead=none]
- *    point_4 -> node_4 [label="hasComponent"]
- *
- *    {  rank=same
- *       point_5 [shape=point]
- *       node_5 [label=< <I>VariableNode</I><BR/>MotorRPM >] }
- *    point_4 -> point_5 [arrowhead=none]
- *    point_5 -> node_5 [label="hasComponent"]
- *
- *    }
- *
- * The following code manually defines a pump and its member variables. We omit
- * setting constraints on the variable values as this is not the focus of this
- * tutorial and was already covered. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-
-static void
-manuallyDefinePump(UA_Server *server) {
-    UA_NodeId pumpId; /* get the nodeid assigned by the server */
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Pump (Manual)");
-    UA_Server_addObjectNode(server, UA_NODEID_NULL,
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, "Pump (Manual)"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                            oAttr, NULL, &pumpId);
-
-    UA_VariableAttributes mnAttr = UA_VariableAttributes_default;
-    UA_String manufacturerName = UA_STRING("Pump King Ltd.");
-    UA_Variant_setScalar(&mnAttr.value, &manufacturerName, &UA_TYPES[UA_TYPES_STRING]);
-    mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName");
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "ManufacturerName"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), mnAttr, NULL, NULL);
-
-    UA_VariableAttributes modelAttr = UA_VariableAttributes_default;
-    UA_String modelName = UA_STRING("Mega Pump 3000");
-    UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]);
-    modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName");
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "ModelName"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), modelAttr, NULL, NULL);
-
-    UA_VariableAttributes statusAttr = UA_VariableAttributes_default;
-    UA_Boolean status = true;
-    UA_Variant_setScalar(&statusAttr.value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status");
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "Status"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), statusAttr, NULL, NULL);
-
-    UA_VariableAttributes rpmAttr = UA_VariableAttributes_default;
-    UA_Double rpm = 50.0;
-    UA_Variant_setScalar(&rpmAttr.value, &rpm, &UA_TYPES[UA_TYPES_DOUBLE]);
-    rpmAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MotorRPM");
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "MotorRPMs"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), rpmAttr, NULL, NULL);
-}
-
-/**
- * Object types, type hierarchies and instantiation
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Building up each object manually requires us to write a lot of code.
- * Furthermore, there is no way for clients to detect that an object represents
- * a pump. (We might use naming conventions or similar to detect pumps. But
- * that's not exactly a clean solution.) Furthermore, we might have more devices
- * than just pumps. And we require all devices to share some common structure.
- * The solution is to define ObjectTypes in a hierarchy with inheritance
- * relations.
- *
- * .. graphviz::
- *
- *    digraph tree {
- *
- *    fixedsize=true;
- *    node [width=2, height=0, shape=box, fillcolor="#E5E5E5", concentrate=true]
- *
- *    node_root [label=< <I>ObjectTypeNode</I><BR/>Device >]
- *
- *    { rank=same
- *      point_1 [shape=point]
- *      node_1 [label=< <I>VariableNode</I><BR/>ManufacturerName<BR/>(mandatory) >] }
- *    node_root -> point_1 [arrowhead=none]
- *    point_1 -> node_1 [label="hasComponent"]
- *
- *    { rank=same
- *      point_2 [shape=point]
- *      node_2 [label=< <I>VariableNode</I><BR/>ModelName >] }
- *    point_1 -> point_2 [arrowhead=none]
- *    point_2 -> node_2 [label="hasComponent"]
- *
- *    {  rank=same
- *       point_3 [shape=point]
- *       node_3 [label=< <I>ObjectTypeNode</I><BR/>Pump >] }
- *    point_2 -> point_3 [arrowhead=none]
- *    point_3 -> node_3 [label="hasSubtype"]
- *
- *    {  rank=same
- *       point_4 [shape=point]
- *       node_4 [label=< <I>VariableNode</I><BR/>Status<BR/>(mandatory) >] }
- *    node_3 -> point_4 [arrowhead=none]
- *    point_4 -> node_4 [label="hasComponent"]
- *
- *    {  rank=same
- *       point_5 [shape=point]
- *       node_5 [label=< <I>VariableNode</I><BR/>MotorRPM >] }
- *    point_4 -> point_5 [arrowhead=none]
- *    point_5 -> node_5 [label="hasComponent"]
- *
- *    }
- *
- * Children that are marked mandatory are automatically instantiated together
- * with the parent object. This is indicated by a `hasModellingRule` reference
- * to an object that representes the `mandatory` modelling rule. */
-
-/* predefined identifier for later use */
-UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-
-static void
-defineObjectTypes(UA_Server *server) {
-    /* Define the object type for "Device" */
-    UA_NodeId deviceTypeId; /* get the nodeid assigned by the server */
-    UA_ObjectTypeAttributes dtAttr = UA_ObjectTypeAttributes_default;
-    dtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DeviceType");
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NULL,
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "DeviceType"), dtAttr,
-                                NULL, &deviceTypeId);
-
-    UA_VariableAttributes mnAttr = UA_VariableAttributes_default;
-    mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName");
-    UA_NodeId manufacturerNameId;
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, deviceTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "ManufacturerName"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), mnAttr, NULL, &manufacturerNameId);
-    /* Make the manufacturer name mandatory */
-    UA_Server_addReference(server, manufacturerNameId,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-
-
-    UA_VariableAttributes modelAttr = UA_VariableAttributes_default;
-    modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName");
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, deviceTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "ModelName"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), modelAttr, NULL, NULL);
-
-    /* Define the object type for "Pump" */
-    UA_ObjectTypeAttributes ptAttr = UA_ObjectTypeAttributes_default;
-    ptAttr.displayName = UA_LOCALIZEDTEXT("en-US", "PumpType");
-    UA_Server_addObjectTypeNode(server, pumpTypeId,
-                                deviceTypeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "PumpType"), ptAttr,
-                                NULL, NULL);
-
-    UA_VariableAttributes statusAttr = UA_VariableAttributes_default;
-    statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status");
-    statusAttr.valueRank = UA_VALUERANK_SCALAR;
-    UA_NodeId statusId;
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "Status"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), statusAttr, NULL, &statusId);
-    /* Make the status variable mandatory */
-    UA_Server_addReference(server, statusId,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-
-    UA_VariableAttributes rpmAttr = UA_VariableAttributes_default;
-    rpmAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MotorRPM");
-    rpmAttr.valueRank = UA_VALUERANK_SCALAR;
-    UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "MotorRPMs"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), rpmAttr, NULL, NULL);
-}
-
-/**
- * Now we add the derived ObjectType for the pump that inherits from the device
- * object type. The resulting object contains all mandatory child variables.
- * These are simply copied over from the object type. The object has a reference
- * of type ``hasTypeDefinition`` to the object type, so that clients can detect
- * the type-instance relation at runtime.
- */
-
-static void
-addPumpObjectInstance(UA_Server *server, char *name) {
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", name);
-    UA_Server_addObjectNode(server, UA_NODEID_NULL,
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, name),
-                            pumpTypeId, /* this refers to the object type
-                                           identifier */
-                            oAttr, NULL, NULL);
-}
-
-/**
- * Often times, we want to run a constructor function on a new object. This is
- * especially useful when an object is instantiated at runtime (with the
- * AddNodes service) and the integration with an underlying process canot be
- * manually defined. In the following constructor example, we simply set the
- * pump status to on.
- */
-
-static UA_StatusCode
-pumpTypeConstructor(UA_Server *server,
-                    const UA_NodeId *sessionId, void *sessionContext,
-                    const UA_NodeId *typeId, void *typeContext,
-                    const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "New pump created");
-
-    /* Find the NodeId of the status child variable */
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = UA_QUALIFIEDNAME(1, "Status");
-
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = *nodeId;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-
-    UA_BrowsePathResult bpr =
-        UA_Server_translateBrowsePathToNodeIds(server, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD ||
-       bpr.targetsSize < 1)
-        return bpr.statusCode;
-
-    /* Set the status value */
-    UA_Boolean status = true;
-    UA_Variant value;
-    UA_Variant_setScalar(&value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
-    UA_BrowsePathResult_clear(&bpr);
-
-    /* At this point we could replace the node context .. */
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-addPumpTypeConstructor(UA_Server *server) {
-    UA_NodeTypeLifecycle lifecycle;
-    lifecycle.constructor = pumpTypeConstructor;
-    lifecycle.destructor = NULL;
-    UA_Server_setNodeTypeLifecycle(server, pumpTypeId, lifecycle);
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    manuallyDefinePump(server);
-    defineObjectTypes(server);
-    addPumpObjectInstance(server, "pump2");
-    addPumpObjectInstance(server, "pump3");
-    addPumpTypeConstructor(server);
-    addPumpObjectInstance(server, "pump4");
-    addPumpObjectInstance(server, "pump5");
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_variable.c b/ext/open62541/examples/tutorial_server_variable.c
deleted file mode 100644
index af34570..0000000
--- a/ext/open62541/examples/tutorial_server_variable.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Adding Variables to a Server
- * ----------------------------
- *
- * This tutorial shows how to work with data types and how to add variable nodes
- * to a server. First, we add a new variable to the server. Take a look at the
- * definition of the ``UA_VariableAttributes`` structure to see the list of all
- * attributes defined for VariableNodes.
- *
- * Note that the default settings have the AccessLevel of the variable value as
- * read only. See below for making the variable writable.
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static void
-addVariable(UA_Server *server) {
-    /* Define the attribute of the myInteger variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    /* Add the variable node to the information model */
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                              parentReferenceNodeId, myIntegerName,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);
-}
-
-static void
-addMatrixVariable(UA_Server *server) {
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Double Matrix");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    /* Set the variable value constraints */
-    attr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    attr.valueRank = UA_VALUERANK_TWO_DIMENSIONS;
-    UA_UInt32 arrayDims[2] = {2,2};
-    attr.arrayDimensions = arrayDims;
-    attr.arrayDimensionsSize = 2;
-
-    /* Set the value. The array dimensions need to be the same for the value. */
-    UA_Double zero[4] = {0.0, 0.0, 0.0, 0.0};
-    UA_Variant_setArray(&attr.value, zero, 4, &UA_TYPES[UA_TYPES_DOUBLE]);
-    attr.value.arrayDimensions = arrayDims;
-    attr.value.arrayDimensionsSize = 2;
-
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "double.matrix");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "double matrix");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                              parentReferenceNodeId, myIntegerName,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              attr, NULL, NULL);
-}
-
-/**
- * Now we change the value with the write service. This uses the same service
- * implementation that can also be reached over the network by an OPC UA client.
- */
-
-static void
-writeVariable(UA_Server *server) {
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-
-    /* Write a different integer value */
-    UA_Int32 myInteger = 43;
-    UA_Variant myVar;
-    UA_Variant_init(&myVar);
-    UA_Variant_setScalar(&myVar, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    UA_Server_writeValue(server, myIntegerNodeId, myVar);
-
-    /* Set the status code of the value to an error code. The function
-     * UA_Server_write provides access to the raw service. The above
-     * UA_Server_writeValue is syntactic sugar for writing a specific node
-     * attribute with the write service. */
-    UA_WriteValue wv;
-    UA_WriteValue_init(&wv);
-    wv.nodeId = myIntegerNodeId;
-    wv.attributeId = UA_ATTRIBUTEID_VALUE;
-    wv.value.status = UA_STATUSCODE_BADNOTCONNECTED;
-    wv.value.hasStatus = true;
-    UA_Server_write(server, &wv);
-
-    /* Reset the variable to a good statuscode with a value */
-    wv.value.hasStatus = false;
-    wv.value.value = myVar;
-    wv.value.hasValue = true;
-    UA_Server_write(server, &wv);
-}
-
-/**
- * Note how we initially set the DataType attribute of the variable node to the
- * NodeId of the Int32 data type. This forbids writing values that are not an
- * Int32. The following code shows how this consistency check is performed for
- * every write.
- */
-
-static void
-writeWrongVariable(UA_Server *server) {
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-
-    /* Write a string */
-    UA_String myString = UA_STRING("test");
-    UA_Variant myVar;
-    UA_Variant_init(&myVar);
-    UA_Variant_setScalar(&myVar, &myString, &UA_TYPES[UA_TYPES_STRING]);
-    UA_StatusCode retval = UA_Server_writeValue(server, myIntegerNodeId, myVar);
-    printf("Writing a string returned statuscode %s\n", UA_StatusCode_name(retval));
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_ServerConfig* config = UA_Server_getConfig(server);
-    config->verifyRequestTimestamp = UA_RULEHANDLING_ACCEPT;
-#ifdef UA_ENABLE_WEBSOCKET_SERVER
-    UA_ServerConfig_addNetworkLayerWS(UA_Server_getConfig(server), 7681, 0, 0);
-#endif
-
-    addVariable(server);
-    addMatrixVariable(server);
-    writeVariable(server);
-    writeWrongVariable(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/examples/tutorial_server_variabletype.c b/ext/open62541/examples/tutorial_server_variabletype.c
deleted file mode 100644
index f71341f..0000000
--- a/ext/open62541/examples/tutorial_server_variabletype.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/**
- * Working with Variable Types
- * ---------------------------
- *
- * Variable types have three functions:
- *
- * - Constrain the possible data type, value rank and array dimensions of the
- *   variables of that type. This allows interface code to be written against
- *   the generic type definition, so it is applicable for all instances.
- * - Provide a sensible default value
- * - Enable a semantic interpretation of the variable based on its type
- *
- * In the example of this tutorial, we represent a point in 2D space by an array
- * of double values. The following function adds the corresponding
- * VariableTypeNode to the hierarchy of variable types.
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <signal.h>
-#include <stdlib.h>
-
-static UA_NodeId pointTypeId;
-
-static void
-addVariableType2DPoint(UA_Server *server) {
-    UA_VariableTypeAttributes vtAttr = UA_VariableTypeAttributes_default;
-    vtAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vtAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 arrayDims[1] = {2};
-    vtAttr.arrayDimensions = arrayDims;
-    vtAttr.arrayDimensionsSize = 1;
-    vtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Type");
-
-    /* a matching default value is required */
-    UA_Double zero[2] = {0.0, 0.0};
-    UA_Variant_setArray(&vtAttr.value, zero, 2, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    UA_Server_addVariableTypeNode(server, UA_NODEID_NULL,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                  UA_QUALIFIEDNAME(1, "2DPoint Type"), UA_NODEID_NULL,
-                                  vtAttr, NULL, &pointTypeId);
-}
-
-/**
- * Now the new variable type for *2DPoint* can be referenced during the creation
- * of a new variable. If no value is given, the default from the variable type
- * is copied during instantiation.
- */
-
-static UA_NodeId pointVariableId;
-
-static void
-addVariable(UA_Server *server) {
-    /* Prepare the node attributes */
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 arrayDims[1] = {2};
-    vAttr.arrayDimensions = arrayDims;
-    vAttr.arrayDimensionsSize = 1;
-    vAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Variable");
-    vAttr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    /* vAttr.value is left empty, the server instantiates with the default value */
-
-    /* Add the node */
-    UA_Server_addVariableNode(server, UA_NODEID_NULL,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "2DPoint Type"), pointTypeId,
-                              vAttr, NULL, &pointVariableId);
-}
-
-/**
- * The constraints of the variable type are enforced when creating new variable
- * instances of the type. In the following function, adding a variable of
- * *2DPoint* type with a string value fails because The value does not match the
- * variable type constraints. */
-
-static void
-addVariableFail(UA_Server *server) {
-    /* Prepare the node attributes */
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vAttr.valueRank = UA_VALUERANK_SCALAR; /* a scalar. this is not allowed per the variable type */
-    vAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Variable (fail)");
-    UA_String s = UA_STRING("2dpoint?");
-    UA_Variant_setScalar(&vAttr.value, &s, &UA_TYPES[UA_TYPES_STRING]);
-
-    /* Add the node will return UA_STATUSCODE_BADTYPEMISMATCH*/
-    UA_Server_addVariableNode(server, UA_NODEID_NULL,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "2DPoint Type (fail)"), pointTypeId,
-                              vAttr, NULL, NULL);
-}
-
-/**
- * The constraints of the variable type are enforced when writing the datatype,
- * valuerank and arraydimensions attributes of the variable. This, in turn,
- * constrains the value attribute of the variable. */
-
-static void
-writeVariable(UA_Server *server) {
-    UA_StatusCode retval = UA_Server_writeValueRank(server, pointVariableId, UA_VALUERANK_ONE_OR_MORE_DIMENSIONS);
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
-                "Setting the Value Rank failed with Status Code %s",
-                UA_StatusCode_name(retval));
-
-}
-
-/** It follows the main server code, making use of the above definitions. */
-
-static volatile UA_Boolean running = true;
-static void stopHandler(int sign) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
-int main(void) {
-    signal(SIGINT, stopHandler);
-    signal(SIGTERM, stopHandler);
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    addVariableType2DPoint(server);
-    addVariable(server);
-    addVariableFail(server);
-    writeVariable(server);
-
-    UA_StatusCode retval = UA_Server_run(server, &running);
-
-    UA_Server_delete(server);
-    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/include/open62541/architecture_base.h b/ext/open62541/include/open62541/architecture_base.h
deleted file mode 100644
index 28efa63..0000000
--- a/ext/open62541/include/open62541/architecture_base.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef ARCH_UA_ARCHITECTURE_BASE_H
-#define ARCH_UA_ARCHITECTURE_BASE_H
-
-/*
- * With the following list of defines, one can define its own UA_sleep_ms using a preprocessor define.
- * E.g. see unit tests.
- */
-
-#ifdef UA_sleep_ms
-void UA_sleep_ms(unsigned long ms);
-#endif
-
-#ifdef UA_malloc
-void* UA_malloc(unsigned long size);
-#endif
-
-#ifdef UA_calloc
-void* UA_calloc(unsigned long num, unsigned long size); //allocate memory in the heap with size*num bytes and set the memory to zero
-#endif
-
-#ifdef UA_realloc
-void* UA_realloc(void *ptr, unsigned long new_size);//re-allocate memory in the heap with new_size bytes from previously allocated memory ptr
-#endif
-
-#ifdef UA_free
-void UA_free(void* ptr); //de-allocate memory previously allocated with UA_malloc, UA_calloc or UA_realloc
-#endif
-
-#endif //ARCH_UA_ARCHITECTURE_BASE_H
diff --git a/ext/open62541/include/open62541/architecture_definitions.h b/ext/open62541/include/open62541/architecture_definitions.h
deleted file mode 100644
index fc20716..0000000
--- a/ext/open62541/include/open62541/architecture_definitions.h
+++ /dev/null
@@ -1,378 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#ifndef ARCH_UA_ARCHITECTURE_DEFINITIONS_H_
-#define ARCH_UA_ARCHITECTURE_DEFINITIONS_H_
-
-#include <open62541/config.h>
-
-/**
- * C99 Definitions
- * --------------- */
-#include <string.h>
-#include <stddef.h>
-
-/* Include stdint.h and stdbool.h or workaround for older Visual Studios */
-#ifdef UNDER_CE
-# include "stdint.h"
-#endif
-#if !defined(_MSC_VER) || _MSC_VER >= 1800
-# include <stdint.h>
-# include <stdbool.h> /* C99 Boolean */
-#else
-# include "ms_stdint.h"
-# if !defined(__bool_true_false_are_defined)
-#  define bool unsigned char
-#  define true 1
-#  define false 0
-#  define __bool_true_false_are_defined
-# endif
-#endif
-
-/**
- * Assertions
- * ----------
- * The assert macro is disabled by defining NDEBUG. It is often forgotten to
- * include -DNDEBUG in the compiler flags when using the single-file release. So
- * we make assertions dependent on the UA_DEBUG definition handled by CMake. */
-#ifdef UA_DEBUG
-# include <assert.h>
-# define UA_assert(ignore) assert(ignore)
-#else
-# define UA_assert(ignore) do {} while(0)
-#endif
-
-/* Outputs an error message at compile time if the assert fails.
- * Example usage:
- * UA_STATIC_ASSERT(sizeof(long)==7, use_another_compiler_luke)
- * See: https://stackoverflow.com/a/4815532/869402 */
-#if defined(__cplusplus) && __cplusplus >= 201103L /* C++11 or above */
-# define UA_STATIC_ASSERT(cond,msg) static_assert(cond, #msg)
-#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L /* C11 or above */
-# define UA_STATIC_ASSERT(cond,msg) _Static_assert(cond, #msg)
-#elif defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) /* GCC, Clang, MSC */
-# define UA_CTASTR2(pre,post) pre ## post
-# define UA_CTASTR(pre,post) UA_CTASTR2(pre,post)
-# ifndef __COUNTER__ /* PPC GCC fix */
-#  define __COUNTER__ __LINE__
-# endif
-# define UA_STATIC_ASSERT(cond,msg)                             \
-    typedef struct {                                            \
-        int UA_CTASTR(static_assertion_failed_,msg) : !!(cond); \
-    } UA_CTASTR(static_assertion_failed_,__COUNTER__)
-#else /* Everybody else */
-# define UA_STATIC_ASSERT(cond,msg) typedef char static_assertion_##msg[(cond)?1:-1]
-#endif
-
-#if defined(_WIN32) && defined(UA_DYNAMIC_LINKING)
-# ifdef UA_DYNAMIC_LINKING_EXPORT /* export dll */
-#  ifdef __GNUC__
-#   define UA_EXPORT __attribute__ ((dllexport))
-#  else
-#   define UA_EXPORT __declspec(dllexport)
-#  endif
-# else /* import dll */
-#  ifdef __GNUC__
-#   define UA_EXPORT __attribute__ ((dllimport))
-#  else
-#   define UA_EXPORT __declspec(dllimport)
-#  endif
-# endif
-#else /* non win32 */
-# if __GNUC__ || __clang__
-#  define UA_EXPORT __attribute__ ((visibility ("default")))
-# endif
-#endif
-#ifndef UA_EXPORT
-# define UA_EXPORT /* fallback to default */
-#endif
-
-#define UA_THREADSAFE
-
-/**
- * Inline Functions
- * ---------------- */
-#ifdef _MSC_VER
-# define UA_INLINE __inline
-#else
-# define UA_INLINE inline
-#endif
-
-/**
- * Non-aliasing pointers
- * -------------------- */
-#ifdef _MSC_VER
-# define UA_RESTRICT __restrict
-#elif defined(__GNUC__)
-# define UA_RESTRICT __restrict__
-#else
-# define UA_RESTRICT restrict
-#endif
-
-/**
- * Function attributes
- * ------------------- */
-#if defined(__GNUC__) || defined(__clang__)
-# define UA_FUNC_ATTR_MALLOC __attribute__((malloc))
-# define UA_FUNC_ATTR_PURE __attribute__ ((pure))
-# define UA_FUNC_ATTR_CONST __attribute__((const))
-# define UA_FUNC_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-# define UA_FORMAT(X,Y) __attribute__ ((format (printf, X, Y)))
-#else
-# define UA_FUNC_ATTR_MALLOC
-# define UA_FUNC_ATTR_PURE
-# define UA_FUNC_ATTR_CONST
-# define UA_FUNC_ATTR_WARN_UNUSED_RESULT
-# define UA_FORMAT(X,Y)
-#endif
-
-#if defined(__GNUC__) || defined(__clang__)
-# define UA_DEPRECATED __attribute__((deprecated))
-#elif defined(_MSC_VER)
-# define UA_DEPRECATED __declspec(deprecated)
-#else
-# define UA_DEPRECATED
-#endif
-
-/**
- * Internal Attributes
- * -------------------
- * These attributes are only defined if the macro UA_INTERNAL is defined. That
- * way public methods can be annotated (e.g. to warn for unused results) but
- * warnings are only triggered for internal code. */
-
-#if defined(UA_INTERNAL) && (defined(__GNUC__) || defined(__clang__))
-# define UA_INTERNAL_DEPRECATED _Pragma ("GCC warning \"Macro is deprecated for internal use\"")
-#else
-# define UA_INTERNAL_DEPRECATED
-#endif
-
-#if defined(UA_INTERNAL) && (defined(__GNUC__) || defined(__clang__))
-# define UA_INTERNAL_FUNC_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#else
-# define UA_INTERNAL_FUNC_ATTR_WARN_UNUSED_RESULT
-#endif
-
-/**
- * Detect Endianness and IEEE 754 floating point
- * ---------------------------------------------
- * Integers and floating point numbers are transmitted in little-endian (IEEE
- * 754 for floating point) encoding. If the target architecture uses the same
- * format, numeral datatypes can be memcpy'd (overlayed) on the network buffer.
- * Otherwise, a slow default encoding routine is used that works for every
- * architecture.
- *
- * Integer Endianness
- * ^^^^^^^^^^^^^^^^^^
- * The definition ``UA_LITTLE_ENDIAN`` is true when the integer representation
- * of the target architecture is little-endian. */
-#if defined(_WIN32)
-# define UA_LITTLE_ENDIAN 1
-#elif defined(__i386__) || defined(__x86_64__) || defined(__amd64__)
-# define UA_LITTLE_ENDIAN 1
-#elif (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
-      (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
-# define UA_LITTLE_ENDIAN 1
-#elif defined(__linux__) /* Linux (including Android) */
-# include <endian.h>
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-#  define UA_LITTLE_ENDIAN 1
-# endif
-#elif defined(__OpenBSD__) /* OpenBSD */
-# include <sys/endian.h>
-# if BYTE_ORDER == LITTLE_ENDIAN
-#  define UA_LITTLE_ENDIAN 1
-# endif
-#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) /* Other BSD */
-# include <sys/endian.h>
-# if _BYTE_ORDER == _LITTLE_ENDIAN
-#  define UA_LITTLE_ENDIAN 1
-# endif
-#elif defined(__APPLE__) /* Apple (MacOS, iOS) */
-# include <libkern/OSByteOrder.h>
-# if defined(__LITTLE_ENDIAN__)
-#  define UA_LITTLE_ENDIAN 1
-# endif
-#elif defined(__QNX__) || defined(__QNXNTO__) /* QNX */
-# include <gulliver.h>
-# if defined(__LITTLEENDIAN__)
-#  define UA_LITTLE_ENDIAN 1
-# endif
-#elif defined(_OS9000) /* OS-9 */
-# if defined(_LIL_END)
-#  define UA_LITTLE_ENDIAN 1
-# endif
-#endif
-#ifndef UA_LITTLE_ENDIAN
-# define UA_LITTLE_ENDIAN 0
-#endif
-
-/* Can the integers be memcpy'd onto the network buffer? Add additional checks
- * here. Some platforms (e.g. QNX) have sizeof(bool) > 1. Manually disable
- * overlayed integer encoding if that is the case. */
-#if (UA_LITTLE_ENDIAN == 1)
-UA_STATIC_ASSERT(sizeof(bool) == 1, cannot_overlay_integers_with_large_bool);
-# define UA_BINARY_OVERLAYABLE_INTEGER 1
-#else
-# define UA_BINARY_OVERLAYABLE_INTEGER 0
-#endif
-
-/**
- * Float Endianness
- * ^^^^^^^^^^^^^^^^
- * The definition ``UA_FLOAT_IEEE754`` is set to true when the floating point
- * number representation of the target architecture is IEEE 754. The definition
- * ``UA_FLOAT_LITTLE_ENDIAN`` is set to true when the floating point number
- * representation is in little-endian encoding. */
-
-#if defined(_WIN32)
-# define UA_FLOAT_IEEE754 1
-#elif defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || \
-    defined(__ia64__) || defined(__powerpc__) || defined(__sparc__) || \
-    defined(__arm__)
-# define UA_FLOAT_IEEE754 1
-#elif defined(__STDC_IEC_559__)
-# define UA_FLOAT_IEEE754 1
-#else
-# define UA_FLOAT_IEEE754 0
-#endif
-
-/* Wikipedia says (https://en.wikipedia.org/wiki/Endianness): Although the
- * ubiquitous x86 processors of today use little-endian storage for all types of
- * data (integer, floating point, BCD), there are a number of hardware
- * architectures where floating-point numbers are represented in big-endian form
- * while integers are represented in little-endian form. */
-#if defined(_WIN32)
-# define UA_FLOAT_LITTLE_ENDIAN 1
-#elif defined(__i386__) || defined(__x86_64__) || defined(__amd64__)
-# define UA_FLOAT_LITTLE_ENDIAN 1
-#elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
-    (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) /* Defined only in GCC */
-# define UA_FLOAT_LITTLE_ENDIAN 1
-#elif defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && \
-    (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) /* Defined only in GCC */
-# define UA_FLOAT_LITTLE_ENDIAN 1
-#endif
-#ifndef UA_FLOAT_LITTLE_ENDIAN
-# define UA_FLOAT_LITTLE_ENDIAN 0
-#endif
-
-/* Only if the floating points are litle-endian **and** in IEEE 754 format can
- * we memcpy directly onto the network buffer. */
-#if (UA_FLOAT_IEEE754 == 1) && (UA_FLOAT_LITTLE_ENDIAN == 1)
-# define UA_BINARY_OVERLAYABLE_FLOAT 1
-#else
-# define UA_BINARY_OVERLAYABLE_FLOAT 0
-#endif
-
-
-/* Atomic Operations
- * -----------------
- * Atomic operations that synchronize across processor cores (for
- * multithreading). Only the inline-functions defined next are used. Replace
- * with architecture-specific operations if necessary. */
-#if UA_MULTITHREADING >= 200
-    #ifdef _MSC_VER /* Visual Studio */
-    #define UA_atomic_sync() _ReadWriteBarrier()
-    #else /* GCC/Clang */
-    #define UA_atomic_sync() __sync_synchronize()
-    #endif
-#else
-    #define UA_atomic_sync()
-#endif
-
-static UA_INLINE void *
-UA_atomic_xchg(void * volatile * addr, void *newptr) {
-#if UA_MULTITHREADING >= 200
-#ifdef _MSC_VER /* Visual Studio */
-    return _InterlockedExchangePointer(addr, newptr);
-#else /* GCC/Clang */
-    return __sync_lock_test_and_set(addr, newptr);
-#endif
-#else
-    void *old = *addr;
-    *addr = newptr;
-    return old;
-#endif
-}
-
-static UA_INLINE void *
-UA_atomic_cmpxchg(void * volatile * addr, void *expected, void *newptr) {
-#if UA_MULTITHREADING >= 200
-#ifdef _MSC_VER /* Visual Studio */
-    return _InterlockedCompareExchangePointer(addr, expected, newptr);
-#else /* GCC/Clang */
-    return __sync_val_compare_and_swap(addr, expected, newptr);
-#endif
-#else
-    void *old = *addr;
-    if(old == expected) {
-        *addr = newptr;
-    }
-    return old;
-#endif
-}
-
-static UA_INLINE uint32_t
-UA_atomic_addUInt32(volatile uint32_t *addr, uint32_t increase) {
-#if UA_MULTITHREADING >= 200
-#ifdef _MSC_VER /* Visual Studio */
-    return _InterlockedExchangeAdd(addr, increase) + increase;
-#else /* GCC/Clang */
-    return __sync_add_and_fetch(addr, increase);
-#endif
-#else
-    *addr += increase;
-    return *addr;
-#endif
-}
-
-static UA_INLINE size_t
-UA_atomic_addSize(volatile size_t *addr, size_t increase) {
-#if UA_MULTITHREADING >= 200
-#ifdef _MSC_VER /* Visual Studio */
-    return _InterlockedExchangeAdd(addr, increase) + increase;
-#else /* GCC/Clang */
-    return __sync_add_and_fetch(addr, increase);
-#endif
-#else
-    *addr += increase;
-    return *addr;
-#endif
-}
-
-static UA_INLINE uint32_t
-UA_atomic_subUInt32(volatile uint32_t *addr, uint32_t decrease) {
-#if UA_MULTITHREADING >= 200
-#ifdef _MSC_VER /* Visual Studio */
-    return _InterlockedExchangeSub(addr, decrease) - decrease;
-#else /* GCC/Clang */
-    return __sync_sub_and_fetch(addr, decrease);
-#endif
-#else
-    *addr -= decrease;
-    return *addr;
-#endif
-}
-
-static UA_INLINE size_t
-UA_atomic_subSize(volatile size_t *addr, size_t decrease) {
-#if UA_MULTITHREADING >= 200
-#ifdef _MSC_VER /* Visual Studio */
-    return _InterlockedExchangeSub(addr, decrease) - decrease;
-#else /* GCC/Clang */
-    return __sync_sub_and_fetch(addr, decrease);
-#endif
-#else
-    *addr -= decrease;
-    return *addr;
-#endif
-}
-
-#endif /* ARCH_UA_ARCHITECTURE_DEFINITIONS_H_ */
diff --git a/ext/open62541/include/open62541/architecture_functions.h b/ext/open62541/include/open62541/architecture_functions.h
deleted file mode 100644
index cb9d607..0000000
--- a/ext/open62541/include/open62541/architecture_functions.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-/*
- * This header has all the functions that are architecture dependent. The declaration is behind a ifndef since
- * they can be previously defined in the ua_architecture.h which include this files at the end
- */
-
-#ifndef PLUGINS_ARCH_UA_ARCHITECTURE_FUNCTIONS_H_
-#define PLUGINS_ARCH_UA_ARCHITECTURE_FUNCTIONS_H_
-
-#include <open62541/config.h>
-
-_UA_BEGIN_DECLS
-
-/*
- * Allocation functions
- */
-
-#ifndef UA_malloc
-void* UA_malloc(size_t size); //allocate memory in the heap with size bytes
-#endif
-
-#ifndef UA_calloc
-void* UA_calloc(size_t num, size_t size); //allocate memory in the heap with size*num bytes and set the memory to zero
-#endif
-
-#ifndef UA_realloc
-void* UA_realloc(void *ptr, size_t new_size);//re-allocate memory in the heap with new_size bytes from previously allocated memory ptr
-#endif
-
-#ifndef UA_free
-void UA_free(void* ptr); //de-allocate memory previously allocated with UA_malloc, UA_calloc or UA_realloc
-#endif
-
-#ifndef UA_alloca
-# if defined(__GNUC__) || defined(__clang__)
-#  define UA_alloca(size) __builtin_alloca (size)
-# elif defined(_WIN32)
-#  define UA_alloca(SIZE) _alloca(SIZE)
-# else
-#  include <alloca.h>
-#  define UA_alloca(SIZE) alloca(SIZE)
-# endif
-#endif
-
-#ifndef UA_STACKARRAY
-/* Stack-allocation of memory. Use C99 variable-length arrays if possible.
- * Otherwise revert to alloca. Note that alloca is not supported on some
- * plattforms. */
-# if defined(__GNUC__) || defined(__clang__)
-#  define UA_STACKARRAY(TYPE, NAME, SIZE) TYPE NAME[SIZE]
-# else
-#  define UA_STACKARRAY(TYPE, NAME, SIZE) \
-    TYPE *NAME = (TYPE*)UA_alloca(sizeof(TYPE) * SIZE)
-# endif
-#endif
-
-/*
- * Sleep function
- */
-
-#ifndef UA_sleep_ms
-int UA_sleep_ms(unsigned int miliSeconds); //suspend the thread for a certain amount of mili seconds
-#endif
-
-/*
- * Socket functions
- */
-
-#ifndef UA_send
-ssize_t UA_send(UA_SOCKET sockfd, const void *buf, size_t len, int flags); //equivalent to posix send implementation
-#endif
-
-#ifndef UA_sendto
-ssize_t sendto(UA_SOCKET sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); //equivalent to posix sendto implementation
-#endif
-
-#ifndef UA_select
-int UA_select(UA_SOCKET nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); //equivalent to posix select implementation
-#endif
-
-#ifndef UA_recv
-ssize_t UA_recv(UA_SOCKET sockfd, void *buf, size_t len, int flags); //equivalent to posix recv implementation
-#endif
-
-#ifndef UA_recvfrom
-ssize_t recvfrom(UA_SOCKET sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
-#endif
-
-#ifndef UA_shutdown
-int UA_shutdown(UA_SOCKET sockfd, int how); //equivalent to posix shutdown implementation
-#endif
-
-#ifndef UA_socket
-UA_SOCKET UA_socket(int domain, int type, int protocol);//equivalent to posix socket implementation
-#endif
-
-#ifndef UA_bind
-int UA_bind(UA_SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen);//equivalent to posix bind implementation
-#endif
-
-#ifndef UA_listen
-int UA_listen(UA_SOCKET sockfd, int backlog);//equivalent to posix listen implementation
-#endif
-
-#ifndef UA_accept
-int UA_accept(UA_SOCKET sockfd, struct sockaddr *addr, socklen_t *addrlen);//equivalent to posix accept implementation
-#endif
-
-#ifndef UA_close
-int UA_close(UA_SOCKET sockfd);//equivalent to posix close implementation
-#endif
-
-#ifndef UA_connect
-int UA_connect(UA_SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen);//equivalent to posix connect implementation
-#endif
-
-#ifndef UA_fd_set
-void UA_fd_set(UA_SOCKET fd, fd_set *set); //equivalent to posix FD_SET implementation
-#endif
-
-#ifndef UA_fd_isset
-int UA_fd_isset(UA_SOCKET fd, fd_set *set);//equivalent to posix FD_ISSET implementation
-#endif
-
-#ifndef UA_getaddrinfo
-int UA_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);//equivalent to posix getaddrinfo implementation
-#endif
-
-#ifndef UA_htonl
-uint32_t UA_htonl(uint32_t hostlong);//equivalent to posix UA_htonl implementation
-#endif
-
-#ifndef UA_ntohl
-uint32_t UA_ntohl(uint32_t netlong);//equivalent to posix ntohl implementation
-#endif
-
-#ifndef UA_inet_pton
-int UA_inet_pton(int af, const char *src, void *dst);//equivalent to ANSI inet_pton implementation
-#endif
-
-#if UA_IPV6
-# ifndef UA_if_nametoindex
-unsigned int UA_if_nametoindex(const char *ifname);//equivalent to posix if_nametoindex implementation
-# endif
-#endif
-
-#ifndef UA_socket_set_blocking
-unsigned int UA_socket_set_blocking(UA_SOCKET sockfd);//set a socket as blocking. Returns 0 if OK, other value otherwise
-#endif
-
-#ifndef UA_socket_set_nonblocking
-unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd);//set a socket as non-blocking. Returns 0 if OK, other value otherwise
-#endif
-
-#ifndef UA_getsockopt
-int UA_getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); //equivalent to posix getsockopt implementation. Only in non windows architectures
-#endif
-
-#ifndef UA_setsockopt
-int UA_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);//equivalent to posix setsockopt implementation
-#endif
-
-#ifndef UA_freeaddrinfo
-void UA_freeaddrinfo(struct addrinfo *res);//equivalent to posix freeaddrinfo implementatio
-#endif
-
-#ifndef UA_gethostname
-int UA_gethostname(char *name, size_t len);//equivalent to posix gethostname implementation
-#endif
-
-#ifndef UA_getsockname
-int UA_getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);//equivalent to posix getsockname implementation
-#endif
-
-#ifndef UA_initialize_architecture_network
-void UA_initialize_architecture_network(void);//initializes all needed for using the network interfaces
-#endif
-
-#ifndef UA_deinitialize_architecture_network
-void UA_deinitialize_architecture_network(void);//de-initializes the network interfaces
-#endif
-
-/*
- * Print function
- */
-#ifndef UA_snprintf
-int UA_snprintf(char* pa_stream, size_t pa_size, const char* pa_format, ...); //prints text to output
-#endif
-
-/*
- * Access to file function
- */
-
-#ifndef UA_access
-int UA_access(const char *pathname, int mode); //equivalent implementation of https://linux.die.net/man/2/access
-#endif
-
-#ifndef UA_fileExists
-#define UA_fileExists(X) ( UA_access(X, 0) == 0)
-#endif
-
-#include <open62541/architecture_definitions.h>
-
-_UA_END_DECLS
-
-#endif /* PLUGINS_ARCH_UA_ARCHITECTURE_FUNCTIONS_H_ */
diff --git a/ext/open62541/include/open62541/client.h b/ext/open62541/include/open62541/client.h
deleted file mode 100644
index e627de0..0000000
--- a/ext/open62541/include/open62541/client.h
+++ /dev/null
@@ -1,528 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015-2017 (c) Florian Palm
- *    Copyright 2015 (c) Holger Jeromin
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Kalycito Infotech Private Limited
- */
-
-#ifndef UA_CLIENT_H_
-#define UA_CLIENT_H_
-
-#include <open62541/client_config.h>
-#include <open62541/nodeids.h>
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * .. _client:
- *
- * Client
- * ======
- *
- * The client implementation allows remote access to all OPC UA services. For
- * convenience, some functionality has been wrapped in :ref:`high-level
- * abstractions <client-highlevel>`.
- *
- * **However**: At this time, the client does not yet contain its own thread or
- * event-driven main-loop. So the client will not perform any actions
- * automatically in the background. This is especially relevant for
- * subscriptions. The user will have to periodically call
- * `UA_Client_Subscriptions_manuallySendPublishRequest`. See also :ref:`here
- * <client-subscriptions>`.
- *
- *
- * .. include:: client_config.rst
- *
- * Client Lifecycle
- * ---------------- */
-
-/* Create a new client */
-UA_Client UA_EXPORT *
-UA_Client_new(void);
-
-/* Get the client connection status */
-UA_ClientState UA_EXPORT
-UA_Client_getState(UA_Client *client);
-
-/* Get the client configuration */
-UA_EXPORT UA_ClientConfig *
-UA_Client_getConfig(UA_Client *client);
-
-/* Get the client context */
-static UA_INLINE void *
-UA_Client_getContext(UA_Client *client) {
-    UA_ClientConfig *config = UA_Client_getConfig(client); /* Cannot fail */
-    return config->clientContext;
-}
-
-/* Reset a client */
-void UA_EXPORT
-UA_Client_reset(UA_Client *client);
-
-/* Delete a client */
-void UA_EXPORT
-UA_Client_delete(UA_Client *client);
-
-/**
- * Connect to a Server
- * ------------------- */
-
-typedef void (*UA_ClientAsyncServiceCallback)(UA_Client *client, void *userdata,
-        UA_UInt32 requestId, void *response);
-
-/* Connect to the server
- *
- * @param client to use
- * @param endpointURL to connect (for example "opc.tcp://localhost:4840")
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_connect(UA_Client *client, const char *endpointUrl);
-
-UA_StatusCode UA_EXPORT
-UA_Client_connect_async(UA_Client *client, const char *endpointUrl,
-                        UA_ClientAsyncServiceCallback callback,
-                        void *userdata);
-
-/* Connect to the server without creating a session
- *
- * @param client to use
- * @param endpointURL to connect (for example "opc.tcp://localhost:4840")
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_connect_noSession(UA_Client *client, const char *endpointUrl);
-
-/* Connect to the selected server with the given username and password
- *
- * @param client to use
- * @param endpointURL to connect (for example "opc.tcp://localhost:4840")
- * @param username
- * @param password
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_connect_username(UA_Client *client, const char *endpointUrl,
-                           const char *username, const char *password);
-
-/* Disconnect and close a connection to the selected server */
-UA_StatusCode UA_EXPORT
-UA_Client_disconnect(UA_Client *client);
-
-UA_StatusCode UA_EXPORT
-UA_Client_disconnect_async(UA_Client *client, UA_UInt32 *requestId);
-
-/* Close a connection to the selected server */
-UA_DEPRECATED static UA_INLINE UA_StatusCode
-UA_Client_close(UA_Client *client) {
-    return UA_Client_disconnect(client);
-}
-
-/**
- * Discovery
- * --------- */
-
-/* Gets a list of endpoints of a server
- *
- * @param client to use. Must be connected to the same endpoint given in
- *        serverUrl or otherwise in disconnected state.
- * @param serverUrl url to connect (for example "opc.tcp://localhost:4840")
- * @param endpointDescriptionsSize size of the array of endpoint descriptions
- * @param endpointDescriptions array of endpoint descriptions that is allocated
- *        by the function (you need to free manually)
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_getEndpoints(UA_Client *client, const char *serverUrl,
-                       size_t* endpointDescriptionsSize,
-                       UA_EndpointDescription** endpointDescriptions);
-
-/* Gets a list of all registered servers at the given server.
- *
- * You can pass an optional filter for serverUris. If the given server is not registered,
- * an empty array will be returned. If the server is registered, only that application
- * description will be returned.
- *
- * Additionally you can optionally indicate which locale you want for the server name
- * in the returned application description. The array indicates the order of preference.
- * A server may have localized names.
- *
- * @param client to use. Must be connected to the same endpoint given in
- *        serverUrl or otherwise in disconnected state.
- * @param serverUrl url to connect (for example "opc.tcp://localhost:4840")
- * @param serverUrisSize Optional filter for specific server uris
- * @param serverUris Optional filter for specific server uris
- * @param localeIdsSize Optional indication which locale you prefer
- * @param localeIds Optional indication which locale you prefer
- * @param registeredServersSize size of returned array, i.e., number of found/registered servers
- * @param registeredServers array containing found/registered servers
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_findServers(UA_Client *client, const char *serverUrl,
-                      size_t serverUrisSize, UA_String *serverUris,
-                      size_t localeIdsSize, UA_String *localeIds,
-                      size_t *registeredServersSize,
-                      UA_ApplicationDescription **registeredServers);
-
-#ifdef UA_ENABLE_DISCOVERY
-/* Get a list of all known server in the network. Only supported by LDS servers.
- *
- * @param client to use. Must be connected to the same endpoint given in
- * serverUrl or otherwise in disconnected state.
- * @param serverUrl url to connect (for example "opc.tcp://localhost:4840")
- * @param startingRecordId optional. Only return the records with an ID higher
- *        or equal the given. Can be used for pagination to only get a subset of
- *        the full list
- * @param maxRecordsToReturn optional. Only return this number of records
-
- * @param serverCapabilityFilterSize optional. Filter the returned list to only
- *        get servers with given capabilities, e.g. "LDS"
- * @param serverCapabilityFilter optional. Filter the returned list to only get
- *        servers with given capabilities, e.g. "LDS"
- * @param serverOnNetworkSize size of returned array, i.e., number of
- *        known/registered servers
- * @param serverOnNetwork array containing known/registered servers
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl,
-                               UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn,
-                               size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
-                               size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork);
-#endif
-
-/**
- * .. _client-services:
- *
- * Services
- * --------
- *
- * The raw OPC UA services are exposed to the client. But most of them time, it
- * is better to use the convenience functions from ``ua_client_highlevel.h``
- * that wrap the raw services. */
-/* Don't use this function. Use the type versions below instead. */
-void UA_EXPORT
-__UA_Client_Service(UA_Client *client, const void *request,
-                    const UA_DataType *requestType, void *response,
-                    const UA_DataType *responseType);
-
-/*
- * Attribute Service Set
- * ^^^^^^^^^^^^^^^^^^^^^ */
-static UA_INLINE UA_ReadResponse
-UA_Client_Service_read(UA_Client *client, const UA_ReadRequest request) {
-    UA_ReadResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_READREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_READRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_WriteResponse
-UA_Client_Service_write(UA_Client *client, const UA_WriteRequest request) {
-    UA_WriteResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_WRITEREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_WRITERESPONSE]);
-    return response;
-}
-
-/*
-* Historical Access Service Set
-* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
-#ifdef UA_ENABLE_HISTORIZING
-static UA_INLINE UA_HistoryReadResponse
-UA_Client_Service_historyRead(UA_Client *client, const UA_HistoryReadRequest request) {
-    UA_HistoryReadResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_HISTORYREADREQUEST],
-        &response, &UA_TYPES[UA_TYPES_HISTORYREADRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_HistoryUpdateResponse
-UA_Client_Service_historyUpdate(UA_Client *client, const UA_HistoryUpdateRequest request) {
-    UA_HistoryUpdateResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_HISTORYUPDATEREQUEST],
-        &response, &UA_TYPES[UA_TYPES_HISTORYUPDATERESPONSE]);
-    return response;
-}
-#endif
-
-/*
- * Method Service Set
- * ^^^^^^^^^^^^^^^^^^ */
-#ifdef UA_ENABLE_METHODCALLS
-static UA_INLINE UA_CallResponse
-UA_Client_Service_call(UA_Client *client, const UA_CallRequest request) {
-    UA_CallResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CALLREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_CALLRESPONSE]);
-    return response;
-}
-#endif
-
-/*
- * NodeManagement Service Set
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^ */
-static UA_INLINE UA_AddNodesResponse
-UA_Client_Service_addNodes(UA_Client *client, const UA_AddNodesRequest request) {
-    UA_AddNodesResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_ADDNODESREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_AddReferencesResponse
-UA_Client_Service_addReferences(UA_Client *client,
-                                const UA_AddReferencesRequest request) {
-    UA_AddReferencesResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_DeleteNodesResponse
-UA_Client_Service_deleteNodes(UA_Client *client,
-                              const UA_DeleteNodesRequest request) {
-    UA_DeleteNodesResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_DELETENODESREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_DeleteReferencesResponse
-UA_Client_Service_deleteReferences(UA_Client *client,
-                                   const UA_DeleteReferencesRequest request) {
-    UA_DeleteReferencesResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]);
-    return response;
-}
-
-/*
- * View Service Set
- * ^^^^^^^^^^^^^^^^ */
-static UA_INLINE UA_BrowseResponse
-UA_Client_Service_browse(UA_Client *client, const UA_BrowseRequest request) {
-    UA_BrowseResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_BROWSEREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_BROWSERESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_BrowseNextResponse
-UA_Client_Service_browseNext(UA_Client *client,
-                             const UA_BrowseNextRequest request) {
-    UA_BrowseNextResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_TranslateBrowsePathsToNodeIdsResponse
-UA_Client_Service_translateBrowsePathsToNodeIds(UA_Client *client,
-                        const UA_TranslateBrowsePathsToNodeIdsRequest request) {
-    UA_TranslateBrowsePathsToNodeIdsResponse response;
-    __UA_Client_Service(client, &request,
-                        &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST],
-                        &response,
-                        &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_RegisterNodesResponse
-UA_Client_Service_registerNodes(UA_Client *client,
-                                const UA_RegisterNodesRequest request) {
-    UA_RegisterNodesResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_UnregisterNodesResponse
-UA_Client_Service_unregisterNodes(UA_Client *client,
-                                  const UA_UnregisterNodesRequest request) {
-    UA_UnregisterNodesResponse response;
-    __UA_Client_Service(client, &request,
-                        &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]);
-    return response;
-}
-
-/*
- * Query Service Set
- * ^^^^^^^^^^^^^^^^^ */
-#ifdef UA_ENABLE_QUERY
-
-static UA_INLINE UA_QueryFirstResponse
-UA_Client_Service_queryFirst(UA_Client *client,
-                             const UA_QueryFirstRequest request) {
-    UA_QueryFirstResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_QueryNextResponse
-UA_Client_Service_queryNext(UA_Client *client,
-                            const UA_QueryNextRequest request) {
-    UA_QueryNextResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE]);
-    return response;
-}
-
-#endif
-
-/**
- * .. _client-async-services:
- *
- * Asynchronous Services
- * ---------------------
- * All OPC UA services are asynchronous in nature. So several service calls can
- * be made without waiting for a response first. Responess may come in a
- * different ordering. */
-
-/* Use the type versions of this method. See below. However, the general
- * mechanism of async service calls is explained here.
- *
- * We say that an async service call has been dispatched once this method
- * returns UA_STATUSCODE_GOOD. If there is an error after an async service has
- * been dispatched, the callback is called with an "empty" response where the
- * statusCode has been set accordingly. This is also done if the client is
- * shutting down and the list of dispatched async services is emptied.
- *
- * The statusCode received when the client is shutting down is
- * UA_STATUSCODE_BADSHUTDOWN.
- *
- * The statusCode received when the client don't receive response
- * after specified config->timeout (in ms) is
- * UA_STATUSCODE_BADTIMEOUT.
- *
- * Instead, you can use __UA_Client_AsyncServiceEx to specify
- * a custom timeout
- *
- * The userdata and requestId arguments can be NULL. */
-UA_StatusCode UA_EXPORT
-__UA_Client_AsyncService(UA_Client *client, const void *request,
-                         const UA_DataType *requestType,
-                         UA_ClientAsyncServiceCallback callback,
-                         const UA_DataType *responseType,
-                         void *userdata, UA_UInt32 *requestId);
-
-UA_StatusCode UA_EXPORT
-UA_Client_sendAsyncRequest(UA_Client *client, const void *request,
-        const UA_DataType *requestType, UA_ClientAsyncServiceCallback callback,
-        const UA_DataType *responseType, void *userdata, UA_UInt32 *requestId);
-
-/* Listen on the network and process arriving asynchronous responses in the
- * background. Internal housekeeping, renewal of SecureChannels and subscription
- * management is done as well. */
-UA_StatusCode UA_EXPORT
-UA_Client_run_iterate(UA_Client *client, UA_UInt16 timeout);
-
-UA_DEPRECATED static UA_INLINE UA_StatusCode
-UA_Client_runAsync(UA_Client *client, UA_UInt16 timeout) {
-    return UA_Client_run_iterate(client, timeout);
-}
-
-UA_DEPRECATED static UA_INLINE UA_StatusCode
-UA_Client_manuallyRenewSecureChannel(UA_Client *client) {
-    return UA_Client_run_iterate(client, 0);
-}
-
-/* Use the type versions of this method. See below. However, the general
- * mechanism of async service calls is explained here.
- *
- * We say that an async service call has been dispatched once this method
- * returns UA_STATUSCODE_GOOD. If there is an error after an async service has
- * been dispatched, the callback is called with an "empty" response where the
- * statusCode has been set accordingly. This is also done if the client is
- * shutting down and the list of dispatched async services is emptied.
- *
- * The statusCode received when the client is shutting down is
- * UA_STATUSCODE_BADSHUTDOWN.
- *
- * The statusCode received when the client don't receive response
- * after specified timeout (in ms) is
- * UA_STATUSCODE_BADTIMEOUT.
- *
- * The timeout can be disabled by setting timeout to 0
- *
- * The userdata and requestId arguments can be NULL. */
-UA_StatusCode UA_EXPORT
-__UA_Client_AsyncServiceEx(UA_Client *client, const void *request,
-                           const UA_DataType *requestType,
-                           UA_ClientAsyncServiceCallback callback,
-                           const UA_DataType *responseType,
-                           void *userdata, UA_UInt32 *requestId,
-                           UA_UInt32 timeout);
-
-/**
- * Timed Callbacks
- * ---------------
- * Repeated callbacks can be attached to a client and will be executed in the
- * defined interval. */
-
-typedef void (*UA_ClientCallback)(UA_Client *client, void *data);
-
-/* Add a callback for execution at a specified time. If the indicated time lies
- * in the past, then the callback is executed at the next iteration of the
- * server's main loop.
- *
- * @param client The client object.
- * @param callback The callback that shall be added.
- * @param data Data that is forwarded to the callback.
- * @param date The timestamp for the execution time.
- * @param callbackId Set to the identifier of the repeated callback . This can
- *        be used to cancel the callback later on. If the pointer is null, the
- *        identifier is not set.
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code
- *         otherwise. */
-UA_StatusCode UA_EXPORT
-UA_Client_addTimedCallback(UA_Client *client, UA_ClientCallback callback,
-                           void *data, UA_DateTime date, UA_UInt64 *callbackId);
-
-/* Add a callback for cyclic repetition to the client.
- *
- * @param client The client object.
- * @param callback The callback that shall be added.
- * @param data Data that is forwarded to the callback.
- * @param interval_ms The callback shall be repeatedly executed with the given
- *        interval (in ms). The interval must be positive. The first execution
- *        occurs at now() + interval at the latest.
- * @param callbackId Set to the identifier of the repeated callback . This can
- *        be used to cancel the callback later on. If the pointer is null, the
- *        identifier is not set.
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code
- *         otherwise. */
-UA_StatusCode UA_EXPORT
-UA_Client_addRepeatedCallback(UA_Client *client, UA_ClientCallback callback,
-                              void *data, UA_Double interval_ms,
-                              UA_UInt64 *callbackId);
-
-UA_StatusCode UA_EXPORT
-UA_Client_changeRepeatedCallbackInterval(UA_Client *client,
-                                         UA_UInt64 callbackId,
-                                         UA_Double interval_ms);
-
-void UA_EXPORT
-UA_Client_removeCallback(UA_Client *client, UA_UInt64 callbackId);
-
-#define UA_Client_removeRepeatedCallback(client, callbackId) \
-    UA_Client_removeCallback(client, callbackId)
-
-/**
- * .. toctree::
- *
- *    client_highlevel
- *    client_subscriptions */
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_H_ */
diff --git a/ext/open62541/include/open62541/client_config.h b/ext/open62541/include/open62541/client_config.h
deleted file mode 100644
index 0ba72ca..0000000
--- a/ext/open62541/include/open62541/client_config.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#ifndef UA_CLIENT_CONFIG_H
-#define UA_CLIENT_CONFIG_H
-
-#include <open62541/config.h>
-#include <open62541/plugin/log.h>
-#include <open62541/plugin/network.h>
-#include <open62541/plugin/securitypolicy.h>
-
-_UA_BEGIN_DECLS
-
-struct UA_Client;
-typedef struct UA_Client UA_Client;
-
-/**
- * .. _client-config:
- *
- * Client Configuration
- * --------------------
- *
- * The client configuration is used for setting connection parameters and
- * additional settings used by the client.
- * The configuration should not be modified after it is passed to a client.
- * Currently, only one client can use a configuration at a time.
- *
- * Examples for configurations are provided in the ``/plugins`` folder.
- * The usual usage is as follows:
- *
- * 1. Create a client configuration with default settings as a starting point
- * 2. Modifiy the configuration, e.g. modifying the timeout
- * 3. Instantiate a client with it
- * 4. After shutdown of the client, clean up the configuration (free memory)
- *
- * The :ref:`tutorials` provide a good starting point for this. */
-
-typedef enum {
-    UA_CLIENTSTATE_DISCONNECTED,         /* The client is disconnected */
-    UA_CLIENTSTATE_WAITING_FOR_ACK,      /* The Client has sent HEL and waiting */
-    UA_CLIENTSTATE_CONNECTED,            /* A TCP connection to the server is open */
-    UA_CLIENTSTATE_SECURECHANNEL,        /* A SecureChannel to the server is open */
-    UA_CLIENTSTATE_SESSION,              /* A session with the server is open */
-    UA_CLIENTSTATE_SESSION_DISCONNECTED, /* Disconnected vs renewed? */
-    UA_CLIENTSTATE_SESSION_RENEWED       /* A session with the server is open (renewed) */
-} UA_ClientState;
-
-typedef struct {
-    /* Basic client configuration */
-    void *clientContext; /* User-defined data attached to the client */
-    UA_Logger logger;   /* Logger used by the client */
-    UA_UInt32 timeout;  /* Response timeout in ms */
-    UA_ApplicationDescription clientDescription;
-
-    /* Basic connection configuration */
-    UA_ExtensionObject userIdentityToken; /* Configured User-Identity Token */
-    UA_MessageSecurityMode securityMode;  /* None, Sign, SignAndEncrypt. The
-                                           * default is invalid. This indicates
-                                           * the client to select any matching
-                                           * endpoint. */
-    UA_String securityPolicyUri; /* SecurityPolicy for the SecureChannel. An
-                                  * empty string indicates the client to select
-                                  * any matching SecurityPolicy. */
-
-    /* Advanced connection configuration
-     *
-     * If either endpoint or userTokenPolicy has been set (at least one non-zero
-     * byte in either structure), then the selected Endpoint and UserTokenPolicy
-     * overwrite the settings in the basic connection configuration. The
-     * userTokenPolicy array in the EndpointDescription is ignored. The selected
-     * userTokenPolicy is set in the dedicated configuration field.
-     *
-     * If the advanced configuration is not set, the client will write to it the
-     * selected Endpoint and UserTokenPolicy during GetEndpoints.
-     *
-     * The information in the advanced configuration is used during reconnect
-     * when the SecureChannel was broken. */
-    UA_EndpointDescription endpoint;
-    UA_UserTokenPolicy userTokenPolicy;
-
-    /* Advanced client configuration */
-
-    UA_UInt32 secureChannelLifeTime; /* Lifetime in ms (then the channel needs
-                                        to be renewed) */
-    UA_UInt32 requestedSessionTimeout; /* Session timeout in ms */
-    UA_ConnectionConfig localConnectionConfig;
-    UA_UInt32 connectivityCheckInterval;     /* Connectivity check interval in ms.
-                                              * 0 = background task disabled */
-    const UA_DataTypeArray *customDataTypes; /* Custom DataTypes. Attention!
-                                              * Custom datatypes are not cleaned
-                                              * up together with the
-                                              * configuration. So it is possible
-                                              * to allocate them on ROM. */
-
-    /* Available SecurityPolicies */
-    size_t securityPoliciesSize;
-    UA_SecurityPolicy *securityPolicies;
-
-    /* Certificate Verification Plugin */
-    UA_CertificateVerification certificateVerification;
-
-    /* Callbacks for async connection handshakes */
-    UA_ConnectClientConnection connectionFunc;
-    UA_ConnectClientConnection initConnectionFunc;
-    void (*pollConnectionFunc)(UA_Client *client, void *context);
-
-    /* Callback for state changes */
-    void (*stateCallback)(UA_Client *client, UA_ClientState clientState);
-
-    /* When connectivityCheckInterval is greater than 0, every
-     * connectivityCheckInterval (in ms), a async read request is performed on
-     * the server. inactivityCallback is called when the client receive no
-     * response for this read request The connection can be closed, this in an
-     * attempt to recreate a healthy connection. */
-    void (*inactivityCallback)(UA_Client *client);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* Number of PublishResponse queued up in the server */
-    UA_UInt16 outStandingPublishRequests;
-
-    /* If the client does not receive a PublishResponse after the defined delay
-     * of ``(sub->publishingInterval * sub->maxKeepAliveCount) +
-     * client->config.timeout)``, then subscriptionInactivityCallback is called
-     * for the subscription.. */
-    void (*subscriptionInactivityCallback)(UA_Client *client,
-                                           UA_UInt32 subscriptionId,
-                                           void *subContext);
-#endif
-} UA_ClientConfig;
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_CONFIG_H */
diff --git a/ext/open62541/include/open62541/client_highlevel.h b/ext/open62541/include/open62541/client_highlevel.h
deleted file mode 100644
index 77ba54a..0000000
--- a/ext/open62541/include/open62541/client_highlevel.h
+++ /dev/null
@@ -1,660 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Florian Palm
- *    Copyright 2016 (c) Chris Iatrou
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Frank Meerkötter
- *    Copyright 2018 (c) Fabian Arndt
- *    Copyright 2018 (c) Peter Rustler, basyskom GmbH
- */
-
-#ifndef UA_CLIENT_HIGHLEVEL_H_
-#define UA_CLIENT_HIGHLEVEL_H_
-
-#include <open62541/client.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * .. _client-highlevel:
- *
- * Highlevel Client Functionality
- * ------------------------------
- *
- * The following definitions are convenience functions making use of the
- * standard OPC UA services in the background. This is a less flexible way of
- * handling the stack, because at many places sensible defaults are presumed; at
- * the same time using these functions is the easiest way of implementing an OPC
- * UA application, as you will not have to consider all the details that go into
- * the OPC UA services. If more flexibility is needed, you can always achieve
- * the same functionality using the raw :ref:`OPC UA services
- * <client-services>`.
- *
- * Read Attributes
- * ^^^^^^^^^^^^^^^
- * The following functions can be used to retrieve a single node attribute. Use
- * the regular service to read several attributes at once. */
-
-/* Don't call this function, use the typed versions */
-UA_StatusCode UA_EXPORT
-__UA_Client_readAttribute(UA_Client *client, const UA_NodeId *nodeId,
-                          UA_AttributeId attributeId, void *out,
-                          const UA_DataType *outDataType);
-
-static UA_INLINE UA_StatusCode
-UA_Client_readNodeIdAttribute(UA_Client *client, const UA_NodeId nodeId,
-                              UA_NodeId *outNodeId) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_NODEID,
-                                     outNodeId, &UA_TYPES[UA_TYPES_NODEID]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readNodeClassAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                 UA_NodeClass *outNodeClass) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_NODECLASS,
-                                     outNodeClass, &UA_TYPES[UA_TYPES_NODECLASS]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readBrowseNameAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  UA_QualifiedName *outBrowseName) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_BROWSENAME,
-                                     outBrowseName,
-                                     &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readDisplayNameAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   UA_LocalizedText *outDisplayName) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME,
-                                     outDisplayName,
-                                     &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readDescriptionAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   UA_LocalizedText *outDescription) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_DESCRIPTION,
-                                     outDescription,
-                                     &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readWriteMaskAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                 UA_UInt32 *outWriteMask) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
-                                     outWriteMask, &UA_TYPES[UA_TYPES_UINT32]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readUserWriteMaskAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                     UA_UInt32 *outUserWriteMask) {
-    return __UA_Client_readAttribute(client, &nodeId,
-                                     UA_ATTRIBUTEID_USERWRITEMASK,
-                                     outUserWriteMask,
-                                     &UA_TYPES[UA_TYPES_UINT32]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readIsAbstractAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  UA_Boolean *outIsAbstract) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
-                                     outIsAbstract, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readSymmetricAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                 UA_Boolean *outSymmetric) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_SYMMETRIC,
-                                     outSymmetric, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readInverseNameAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   UA_LocalizedText *outInverseName) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_INVERSENAME,
-                                     outInverseName,
-                                     &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readContainsNoLoopsAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                       UA_Boolean *outContainsNoLoops) {
-    return __UA_Client_readAttribute(client, &nodeId,
-                                     UA_ATTRIBUTEID_CONTAINSNOLOOPS,
-                                     outContainsNoLoops,
-                                     &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readEventNotifierAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                     UA_Byte *outEventNotifier) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER,
-                                     outEventNotifier, &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readValueAttribute(UA_Client *client, const UA_NodeId nodeId,
-                             UA_Variant *outValue) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_VALUE,
-                                     outValue, &UA_TYPES[UA_TYPES_VARIANT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readDataTypeAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                UA_NodeId *outDataType) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_DATATYPE,
-                                     outDataType, &UA_TYPES[UA_TYPES_NODEID]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readValueRankAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                 UA_Int32 *outValueRank) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_VALUERANK,
-                                     outValueRank, &UA_TYPES[UA_TYPES_INT32]);
-}
-
-UA_StatusCode UA_EXPORT
-UA_Client_readArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                       size_t *outArrayDimensionsSize,
-                                       UA_UInt32 **outArrayDimensions);
-
-static UA_INLINE UA_StatusCode
-UA_Client_readAccessLevelAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   UA_Byte *outAccessLevel) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
-                                     outAccessLevel, &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readUserAccessLevelAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                       UA_Byte *outUserAccessLevel) {
-    return __UA_Client_readAttribute(client, &nodeId,
-                                     UA_ATTRIBUTEID_USERACCESSLEVEL,
-                                     outUserAccessLevel,
-                                     &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readMinimumSamplingIntervalAttribute(UA_Client *client,
-                                               const UA_NodeId nodeId,
-                                               UA_Double *outMinSamplingInterval) {
-    return __UA_Client_readAttribute(client, &nodeId,
-                                     UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
-                                     outMinSamplingInterval,
-                                     &UA_TYPES[UA_TYPES_DOUBLE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readHistorizingAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   UA_Boolean *outHistorizing) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_HISTORIZING,
-                                     outHistorizing, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readExecutableAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  UA_Boolean *outExecutable) {
-    return __UA_Client_readAttribute(client, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
-                                     outExecutable, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_readUserExecutableAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                      UA_Boolean *outUserExecutable) {
-    return __UA_Client_readAttribute(client, &nodeId,
-                                     UA_ATTRIBUTEID_USEREXECUTABLE,
-                                     outUserExecutable,
-                                     &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-/**
- * Historical Access
- * ^^^^^^^^^^^^^^^^^
- * The following functions can be used to read a single node historically.
- * Use the regular service to read several nodes at once. */
-
-#ifdef UA_ENABLE_HISTORIZING
-typedef UA_Boolean
-(*UA_HistoricalIteratorCallback)(UA_Client *client,
-                                 const UA_NodeId *nodeId,
-                                 UA_Boolean moreDataAvailable,
-                                 const UA_ExtensionObject *data, void *callbackContext);
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryRead_events(UA_Client *client, const UA_NodeId *nodeId,
-                                const UA_HistoricalIteratorCallback callback,
-                                UA_DateTime startTime, UA_DateTime endTime,
-                                UA_String indexRange, const UA_EventFilter filter, UA_UInt32 numValuesPerNode,
-                                UA_TimestampsToReturn timestampsToReturn, void *callbackContext);
-#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING
-
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryRead_raw(UA_Client *client, const UA_NodeId *nodeId,
-                             const UA_HistoricalIteratorCallback callback,
-                             UA_DateTime startTime, UA_DateTime endTime,
-                             UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode,
-                             UA_TimestampsToReturn timestampsToReturn, void *callbackContext);
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryRead_modified(UA_Client *client, const UA_NodeId *nodeId,
-                                  const UA_HistoricalIteratorCallback callback,
-                                  UA_DateTime startTime, UA_DateTime endTime,
-                                  UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode,
-                                  UA_TimestampsToReturn timestampsToReturn, void *callbackContext);
-#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING
-
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryUpdate_insert(UA_Client *client,
-                               const UA_NodeId *nodeId,
-                               UA_DataValue *value);
-
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryUpdate_replace(UA_Client *client,
-                                const UA_NodeId *nodeId,
-                                UA_DataValue *value);
-
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryUpdate_update(UA_Client *client,
-                               const UA_NodeId *nodeId,
-                               UA_DataValue *value);
-
-UA_StatusCode UA_EXPORT
-UA_Client_HistoryUpdate_deleteRaw(UA_Client *client,
-                                  const UA_NodeId *nodeId,
-                                  UA_DateTime startTimestamp,
-                                  UA_DateTime endTimestamp);
-
-#endif // UA_ENABLE_HISTORIZING
-
-/**
- * Write Attributes
- * ^^^^^^^^^^^^^^^^
- *
- * The following functions can be use to write a single node attribute at a
- * time. Use the regular write service to write several attributes at once. */
-
-/* Don't call this function, use the typed versions */
-UA_StatusCode UA_EXPORT
-__UA_Client_writeAttribute(UA_Client *client, const UA_NodeId *nodeId,
-                           UA_AttributeId attributeId, const void *in,
-                           const UA_DataType *inDataType);
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeNodeIdAttribute(UA_Client *client, const UA_NodeId nodeId,
-                               const UA_NodeId *newNodeId) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_NODEID,
-                                      newNodeId, &UA_TYPES[UA_TYPES_NODEID]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeNodeClassAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  const UA_NodeClass *newNodeClass) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_NODECLASS,
-                                      newNodeClass, &UA_TYPES[UA_TYPES_NODECLASS]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeBrowseNameAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   const UA_QualifiedName *newBrowseName) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_BROWSENAME,
-                                      newBrowseName,
-                                      &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeDisplayNameAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                    const UA_LocalizedText *newDisplayName) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME,
-                                      newDisplayName,
-                                      &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeDescriptionAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                    const UA_LocalizedText *newDescription) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_DESCRIPTION,
-                                      newDescription,
-                                      &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeWriteMaskAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  const UA_UInt32 *newWriteMask) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
-                                      newWriteMask, &UA_TYPES[UA_TYPES_UINT32]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeUserWriteMaskAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                      const UA_UInt32 *newUserWriteMask) {
-    return __UA_Client_writeAttribute(client, &nodeId,
-                                      UA_ATTRIBUTEID_USERWRITEMASK,
-                                      newUserWriteMask,
-                                      &UA_TYPES[UA_TYPES_UINT32]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeIsAbstractAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   const UA_Boolean *newIsAbstract) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
-                                      newIsAbstract, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeSymmetricAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  const UA_Boolean *newSymmetric) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_SYMMETRIC,
-                                      newSymmetric, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeInverseNameAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                    const UA_LocalizedText *newInverseName) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_INVERSENAME,
-                                      newInverseName,
-                                      &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeContainsNoLoopsAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                        const UA_Boolean *newContainsNoLoops) {
-    return __UA_Client_writeAttribute(client, &nodeId,
-                                      UA_ATTRIBUTEID_CONTAINSNOLOOPS,
-                                      newContainsNoLoops,
-                                      &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeEventNotifierAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                      const UA_Byte *newEventNotifier) {
-    return __UA_Client_writeAttribute(client, &nodeId,
-                                      UA_ATTRIBUTEID_EVENTNOTIFIER,
-                                      newEventNotifier,
-                                      &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeValueAttribute(UA_Client *client, const UA_NodeId nodeId,
-                              const UA_Variant *newValue) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_VALUE,
-                                      newValue, &UA_TYPES[UA_TYPES_VARIANT]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeDataTypeAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                 const UA_NodeId *newDataType) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_DATATYPE,
-                                      newDataType, &UA_TYPES[UA_TYPES_NODEID]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeValueRankAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                  const UA_Int32 *newValueRank) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_VALUERANK,
-                                      newValueRank, &UA_TYPES[UA_TYPES_INT32]);
-}
-
-UA_StatusCode UA_EXPORT
-UA_Client_writeArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                        size_t newArrayDimensionsSize,
-                                        const UA_UInt32 *newArrayDimensions);
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeAccessLevelAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                    const UA_Byte *newAccessLevel) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
-                                      newAccessLevel, &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeUserAccessLevelAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                        const UA_Byte *newUserAccessLevel) {
-    return __UA_Client_writeAttribute(client, &nodeId,
-                                      UA_ATTRIBUTEID_USERACCESSLEVEL,
-                                      newUserAccessLevel,
-                                      &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeMinimumSamplingIntervalAttribute(UA_Client *client,
-                                                const UA_NodeId nodeId,
-                                                const UA_Double *newMinInterval) {
-    return __UA_Client_writeAttribute(client, &nodeId,
-                                      UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
-                                      newMinInterval, &UA_TYPES[UA_TYPES_DOUBLE]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeHistorizingAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                    const UA_Boolean *newHistorizing) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_HISTORIZING,
-                                      newHistorizing, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeExecutableAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                   const UA_Boolean *newExecutable) {
-    return __UA_Client_writeAttribute(client, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
-                                      newExecutable, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeUserExecutableAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                       const UA_Boolean *newUserExecutable) {
-    return __UA_Client_writeAttribute(client, &nodeId,
-                                      UA_ATTRIBUTEID_USEREXECUTABLE,
-                                      newUserExecutable,
-                                      &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-/**
- * Method Calling
- * ^^^^^^^^^^^^^^ */
-
-#ifdef UA_ENABLE_METHODCALLS
-UA_StatusCode UA_EXPORT
-UA_Client_call(UA_Client *client, const UA_NodeId objectId,
-               const UA_NodeId methodId, size_t inputSize, const UA_Variant *input,
-               size_t *outputSize, UA_Variant **output);
-#endif
-
-/**
- * Node Management
- * ^^^^^^^^^^^^^^^
- * See the section on :ref:`server-side node management <addnodes>`. */
-
-UA_StatusCode UA_EXPORT
-UA_Client_addReference(UA_Client *client, const UA_NodeId sourceNodeId,
-                       const UA_NodeId referenceTypeId, UA_Boolean isForward,
-                       const UA_String targetServerUri,
-                       const UA_ExpandedNodeId targetNodeId,
-                       UA_NodeClass targetNodeClass);
-
-UA_StatusCode UA_EXPORT
-UA_Client_deleteReference(UA_Client *client, const UA_NodeId sourceNodeId,
-                          const UA_NodeId referenceTypeId, UA_Boolean isForward,
-                          const UA_ExpandedNodeId targetNodeId,
-                          UA_Boolean deleteBidirectional);
-
-UA_StatusCode UA_EXPORT
-UA_Client_deleteNode(UA_Client *client, const UA_NodeId nodeId,
-                     UA_Boolean deleteTargetReferences);
-
-/* Protect against redundant definitions for server/client */
-#ifndef UA_DEFAULT_ATTRIBUTES_DEFINED
-#define UA_DEFAULT_ATTRIBUTES_DEFINED
-/* The default for variables is "BaseDataType" for the datatype, -2 for the
- * valuerank and a read-accesslevel. */
-UA_EXPORT extern const UA_VariableAttributes UA_VariableAttributes_default;
-UA_EXPORT extern const UA_VariableTypeAttributes UA_VariableTypeAttributes_default;
-/* Methods are executable by default */
-UA_EXPORT extern const UA_MethodAttributes UA_MethodAttributes_default;
-/* The remaining attribute definitions are currently all zeroed out */
-UA_EXPORT extern const UA_ObjectAttributes UA_ObjectAttributes_default;
-UA_EXPORT extern const UA_ObjectTypeAttributes UA_ObjectTypeAttributes_default;
-UA_EXPORT extern const UA_ReferenceTypeAttributes UA_ReferenceTypeAttributes_default;
-UA_EXPORT extern const UA_DataTypeAttributes UA_DataTypeAttributes_default;
-UA_EXPORT extern const UA_ViewAttributes UA_ViewAttributes_default;
-#endif
-
-/* Don't call this function, use the typed versions */
-UA_StatusCode UA_EXPORT
-__UA_Client_addNode(UA_Client *client, const UA_NodeClass nodeClass,
-                    const UA_NodeId requestedNewNodeId,
-                    const UA_NodeId parentNodeId,
-                    const UA_NodeId referenceTypeId,
-                    const UA_QualifiedName browseName,
-                    const UA_NodeId typeDefinition, const UA_NodeAttributes *attr,
-                    const UA_DataType *attributeType, UA_NodeId *outNewNodeId);
-
-static UA_INLINE UA_StatusCode
-UA_Client_addVariableNode(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_NodeId typeDefinition,
-                          const UA_VariableAttributes attr,
-                          UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_VARIABLE, requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               typeDefinition, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],
-                               outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addVariableTypeNode(UA_Client *client,
-                              const UA_NodeId requestedNewNodeId,
-                              const UA_NodeId parentNodeId,
-                              const UA_NodeId referenceTypeId,
-                              const UA_QualifiedName browseName,
-                              const UA_VariableTypeAttributes attr,
-                              UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_VARIABLETYPE,
-                               requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],
-                               outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addObjectNode(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                        const UA_NodeId parentNodeId,
-                        const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName,
-                        const UA_NodeId typeDefinition,
-                        const UA_ObjectAttributes attr, UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_OBJECT, requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               typeDefinition, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addObjectTypeNode(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                            const UA_NodeId parentNodeId,
-                            const UA_NodeId referenceTypeId,
-                            const UA_QualifiedName browseName,
-                            const UA_ObjectTypeAttributes attr,
-                            UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_OBJECTTYPE, requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],
-                               outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addViewNode(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                      const UA_NodeId parentNodeId,
-                      const UA_NodeId referenceTypeId,
-                      const UA_QualifiedName browseName,
-                      const UA_ViewAttributes attr,
-                      UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_VIEW, requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addReferenceTypeNode(UA_Client *client,
-                               const UA_NodeId requestedNewNodeId,
-                               const UA_NodeId parentNodeId,
-                               const UA_NodeId referenceTypeId,
-                               const UA_QualifiedName browseName,
-                               const UA_ReferenceTypeAttributes attr,
-                               UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_REFERENCETYPE,
-                               requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],
-                               outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addDataTypeNode(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_DataTypeAttributes attr,
-                          UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_DATATYPE, requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],
-                               outNewNodeId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addMethodNode(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                        const UA_NodeId parentNodeId,
-                        const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName,
-                        const UA_MethodAttributes attr,
-                        UA_NodeId *outNewNodeId) {
-    return __UA_Client_addNode(client, UA_NODECLASS_METHOD, requestedNewNodeId,
-                               parentNodeId, referenceTypeId, browseName,
-                               UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_METHODATTRIBUTES], outNewNodeId);
-}
-
-/**
- * Misc Highlevel Functionality
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
-
-/* Get the namespace-index of a namespace-URI
- *
- * @param client The UA_Client struct for this connection
- * @param namespaceUri The interested namespace URI
- * @param namespaceIndex The namespace index of the URI. The value is unchanged
- *        in case of an error
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri,
-                            UA_UInt16 *namespaceIndex);
-
-#ifndef HAVE_NODEITER_CALLBACK
-#define HAVE_NODEITER_CALLBACK
-/* Iterate over all nodes referenced by parentNodeId by calling the callback
-   function for each child node */
-typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse,
-                                                 UA_NodeId referenceTypeId, void *handle);
-#endif
-
-UA_StatusCode UA_EXPORT
-UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId,
-                               UA_NodeIteratorCallback callback, void *handle);
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_HIGHLEVEL_H_ */
diff --git a/ext/open62541/include/open62541/client_highlevel_async.h b/ext/open62541/include/open62541/client_highlevel_async.h
deleted file mode 100644
index 6f45624..0000000
--- a/ext/open62541/include/open62541/client_highlevel_async.h
+++ /dev/null
@@ -1,722 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifndef UA_CLIENT_HIGHLEVEL_ASYNC_H_
-#define UA_CLIENT_HIGHLEVEL_ASYNC_H_
-
-#include <open62541/client.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Raw Services
- * ^^^^^^^^^^^^ */
-
-typedef void (*UA_ClientAsyncReadCallback)(UA_Client *client, void *userdata,
-                                           UA_UInt32 requestId, UA_ReadResponse *rr);
-static UA_INLINE UA_StatusCode
-UA_Client_sendAsyncReadRequest(UA_Client *client, UA_ReadRequest *request,
-                               UA_ClientAsyncReadCallback readCallback, void *userdata,
-                               UA_UInt32 *reqId) {
-    return UA_Client_sendAsyncRequest(client, request, &UA_TYPES[UA_TYPES_READREQUEST],
-                                      (UA_ClientAsyncServiceCallback)readCallback,
-                                      &UA_TYPES[UA_TYPES_READRESPONSE], userdata, reqId);
-}
-
-typedef void (*UA_ClientAsyncWriteCallback)(UA_Client *client, void *userdata,
-                                            UA_UInt32 requestId, UA_WriteResponse *wr);
-static UA_INLINE UA_StatusCode
-UA_Client_sendAsyncWriteRequest(UA_Client *client, UA_WriteRequest *request,
-                                UA_ClientAsyncWriteCallback writeCallback, void *userdata,
-                                UA_UInt32 *reqId) {
-    return UA_Client_sendAsyncRequest(client, request, &UA_TYPES[UA_TYPES_WRITEREQUEST],
-                                      (UA_ClientAsyncServiceCallback)writeCallback,
-                                      &UA_TYPES[UA_TYPES_WRITERESPONSE], userdata, reqId);
-}
-
-typedef void (*UA_ClientAsyncBrowseCallback)(UA_Client *client, void *userdata,
-                                             UA_UInt32 requestId, UA_BrowseResponse *wr);
-static UA_INLINE UA_StatusCode
-UA_Client_sendAsyncBrowseRequest(UA_Client *client, UA_BrowseRequest *request,
-                                 UA_ClientAsyncBrowseCallback browseCallback,
-                                 void *userdata, UA_UInt32 *reqId) {
-    return UA_Client_sendAsyncRequest(client, request, &UA_TYPES[UA_TYPES_BROWSEREQUEST],
-                                      (UA_ClientAsyncServiceCallback)browseCallback,
-                                      &UA_TYPES[UA_TYPES_BROWSERESPONSE], userdata,
-                                      reqId);
-}
-
-/**
- * Read Attribute
- * ^^^^^^^^^^^^^^ */
-UA_StatusCode UA_EXPORT
-__UA_Client_readAttribute_async(UA_Client *client, const UA_NodeId *nodeId,
-                                UA_AttributeId attributeId,
-                                const UA_DataType *outDataType,
-                                UA_ClientAsyncServiceCallback callback, void *userdata,
-                                UA_UInt32 *reqId);
-
-typedef void (*UA_ClientAsyncReadDataTypeAttributeCallback)(UA_Client *client,
-                                                            void *userdata,
-                                                            UA_UInt32 requestId,
-                                                            UA_NodeId *var);
-static UA_INLINE UA_StatusCode
-UA_Client_readDataTypeAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadDataTypeAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_DATATYPE, &UA_TYPES[UA_TYPES_NODEID],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-typedef void (*UA_ClientAsyncReadValueAttributeCallback)(UA_Client *client,
-                                                         void *userdata,
-                                                         UA_UInt32 requestId,
-                                                         UA_Variant *var);
-static UA_INLINE UA_StatusCode
-UA_Client_readValueAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                   UA_ClientAsyncReadValueAttributeCallback callback,
-                                   void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-typedef void (*UA_ClientAsyncReadNodeIdAttributeCallback)(UA_Client *client,
-                                                          void *userdata,
-                                                          UA_UInt32 requestId,
-                                                          UA_NodeId *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readNodeIdAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                    UA_ClientAsyncReadNodeIdAttributeCallback callback,
-                                    void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_NODEID, &UA_TYPES[UA_TYPES_NODEID],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadNodeClassAttributeCallback)(UA_Client *client,
-                                                             void *userdata,
-                                                             UA_UInt32 requestId,
-                                                             UA_NodeClass *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readNodeClassAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadNodeClassAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_NODECLASS, &UA_TYPES[UA_TYPES_NODECLASS],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadBrowseNameAttributeCallback)(UA_Client *client,
-                                                              void *userdata,
-                                                              UA_UInt32 requestId,
-                                                              UA_QualifiedName *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readBrowseNameAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadBrowseNameAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_BROWSENAME, &UA_TYPES[UA_TYPES_QUALIFIEDNAME],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadDisplayNameAttributeCallback)(UA_Client *client,
-                                                               void *userdata,
-                                                               UA_UInt32 requestId,
-                                                               UA_LocalizedText *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readDisplayNameAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadDisplayNameAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadDescriptionAttributeCallback)(UA_Client *client,
-                                                               void *userdata,
-                                                               UA_UInt32 requestId,
-                                                               UA_LocalizedText *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readDescriptionAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadDescriptionAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_DESCRIPTION, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadWriteMaskAttributeCallback)(UA_Client *client,
-                                                             void *userdata,
-                                                             UA_UInt32 requestId,
-                                                             UA_UInt32 *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readWriteMaskAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadWriteMaskAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_WRITEMASK, &UA_TYPES[UA_TYPES_UINT32],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadUserWriteMaskAttributeCallback)(UA_Client *client,
-                                                                 void *userdata,
-                                                                 UA_UInt32 requestId,
-                                                                 UA_UInt32 *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readUserWriteMaskAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadUserWriteMaskAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_USERWRITEMASK, &UA_TYPES[UA_TYPES_UINT32],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadIsAbstractAttributeCallback)(UA_Client *client,
-                                                              void *userdata,
-                                                              UA_UInt32 requestId,
-                                                              UA_Boolean *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readIsAbstractAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadIsAbstractAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_ISABSTRACT, &UA_TYPES[UA_TYPES_BOOLEAN],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadSymmetricAttributeCallback)(UA_Client *client,
-                                                             void *userdata,
-                                                             UA_UInt32 requestId,
-                                                             UA_Boolean *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readSymmetricAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadSymmetricAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_SYMMETRIC, &UA_TYPES[UA_TYPES_BOOLEAN],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadInverseNameAttributeCallback)(UA_Client *client,
-                                                               void *userdata,
-                                                               UA_UInt32 requestId,
-                                                               UA_LocalizedText *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readInverseNameAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadInverseNameAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_INVERSENAME, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadContainsNoLoopsAttributeCallback)(UA_Client *client,
-                                                                   void *userdata,
-                                                                   UA_UInt32 requestId,
-                                                                   UA_Boolean *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readContainsNoLoopsAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadContainsNoLoopsAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS, &UA_TYPES[UA_TYPES_BOOLEAN],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadEventNotifierAttributeCallback)(UA_Client *client,
-                                                                 void *userdata,
-                                                                 UA_UInt32 requestId,
-                                                                 UA_Byte *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readEventNotifierAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadEventNotifierAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER, &UA_TYPES[UA_TYPES_BYTE],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadValueRankAttributeCallback)(UA_Client *client,
-                                                             void *userdata,
-                                                             UA_UInt32 requestId,
-                                                             UA_Int32 *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readValueRankAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadValueRankAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_VALUERANK, &UA_TYPES[UA_TYPES_INT32],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadAccessLevelAttributeCallback)(UA_Client *client,
-                                                               void *userdata,
-                                                               UA_UInt32 requestId,
-                                                               UA_Byte *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readAccessLevelAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadAccessLevelAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL, &UA_TYPES[UA_TYPES_BYTE],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadUserAccessLevelAttributeCallback)(UA_Client *client,
-                                                                   void *userdata,
-                                                                   UA_UInt32 requestId,
-                                                                   UA_Byte *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readUserAccessLevelAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadUserAccessLevelAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_USERACCESSLEVEL, &UA_TYPES[UA_TYPES_BYTE],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadMinimumSamplingIntervalAttributeCallback)(
-    UA_Client *client, void *userdata, UA_UInt32 requestId, UA_Double *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readMinimumSamplingIntervalAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadMinimumSamplingIntervalAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
-        &UA_TYPES[UA_TYPES_DOUBLE], (UA_ClientAsyncServiceCallback)callback, userdata,
-        reqId);
-}
-typedef void (*UA_ClientAsyncReadHistorizingAttributeCallback)(UA_Client *client,
-                                                               void *userdata,
-                                                               UA_UInt32 requestId,
-                                                               UA_Boolean *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readHistorizingAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadHistorizingAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_HISTORIZING, &UA_TYPES[UA_TYPES_BOOLEAN],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadExecutableAttributeCallback)(UA_Client *client,
-                                                              void *userdata,
-                                                              UA_UInt32 requestId,
-                                                              UA_Boolean *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readExecutableAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadExecutableAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_EXECUTABLE, &UA_TYPES[UA_TYPES_BOOLEAN],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-typedef void (*UA_ClientAsyncReadUserExecutableAttributeCallback)(UA_Client *client,
-                                                                  void *userdata,
-                                                                  UA_UInt32 requestId,
-                                                                  UA_Boolean *out);
-static UA_INLINE UA_StatusCode
-UA_Client_readUserExecutableAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    UA_ClientAsyncReadUserExecutableAttributeCallback callback, void *userdata,
-    UA_UInt32 *reqId) {
-    return __UA_Client_readAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_USEREXECUTABLE, &UA_TYPES[UA_TYPES_BOOLEAN],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-/**
- * Write Attribute
- * ^^^^^^^^^^^^^^ */
-
-UA_StatusCode UA_EXPORT
-__UA_Client_writeAttribute_async(UA_Client *client, const UA_NodeId *nodeId,
-                                 UA_AttributeId attributeId, const void *in,
-                                 const UA_DataType *inDataType,
-                                 UA_ClientAsyncServiceCallback callback, void *userdata,
-                                 UA_UInt32 *reqId);
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeValueAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                    const UA_Variant *newValue,
-                                    UA_ClientAsyncWriteCallback callback, void *userdata,
-                                    UA_UInt32 *reqId) {
-
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_VALUE, newValue, &UA_TYPES[UA_TYPES_VARIANT],
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_writeNodeIdAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                     const UA_NodeId *outNodeId,
-                                     UA_ClientAsyncServiceCallback callback,
-                                     void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_NODEID,
-                                            outNodeId, &UA_TYPES[UA_TYPES_NODEID],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeNodeClassAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                        const UA_NodeClass *outNodeClass,
-                                        UA_ClientAsyncServiceCallback callback,
-                                        void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_NODECLASS,
-                                            outNodeClass, &UA_TYPES[UA_TYPES_NODECLASS],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeBrowseNameAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                         const UA_QualifiedName *outBrowseName,
-                                         UA_ClientAsyncServiceCallback callback,
-                                         void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_BROWSENAME, outBrowseName,
-        &UA_TYPES[UA_TYPES_QUALIFIEDNAME], callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeDisplayNameAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                          const UA_LocalizedText *outDisplayName,
-                                          UA_ClientAsyncServiceCallback callback,
-                                          void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME, outDisplayName,
-        &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeDescriptionAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                          const UA_LocalizedText *outDescription,
-                                          UA_ClientAsyncServiceCallback callback,
-                                          void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_DESCRIPTION, outDescription,
-        &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeWriteMaskAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                        const UA_UInt32 *outWriteMask,
-                                        UA_ClientAsyncServiceCallback callback,
-                                        void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
-                                            outWriteMask, &UA_TYPES[UA_TYPES_UINT32],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeUserWriteMaskAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                            const UA_UInt32 *outUserWriteMask,
-                                            UA_ClientAsyncServiceCallback callback,
-                                            void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_USERWRITEMASK,
-                                            outUserWriteMask, &UA_TYPES[UA_TYPES_UINT32],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeIsAbstractAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                         const UA_Boolean *outIsAbstract,
-                                         UA_ClientAsyncServiceCallback callback,
-                                         void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
-                                            outIsAbstract, &UA_TYPES[UA_TYPES_BOOLEAN],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeSymmetricAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                        const UA_Boolean *outSymmetric,
-                                        UA_ClientAsyncServiceCallback callback,
-                                        void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_SYMMETRIC,
-                                            outSymmetric, &UA_TYPES[UA_TYPES_BOOLEAN],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeInverseNameAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                          const UA_LocalizedText *outInverseName,
-                                          UA_ClientAsyncServiceCallback callback,
-                                          void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_INVERSENAME, outInverseName,
-        &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeContainsNoLoopsAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                              const UA_Boolean *outContainsNoLoops,
-                                              UA_ClientAsyncServiceCallback callback,
-                                              void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS, outContainsNoLoops,
-        &UA_TYPES[UA_TYPES_BOOLEAN], callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeEventNotifierAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                            const UA_Byte *outEventNotifier,
-                                            UA_ClientAsyncServiceCallback callback,
-                                            void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER,
-                                            outEventNotifier, &UA_TYPES[UA_TYPES_BYTE],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeDataTypeAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                       const UA_NodeId *outDataType,
-                                       UA_ClientAsyncServiceCallback callback,
-                                       void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_DATATYPE,
-                                            outDataType, &UA_TYPES[UA_TYPES_NODEID],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeValueRankAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                        const UA_Int32 *outValueRank,
-                                        UA_ClientAsyncServiceCallback callback,
-                                        void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_VALUERANK,
-                                            outValueRank, &UA_TYPES[UA_TYPES_INT32],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeAccessLevelAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                          const UA_Byte *outAccessLevel,
-                                          UA_ClientAsyncServiceCallback callback,
-                                          void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
-                                            outAccessLevel, &UA_TYPES[UA_TYPES_BYTE],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeUserAccessLevelAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                              const UA_Byte *outUserAccessLevel,
-                                              UA_ClientAsyncServiceCallback callback,
-                                              void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_USERACCESSLEVEL, outUserAccessLevel,
-        &UA_TYPES[UA_TYPES_BYTE], callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeMinimumSamplingIntervalAttribute_async(
-    UA_Client *client, const UA_NodeId nodeId,
-    const UA_Double *outMinimumSamplingInterval, UA_ClientAsyncServiceCallback callback,
-    void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
-        outMinimumSamplingInterval, &UA_TYPES[UA_TYPES_DOUBLE], callback, userdata,
-        reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeHistorizingAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                          const UA_Boolean *outHistorizing,
-                                          UA_ClientAsyncServiceCallback callback,
-                                          void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_HISTORIZING,
-                                            outHistorizing, &UA_TYPES[UA_TYPES_BOOLEAN],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeExecutableAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                         const UA_Boolean *outExecutable,
-                                         UA_ClientAsyncServiceCallback callback,
-                                         void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
-                                            outExecutable, &UA_TYPES[UA_TYPES_BOOLEAN],
-                                            callback, userdata, reqId);
-}
-static UA_INLINE UA_StatusCode
-UA_Client_writeUserExecutableAttribute_async(UA_Client *client, const UA_NodeId nodeId,
-                                             const UA_Boolean *outUserExecutable,
-                                             UA_ClientAsyncServiceCallback callback,
-                                             void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_writeAttribute_async(
-        client, &nodeId, UA_ATTRIBUTEID_USEREXECUTABLE, outUserExecutable,
-        &UA_TYPES[UA_TYPES_BOOLEAN], callback, userdata, reqId);
-}
-
-/**
- * Method Calling
- * ^^^^^^^^^^^^^^ */
-#ifdef UA_ENABLE_METHODCALLS
-UA_StatusCode UA_EXPORT
-__UA_Client_call_async(UA_Client *client, const UA_NodeId objectId,
-                       const UA_NodeId methodId, size_t inputSize,
-                       const UA_Variant *input, UA_ClientAsyncServiceCallback callback,
-                       void *userdata, UA_UInt32 *reqId);
-
-typedef void (*UA_ClientAsyncCallCallback)(UA_Client *client, void *userdata,
-                                           UA_UInt32 requestId, UA_CallResponse *cr);
-
-static UA_INLINE UA_StatusCode
-UA_Client_call_async(UA_Client *client, const UA_NodeId objectId,
-                     const UA_NodeId methodId, size_t inputSize, const UA_Variant *input,
-                     UA_ClientAsyncCallCallback callback, void *userdata,
-                     UA_UInt32 *reqId) {
-    return __UA_Client_call_async(client, objectId, methodId, inputSize, input,
-                                  (UA_ClientAsyncServiceCallback)callback, userdata,
-                                  reqId);
-}
-#endif
-
-/**
- * Node Management
- * ^^^^^^^^^^^^^^^ */
-typedef void (*UA_ClientAsyncAddNodesCallback)(UA_Client *client, void *userdata,
-                                               UA_UInt32 requestId,
-                                               UA_AddNodesResponse *ar);
-
-UA_StatusCode UA_EXPORT
-__UA_Client_addNode_async(UA_Client *client, const UA_NodeClass nodeClass,
-                          const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_NodeId typeDefinition, const UA_NodeAttributes *attr,
-                          const UA_DataType *attributeType, UA_NodeId *outNewNodeId,
-                          UA_ClientAsyncServiceCallback callback, void *userdata,
-                          UA_UInt32 *reqId);
-
-static UA_INLINE UA_StatusCode
-UA_Client_addVariableNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                                const UA_NodeId parentNodeId,
-                                const UA_NodeId referenceTypeId,
-                                const UA_QualifiedName browseName,
-                                const UA_NodeId typeDefinition,
-                                const UA_VariableAttributes attr, UA_NodeId *outNewNodeId,
-                                UA_ClientAsyncAddNodesCallback callback, void *userdata,
-                                UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_VARIABLE, requestedNewNodeId, parentNodeId, referenceTypeId,
-        browseName, typeDefinition, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addVariableTypeNode_async(
-    UA_Client *client, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
-    const UA_NodeId referenceTypeId, const UA_QualifiedName browseName,
-    const UA_VariableTypeAttributes attr, UA_NodeId *outNewNodeId,
-    UA_ClientAsyncAddNodesCallback callback, void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_VARIABLETYPE, requestedNewNodeId, parentNodeId,
-        referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addObjectNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                              const UA_NodeId parentNodeId,
-                              const UA_NodeId referenceTypeId,
-                              const UA_QualifiedName browseName,
-                              const UA_NodeId typeDefinition,
-                              const UA_ObjectAttributes attr, UA_NodeId *outNewNodeId,
-                              UA_ClientAsyncAddNodesCallback callback, void *userdata,
-                              UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_OBJECT, requestedNewNodeId, parentNodeId, referenceTypeId,
-        browseName, typeDefinition, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addObjectTypeNode_async(
-    UA_Client *client, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
-    const UA_NodeId referenceTypeId, const UA_QualifiedName browseName,
-    const UA_ObjectTypeAttributes attr, UA_NodeId *outNewNodeId,
-    UA_ClientAsyncAddNodesCallback callback, void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_OBJECTTYPE, requestedNewNodeId, parentNodeId,
-        referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addViewNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                            const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                            const UA_QualifiedName browseName,
-                            const UA_ViewAttributes attr, UA_NodeId *outNewNodeId,
-                            UA_ClientAsyncAddNodesCallback callback, void *userdata,
-                            UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_VIEW, requestedNewNodeId, parentNodeId, referenceTypeId,
-        browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addReferenceTypeNode_async(
-    UA_Client *client, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
-    const UA_NodeId referenceTypeId, const UA_QualifiedName browseName,
-    const UA_ReferenceTypeAttributes attr, UA_NodeId *outNewNodeId,
-    UA_ClientAsyncAddNodesCallback callback, void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_REFERENCETYPE, requestedNewNodeId, parentNodeId,
-        referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addDataTypeNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                                const UA_NodeId parentNodeId,
-                                const UA_NodeId referenceTypeId,
-                                const UA_QualifiedName browseName,
-                                const UA_DataTypeAttributes attr, UA_NodeId *outNewNodeId,
-                                UA_ClientAsyncAddNodesCallback callback, void *userdata,
-                                UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_DATATYPE, requestedNewNodeId, parentNodeId, referenceTypeId,
-        browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-static UA_INLINE UA_StatusCode
-UA_Client_addMethodNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId,
-                              const UA_NodeId parentNodeId,
-                              const UA_NodeId referenceTypeId,
-                              const UA_QualifiedName browseName,
-                              const UA_MethodAttributes attr, UA_NodeId *outNewNodeId,
-                              UA_ClientAsyncAddNodesCallback callback, void *userdata,
-                              UA_UInt32 *reqId) {
-    return __UA_Client_addNode_async(
-        client, UA_NODECLASS_METHOD, requestedNewNodeId, parentNodeId, referenceTypeId,
-        browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr,
-        &UA_TYPES[UA_TYPES_METHODATTRIBUTES], outNewNodeId,
-        (UA_ClientAsyncServiceCallback)callback, userdata, reqId);
-}
-
-/**
- * Misc Functionalities
- * ^^^^^^^^^^^^^^^^^^^^ */
-
-UA_StatusCode UA_EXPORT
-__UA_Client_translateBrowsePathsToNodeIds_async(UA_Client *client, char *paths[],
-                                                UA_UInt32 ids[], size_t pathSize,
-                                                UA_ClientAsyncServiceCallback callback,
-                                                void *userdata, UA_UInt32 *reqId);
-
-typedef void (*UA_ClientAsyncTranslateCallback)(
-    UA_Client *client, void *userdata, UA_UInt32 requestId,
-    UA_TranslateBrowsePathsToNodeIdsResponse *tr);
-
-static UA_INLINE UA_StatusCode
-UA_Cient_translateBrowsePathsToNodeIds_async(UA_Client *client, char **paths,
-                                             UA_UInt32 *ids, size_t pathSize,
-                                             UA_ClientAsyncTranslateCallback callback,
-                                             void *userdata, UA_UInt32 *reqId) {
-    return __UA_Client_translateBrowsePathsToNodeIds_async(
-        client, paths, ids, pathSize, (UA_ClientAsyncServiceCallback)callback, userdata,
-        reqId);
-}
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_HIGHLEVEL_ASYNC_H_ */
diff --git a/ext/open62541/include/open62541/client_subscriptions.h b/ext/open62541/include/open62541/client_subscriptions.h
deleted file mode 100644
index 204b294..0000000
--- a/ext/open62541/include/open62541/client_subscriptions.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef UA_CLIENT_SUBSCRIPTIONS_H_
-#define UA_CLIENT_SUBSCRIPTIONS_H_
-
-#include <open62541/client.h>
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-/**
- * .. _client-subscriptions:
- *
- * Subscriptions
- * -------------
- *
- * Subscriptions in OPC UA are asynchronous. That is, the client sends several
- * PublishRequests to the server. The server returns PublishResponses with
- * notifications. But only when a notification has been generated. The client
- * does not wait for the responses and continues normal operations.
- *
- * Note the difference between Subscriptions and MonitoredItems. Subscriptions
- * are used to report back notifications. MonitoredItems are used to generate
- * notifications. Every MonitoredItem is attached to exactly one Subscription.
- * And a Subscription can contain many MonitoredItems.
- *
- * The client automatically processes PublishResponses (with a callback) in the
- * background and keeps enough PublishRequests in transit. The PublishResponses
- * may be recieved during a synchronous service call or in
- * ``UA_Client_runAsync``. */
-
-/* Callbacks defined for Subscriptions */
-typedef void (*UA_Client_DeleteSubscriptionCallback)
-    (UA_Client *client, UA_UInt32 subId, void *subContext);
-
-typedef void (*UA_Client_StatusChangeNotificationCallback)
-    (UA_Client *client, UA_UInt32 subId, void *subContext,
-     UA_StatusChangeNotification *notification);
-
-/* Provides default values for a new subscription.
- *
- * RequestedPublishingInterval:  500.0 [ms]
- * RequestedLifetimeCount: 10000
- * RequestedMaxKeepAliveCount: 10
- * MaxNotificationsPerPublish: 0 (unlimited)
- * PublishingEnabled: true
- * Priority: 0 */
-static UA_INLINE UA_CreateSubscriptionRequest
-UA_CreateSubscriptionRequest_default(void) {
-    UA_CreateSubscriptionRequest request;
-    UA_CreateSubscriptionRequest_init(&request);
-
-    request.requestedPublishingInterval = 500.0;
-    request.requestedLifetimeCount = 10000;
-    request.requestedMaxKeepAliveCount = 10;
-    request.maxNotificationsPerPublish = 0;
-    request.publishingEnabled = true;
-    request.priority = 0;
-    return request;
-}
-
-UA_CreateSubscriptionResponse UA_EXPORT
-UA_Client_Subscriptions_create(UA_Client *client,
-                               const UA_CreateSubscriptionRequest request,
-                               void *subscriptionContext,
-                               UA_Client_StatusChangeNotificationCallback statusChangeCallback,
-                               UA_Client_DeleteSubscriptionCallback deleteCallback);
-
-UA_ModifySubscriptionResponse UA_EXPORT
-UA_Client_Subscriptions_modify(UA_Client *client, const UA_ModifySubscriptionRequest request);
-
-UA_DeleteSubscriptionsResponse UA_EXPORT
-UA_Client_Subscriptions_delete(UA_Client *client,
-                               const UA_DeleteSubscriptionsRequest request);
-
-/* Delete a single subscription */
-UA_StatusCode UA_EXPORT
-UA_Client_Subscriptions_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId);
-
-static UA_INLINE UA_SetPublishingModeResponse
-UA_Client_Subscriptions_setPublishingMode(UA_Client *client,
-                                          const UA_SetPublishingModeRequest request) {
-    UA_SetPublishingModeResponse response;
-    __UA_Client_Service(client, &request,
-                        &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], &response,
-                        &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]);
-    return response;
-}
-
-/**
- * MonitoredItems
- * --------------
- *
- * MonitoredItems for Events indicate the ``EventNotifier`` attribute. This
- * indicates to the server not to monitor changes of the attribute, but to
- * forward Event notifications from that node.
- *
- * During the creation of a MonitoredItem, the server may return changed
- * adjusted parameters. Check the returned ``UA_CreateMonitoredItemsResponse``
- * to get the current parameters. */
-
-/* Provides default values for a new monitored item. */
-static UA_INLINE UA_MonitoredItemCreateRequest
-UA_MonitoredItemCreateRequest_default(UA_NodeId nodeId) {
-    UA_MonitoredItemCreateRequest request;
-    UA_MonitoredItemCreateRequest_init(&request);
-    request.itemToMonitor.nodeId = nodeId;
-    request.itemToMonitor.attributeId = UA_ATTRIBUTEID_VALUE;
-    request.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    request.requestedParameters.samplingInterval = 250;
-    request.requestedParameters.discardOldest = true;
-    request.requestedParameters.queueSize = 1;
-    return request;
-}
-
-/**
- * The clientHandle parameter can't be set by the user, any value will be replaced
- * by the client before sending the request to the server. */
-
-/* Callback for the deletion of a MonitoredItem */
-typedef void (*UA_Client_DeleteMonitoredItemCallback)
-    (UA_Client *client, UA_UInt32 subId, void *subContext,
-     UA_UInt32 monId, void *monContext);
-
-/* Callback for DataChange notifications */
-typedef void (*UA_Client_DataChangeNotificationCallback)
-    (UA_Client *client, UA_UInt32 subId, void *subContext,
-     UA_UInt32 monId, void *monContext,
-     UA_DataValue *value);
-
-/* Callback for Event notifications */
-typedef void (*UA_Client_EventNotificationCallback)
-    (UA_Client *client, UA_UInt32 subId, void *subContext,
-     UA_UInt32 monId, void *monContext,
-     size_t nEventFields, UA_Variant *eventFields);
-
-/* Don't use to monitor the EventNotifier attribute */
-UA_CreateMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_createDataChanges(UA_Client *client,
-            const UA_CreateMonitoredItemsRequest request, void **contexts,
-            UA_Client_DataChangeNotificationCallback *callbacks,
-            UA_Client_DeleteMonitoredItemCallback *deleteCallbacks);
-
-UA_MonitoredItemCreateResult UA_EXPORT
-UA_Client_MonitoredItems_createDataChange(UA_Client *client, UA_UInt32 subscriptionId,
-          UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item,
-          void *context, UA_Client_DataChangeNotificationCallback callback,
-          UA_Client_DeleteMonitoredItemCallback deleteCallback);
-
-/* Monitor the EventNotifier attribute only */
-UA_CreateMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_createEvents(UA_Client *client,
-            const UA_CreateMonitoredItemsRequest request, void **contexts,
-            UA_Client_EventNotificationCallback *callback,
-            UA_Client_DeleteMonitoredItemCallback *deleteCallback);
-
-UA_MonitoredItemCreateResult UA_EXPORT
-UA_Client_MonitoredItems_createEvent(UA_Client *client, UA_UInt32 subscriptionId,
-          UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item,
-          void *context, UA_Client_EventNotificationCallback callback,
-          UA_Client_DeleteMonitoredItemCallback deleteCallback);
-
-UA_DeleteMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_delete(UA_Client *client, const UA_DeleteMonitoredItemsRequest);
-
-UA_StatusCode UA_EXPORT
-UA_Client_MonitoredItems_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId, UA_UInt32 monitoredItemId);
-
-/* The clientHandle parameter will be filled automatically */
-UA_ModifyMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_modify(UA_Client *client,
-                                const UA_ModifyMonitoredItemsRequest request);
-
-/**
- * The following service calls go directly to the server. The MonitoredItem settings are
- * not stored in the client. */
-
-static UA_INLINE UA_SetMonitoringModeResponse
-UA_Client_MonitoredItems_setMonitoringMode(UA_Client *client,
-                                           const UA_SetMonitoringModeRequest request) {
-    UA_SetMonitoringModeResponse response;
-    __UA_Client_Service(client,
-                        &request, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]);
-    return response;
-}
-
-static UA_INLINE UA_SetTriggeringResponse
-UA_Client_MonitoredItems_setTriggering(UA_Client *client,
-                                       const UA_SetTriggeringRequest request) {
-    UA_SetTriggeringResponse response;
-    __UA_Client_Service(client,
-                        &request, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]);
-    return response;
-}
-
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_SUBSCRIPTIONS_H_ */
diff --git a/ext/open62541/include/open62541/config.h.in b/ext/open62541/include/open62541/config.h.in
deleted file mode 100644
index d603fe0..0000000
--- a/ext/open62541/include/open62541/config.h.in
+++ /dev/null
@@ -1,108 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef UA_CONFIG_H_
-#define UA_CONFIG_H_
-
-/**
- * open62541 Version
- * ----------------- */
-#define UA_OPEN62541_VER_MAJOR ${OPEN62541_VER_MAJOR}
-#define UA_OPEN62541_VER_MINOR ${OPEN62541_VER_MINOR}
-#define UA_OPEN62541_VER_PATCH ${OPEN62541_VER_PATCH}
-#define UA_OPEN62541_VER_LABEL "${OPEN62541_VER_LABEL}" /* Release candidate label, etc. */
-#define UA_OPEN62541_VER_COMMIT "${OPEN62541_VER_COMMIT}"
-
-/**
- * Feature Options
- * ---------------
- * Changing the feature options has no effect on a pre-compiled library. */
-
-#define UA_LOGLEVEL ${UA_LOGLEVEL}
-#ifndef UA_ENABLE_AMALGAMATION
-#cmakedefine UA_ENABLE_AMALGAMATION
-#endif
-#cmakedefine UA_ENABLE_METHODCALLS
-#cmakedefine UA_ENABLE_NODEMANAGEMENT
-#cmakedefine UA_ENABLE_SUBSCRIPTIONS
-#cmakedefine UA_ENABLE_PUBSUB
-#cmakedefine UA_ENABLE_PUBSUB_ETH_UADP
-#cmakedefine UA_ENABLE_PUBSUB_DELTAFRAMES
-#cmakedefine UA_ENABLE_PUBSUB_INFORMATIONMODEL
-#cmakedefine UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-#cmakedefine UA_ENABLE_DA
-#cmakedefine UA_ENABLE_ENCRYPTION
-#cmakedefine UA_ENABLE_HISTORIZING
-#cmakedefine UA_ENABLE_MICRO_EMB_DEV_PROFILE
-#cmakedefine UA_ENABLE_EXPERIMENTAL_HISTORIZING
-#cmakedefine UA_ENABLE_SUBSCRIPTIONS_EVENTS
-#cmakedefine UA_ENABLE_JSON_ENCODING
-
-/* Multithreading */
-#cmakedefine UA_ENABLE_IMMUTABLE_NODES
-#define UA_MULTITHREADING ${UA_MULTITHREADING}
-#if UA_MULTITHREADING >= 200 && !defined(UA_ENABLE_IMMUTABLE_NODES)
-#error "The multithreading feature requires nodes to be immutable"
-#endif
-
-/* Advanced Options */
-#cmakedefine UA_ENABLE_CUSTOM_NODESTORE
-#cmakedefine UA_ENABLE_STATUSCODE_DESCRIPTIONS
-#cmakedefine UA_ENABLE_TYPEDESCRIPTION
-#cmakedefine UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS
-#cmakedefine UA_ENABLE_DETERMINISTIC_RNG
-#cmakedefine UA_ENABLE_DISCOVERY
-#cmakedefine UA_ENABLE_DISCOVERY_MULTICAST
-#cmakedefine UA_ENABLE_WEBSOCKET_SERVER
-#cmakedefine UA_ENABLE_QUERY
-#cmakedefine UA_ENABLE_MALLOC_SINGLETON
-#cmakedefine UA_ENABLE_DISCOVERY_SEMAPHORE
-#cmakedefine UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-#cmakedefine UA_ENABLE_VALGRIND_INTERACTIVE
-#define UA_VALGRIND_INTERACTIVE_INTERVAL ${UA_VALGRIND_INTERACTIVE_INTERVAL}
-#cmakedefine UA_GENERATED_NAMESPACE_ZERO
-#cmakedefine UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING
-
-#cmakedefine UA_PACK_DEBIAN
-
-/* Options for Debugging */
-#cmakedefine UA_DEBUG
-#cmakedefine UA_DEBUG_DUMP_PKGS
-
-/**
- * Function Export
- * ---------------
- * On Win32: Define ``UA_DYNAMIC_LINKING`` and ``UA_DYNAMIC_LINKING_EXPORT`` in
- * order to export symbols for a DLL. Define ``UA_DYNAMIC_LINKING`` only to
- * import symbols from a DLL.*/
-#cmakedefine UA_DYNAMIC_LINKING
-
-/* Shortcuts for extern "C" declarations */
-#if !defined(_UA_BEGIN_DECLS)
-# ifdef __cplusplus
-#  define _UA_BEGIN_DECLS extern "C" {
-# else
-#  define _UA_BEGIN_DECLS
-# endif
-#endif
-#if !defined(_UA_END_DECLS)
-# ifdef __cplusplus
-#  define _UA_END_DECLS }
-# else
-#  define _UA_END_DECLS
-# endif
-#endif
-
-/* Select default architecture if non is selected through CMake or compiler define */
-#if ${UA_ARCHITECTURES_NODEF}
-# ifdef _WIN32
-#  define UA_ARCHITECTURE_WIN32
-# else
-#  define UA_ARCHITECTURE_POSIX
-# endif
-#endif
-
-#include "${UA_ARCHITECTURE}/ua_architecture.h"
-
-#endif /* UA_CONFIG_H_ */
diff --git a/ext/open62541/include/open62541/constants.h b/ext/open62541/include/open62541/constants.h
deleted file mode 100644
index 57296b4..0000000
--- a/ext/open62541/include/open62541/constants.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2016 (c) Sten Grüner
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Florian Palm
- */
-
-#ifndef UA_CONSTANTS_H_
-#define UA_CONSTANTS_H_
-
-#include <open62541/config.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Standard-Defined Constants
- * ==========================
- * This section contains numerical and string constants that are defined in the
- * OPC UA standard.
- *
- * .. _attribute-id:
- *
- * Attribute Id
- * ------------
- * Every node in an OPC UA information model contains attributes depending on
- * the node type. Possible attributes are as follows: */
-
-typedef enum {
-    UA_ATTRIBUTEID_NODEID                  = 1,
-    UA_ATTRIBUTEID_NODECLASS               = 2,
-    UA_ATTRIBUTEID_BROWSENAME              = 3,
-    UA_ATTRIBUTEID_DISPLAYNAME             = 4,
-    UA_ATTRIBUTEID_DESCRIPTION             = 5,
-    UA_ATTRIBUTEID_WRITEMASK               = 6,
-    UA_ATTRIBUTEID_USERWRITEMASK           = 7,
-    UA_ATTRIBUTEID_ISABSTRACT              = 8,
-    UA_ATTRIBUTEID_SYMMETRIC               = 9,
-    UA_ATTRIBUTEID_INVERSENAME             = 10,
-    UA_ATTRIBUTEID_CONTAINSNOLOOPS         = 11,
-    UA_ATTRIBUTEID_EVENTNOTIFIER           = 12,
-    UA_ATTRIBUTEID_VALUE                   = 13,
-    UA_ATTRIBUTEID_DATATYPE                = 14,
-    UA_ATTRIBUTEID_VALUERANK               = 15,
-    UA_ATTRIBUTEID_ARRAYDIMENSIONS         = 16,
-    UA_ATTRIBUTEID_ACCESSLEVEL             = 17,
-    UA_ATTRIBUTEID_USERACCESSLEVEL         = 18,
-    UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
-    UA_ATTRIBUTEID_HISTORIZING             = 20,
-    UA_ATTRIBUTEID_EXECUTABLE              = 21,
-    UA_ATTRIBUTEID_USEREXECUTABLE          = 22,
-    UA_ATTRIBUTEID_DATATYPEDEFINITION      = 23
-} UA_AttributeId;
-
-/**
- * Access Level Masks
- * ------------------
- * The access level to a node is given by the following constants that are ANDed
- * with the overall access level. */
-
-#define UA_ACCESSLEVELMASK_READ           (0x01u << 0u)
-#define UA_ACCESSLEVELMASK_WRITE          (0x01u << 1u)
-#define UA_ACCESSLEVELMASK_HISTORYREAD    (0x01u << 2u)
-#define UA_ACCESSLEVELMASK_HISTORYWRITE   (0x01u << 3u)
-#define UA_ACCESSLEVELMASK_SEMANTICCHANGE (0x01u << 4u)
-#define UA_ACCESSLEVELMASK_STATUSWRITE    (0x01u << 5u)
-#define UA_ACCESSLEVELMASK_TIMESTAMPWRITE (0x01u << 6u)
-
-/**
- * Write Masks
- * -----------
- * The write mask and user write mask is given by the following constants that
- * are ANDed for the overall write mask. Part 3: 5.2.7 Table 2 */
-
-#define UA_WRITEMASK_ACCESSLEVEL             (0x01u << 0u)
-#define UA_WRITEMASK_ARRRAYDIMENSIONS        (0x01u << 1u)
-#define UA_WRITEMASK_BROWSENAME              (0x01u << 2u)
-#define UA_WRITEMASK_CONTAINSNOLOOPS         (0x01u << 3u)
-#define UA_WRITEMASK_DATATYPE                (0x01u << 4u)
-#define UA_WRITEMASK_DESCRIPTION             (0x01u << 5u)
-#define UA_WRITEMASK_DISPLAYNAME             (0x01u << 6u)
-#define UA_WRITEMASK_EVENTNOTIFIER           (0x01u << 7u)
-#define UA_WRITEMASK_EXECUTABLE              (0x01u << 8u)
-#define UA_WRITEMASK_HISTORIZING             (0x01u << 9u)
-#define UA_WRITEMASK_INVERSENAME             (0x01u << 10u)
-#define UA_WRITEMASK_ISABSTRACT              (0x01u << 11u)
-#define UA_WRITEMASK_MINIMUMSAMPLINGINTERVAL (0x01u << 12u)
-#define UA_WRITEMASK_NODECLASS               (0x01u << 13u)
-#define UA_WRITEMASK_NODEID                  (0x01u << 14u)
-#define UA_WRITEMASK_SYMMETRIC               (0x01u << 15u)
-#define UA_WRITEMASK_USERACCESSLEVEL         (0x01u << 16u)
-#define UA_WRITEMASK_USEREXECUTABLE          (0x01u << 17u)
-#define UA_WRITEMASK_USERWRITEMASK           (0x01u << 18u)
-#define UA_WRITEMASK_VALUERANK               (0x01u << 19u)
-#define UA_WRITEMASK_WRITEMASK               (0x01u << 20u)
-#define UA_WRITEMASK_VALUEFORVARIABLETYPE    (0x01u << 21u)
-
-/**
- * ValueRanks
- * ----------
- * The following are the most common ValueRanks used for Variables,
- * VariableTypes and method arguments. ValueRanks higher than 3 are valid as
- * well (but less common). */
-
-#define UA_VALUERANK_SCALAR_OR_ONE_DIMENSION  -3
-#define UA_VALUERANK_ANY                      -2
-#define UA_VALUERANK_SCALAR                   -1
-#define UA_VALUERANK_ONE_OR_MORE_DIMENSIONS    0
-#define UA_VALUERANK_ONE_DIMENSION             1
-#define UA_VALUERANK_TWO_DIMENSIONS            2
-#define UA_VALUERANK_THREE_DIMENSIONS          3
-
-/**
- * Internal Constants
- * ==================
- *
- * Rule Handling
- * -------------
- *
- * The RuleHanding settings define how error cases that result from rules in the
- * OPC UA specification shall be handled. The rule handling can be softened,
- * e.g. to workaround misbehaving implementations or to mitigate the impact of
- * additional rules that are introduced in later versions of the OPC UA
- * specification. */
-typedef enum {
-    UA_RULEHANDLING_DEFAULT = 0,
-    UA_RULEHANDLING_ABORT,  /* Abort the operation and return an error code */
-    UA_RULEHANDLING_WARN,   /* Print a message in the logs and continue */
-    UA_RULEHANDLING_ACCEPT, /* Continue and disregard the broken rule */
-} UA_RuleHandling;
-
-/**
- * Order
- * -----
- *
- * The Order enum is used to establish an absolute ordering between elements.
- */
-
-typedef enum {
-    UA_ORDER_LESS = -1,
-    UA_ORDER_EQ = 0,
-    UA_ORDER_MORE = 1
-} UA_Order;
-
-_UA_END_DECLS
-
-#endif /* UA_CONSTANTS_H_ */
diff --git a/ext/open62541/include/open62541/network_tcp.h b/ext/open62541/include/open62541/network_tcp.h
deleted file mode 100644
index a377470..0000000
--- a/ext/open62541/include/open62541/network_tcp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifndef UA_NETWORK_TCP_H_
-#define UA_NETWORK_TCP_H_
-
-#include <open62541/client.h>
-#include <open62541/plugin/log.h>
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-UA_ServerNetworkLayer UA_EXPORT
-UA_ServerNetworkLayerTCP(UA_ConnectionConfig config, UA_UInt16 port, UA_Logger *logger);
-
-UA_Connection UA_EXPORT
-UA_ClientConnectionTCP(UA_ConnectionConfig config, const UA_String endpointUrl,
-                       UA_UInt32 timeout, UA_Logger *logger);
-
-UA_StatusCode UA_EXPORT
-UA_ClientConnectionTCP_poll(UA_Client *client, void *data);
-
-UA_Connection UA_EXPORT
-UA_ClientConnectionTCP_init(UA_ConnectionConfig config, const UA_String endpointUrl,
-                            UA_UInt32 timeout, UA_Logger *logger);
-
-_UA_END_DECLS
-
-#endif /* UA_NETWORK_TCP_H_ */
diff --git a/ext/open62541/include/open62541/network_ws.h b/ext/open62541/include/open62541/network_ws.h
deleted file mode 100644
index 8bcb102..0000000
--- a/ext/open62541/include/open62541/network_ws.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifndef UA_NETWORK_WS_H_
-#define UA_NETWORK_WS_H_
-
-#include <open62541/client.h>
-#include <open62541/plugin/log.h>
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-UA_ServerNetworkLayer UA_EXPORT
-UA_ServerNetworkLayerWS(UA_ConnectionConfig config, UA_UInt16 port, UA_Logger *logger);
-
-
-_UA_END_DECLS
-
-#endif /* UA_NETWORK_WS_H_ */
diff --git a/ext/open62541/include/open62541/plugin/accesscontrol.h b/ext/open62541/include/open62541/plugin/accesscontrol.h
deleted file mode 100644
index ef85e40..0000000
--- a/ext/open62541/include/open62541/plugin/accesscontrol.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_PLUGIN_ACCESS_CONTROL_H_
-#define UA_PLUGIN_ACCESS_CONTROL_H_
-
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-struct UA_AccessControl;
-typedef struct UA_AccessControl UA_AccessControl;
-
-/**
- * .. _access-control:
- *
- * Access Control Plugin API
- * =========================
- * The access control callback is used to authenticate sessions and grant access
- * rights accordingly. */
-
-struct UA_AccessControl {
-    void *context;
-    void (*deleteMembers)(UA_AccessControl *ac);
-
-    /* Supported login mechanisms. The server endpoints are created from here. */
-    size_t userTokenPoliciesSize;
-    UA_UserTokenPolicy *userTokenPolicies;
-
-    /* Authenticate a session. The session context is attached to the session
-     * and later passed into the node-based access control callbacks. The new
-     * session is rejected if a StatusCode other than UA_STATUSCODE_GOOD is
-     * returned. */
-    UA_StatusCode (*activateSession)(UA_Server *server, UA_AccessControl *ac,
-                                     const UA_EndpointDescription *endpointDescription,
-                                     const UA_ByteString *secureChannelRemoteCertificate,
-                                     const UA_NodeId *sessionId,
-                                     const UA_ExtensionObject *userIdentityToken,
-                                     void **sessionContext);
-
-    /* Deauthenticate a session and cleanup */
-    void (*closeSession)(UA_Server *server, UA_AccessControl *ac,
-                         const UA_NodeId *sessionId, void *sessionContext);
-
-    /* Access control for all nodes*/
-    UA_UInt32 (*getUserRightsMask)(UA_Server *server, UA_AccessControl *ac,
-                                   const UA_NodeId *sessionId, void *sessionContext,
-                                   const UA_NodeId *nodeId, void *nodeContext);
-
-    /* Additional access control for variable nodes */
-    UA_Byte (*getUserAccessLevel)(UA_Server *server, UA_AccessControl *ac,
-                                  const UA_NodeId *sessionId, void *sessionContext,
-                                  const UA_NodeId *nodeId, void *nodeContext);
-
-    /* Additional access control for method nodes */
-    UA_Boolean (*getUserExecutable)(UA_Server *server, UA_AccessControl *ac,
-                                    const UA_NodeId *sessionId, void *sessionContext,
-                                    const UA_NodeId *methodId, void *methodContext);
-
-    /* Additional access control for calling a method node in the context of a
-     * specific object */
-    UA_Boolean (*getUserExecutableOnObject)(UA_Server *server, UA_AccessControl *ac,
-                                            const UA_NodeId *sessionId, void *sessionContext,
-                                            const UA_NodeId *methodId, void *methodContext,
-                                            const UA_NodeId *objectId, void *objectContext);
-
-    /* Allow adding a node */
-    UA_Boolean (*allowAddNode)(UA_Server *server, UA_AccessControl *ac,
-                               const UA_NodeId *sessionId, void *sessionContext,
-                               const UA_AddNodesItem *item);
-
-    /* Allow adding a reference */
-    UA_Boolean (*allowAddReference)(UA_Server *server, UA_AccessControl *ac,
-                                    const UA_NodeId *sessionId, void *sessionContext,
-                                    const UA_AddReferencesItem *item);
-
-    /* Allow deleting a node */
-    UA_Boolean (*allowDeleteNode)(UA_Server *server, UA_AccessControl *ac,
-                                  const UA_NodeId *sessionId, void *sessionContext,
-                                  const UA_DeleteNodesItem *item);
-
-    /* Allow deleting a reference */
-    UA_Boolean (*allowDeleteReference)(UA_Server *server, UA_AccessControl *ac,
-                                       const UA_NodeId *sessionId, void *sessionContext,
-                                       const UA_DeleteReferencesItem *item);
-#ifdef UA_ENABLE_HISTORIZING
-    /* Allow insert,replace,update of historical data */
-    UA_Boolean (*allowHistoryUpdateUpdateData)(UA_Server *server, UA_AccessControl *ac,
-                                               const UA_NodeId *sessionId, void *sessionContext,
-                                               const UA_NodeId *nodeId,
-                                               UA_PerformUpdateType performInsertReplace,
-                                               const UA_DataValue *value);
-
-    /* Allow delete of historical data */
-    UA_Boolean (*allowHistoryUpdateDeleteRawModified)(UA_Server *server, UA_AccessControl *ac,
-                                                      const UA_NodeId *sessionId, void *sessionContext,
-                                                      const UA_NodeId *nodeId,
-                                                      UA_DateTime startTimestamp,
-                                                      UA_DateTime endTimestamp,
-                                                      bool isDeleteModified);
-#endif
-};
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_ACCESS_CONTROL_H_ */
diff --git a/ext/open62541/include/open62541/plugin/historydatabase.h b/ext/open62541/include/open62541/plugin/historydatabase.h
deleted file mode 100644
index e50e892..0000000
--- a/ext/open62541/include/open62541/plugin/historydatabase.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#ifndef UA_PLUGIN_HISTORYDATABASE_H_
-#define UA_PLUGIN_HISTORYDATABASE_H_
-
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-typedef struct UA_HistoryDatabase UA_HistoryDatabase;
-
-struct UA_HistoryDatabase {
-    void *context;
-
-    void
-    (*deleteMembers)(UA_HistoryDatabase *hdb);
-
-    /* This function will be called when a nodes value is set.
-     * Use this to insert data into your database(s) if polling is not suitable
-     * and you need to get all data changes.
-     * Set it to NULL if you do not need it.
-     *
-     * server is the server this node lives in.
-     * hdbContext is the context of the UA_HistoryDatabase.
-     * sessionId and sessionContext identify the session which set this value.
-     * nodeId is the node id for which data was set.
-     * historizing is the nodes boolean flag for historizing
-     * value is the new value. */
-    void
-    (*setValue)(UA_Server *server,
-                void *hdbContext,
-                const UA_NodeId *sessionId,
-                void *sessionContext,
-                const UA_NodeId *nodeId,
-                UA_Boolean historizing,
-                const UA_DataValue *value);
-
-    /* This function is called if a history read is requested with
-     * isRawReadModified set to false. Setting it to NULL will result in a
-     * response with statuscode UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED.
-     *
-     * server is the server this node lives in.
-     * hdbContext is the context of the UA_HistoryDatabase.
-     * sessionId and sessionContext identify the session which set this value.
-     * requestHeader, historyReadDetails, timestampsToReturn, releaseContinuationPoints
-     * nodesToReadSize and nodesToRead is the requested data from the client. It
-     *                 is from the request object.
-     * response the response to fill for the client. If the request is ok, there
-     *          is no need to use it. Use this to set status codes other than
-     *          "Good" or other data. You find an already allocated
-     *          UA_HistoryReadResult array with an UA_HistoryData object in the
-     *          extension object in the size of nodesToReadSize. If you are not
-     *          willing to return data, you have to delete the results array,
-     *          set it to NULL and set the resultsSize to 0. Do not access
-     *          historyData after that.
-     * historyData is a proper typed pointer array pointing in the
-     *             UA_HistoryReadResult extension object. use this to provide
-     *             result data to the client. Index in the array is the same as
-     *             in nodesToRead and the UA_HistoryReadResult array. */
-    void
-    (*readRaw)(UA_Server *server,
-               void *hdbContext,
-               const UA_NodeId *sessionId,
-               void *sessionContext,
-               const UA_RequestHeader *requestHeader,
-               const UA_ReadRawModifiedDetails *historyReadDetails,
-               UA_TimestampsToReturn timestampsToReturn,
-               UA_Boolean releaseContinuationPoints,
-               size_t nodesToReadSize,
-               const UA_HistoryReadValueId *nodesToRead,
-               UA_HistoryReadResponse *response,
-               UA_HistoryData * const * const historyData);
-
-    void
-    (*updateData)(UA_Server *server,
-                  void *hdbContext,
-                  const UA_NodeId *sessionId,
-                  void *sessionContext,
-                  const UA_RequestHeader *requestHeader,
-                  const UA_UpdateDataDetails *details,
-                  UA_HistoryUpdateResult *result);
-
-    void
-    (*deleteRawModified)(UA_Server *server,
-                         void *hdbContext,
-                         const UA_NodeId *sessionId,
-                         void *sessionContext,
-                         const UA_RequestHeader *requestHeader,
-                         const UA_DeleteRawModifiedDetails *details,
-                         UA_HistoryUpdateResult *result);
-
-    /* Add more function pointer here.
-     * For example for read_event, read_modified, read_processed, read_at_time */
-};
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_HISTORYDATABASE_H_ */
diff --git a/ext/open62541/include/open62541/plugin/log.h b/ext/open62541/include/open62541/plugin/log.h
deleted file mode 100644
index 70a47c1..0000000
--- a/ext/open62541/include/open62541/plugin/log.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_PLUGIN_LOG_H_
-#define UA_PLUGIN_LOG_H_
-
-#include <open62541/config.h>
-
-#include <stdarg.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Logging Plugin API
- * ==================
- *
- * Servers and clients define a logger in their configuration. The logger is a
- * plugin. A default plugin that logs to ``stdout`` is provided as an example.
- * The logger plugin is stateful and can point to custom data. So it is possible
- * to keep open file handlers in the logger context.
- *
- * Every log-message consists of a log-level, a log-category and a string
- * message content. The timestamp of the log-message is created within the
- * logger. */
-
-typedef enum {
-    UA_LOGLEVEL_TRACE,
-    UA_LOGLEVEL_DEBUG,
-    UA_LOGLEVEL_INFO,
-    UA_LOGLEVEL_WARNING,
-    UA_LOGLEVEL_ERROR,
-    UA_LOGLEVEL_FATAL
-} UA_LogLevel;
-
-typedef enum {
-    UA_LOGCATEGORY_NETWORK,
-    UA_LOGCATEGORY_SECURECHANNEL,
-    UA_LOGCATEGORY_SESSION,
-    UA_LOGCATEGORY_SERVER,
-    UA_LOGCATEGORY_CLIENT,
-    UA_LOGCATEGORY_USERLAND,
-    UA_LOGCATEGORY_SECURITYPOLICY
-} UA_LogCategory;
-
-typedef struct {
-    /* Log a message. The message string and following varargs are formatted
-     * according to the rules of the printf command. Use the convenience macros
-     * below that take the minimum log-level defined in ua_config.h into
-     * account. */
-    void (*log)(void *logContext, UA_LogLevel level, UA_LogCategory category,
-                const char *msg, va_list args);
-
-    void *context; /* Logger state */
-
-    void (*clear)(void *context); /* Clean up the logger plugin */
-} UA_Logger;
-
-static UA_INLINE UA_FORMAT(3,4) void
-UA_LOG_TRACE(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) {
-#if UA_LOGLEVEL <= 100
-    if(!logger || !logger->log)
-        return;
-    va_list args; va_start(args, msg);
-    logger->log(logger->context, UA_LOGLEVEL_TRACE, category, msg, args);
-    va_end(args);
-#endif
-}
-
-static UA_INLINE UA_FORMAT(3,4) void
-UA_LOG_DEBUG(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) {
-#if UA_LOGLEVEL <= 200
-    if(!logger || !logger->log)
-        return;
-    va_list args; va_start(args, msg);
-    logger->log(logger->context, UA_LOGLEVEL_DEBUG, category, msg, args);
-    va_end(args);
-#endif
-}
-
-static UA_INLINE UA_FORMAT(3,4) void
-UA_LOG_INFO(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) {
-#if UA_LOGLEVEL <= 300
-    if(!logger || !logger->log)
-        return;
-    va_list args; va_start(args, msg);
-    logger->log(logger->context, UA_LOGLEVEL_INFO, category, msg, args);
-    va_end(args);
-#endif
-}
-
-static UA_INLINE UA_FORMAT(3,4) void
-UA_LOG_WARNING(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) {
-#if UA_LOGLEVEL <= 400
-    if(!logger || !logger->log)
-        return;
-    va_list args; va_start(args, msg);
-    logger->log(logger->context, UA_LOGLEVEL_WARNING, category, msg, args);
-    va_end(args);
-#endif
-}
-
-static UA_INLINE UA_FORMAT(3,4) void
-UA_LOG_ERROR(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) {
-#if UA_LOGLEVEL <= 500
-    if(!logger || !logger->log)
-        return;
-    va_list args; va_start(args, msg);
-    logger->log(logger->context, UA_LOGLEVEL_ERROR, category, msg, args);
-    va_end(args);
-#endif
-}
-
-static UA_INLINE UA_FORMAT(3,4) void
-UA_LOG_FATAL(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) {
-#if UA_LOGLEVEL <= 600
-    if(!logger || !logger->log)
-        return;
-    va_list args; va_start(args, msg);
-    logger->log(logger->context, UA_LOGLEVEL_FATAL, category, msg, args);
-    va_end(args);
-#endif
-}
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_LOG_H_ */
diff --git a/ext/open62541/include/open62541/plugin/network.h b/ext/open62541/include/open62541/plugin/network.h
deleted file mode 100644
index 13f4c38..0000000
--- a/ext/open62541/include/open62541/plugin/network.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_PLUGIN_NETWORK_H_
-#define UA_PLUGIN_NETWORK_H_
-
-#include <open62541/plugin/log.h>
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-/* Forward declarations */
-struct UA_Connection;
-typedef struct UA_Connection UA_Connection;
-
-struct UA_SecureChannel;
-typedef struct UA_SecureChannel UA_SecureChannel;
-
-struct UA_ServerNetworkLayer;
-typedef struct UA_ServerNetworkLayer UA_ServerNetworkLayer;
-
-/**
- * .. _networking:
- *
- * Networking Plugin API
- * =====================
- *
- * Connection
- * ----------
- * Client-server connections are represented by a `UA_Connection`. The
- * connection is stateful and stores partially received messages, and so on. In
- * addition, the connection contains function pointers to the underlying
- * networking implementation. An example for this is the `send` function. So the
- * connection encapsulates all the required networking functionality. This lets
- * users on embedded (or otherwise exotic) systems implement their own
- * networking plugins with a clear interface to the main open62541 library. */
-
-typedef struct {
-    UA_UInt32 protocolVersion;
-    UA_UInt32 recvBufferSize;
-    UA_UInt32 sendBufferSize;
-    UA_UInt32 maxMessageSize; /* Indicated by the remote side (0 = unbounded) */
-    UA_UInt32 maxChunkCount;  /* Indicated by the remote side (0 = unbounded) */
-} UA_ConnectionConfig;
-
-typedef enum {
-    UA_CONNECTION_CLOSED,     /* The socket has been closed and the connection
-                               * will be deleted */
-    UA_CONNECTION_OPENING,    /* The socket is open, but the HEL/ACK handshake
-                               * is not done */
-    UA_CONNECTION_ESTABLISHED /* The socket is open and the connection
-                               * configured */
-
-} UA_ConnectionState;
-
-struct UA_Connection {
-    UA_ConnectionState state;
-    UA_ConnectionConfig config;
-    UA_SecureChannel *channel;     /* The securechannel that is attached to
-                                    * this connection */
-    UA_SOCKET sockfd;              /* Most connectivity solutions run on
-                                    * sockets. Having the socket id here
-                                    * simplifies the design. */
-    UA_DateTime openingDate;       /* The date the connection was created */
-    void *handle;                  /* A pointer to internal data */
-    UA_ByteString incompleteChunk; /* A half-received chunk (TCP is a
-                                    * streaming protocol) is stored here */
-    UA_UInt64 connectCallbackID;   /* Callback Id, for the connect-loop */
-    /* Get a buffer for sending */
-    UA_StatusCode (*getSendBuffer)(UA_Connection *connection, size_t length,
-                                   UA_ByteString *buf);
-
-    /* Release the send buffer manually */
-    void (*releaseSendBuffer)(UA_Connection *connection, UA_ByteString *buf);
-
-    /* Sends a message over the connection. The message buffer is always freed,
-     * even if sending fails.
-     *
-     * @param connection The connection
-     * @param buf The message buffer
-     * @return Returns an error code or UA_STATUSCODE_GOOD. */
-    UA_StatusCode (*send)(UA_Connection *connection, UA_ByteString *buf);
-
-    /* Receive a message from the remote connection
-     *
-     * @param connection The connection
-     * @param response The response string. It is allocated by the connection
-     *        and needs to be freed with connection->releaseBuffer
-     * @param timeout Timeout of the recv operation in milliseconds
-     * @return Returns UA_STATUSCODE_BADCOMMUNICATIONERROR if the recv operation
-     *         can be repeated, UA_STATUSCODE_GOOD if it succeeded and
-     *         UA_STATUSCODE_BADCONNECTIONCLOSED if the connection was
-     *         closed. */
-    UA_StatusCode (*recv)(UA_Connection *connection, UA_ByteString *response,
-                          UA_UInt32 timeout);
-
-    /* Release the buffer of a received message */
-    void (*releaseRecvBuffer)(UA_Connection *connection, UA_ByteString *buf);
-
-    /* Close the connection. The network layer closes the socket. This is picked
-     * up during the next 'listen' and the connection is freed in the network
-     * layer. */
-    void (*close)(UA_Connection *connection);
-
-    /* To be called only from within the server (and not the network layer).
-     * Frees up the connection's memory. */
-    void (*free)(UA_Connection *connection);
-};
-
-/* Cleans up half-received messages, and so on. Called from connection->free. */
-void UA_EXPORT
-UA_Connection_deleteMembers(UA_Connection *connection);
-
-/**
- * Server Network Layer
- * --------------------
- * The server exposes two functions to interact with remote clients:
- * `processBinaryMessage` and `removeConnection`. These functions are called by
- * the server network layer.
- *
- * It is the job of the server network layer to listen on a TCP socket, to
- * accept new connections, to call the server with received messages and to
- * signal closed connections to the server.
- *
- * The network layer is part of the server config. So users can provide a custom
- * implementation if the provided example does not fit their architecture. The
- * network layer is invoked only from the server's main loop. So the network
- * layer does not need to be thread-safe. If the networklayer receives a
- * positive duration for blocking listening, the server's main loop will block
- * until a message is received or the duration times out. */
-
-/* Process a binary message (TCP packet). The message can contain partial
- * chunks. (TCP is a streaming protocol and packets may be split/merge during
- * transport.) After processing, the message is freed with
- * connection->releaseRecvBuffer. */
-void UA_EXPORT
-UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection,
-                               UA_ByteString *message);
-
-/* The server internally cleans up the connection and then calls
- * connection->free. */
-void UA_EXPORT
-UA_Server_removeConnection(UA_Server *server, UA_Connection *connection);
-
-struct UA_ServerNetworkLayer {
-    void *handle; /* Internal data */
-
-    UA_String discoveryUrl;
-
-    UA_ConnectionConfig localConnectionConfig;
-
-    /* Start listening on the networklayer.
-     *
-     * @param nl The network layer
-     * @return Returns UA_STATUSCODE_GOOD or an error code. */
-    UA_StatusCode (*start)(UA_ServerNetworkLayer *nl, const UA_String *customHostname);
-
-    /* Listen for new and closed connections and arriving packets. Calls
-     * UA_Server_processBinaryMessage for the arriving packets. Closed
-     * connections are picked up here and forwarded to
-     * UA_Server_removeConnection where they are cleaned up and freed.
-     *
-     * @param nl The network layer
-     * @param server The server for processing the incoming packets and for
-     *               closing connections.
-     * @param timeout The timeout during which an event must arrive in
-     *                milliseconds
-     * @return A statuscode for the status of the network layer. */
-    UA_StatusCode (*listen)(UA_ServerNetworkLayer *nl, UA_Server *server,
-                            UA_UInt16 timeout);
-
-    /* Close the network socket and all open connections. Afterwards, the
-     * network layer can be safely deleted.
-     *
-     * @param nl The network layer
-     * @param server The server that processes the incoming packets and for
-     *               closing connections before deleting them.
-     * @return A statuscode for the status of the closing operation. */
-    void (*stop)(UA_ServerNetworkLayer *nl, UA_Server *server);
-
-    /* Deletes the network layer context. Call only after stopping. */
-    void (*deleteMembers)(UA_ServerNetworkLayer *nl);
-};
-
-/**
- * Client Network Layer
- * --------------------
- * The client has only a single connection used for sending and receiving binary
- * messages. */
-
-/* @param config the connection config for this client
- * @param endpointUrl to where to connect
- * @param timeout in ms until the connection try times out if remote not reachable
- * @param logger the logger to use */
-typedef UA_Connection
-(*UA_ConnectClientConnection)(UA_ConnectionConfig config, UA_String endpointUrl,
-                              UA_UInt32 timeout, UA_Logger *logger);
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_NETWORK_H_ */
diff --git a/ext/open62541/include/open62541/plugin/nodestore.h b/ext/open62541/include/open62541/plugin/nodestore.h
deleted file mode 100644
index 5f4e404..0000000
--- a/ext/open62541/include/open62541/plugin/nodestore.h
+++ /dev/null
@@ -1,536 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_SERVER_NODES_H_
-#define UA_SERVER_NODES_H_
-
-/* !!! Warning !!!
- *
- * If you are not developing a nodestore plugin, then you should not work with
- * the definitions from this file directly. The underlying node structures are
- * not meant to be used directly by end users. Please use the public server API
- * / OPC UA services to interact with the information model. */
-
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-/* Forward declaration */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-struct UA_MonitoredItem;
-#endif
-
-/**
- * .. _information-modelling:
- *
- * Information Modelling
- * =====================
- *
- * Information modelling in OPC UA combines concepts from object-orientation and
- * semantic modelling. At the core, an OPC UA information model is a graph made
- * up of
- *
- * - Nodes: There are eight possible Node types (variable, object, method, ...)
- * - References: Typed and directed relations between two nodes
- *
- * Every node is identified by a unique (within the server) :ref:`nodeid`.
- * Reference are triples of the form ``(source-nodeid, referencetype-nodeid,
- * target-nodeid)``. An example reference between nodes is a
- * ``hasTypeDefinition`` reference between a Variable and its VariableType. Some
- * ReferenceTypes are *hierarchic* and must not form *directed loops*. See the
- * section on :ref:`ReferenceTypes <referencetypenode>` for more details on
- * possible references and their semantics.
- *
- * **Warning!!** The structures defined in this section are only relevant for
- * the developers of custom Nodestores. The interaction with the information
- * model is possible only via the OPC UA :ref:`services`. So the following
- * sections are purely informational so that users may have a clear mental
- * model of the underlying representation.
- *
- * Base Node Attributes
- * --------------------
- *
- * Nodes contain attributes according to their node type. The base node
- * attributes are common to all node types. In the OPC UA :ref:`services`,
- * attributes are referred to via the :ref:`nodeid` of the containing node and
- * an integer :ref:`attribute-id`.
- *
- * Internally, open62541 uses ``UA_Node`` in places where the exact node type is
- * not known or not important. The ``nodeClass`` attribute is used to ensure the
- * correctness of casting from ``UA_Node`` to a specific node type. */
-
-/* List of reference targets with the same reference type and direction */
-typedef struct {
-    UA_NodeId referenceTypeId;
-    UA_Boolean isInverse;
-    size_t targetIdsSize;
-    UA_ExpandedNodeId *targetIds;
-} UA_NodeReferenceKind;
-
-#define UA_NODE_BASEATTRIBUTES                  \
-    UA_NodeId nodeId;                           \
-    UA_NodeClass nodeClass;                     \
-    UA_QualifiedName browseName;                \
-    UA_LocalizedText displayName;               \
-    UA_LocalizedText description;               \
-    UA_UInt32 writeMask;                        \
-    size_t referencesSize;                      \
-    UA_NodeReferenceKind *references;           \
-                                                \
-    /* Members specific to open62541 */         \
-    void *context;                              \
-    UA_Boolean constructed; /* Constructors were called */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-} UA_Node;
-
-/**
- * VariableNode
- * ------------
- *
- * Variables store values in a :ref:`datavalue` together with
- * metadata for introspection. Most notably, the attributes data type, value
- * rank and array dimensions constrain the possible values the variable can take
- * on.
- *
- * Variables come in two flavours: properties and datavariables. Properties are
- * related to a parent with a ``hasProperty`` reference and may not have child
- * nodes themselves. Datavariables may contain properties (``hasProperty``) and
- * also datavariables (``hasComponents``).
- *
- * All variables are instances of some :ref:`variabletypenode` in return
- * constraining the possible data type, value rank and array dimensions
- * attributes.
- *
- * Data Type
- * ^^^^^^^^^
- *
- * The (scalar) data type of the variable is constrained to be of a specific
- * type or one of its children in the type hierarchy. The data type is given as
- * a NodeId pointing to a :ref:`datatypenode` in the type hierarchy. See the
- * Section :ref:`datatypenode` for more details.
- *
- * If the data type attribute points to ``UInt32``, then the value attribute
- * must be of that exact type since ``UInt32`` does not have children in the
- * type hierarchy. If the data type attribute points ``Number``, then the type
- * of the value attribute may still be ``UInt32``, but also ``Float`` or
- * ``Byte``.
- *
- * Consistency between the data type attribute in the variable and its
- * :ref:`VariableTypeNode` is ensured.
- *
- * Value Rank
- * ^^^^^^^^^^
- *
- * This attribute indicates whether the value attribute of the variable is an
- * array and how many dimensions the array has. It may have the following
- * values:
- *
- * - ``n >= 1``: the value is an array with the specified number of dimensions
- * - ``n =  0``: the value is an array with one or more dimensions
- * - ``n = -1``: the value is a scalar
- * - ``n = -2``: the value can be a scalar or an array with any number of dimensions
- * - ``n = -3``: the value can be a scalar or a one dimensional array
- *
- * Consistency between the value rank attribute in the variable and its
- * :ref:`variabletypenode` is ensured.
- *
- * Array Dimensions
- * ^^^^^^^^^^^^^^^^
- *
- * If the value rank permits the value to be a (multi-dimensional) array, the
- * exact length in each dimensions can be further constrained with this
- * attribute.
- *
- * - For positive lengths, the variable value is guaranteed to be of the same
- *   length in this dimension.
- * - The dimension length zero is a wildcard and the actual value may have any
- *   length in this dimension.
- *
- * Consistency between the array dimensions attribute in the variable and its
- * :ref:`variabletypenode` is ensured. */
-
-/* Indicates whether a variable contains data inline or whether it points to an
- * external data source */
-typedef enum {
-    UA_VALUESOURCE_DATA,
-    UA_VALUESOURCE_DATASOURCE
-} UA_ValueSource;
-
-#define UA_NODE_VARIABLEATTRIBUTES                                      \
-    /* Constraints on possible values */                                \
-    UA_NodeId dataType;                                                 \
-    UA_Int32 valueRank;                                                 \
-    size_t arrayDimensionsSize;                                         \
-    UA_UInt32 *arrayDimensions;                                         \
-                                                                        \
-    /* The current value */                                             \
-    UA_ValueSource valueSource;                                         \
-    union {                                                             \
-        struct {                                                        \
-            UA_DataValue value;                                         \
-            UA_ValueCallback callback;                                  \
-        } data;                                                         \
-        UA_DataSource dataSource;                                       \
-    } value;
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_NODE_VARIABLEATTRIBUTES
-    UA_Byte accessLevel;
-    UA_Double minimumSamplingInterval;
-    UA_Boolean historizing;
-} UA_VariableNode;
-
-/**
- * .. _variabletypenode:
- *
- * VariableTypeNode
- * ----------------
- *
- * VariableTypes are used to provide type definitions for variables.
- * VariableTypes constrain the data type, value rank and array dimensions
- * attributes of variable instances. Furthermore, instantiating from a specific
- * variable type may provide semantic information. For example, an instance from
- * ``MotorTemperatureVariableType`` is more meaningful than a float variable
- * instantiated from ``BaseDataVariable``. */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_NODE_VARIABLEATTRIBUTES
-    UA_Boolean isAbstract;
-
-    /* Members specific to open62541 */
-    UA_NodeTypeLifecycle lifecycle;
-} UA_VariableTypeNode;
-
-/**
- * .. _methodnode:
- *
- * MethodNode
- * ----------
- *
- * Methods define callable functions and are invoked using the :ref:`Call
- * <method-services>` service. MethodNodes may have special properties (variable
- * childen with a ``hasProperty`` reference) with the :ref:`qualifiedname` ``(0,
- * "InputArguments")`` and ``(0, "OutputArguments")``. The input and output
- * arguments are both described via an array of ``UA_Argument``. While the Call
- * service uses a generic array of :ref:`variant` for input and output, the
- * actual argument values are checked to match the signature of the MethodNode.
- *
- * Note that the same MethodNode may be referenced from several objects (and
- * object types). For this, the NodeId of the method *and of the object
- * providing context* is part of a Call request message. */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_Boolean executable;
-
-    /* Members specific to open62541 */
-    UA_MethodCallback method;
-} UA_MethodNode;
-
-/**
- * ObjectNode
- * ----------
- *
- * Objects are used to represent systems, system components, real-world objects
- * and software objects. Objects are instances of an :ref:`object
- * type<objecttypenode>` and may contain variables, methods and further
- * objects. */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    struct UA_MonitoredItem *monitoredItemQueue;
-#endif
-    UA_Byte eventNotifier;
-} UA_ObjectNode;
-
-/**
- * .. _objecttypenode:
- *
- * ObjectTypeNode
- * --------------
- *
- * ObjectTypes provide definitions for Objects. Abstract objects cannot be
- * instantiated. See :ref:`node-lifecycle` for the use of constructor and
- * destructor callbacks. */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_Boolean isAbstract;
-
-    /* Members specific to open62541 */
-    UA_NodeTypeLifecycle lifecycle;
-} UA_ObjectTypeNode;
-
-/**
- * .. _referencetypenode:
- *
- * ReferenceTypeNode
- * -----------------
- *
- * Each reference between two nodes is typed with a ReferenceType that gives
- * meaning to the relation. The OPC UA standard defines a set of ReferenceTypes
- * as a mandatory part of OPC UA information models.
- *
- * - Abstract ReferenceTypes cannot be used in actual references and are only
- *   used to structure the ReferenceTypes hierarchy
- * - Symmetric references have the same meaning from the perspective of the
- *   source and target node
- *
- * The figure below shows the hierarchy of the standard ReferenceTypes (arrows
- * indicate a ``hasSubType`` relation). Refer to Part 3 of the OPC UA
- * specification for the full semantics of each ReferenceType.
- *
- * .. graphviz::
- *
- *    digraph tree {
- *
- *    node [height=0, shape=box, fillcolor="#E5E5E5", concentrate=true]
- *
- *    references [label="References\n(Abstract, Symmetric)"]
- *    hierarchical_references [label="HierarchicalReferences\n(Abstract)"]
- *    references -> hierarchical_references
- *
- *    nonhierarchical_references [label="NonHierarchicalReferences\n(Abstract, Symmetric)"]
- *    references -> nonhierarchical_references
- *
- *    haschild [label="HasChild\n(Abstract)"]
- *    hierarchical_references -> haschild
- *
- *    aggregates [label="Aggregates\n(Abstract)"]
- *    haschild -> aggregates
- *
- *    organizes [label="Organizes"]
- *    hierarchical_references -> organizes
- *
- *    hascomponent [label="HasComponent"]
- *    aggregates -> hascomponent
- *
- *    hasorderedcomponent [label="HasOrderedComponent"]
- *    hascomponent -> hasorderedcomponent
- *
- *    hasproperty [label="HasProperty"]
- *    aggregates -> hasproperty
- *
- *    hassubtype [label="HasSubtype"]
- *    haschild -> hassubtype
- *
- *    hasmodellingrule [label="HasModellingRule"]
- *    nonhierarchical_references -> hasmodellingrule
- *
- *    hastypedefinition [label="HasTypeDefinition"]
- *    nonhierarchical_references -> hastypedefinition
- *
- *    hasencoding [label="HasEncoding"]
- *    nonhierarchical_references -> hasencoding
- *
- *    hasdescription [label="HasDescription"]
- *    nonhierarchical_references -> hasdescription
- *
- *    haseventsource [label="HasEventSource"]
- *    hierarchical_references -> haseventsource
- *
- *    hasnotifier [label="HasNotifier"]
- *    hierarchical_references -> hasnotifier
- *
- *    generatesevent [label="GeneratesEvent"]
- *    nonhierarchical_references -> generatesevent
- *
- *    alwaysgeneratesevent [label="AlwaysGeneratesEvent"]
- *    generatesevent -> alwaysgeneratesevent
- *
- *    {rank=same hierarchical_references nonhierarchical_references}
- *    {rank=same generatesevent haseventsource hasmodellingrule
- *               hasencoding hassubtype}
- *    {rank=same alwaysgeneratesevent hasproperty}
- *
- *    }
- *
- * The ReferenceType hierarchy can be extended with user-defined ReferenceTypes.
- * Many Companion Specifications for OPC UA define new ReferenceTypes to be used
- * in their domain of interest.
- *
- * For the following example of custom ReferenceTypes, we attempt to model the
- * structure of a technical system. For this, we introduce two custom
- * ReferenceTypes. First, the hierarchical ``contains`` ReferenceType indicates
- * that a system (represented by an OPC UA object) contains a component (or
- * subsystem). This gives rise to a tree-structure of containment relations. For
- * example, the motor (object) is contained in the car and the crankshaft is
- * contained in the motor. Second, the symmetric ``connectedTo`` ReferenceType
- * indicates that two components are connected. For example, the motor's
- * crankshaft is connected to the gear box. Connections are independent of the
- * containment hierarchy and can induce a general graph-structure. Further
- * subtypes of ``connectedTo`` could be used to differentiate between physical,
- * electrical and information related connections. A client can then learn the
- * layout of a (physical) system represented in an OPC UA information model
- * based on a common understanding of just two custom reference types. */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_Boolean isAbstract;
-    UA_Boolean symmetric;
-    UA_LocalizedText inverseName;
-} UA_ReferenceTypeNode;
-
-/**
- * .. _datatypenode:
- *
- * DataTypeNode
- * ------------
- *
- * DataTypes represent simple and structured data types. DataTypes may contain
- * arrays. But they always describe the structure of a single instance. In
- * open62541, DataTypeNodes in the information model hierarchy are matched to
- * ``UA_DataType`` type descriptions for :ref:`generic-types` via their NodeId.
- *
- * Abstract DataTypes (e.g. ``Number``) cannot be the type of actual values.
- * They are used to constrain values to possible child DataTypes (e.g.
- * ``UInt32``). */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_Boolean isAbstract;
-} UA_DataTypeNode;
-
-/**
- * ViewNode
- * --------
- *
- * Each View defines a subset of the Nodes in the AddressSpace. Views can be
- * used when browsing an information model to focus on a subset of nodes and
- * references only. ViewNodes can be created and be interacted with. But their
- * use in the :ref:`Browse<view-services>` service is currently unsupported in
- * open62541. */
-
-typedef struct {
-    UA_NODE_BASEATTRIBUTES
-    UA_Byte eventNotifier;
-    UA_Boolean containsNoLoops;
-} UA_ViewNode;
-
-/**
- * Nodestore Plugin API
- * ====================
- *
- * The following definitions are used for implementing custom node storage
- * backends. **Most users will want to use the default nodestore and don't need
- * to work with the nodestore API**.
- *
- * Outside of custom nodestore implementations, users should not manually edit
- * nodes. Please use the OPC UA services for that. Otherwise, all consistency
- * checks are omitted. This can crash the application eventually. */
-
-/* For non-multithreaded access, some nodestores allow that nodes are edited
- * without a copy/replace. This is not possible when the node is only an
- * intermediate representation and stored e.g. in a database backend. */
-extern const UA_Boolean inPlaceEditAllowed;
-
-/* Nodestore context and lifecycle */
-UA_StatusCode UA_Nodestore_new(void **nsCtx);
-void UA_Nodestore_delete(void *nsCtx);
-
-/**
- * The following definitions are used to create empty nodes of the different
- * node types. The memory is managed by the nodestore. Therefore, the node has
- * to be removed via a special deleteNode function. (If the new node is not
- * added to the nodestore.) */
-
-UA_Node *
-UA_Nodestore_newNode(void *nsCtx, UA_NodeClass nodeClass);
-
-void
-UA_Nodestore_deleteNode(void *nsCtx, UA_Node *node);
-
-/**
- *``Get`` returns a pointer to an immutable node. ``Release`` indicates that the
- * pointer is no longer accessed afterwards. */
-
-const UA_Node *
-UA_Nodestore_getNode(void *nsCtx, const UA_NodeId *nodeId);
-
-void
-UA_Nodestore_releaseNode(void *nsCtx, const UA_Node *node);
-
-/* Returns an editable copy of a node (needs to be deleted with the
- * deleteNode function or inserted / replaced into the nodestore). */
-UA_StatusCode
-UA_Nodestore_getNodeCopy(void *nsCtx, const UA_NodeId *nodeId,
-                         UA_Node **outNode);
-
-/* Inserts a new node into the nodestore. If the NodeId is zero, then a fresh
- * numeric NodeId is assigned. If insertion fails, the node is deleted. */
-UA_StatusCode
-UA_Nodestore_insertNode(void *nsCtx, UA_Node *node, UA_NodeId *addedNodeId);
-
-/* To replace a node, get an editable copy of the node, edit and replace with
- * this function. If the node was already replaced since the copy was made,
- * UA_STATUSCODE_BADINTERNALERROR is returned. If the NodeId is not found,
- * UA_STATUSCODE_BADNODEIDUNKNOWN is returned. In both error cases, the editable
- * node is deleted. */
-UA_StatusCode
-UA_Nodestore_replaceNode(void *nsCtx, UA_Node *node);
-
-/* Removes a node from the nodestore. */
-UA_StatusCode
-UA_Nodestore_removeNode(void *nsCtx, const UA_NodeId *nodeId);
-
-/* Execute a callback for every node in the nodestore. */
-typedef void (*UA_NodestoreVisitor)(void *visitorCtx, const UA_Node *node);
-void
-UA_Nodestore_iterate(void *nsCtx, UA_NodestoreVisitor visitor,
-                     void *visitorCtx);
-
-/**
- * Node Handling
- * =============
- *
- * To be used only in the nodestore and internally in the SDK. The following
- * methods specialize internally for the different node classes, distinguished
- * by the NodeClass attribute. */
-
-/* Attributes must be of a matching type (VariableAttributes, ObjectAttributes,
- * and so on). The attributes are copied. Note that the attributes structs do
- * not contain NodeId, NodeClass and BrowseName. The NodeClass of the node needs
- * to be correctly set before calling this method. UA_Node_deleteMembers is
- * called on the node when an error occurs internally. */
-UA_StatusCode UA_EXPORT
-UA_Node_setAttributes(UA_Node *node, const void *attributes,
-                      const UA_DataType *attributeType);
-
-/* Reset the destination node and copy the content of the source */
-UA_StatusCode UA_EXPORT
-UA_Node_copy(const UA_Node *src, UA_Node *dst);
-
-/* Allocate new node and copy the values from src */
-UA_EXPORT UA_Node *
-UA_Node_copy_alloc(const UA_Node *src);
-
-/* Add a single reference to the node */
-UA_StatusCode UA_EXPORT
-UA_Node_addReference(UA_Node *node, const UA_AddReferencesItem *item);
-
-/* Delete a single reference from the node */
-UA_StatusCode UA_EXPORT
-UA_Node_deleteReference(UA_Node *node, const UA_DeleteReferencesItem *item);
-
-/* Delete all references of the node */
-void UA_EXPORT
-UA_Node_deleteReferences(UA_Node *node);
-
-/* Remove all malloc'ed members of the node */
-void UA_EXPORT
-UA_Node_deleteMembers(UA_Node *node);
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_NODES_H_ */
diff --git a/ext/open62541/include/open62541/plugin/pki.h b/ext/open62541/include/open62541/plugin/pki.h
deleted file mode 100644
index ef836e1..0000000
--- a/ext/open62541/include/open62541/plugin/pki.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#ifndef UA_PLUGIN_PKI_H_
-#define UA_PLUGIN_PKI_H_
-
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Public Key Infrastructure Integration
- * =====================================
- * This file contains interface definitions for integration in a Public Key
- * Infrastructure (PKI). Currently only one plugin interface is defined.
- *
- * Certificate Verification
- * ------------------------
- * This plugin verifies that the origin of the certificate is trusted. It does
- * not assign any access rights/roles to the holder of the certificate.
- *
- * Usually, implementations of the certificate verification plugin provide an
- * initialization method that takes a trust-list and a revocation-list as input.
- * The lifecycle of the plugin is attached to a server or client config. The
- * ``deleteMembers`` method is called automatically when the config is
- * destroyed. */
-
-struct UA_CertificateVerification;
-typedef struct UA_CertificateVerification UA_CertificateVerification;
-
-struct UA_CertificateVerification {
-    void *context;
-
-    /* Verify the certificate against the configured policies and trust chain. */
-    UA_StatusCode (*verifyCertificate)(void *verificationContext,
-                                       const UA_ByteString *certificate);
-
-    /* Verify that the certificate has the applicationURI in the subject name. */
-    UA_StatusCode (*verifyApplicationURI)(void *verificationContext,
-                                          const UA_ByteString *certificate,
-                                          const UA_String *applicationURI);
-
-    /* Delete the certificate verification context */
-    void (*deleteMembers)(UA_CertificateVerification *cv);
-};
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_PKI_H_ */
diff --git a/ext/open62541/include/open62541/plugin/pubsub.h b/ext/open62541/include/open62541/plugin/pubsub.h
deleted file mode 100644
index 80d996b..0000000
--- a/ext/open62541/include/open62541/plugin/pubsub.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#ifndef UA_PLUGIN_PUBSUB_H_
-#define UA_PLUGIN_PUBSUB_H_
-
-#include <open62541/server_pubsub.h>
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_PUBSUB
-
-/**
- * .. _pubsub_connection:
- *
- * PubSub Connection Plugin API
- * ============================
- *
- * The PubSub Connection API is the interface between concrete network
- * implementations and the internal pubsub code.
- *
- * The PubSub specification enables the creation of new connections on runtime.
- * Wording: 'Connection' -> OPC UA standard 'highlevel' perspective, 'Channel'
- * -> open62541 implementation 'lowlevel' perspective. A channel can be assigned
- * with different network implementations like UDP, MQTT, AMQP. The channel
- * provides basis services like send, regist, unregist, receive, close. */
-
-typedef enum {
-    UA_PUBSUB_CHANNEL_RDY,
-    UA_PUBSUB_CHANNEL_PUB,
-    UA_PUBSUB_CHANNEL_SUB,
-    UA_PUBSUB_CHANNEL_PUB_SUB,
-    UA_PUBSUB_CHANNEL_ERROR,
-    UA_PUBSUB_CHANNEL_CLOSED
-} UA_PubSubChannelState;
-
-struct UA_PubSubChannel;
-typedef struct UA_PubSubChannel UA_PubSubChannel;
-
-/* Interface structure between network plugin and internal implementation */
-struct UA_PubSubChannel {
-    UA_UInt32 publisherId; /* unique identifier */
-    UA_PubSubChannelState state;
-    UA_PubSubConnectionConfig *connectionConfig; /* link to parent connection config */
-    UA_SOCKET sockfd;
-    void *handle; /* implementation specific data */
-    /*@info for handle: each network implementation should provide an structure
-    * UA_PubSubChannelData[ImplementationName] This structure can be used by the
-    * network implementation to store network implementation specific data.*/
-
-    /* Sending out the content of the buf parameter */
-    UA_StatusCode (*send)(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettings,
-                          const UA_ByteString *buf);
-
-    /* Register to an specified message source, e.g. multicast group or topic. Callback is used for mqtt. */
-    UA_StatusCode (*regist)(UA_PubSubChannel * channel, UA_ExtensionObject *transportSettings,
-        void (*callback)(UA_ByteString *encodedBuffer, UA_ByteString *topic));
-
-    /* Remove subscription to an specified message source, e.g. multicast group or topic */
-    UA_StatusCode (*unregist)(UA_PubSubChannel * channel, UA_ExtensionObject *transportSettings);
-
-    /* Receive messages. A regist to the message source is needed before. */
-    UA_StatusCode (*receive)(UA_PubSubChannel * channel, UA_ByteString *,
-                             UA_ExtensionObject *transportSettings, UA_UInt32 timeout);
-
-    /* Closing the connection and implicit free of the channel structures. */
-    UA_StatusCode (*close)(UA_PubSubChannel *channel);
-
-    /* Giving the connection protocoll time to process inbound and outbound traffic. */
-    UA_StatusCode (*yield)(UA_PubSubChannel *channel, UA_UInt16 timeout);
-};
-
-/**
- * The UA_PubSubTransportLayer is used for the creation of new connections.
- * Whenever on runtime a new connection is request, the internal PubSub
- * implementation call * the 'createPubSubChannel' function. The
- * 'transportProfileUri' contains the standard defined transport profile
- * information and is used to identify the type of connections which can be
- * created by the TransportLayer. The server config contains a list of
- * UA_PubSubTransportLayer. Take a look in the tutorial_pubsub_connection to get
- * informations about the TransportLayer handling. */
-
-typedef struct {
-    UA_String transportProfileUri;
-    UA_PubSubChannel *(*createPubSubChannel)(UA_PubSubConnectionConfig *connectionConfig);
-} UA_PubSubTransportLayer;
-
-/**
- * The UA_ServerConfig_addPubSubTransportLayer is used to add a transport layer
- * to the server configuration. The list memory is allocated and will be freed
- * with UA_PubSubManager_delete.
- *
- * .. note:: If the UA_String transportProfileUri was dynamically allocated
- *           the memory has to be freed when no longer required.
- *
- * .. note:: This has to be done before the server is started with UA_Server_run. */
-UA_StatusCode UA_EXPORT
-UA_ServerConfig_addPubSubTransportLayer(UA_ServerConfig *config,
-                                        UA_PubSubTransportLayer *pubsubTransportLayer);
-
-#endif /* UA_ENABLE_PUBSUB */
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_PUBSUB_H_ */
diff --git a/ext/open62541/include/open62541/plugin/securitypolicy.h b/ext/open62541/include/open62541/plugin/securitypolicy.h
deleted file mode 100644
index 9f0d26c..0000000
--- a/ext/open62541/include/open62541/plugin/securitypolicy.h
+++ /dev/null
@@ -1,390 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_PLUGIN_SECURITYPOLICY_H_
-#define UA_PLUGIN_SECURITYPOLICY_H_
-
-#include <open62541/plugin/log.h>
-#include <open62541/plugin/pki.h>
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-extern UA_EXPORT const UA_ByteString UA_SECURITY_POLICY_NONE_URI;
-
-struct UA_SecurityPolicy;
-typedef struct UA_SecurityPolicy UA_SecurityPolicy;
-
-/**
- * SecurityPolicy Interface Definition
- * ----------------------------------- */
-
-typedef struct {
-    UA_String uri;
-
-    /* Verifies the signature of the message using the provided keys in the context.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the channelContext that contains the key to verify
-     *                       the supplied message with.
-     * @param message the message to which the signature is supposed to belong.
-     * @param signature the signature of the message, that should be verified. */
-    UA_StatusCode (*verify)(const UA_SecurityPolicy *securityPolicy,
-                            void *channelContext, const UA_ByteString *message,
-                            const UA_ByteString *signature) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Signs the given message using this policys signing algorithm and the
-     * provided keys in the context.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the channelContext that contains the key to sign
-     *                       the supplied message with.
-     * @param message the message to sign.
-     * @param signature an output buffer to which the signature is written. The
-     *                  buffer needs to be allocated by the caller. The
-     *                  necessary size can be acquired with the signatureSize
-     *                  attribute of this module. */
-    UA_StatusCode (*sign)(const UA_SecurityPolicy *securityPolicy,
-                          void *channelContext, const UA_ByteString *message,
-                          UA_ByteString *signature) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Gets the signature size that depends on the local (private) key.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the channelContext that contains the
-     *                       certificate/key.
-     * @return the size of the local signature. Returns 0 if no local
-     *         certificate was set. */
-    size_t (*getLocalSignatureSize)(const UA_SecurityPolicy *securityPolicy,
-                                    const void *channelContext);
-
-    /* Gets the signature size that depends on the remote (public) key.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the size of the remote signature. Returns 0 if no
-     *         remote certificate was set previousely. */
-    size_t (*getRemoteSignatureSize)(const UA_SecurityPolicy *securityPolicy,
-                                     const void *channelContext);
-
-    /* Gets the local signing key length.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the length of the signing key in bytes. Returns 0 if no length can be found.
-     */
-    size_t (*getLocalKeyLength)(const UA_SecurityPolicy *securityPolicy,
-                                const void *channelContext);
-
-    /* Gets the local signing key length.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the length of the signing key in bytes. Returns 0 if no length can be found.
-     */
-    size_t (*getRemoteKeyLength)(const UA_SecurityPolicy *securityPolicy,
-                                 const void *channelContext);
-} UA_SecurityPolicySignatureAlgorithm;
-
-typedef struct {
-    UA_String uri;
-
-    /* Encrypt the given data in place using an asymmetric algorithm and keys.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the channelContext which contains information about
-     *                       the keys to encrypt data.
-     * @param data the data that is encrypted. The encrypted data will overwrite
-     *             the data that was supplied. */
-    UA_StatusCode (*encrypt)(const UA_SecurityPolicy *securityPolicy,
-                             void *channelContext,
-                             UA_ByteString *data) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Decrypts the given ciphertext in place using an asymmetric algorithm and
-     * key.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the channelContext which contains information about
-     *                       the keys needed to decrypt the message.
-     * @param data the data to decrypt. The decryption is done in place. */
-    UA_StatusCode (*decrypt)(const UA_SecurityPolicy *securityPolicy,
-                             void *channelContext,
-                             UA_ByteString *data) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Returns the length of the key used locally to encrypt messages in bits
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the length of the local key. Returns 0 if no
-     *         key length is known. */
-    size_t (*getLocalKeyLength)(const UA_SecurityPolicy *securityPolicy,
-                                const void *channelContext);
-
-    /* Returns the length of the key used remotely to encrypt messages in bits
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the length of the remote key. Returns 0 if no
-     *         key length is known. */
-    size_t (*getRemoteKeyLength)(const UA_SecurityPolicy *securityPolicy,
-                                 const void *channelContext);
-
-    /* Returns the size of encrypted blocks used by the local encryption algorithm.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the size of encrypted blocks in bytes. Returns 0 if no key length is known.
-     */
-    size_t (*getLocalBlockSize)(const UA_SecurityPolicy *securityPolicy,
-                                const void *channelContext);
-
-    /* Returns the size of encrypted blocks used by the remote encryption algorithm.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the size of encrypted blocks in bytes. Returns 0 if no key length is known.
-     */
-    size_t (*getRemoteBlockSize)(const UA_SecurityPolicy *securityPolicy,
-                                 const void *channelContext);
-
-    /* Returns the size of plaintext blocks used by the local encryption algorithm.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the size of plaintext blocks in bytes. Returns 0 if no key length is known.
-     */
-    size_t (*getLocalPlainTextBlockSize)(const UA_SecurityPolicy *securityPolicy,
-                                         const void *channelContext);
-
-    /* Returns the size of plaintext blocks used by the remote encryption algorithm.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param channelContext the context to retrieve data from.
-     * @return the size of plaintext blocks in bytes. Returns 0 if no key length is known.
-     */
-    size_t (*getRemotePlainTextBlockSize)(const UA_SecurityPolicy *securityPolicy,
-                                          const void *channelContext);
-} UA_SecurityPolicyEncryptionAlgorithm;
-
-typedef struct {
-    /* The algorithm used to sign and verify certificates. */
-    UA_SecurityPolicySignatureAlgorithm signatureAlgorithm;
-
-    /* The algorithm used to encrypt and decrypt messages. */
-    UA_SecurityPolicyEncryptionAlgorithm encryptionAlgorithm;
-
-} UA_SecurityPolicyCryptoModule;
-
-typedef struct {
-    /* Generates a thumbprint for the specified certificate.
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param certificate the certificate to make a thumbprint of.
-     * @param thumbprint an output buffer for the resulting thumbprint. Always
-     *                   has the length specified in the thumbprintLength in the
-     *                   asymmetricModule. */
-    UA_StatusCode (*makeCertificateThumbprint)(const UA_SecurityPolicy *securityPolicy,
-                                               const UA_ByteString *certificate,
-                                               UA_ByteString *thumbprint)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Compares the supplied certificate with the certificate in the endpoit context.
-     *
-     * @param securityPolicy the policy data that contains the certificate
-     *                       to compare to.
-     * @param certificateThumbprint the certificate thumbprint to compare to the
-     *                              one stored in the context.
-     * @return if the thumbprints match UA_STATUSCODE_GOOD is returned. If they
-     *         don't match or an error occurred an error code is returned. */
-    UA_StatusCode (*compareCertificateThumbprint)(const UA_SecurityPolicy *securityPolicy,
-                                                  const UA_ByteString *certificateThumbprint)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    UA_SecurityPolicyCryptoModule cryptoModule;
-} UA_SecurityPolicyAsymmetricModule;
-
-typedef struct {
-    /* Pseudo random function that is used to generate the symmetric keys.
-     *
-     * For information on what parameters this function receives in what situation,
-     * refer to the OPC UA specification 1.03 Part6 Table 33
-     *
-     * @param securityPolicy the securityPolicy the function is invoked on.
-     * @param secret
-     * @param seed
-     * @param out an output to write the data to. The length defines the maximum
-     *            number of output bytes that are produced. */
-    UA_StatusCode (*generateKey)(const UA_SecurityPolicy *securityPolicy,
-                                 const UA_ByteString *secret,
-                                 const UA_ByteString *seed, UA_ByteString *out)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Random generator for generating nonces.
-     *
-     * @param securityPolicy the securityPolicy this function is invoked on.
-     *                       Example: myPolicy->generateNonce(myPolicy,
-     *                       &outBuff);
-     * @param out pointer to a buffer to store the nonce in. Needs to be
-     *            allocated by the caller. The buffer is filled with random
-     *            data. */
-    UA_StatusCode (*generateNonce)(const UA_SecurityPolicy *securityPolicy,
-                                   UA_ByteString *out)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /*
-     * The length of the nonce used in the SecureChannel as specified in the standard.
-     */
-    size_t secureChannelNonceLength;
-
-    UA_SecurityPolicyCryptoModule cryptoModule;
-} UA_SecurityPolicySymmetricModule;
-
-typedef struct {
-    /* This method creates a new context data object.
-     *
-     * The caller needs to call delete on the received object to free allocated
-     * memory. Memory is only allocated if the function succeeds so there is no
-     * need to manually free the memory pointed to by *channelContext or to
-     * call delete in case of failure.
-     *
-     * @param securityPolicy the policy context of the endpoint that is connected
-     *                       to. It will be stored in the channelContext for
-     *                       further access by the policy.
-     * @param remoteCertificate the remote certificate contains the remote
-     *                          asymmetric key. The certificate will be verified
-     *                          and then stored in the context so that its
-     *                          details may be accessed.
-     * @param channelContext the initialized channelContext that is passed to
-     *                       functions that work on a context. */
-    UA_StatusCode (*newContext)(const UA_SecurityPolicy *securityPolicy,
-                                const UA_ByteString *remoteCertificate,
-                                void **channelContext)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Deletes the the security context. */
-    void (*deleteContext)(void *channelContext);
-
-    /* Sets the local encrypting key in the supplied context.
-     *
-     * @param channelContext the context to work on.
-     * @param key the local encrypting key to store in the context. */
-    UA_StatusCode (*setLocalSymEncryptingKey)(void *channelContext,
-                                              const UA_ByteString *key)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Sets the local signing key in the supplied context.
-     *
-     * @param channelContext the context to work on.
-     * @param key the local signing key to store in the context. */
-    UA_StatusCode (*setLocalSymSigningKey)(void *channelContext,
-                                           const UA_ByteString *key)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Sets the local initialization vector in the supplied context.
-     *
-     * @param channelContext the context to work on.
-     * @param iv the local initialization vector to store in the context. */
-    UA_StatusCode (*setLocalSymIv)(void *channelContext,
-                                   const UA_ByteString *iv)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Sets the remote encrypting key in the supplied context.
-     *
-     * @param channelContext the context to work on.
-     * @param key the remote encrypting key to store in the context. */
-    UA_StatusCode (*setRemoteSymEncryptingKey)(void *channelContext,
-                                               const UA_ByteString *key)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Sets the remote signing key in the supplied context.
-     *
-     * @param channelContext the context to work on.
-     * @param key the remote signing key to store in the context. */
-    UA_StatusCode (*setRemoteSymSigningKey)(void *channelContext,
-                                            const UA_ByteString *key)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Sets the remote initialization vector in the supplied context.
-     *
-     * @param channelContext the context to work on.
-     * @param iv the remote initialization vector to store in the context. */
-    UA_StatusCode (*setRemoteSymIv)(void *channelContext,
-                                    const UA_ByteString *iv)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-    /* Compares the supplied certificate with the certificate in the channel
-     * context.
-     *
-     * @param channelContext the channel context data that contains the
-     *                       certificate to compare to.
-     * @param certificate the certificate to compare to the one stored in the context.
-     * @return if the certificates match UA_STATUSCODE_GOOD is returned. If they
-     *         don't match or an errror occurred an error code is returned. */
-    UA_StatusCode (*compareCertificate)(const void *channelContext,
-                                        const UA_ByteString *certificate)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-} UA_SecurityPolicyChannelModule;
-
-struct UA_SecurityPolicy {
-    /* Additional data */
-    void *policyContext;
-
-    /* The policy uri that identifies the implemented algorithms */
-    UA_ByteString policyUri;
-
-    /* The local certificate is specific for each SecurityPolicy since it
-     * depends on the used key length. */
-    UA_ByteString localCertificate;
-
-    /* Function pointers grouped into modules */
-    UA_SecurityPolicyAsymmetricModule asymmetricModule;
-    UA_SecurityPolicySymmetricModule symmetricModule;
-    UA_SecurityPolicySignatureAlgorithm certificateSigningAlgorithm;
-    UA_SecurityPolicyChannelModule channelModule;
-    UA_CertificateVerification *certificateVerification;
-
-    const UA_Logger *logger;
-
-    /* Updates the ApplicationInstanceCertificate and the corresponding private
-     * key at runtime. */
-    UA_StatusCode (*updateCertificateAndPrivateKey)(UA_SecurityPolicy *policy,
-                                                    const UA_ByteString newCertificate,
-                                                    const UA_ByteString newPrivateKey);
-
-    /* Deletes the dynamic content of the policy */
-    void (*deleteMembers)(UA_SecurityPolicy *policy);
-};
-
-/* Gets the number of bytes that are needed by the encryption function in
- * addition to the length of the plaintext message. This is needed, since
- * most RSA encryption methods have their own padding mechanism included.
- * This makes the encrypted message larger than the plainText, so we need to
- * have enough room in the buffer for the overhead.
- *
- * @param securityPolicy the algorithms to use.
- * @param channelContext the retrieve data from.
- * @param maxEncryptionLength the maximum number of bytes that the data to
- *                            encrypt can be. */
-size_t
-UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityPolicy *securityPolicy,
-                                                              const void *channelContext,
-                                                              size_t maxEncryptionLength);
-
-/* Gets the a pointer to the context of a security policy supported by the
- * server matched by the security policy uri.
- *
- * @param server the server context.
- * @param securityPolicyUri the security policy to get the context of. */
-UA_SecurityPolicy *
-UA_SecurityPolicy_getSecurityPolicyByUri(const UA_Server *server,
-                                         const UA_ByteString *securityPolicyUri);
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_SECURITYPOLICY_H_ */
diff --git a/ext/open62541/include/open62541/server.h b/ext/open62541/include/open62541/server.h
deleted file mode 100644
index 340ddeb..0000000
--- a/ext/open62541/include/open62541/server.h
+++ /dev/null
@@ -1,1373 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2014-2015, 2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_SERVER_H_
-#define UA_SERVER_H_
-
-#include <open62541/nodeids.h>
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-
-_UA_BEGIN_DECLS
-
-/* Forward declarations */
-struct UA_ServerConfig;
-typedef struct UA_ServerConfig UA_ServerConfig;
-
-struct UA_Server;
-typedef struct UA_Server UA_Server;
-
-struct UA_Client;
-
-/**
- * .. _server:
- *
- * Server
- * ======
- *
- * .. include:: server_config.rst
- *
- * .. _server-lifecycle:
- *
- * Server Lifecycle
- * ---------------- */
-
-UA_Server UA_EXPORT * UA_Server_new(void);
-
-/* Makes a (shallow) copy of the config into the server object.
- * The config content is cleared together with the server. */
-UA_Server UA_EXPORT *
-UA_Server_newWithConfig(const UA_ServerConfig *config);
-
-void UA_EXPORT UA_Server_delete(UA_Server *server);
-
-UA_ServerConfig UA_EXPORT *
-UA_Server_getConfig(UA_Server *server);
-
-/* Runs the main loop of the server. In each iteration, this calls into the
- * networklayers to see if messages have arrived.
- *
- * @param server The server object.
- * @param running The loop is run as long as *running is true.
- *        Otherwise, the server shuts down.
- * @return Returns the statuscode of the UA_Server_run_shutdown method */
-UA_StatusCode UA_EXPORT
-UA_Server_run(UA_Server *server, const volatile UA_Boolean *running);
-
-/* The prologue part of UA_Server_run (no need to use if you call
- * UA_Server_run) */
-UA_StatusCode UA_EXPORT
-UA_Server_run_startup(UA_Server *server);
-
-/* Executes a single iteration of the server's main loop.
- *
- * @param server The server object.
- * @param waitInternal Should we wait for messages in the networklayer?
- *        Otherwise, the timouts for the networklayers are set to zero.
- *        The default max wait time is 50millisec.
- * @return Returns how long we can wait until the next scheduled
- *         callback (in ms) */
-UA_UInt16 UA_EXPORT
-UA_Server_run_iterate(UA_Server *server, UA_Boolean waitInternal);
-
-/* The epilogue part of UA_Server_run (no need to use if you call
- * UA_Server_run) */
-UA_StatusCode UA_EXPORT
-UA_Server_run_shutdown(UA_Server *server);
-
-/**
- * Timed Callbacks
- * --------------- */
-typedef void (*UA_ServerCallback)(UA_Server *server, void *data);
-
-/* Add a callback for execution at a specified time. If the indicated time lies
- * in the past, then the callback is executed at the next iteration of the
- * server's main loop.
- *
- * @param server The server object.
- * @param callback The callback that shall be added.
- * @param data Data that is forwarded to the callback.
- * @param date The timestamp for the execution time.
- * @param callbackId Set to the identifier of the repeated callback . This can
- *        be used to cancel the callback later on. If the pointer is null, the
- *        identifier is not set.
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code
- *         otherwise. */
-UA_StatusCode UA_EXPORT
-UA_Server_addTimedCallback(UA_Server *server, UA_ServerCallback callback,
-                           void *data, UA_DateTime date, UA_UInt64 *callbackId);
-
-/* Add a callback for cyclic repetition to the server.
- *
- * @param server The server object.
- * @param callback The callback that shall be added.
- * @param data Data that is forwarded to the callback.
- * @param interval_ms The callback shall be repeatedly executed with the given
- *        interval (in ms). The interval must be positive. The first execution
- *        occurs at now() + interval at the latest.
- * @param callbackId Set to the identifier of the repeated callback . This can
- *        be used to cancel the callback later on. If the pointer is null, the
- *        identifier is not set.
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code
- *         otherwise. */
-UA_StatusCode UA_EXPORT
-UA_Server_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback,
-                              void *data, UA_Double interval_ms, UA_UInt64 *callbackId);
-
-UA_StatusCode UA_EXPORT
-UA_Server_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId,
-                                         UA_Double interval_ms);
-
-/* Remove a repeated callback. Does nothing if the callback is not found.
- *
- * @param server The server object.
- * @param callbackId The id of the callback */
-void UA_EXPORT
-UA_Server_removeCallback(UA_Server *server, UA_UInt64 callbackId);
-
-#define UA_Server_removeRepeatedCallback(server, callbackId) \
-    UA_Server_removeCallback(server, callbackId);
-
-/**
- * Reading and Writing Node Attributes
- * -----------------------------------
- * The functions for reading and writing node attributes call the regular read
- * and write service in the background that are also used over the network.
- *
- * The following attributes cannot be read, since the local "admin" user always
- * has full rights.
- *
- * - UserWriteMask
- * - UserAccessLevel
- * - UserExecutable */
-/* Read an attribute of a node. The specialized functions below provide a more
- * concise syntax.
- *
- * @param server The server object.
- * @param item ReadValueIds contain the NodeId of the target node, the id of the
- *             attribute to read and (optionally) an index range to read parts
- *             of an array only. See the section on NumericRange for the format
- *             used for array ranges.
- * @param timestamps Which timestamps to return for the attribute.
- * @return Returns a DataValue that contains either an error code, or a variant
- *         with the attribute value and the timestamps. */
-UA_DataValue UA_EXPORT UA_THREADSAFE
-UA_Server_read(UA_Server *server, const UA_ReadValueId *item,
-               UA_TimestampsToReturn timestamps);
-
-/* Don't use this function. There are typed versions for every supported
- * attribute. */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-__UA_Server_read(UA_Server *server, const UA_NodeId *nodeId,
-                 UA_AttributeId attributeId, void *v);
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readNodeId(UA_Server *server, const UA_NodeId nodeId,
-                     UA_NodeId *outNodeId) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_NODEID, outNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readNodeClass(UA_Server *server, const UA_NodeId nodeId,
-                        UA_NodeClass *outNodeClass) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_NODECLASS,
-                            outNodeClass);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readBrowseName(UA_Server *server, const UA_NodeId nodeId,
-                         UA_QualifiedName *outBrowseName) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_BROWSENAME,
-                            outBrowseName);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readDisplayName(UA_Server *server, const UA_NodeId nodeId,
-                          UA_LocalizedText *outDisplayName) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME,
-                            outDisplayName);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readDescription(UA_Server *server, const UA_NodeId nodeId,
-                          UA_LocalizedText *outDescription) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_DESCRIPTION,
-                            outDescription);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readWriteMask(UA_Server *server, const UA_NodeId nodeId,
-                        UA_UInt32 *outWriteMask) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
-                            outWriteMask);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readIsAbstract(UA_Server *server, const UA_NodeId nodeId,
-                         UA_Boolean *outIsAbstract) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
-                            outIsAbstract);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readSymmetric(UA_Server *server, const UA_NodeId nodeId,
-                        UA_Boolean *outSymmetric) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_SYMMETRIC,
-                            outSymmetric);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readInverseName(UA_Server *server, const UA_NodeId nodeId,
-                          UA_LocalizedText *outInverseName) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_INVERSENAME,
-                            outInverseName);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readContainsNoLoop(UA_Server *server, const UA_NodeId nodeId,
-                             UA_Boolean *outContainsNoLoops) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS,
-                            outContainsNoLoops);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readEventNotifier(UA_Server *server, const UA_NodeId nodeId,
-                            UA_Byte *outEventNotifier) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER,
-                            outEventNotifier);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readValue(UA_Server *server, const UA_NodeId nodeId,
-                    UA_Variant *outValue) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_VALUE, outValue);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readDataType(UA_Server *server, const UA_NodeId nodeId,
-                       UA_NodeId *outDataType) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_DATATYPE,
-                            outDataType);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readValueRank(UA_Server *server, const UA_NodeId nodeId,
-                        UA_Int32 *outValueRank) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_VALUERANK,
-                            outValueRank);
-}
-
-/* Returns a variant with an int32 array */
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readArrayDimensions(UA_Server *server, const UA_NodeId nodeId,
-                              UA_Variant *outArrayDimensions) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_ARRAYDIMENSIONS,
-                            outArrayDimensions);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readAccessLevel(UA_Server *server, const UA_NodeId nodeId,
-                          UA_Byte *outAccessLevel) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
-                            outAccessLevel);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readMinimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId,
-                                      UA_Double *outMinimumSamplingInterval) {
-    return __UA_Server_read(server, &nodeId,
-                            UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
-                            outMinimumSamplingInterval);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readHistorizing(UA_Server *server, const UA_NodeId nodeId,
-                          UA_Boolean *outHistorizing) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_HISTORIZING,
-                            outHistorizing);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_readExecutable(UA_Server *server, const UA_NodeId nodeId,
-                         UA_Boolean *outExecutable) {
-    return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
-                            outExecutable);
-}
-
-/**
- * The following node attributes cannot be changed once a node has been created:
- *
- * - NodeClass
- * - NodeId
- * - Symmetric
- * - ContainsNoLoop
- *
- * The following attributes cannot be written from the server, as they are
- * specific to the different users and set by the access control callback:
- *
- * - UserWriteMask
- * - UserAccessLevel
- * - UserExecutable
- */
-
-/* Overwrite an attribute of a node. The specialized functions below provide a
- * more concise syntax.
- *
- * @param server The server object.
- * @param value WriteValues contain the NodeId of the target node, the id of the
- *              attribute to overwritten, the actual value and (optionally) an
- *              index range to replace parts of an array only. of an array only.
- *              See the section on NumericRange for the format used for array
- *              ranges.
- * @return Returns a status code. */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_write(UA_Server *server, const UA_WriteValue *value);
-
-/* Don't use this function. There are typed versions with no additional
- * overhead. */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-__UA_Server_write(UA_Server *server, const UA_NodeId *nodeId,
-                  const UA_AttributeId attributeId,
-                  const UA_DataType *attr_type, const void *attr);
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeBrowseName(UA_Server *server, const UA_NodeId nodeId,
-                          const UA_QualifiedName browseName) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_BROWSENAME,
-                             &UA_TYPES[UA_TYPES_QUALIFIEDNAME], &browseName);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeDisplayName(UA_Server *server, const UA_NodeId nodeId,
-                           const UA_LocalizedText displayName) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME,
-                             &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &displayName);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeDescription(UA_Server *server, const UA_NodeId nodeId,
-                           const UA_LocalizedText description) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_DESCRIPTION,
-                             &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &description);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeWriteMask(UA_Server *server, const UA_NodeId nodeId,
-                         const UA_UInt32 writeMask) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
-                             &UA_TYPES[UA_TYPES_UINT32], &writeMask);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeIsAbstract(UA_Server *server, const UA_NodeId nodeId,
-                          const UA_Boolean isAbstract) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
-                             &UA_TYPES[UA_TYPES_BOOLEAN], &isAbstract);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeInverseName(UA_Server *server, const UA_NodeId nodeId,
-                           const UA_LocalizedText inverseName) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_INVERSENAME,
-                             &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &inverseName);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeEventNotifier(UA_Server *server, const UA_NodeId nodeId,
-                             const UA_Byte eventNotifier) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER,
-                             &UA_TYPES[UA_TYPES_BYTE], &eventNotifier);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeValue(UA_Server *server, const UA_NodeId nodeId,
-                     const UA_Variant value) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_VALUE,
-                             &UA_TYPES[UA_TYPES_VARIANT], &value);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeDataType(UA_Server *server, const UA_NodeId nodeId,
-                        const UA_NodeId dataType) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_DATATYPE,
-                             &UA_TYPES[UA_TYPES_NODEID], &dataType);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeValueRank(UA_Server *server, const UA_NodeId nodeId,
-                         const UA_Int32 valueRank) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_VALUERANK,
-                             &UA_TYPES[UA_TYPES_INT32], &valueRank);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeArrayDimensions(UA_Server *server, const UA_NodeId nodeId,
-                               const UA_Variant arrayDimensions) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_ARRAYDIMENSIONS,
-                             &UA_TYPES[UA_TYPES_VARIANT], &arrayDimensions);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeAccessLevel(UA_Server *server, const UA_NodeId nodeId,
-                           const UA_Byte accessLevel) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
-                             &UA_TYPES[UA_TYPES_BYTE], &accessLevel);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeMinimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId,
-                                       const UA_Double miniumSamplingInterval) {
-    return __UA_Server_write(server, &nodeId,
-                             UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
-                             &UA_TYPES[UA_TYPES_DOUBLE],
-                             &miniumSamplingInterval);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeHistorizing(UA_Server *server, const UA_NodeId nodeId,
-                          const UA_Boolean historizing) {
-    return __UA_Server_write(server, &nodeId,
-                             UA_ATTRIBUTEID_HISTORIZING,
-                             &UA_TYPES[UA_TYPES_BOOLEAN],
-                             &historizing);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_writeExecutable(UA_Server *server, const UA_NodeId nodeId,
-                          const UA_Boolean executable) {
-    return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
-                             &UA_TYPES[UA_TYPES_BOOLEAN], &executable); }
-
-/**
- * Browsing
- * -------- */
-
-/* Browse the references of a particular node. See the definition of
- * BrowseDescription structure for details. */
-UA_BrowseResult UA_EXPORT
-UA_Server_browse(UA_Server *server, UA_UInt32 maxReferences,
-                 const UA_BrowseDescription *bd);
-
-UA_BrowseResult UA_EXPORT
-UA_Server_browseNext(UA_Server *server, UA_Boolean releaseContinuationPoint,
-                     const UA_ByteString *continuationPoint);
-
-/* Nonstandard version of the browse service that recurses into child nodes.
- * Possible loops (that can occur for non-hierarchical references) are handled
- * by adding every target node at most once to the results array. */
-UA_StatusCode UA_EXPORT
-UA_Server_browseRecursive(UA_Server *server, const UA_BrowseDescription *bd,
-                          size_t *resultsSize, UA_ExpandedNodeId **results);
-
-UA_BrowsePathResult UA_EXPORT UA_THREADSAFE
-UA_Server_translateBrowsePathToNodeIds(UA_Server *server,
-                                       const UA_BrowsePath *browsePath);
-
-/* A simplified TranslateBrowsePathsToNodeIds based on the
- * SimpleAttributeOperand type (Part 4, 7.4.4.5).
- *
- * This specifies a relative path using a list of BrowseNames instead of the
- * RelativePath structure. The list of BrowseNames is equivalent to a
- * RelativePath that specifies forward references which are subtypes of the
- * HierarchicalReferences ReferenceType. All Nodes followed by the browsePath
- * shall be of the NodeClass Object or Variable. */
-UA_BrowsePathResult UA_EXPORT
-UA_Server_browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin,
-                                     size_t browsePathSize,
-                                     const UA_QualifiedName *browsePath);
-
-#ifndef HAVE_NODEITER_CALLBACK
-#define HAVE_NODEITER_CALLBACK
-/* Iterate over all nodes referenced by parentNodeId by calling the callback
- * function for each child node (in ifdef because GCC/CLANG handle include order
- * differently) */
-typedef UA_StatusCode
-(*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse,
-                           UA_NodeId referenceTypeId, void *handle);
-#endif
-
-UA_StatusCode UA_EXPORT
-UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId,
-                               UA_NodeIteratorCallback callback, void *handle);
-
-#ifdef UA_ENABLE_DISCOVERY
-
-/**
- * Discovery
- * --------- */
-/* Register the given server instance at the discovery server.
- * This should be called periodically.
- * The semaphoreFilePath is optional. If the given file is deleted,
- * the server will automatically be unregistered. This could be
- * for example a pid file which is deleted if the server crashes.
- *
- * When the server shuts down you need to call unregister.
- *
- * @param server
- * @param client the client which is used to call the RegisterServer. It must
- *        already be connected to the correct endpoint
- * @param semaphoreFilePath optional parameter pointing to semaphore file. */
-UA_StatusCode UA_EXPORT
-UA_Server_register_discovery(UA_Server *server, struct UA_Client *client,
-                             const char* semaphoreFilePath);
-
-/* Unregister the given server instance from the discovery server.
- * This should only be called when the server is shutting down.
- * @param server
- * @param client the client which is used to call the RegisterServer. It must
- *        already be connected to the correct endpoint */
-UA_StatusCode UA_EXPORT
-UA_Server_unregister_discovery(UA_Server *server, struct UA_Client *client);
-
- /* Adds a periodic callback to register the server with the LDS (local discovery server)
-  * periodically. The interval between each register call is given as second parameter.
-  * It should be 10 minutes by default (= 10*60*1000).
-  *
-  * The delayFirstRegisterMs parameter indicates the delay for the first register call.
-  * If it is 0, the first register call will be after intervalMs milliseconds,
-  * otherwise the server's first register will be after delayFirstRegisterMs.
-  *
-  * When you manually unregister the server, you also need to cancel the
-  * periodic callback, otherwise it will be automatically be registered again.
-  *
-  * If you call this method multiple times for the same discoveryServerUrl, the older
-  * periodic callback will be removed.
-  *
-  * @param server
-  * @param client the client which is used to call the RegisterServer.
-  *         It must not yet be connected and will be connected for every register call
-  *         to the given discoveryServerUrl.
-  * @param discoveryServerUrl where this server should register itself.
-  *        The string will be copied internally. Therefore you can free it after calling this method.
-  * @param intervalMs
-  * @param delayFirstRegisterMs
-  * @param periodicCallbackId */
-UA_StatusCode UA_EXPORT
-UA_Server_addPeriodicServerRegisterCallback(UA_Server *server, struct UA_Client *client,
-                                            const char* discoveryServerUrl,
-                                            UA_Double intervalMs,
-                                            UA_Double delayFirstRegisterMs,
-                                            UA_UInt64 *periodicCallbackId);
-
-/* Callback for RegisterServer. Data is passed from the register call */
-typedef void (*UA_Server_registerServerCallback)(const UA_RegisteredServer *registeredServer,
-                                                 void* data);
-
-/* Set the callback which is called if another server registeres or unregisters
- * with this instance. This callback is called every time the server gets a register
- * call. This especially means that for every periodic server register the callback will
- * be called.
- *
- * @param server
- * @param cb the callback
- * @param data data passed to the callback
- * @return UA_STATUSCODE_SUCCESS on success */
-void UA_EXPORT
-UA_Server_setRegisterServerCallback(UA_Server *server, UA_Server_registerServerCallback cb,
-                                    void* data);
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-/* Callback for server detected through mDNS. Data is passed from the register
- * call
- *
- * @param isServerAnnounce indicates if the server has just been detected. If
- *        set to false, this means the server is shutting down.
- * @param isTxtReceived indicates if we already received the corresponding TXT
- *        record with the path and caps data */
-typedef void (*UA_Server_serverOnNetworkCallback)(const UA_ServerOnNetwork *serverOnNetwork,
-                                                  UA_Boolean isServerAnnounce,
-                                                  UA_Boolean isTxtReceived, void* data);
-
-/* Set the callback which is called if another server is found through mDNS or
- * deleted. It will be called for any mDNS message from the remote server, thus
- * it may be called multiple times for the same instance. Also the SRV and TXT
- * records may arrive later, therefore for the first call the server
- * capabilities may not be set yet. If called multiple times, previous data will
- * be overwritten.
- *
- * @param server
- * @param cb the callback
- * @param data data passed to the callback
- * @return UA_STATUSCODE_SUCCESS on success */
-void UA_EXPORT
-UA_Server_setServerOnNetworkCallback(UA_Server *server,
-                                     UA_Server_serverOnNetworkCallback cb,
-                                     void* data);
-
-#endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-
-#endif /* UA_ENABLE_DISCOVERY */
-
-/**
- * Information Model Callbacks
- * ---------------------------
- *
- * There are three places where a callback from an information model to
- * user-defined code can happen.
- *
- * - Custom node constructors and destructors
- * - Linking VariableNodes with an external data source
- * - MethodNode callbacks
- *
- * .. _node-lifecycle:
- *
- * Node Lifecycle: Constructors, Destructors and Node Contexts
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- *
- * To finalize the instantiation of a node, a (user-defined) constructor
- * callback is executed. There can be both a global constructor for all nodes
- * and node-type constructor specific to the TypeDefinition of the new node
- * (attached to an ObjectTypeNode or VariableTypeNode).
- *
- * In the hierarchy of ObjectTypes and VariableTypes, only the constructor of
- * the (lowest) type defined for the new node is executed. Note that every
- * Object and Variable can have only one ``isTypeOf`` reference. But type-nodes
- * can technically have several ``hasSubType`` references to implement multiple
- * inheritance. Issues of (multiple) inheritance in the constructor need to be
- * solved by the user.
- *
- * When a node is destroyed, the node-type destructor is called before the
- * global destructor. So the overall node lifecycle is as follows:
- *
- * 1. Global Constructor (set in the server config)
- * 2. Node-Type Constructor (for VariableType or ObjectTypes)
- * 3. (Usage-period of the Node)
- * 4. Node-Type Destructor
- * 5. Global Destructor
- *
- * The constructor and destructor callbacks can be set to ``NULL`` and are not
- * used in that case. If the node-type constructor fails, the global destructor
- * will be called before removing the node. The destructors are assumed to never
- * fail.
- *
- * Every node carries a user-context and a constructor-context pointer. The
- * user-context is used to attach custom data to a node. But the (user-defined)
- * constructors and destructors may replace the user-context pointer if they
- * wish to do so. The initial value for the constructor-context is ``NULL``.
- * When the ``AddNodes`` service is used over the network, the user-context
- * pointer of the new node is also initially set to ``NULL``. */
-
-/* To be set in the server config. */
-typedef struct {
-    /* Can be NULL. May replace the nodeContext */
-    UA_StatusCode (*constructor)(UA_Server *server,
-                                 const UA_NodeId *sessionId, void *sessionContext,
-                                 const UA_NodeId *nodeId, void **nodeContext);
-
-    /* Can be NULL. The context cannot be replaced since the node is destroyed
-     * immediately afterwards anyway. */
-    void (*destructor)(UA_Server *server,
-                       const UA_NodeId *sessionId, void *sessionContext,
-                       const UA_NodeId *nodeId, void *nodeContext);
-
-    /* Can be NULL. Called during recursive node instantiation. While mandatory
-     * child nodes are automatically created if not already present, optional child
-     * nodes are not. This callback can be used to define whether an optional child
-     * node should be created.
-     *
-     * @param server The server executing the callback
-     * @param sessionId The identifier of the session
-     * @param sessionContext Additional data attached to the session in the
-     *        access control layer
-     * @param sourceNodeId Source node from the type definition. If the new node
-     *        shall be created, it will be a copy of this node.
-     * @param targetParentNodeId Parent of the potential new child node
-     * @param referenceTypeId Identifies the reference type which that the parent
-     *        node has to the new node. 
-     * @return Return UA_TRUE if the child node shall be instantiatet, 
-     *         UA_FALSE otherwise. */
-    UA_Boolean (*createOptionalChild)(UA_Server *server,
-                                      const UA_NodeId *sessionId,
-                                      void *sessionContext,
-                                      const UA_NodeId *sourceNodeId,
-                                      const UA_NodeId *targetParentNodeId,
-                                      const UA_NodeId *referenceTypeId);
-
-    /* Can be NULL. Called when a node is to be copied during recursive
-     * node instantiation. Allows definition of the NodeId for the new node.
-     * If the callback is set to NULL or the resulting NodeId is UA_NODEID_NULL,
-     * then a random NodeId will be generated.
-     *
-     * @param server The server executing the callback
-     * @param sessionId The identifier of the session
-     * @param sessionContext Additional data attached to the session in the
-     *        access control layer
-     * @param sourceNodeId Source node of the copy operation
-     * @param targetParentNodeId Parent node of the new node
-     * @param referenceTypeId Identifies the reference type which that the parent
-     *        node has to the new node. */
-    UA_StatusCode (*generateChildNodeId)(UA_Server *server,
-                                         const UA_NodeId *sessionId, void *sessionContext,
-                                         const UA_NodeId *sourceNodeId,
-                                         const UA_NodeId *targetParentNodeId,
-                                         const UA_NodeId *referenceTypeId,
-                                         UA_NodeId *targetNodeId);
-    } UA_GlobalNodeLifecycle;
-
-typedef struct {
-    /* Can be NULL. May replace the nodeContext */
-    UA_StatusCode (*constructor)(UA_Server *server,
-                                 const UA_NodeId *sessionId, void *sessionContext,
-                                 const UA_NodeId *typeNodeId, void *typeNodeContext,
-                                 const UA_NodeId *nodeId, void **nodeContext);
-
-    /* Can be NULL. May replace the nodeContext. */
-    void (*destructor)(UA_Server *server,
-                       const UA_NodeId *sessionId, void *sessionContext,
-                       const UA_NodeId *typeNodeId, void *typeNodeContext,
-                       const UA_NodeId *nodeId, void **nodeContext);
-} UA_NodeTypeLifecycle;
-
-UA_StatusCode UA_EXPORT
-UA_Server_setNodeTypeLifecycle(UA_Server *server, UA_NodeId nodeId,
-                               UA_NodeTypeLifecycle lifecycle);
-
-UA_StatusCode UA_EXPORT
-UA_Server_getNodeContext(UA_Server *server, UA_NodeId nodeId,
-                         void **nodeContext);
-
-/* Careful! The user has to ensure that the destructor callbacks still work. */
-UA_StatusCode UA_EXPORT
-UA_Server_setNodeContext(UA_Server *server, UA_NodeId nodeId,
-                         void *nodeContext);
-
-/**
- * .. _datasource:
- *
- * Data Source Callback
- * ^^^^^^^^^^^^^^^^^^^^
- *
- * The server has a unique way of dealing with the content of variables. Instead
- * of storing a variant attached to the variable node, the node can point to a
- * function with a local data provider. Whenever the value attribute is read,
- * the function will be called and asked to provide a UA_DataValue return value
- * that contains the value content and additional timestamps.
- *
- * It is expected that the read callback is implemented. The write callback can
- * be set to a null-pointer. */
-typedef struct {
-    /* Copies the data from the source into the provided value.
-     *
-     * !! ZERO-COPY OPERATIONS POSSIBLE !!
-     * It is not required to return a copy of the actual content data. You can
-     * return a pointer to memory owned by the user. Memory can be reused
-     * between read callbacks of a DataSource, as the result is already encoded
-     * on the network buffer between each read operation.
-     *
-     * To use zero-copy reads, set the value of the `value->value` Variant
-     * without copying, e.g. with `UA_Variant_setScalar`. Then, also set
-     * `value->value.storageType` to `UA_VARIANT_DATA_NODELETE` to prevent the
-     * memory being cleaned up. Don't forget to also set `value->hasValue` to
-     * true to indicate the presence of a value.
-     *
-     * @param server The server executing the callback
-     * @param sessionId The identifier of the session
-     * @param sessionContext Additional data attached to the session in the
-     *        access control layer
-     * @param nodeId The identifier of the node being read from
-     * @param nodeContext Additional data attached to the node by the user
-     * @param includeSourceTimeStamp If true, then the datasource is expected to
-     *        set the source timestamp in the returned value
-     * @param range If not null, then the datasource shall return only a
-     *        selection of the (nonscalar) data. Set
-     *        UA_STATUSCODE_BADINDEXRANGEINVALID in the value if this does not
-     *        apply
-     * @param value The (non-null) DataValue that is returned to the client. The
-     *        data source sets the read data, the result status and optionally a
-     *        sourcetimestamp.
-     * @return Returns a status code for logging. Error codes intended for the
-     *         original caller are set in the value. If an error is returned,
-     *         then no releasing of the value is done
-     */
-    UA_StatusCode (*read)(UA_Server *server, const UA_NodeId *sessionId,
-                          void *sessionContext, const UA_NodeId *nodeId,
-                          void *nodeContext, UA_Boolean includeSourceTimeStamp,
-                          const UA_NumericRange *range, UA_DataValue *value);
-
-    /* Write into a data source. This method pointer can be NULL if the
-     * operation is unsupported.
-     *
-     * @param server The server executing the callback
-     * @param sessionId The identifier of the session
-     * @param sessionContext Additional data attached to the session in the
-     *        access control layer
-     * @param nodeId The identifier of the node being written to
-     * @param nodeContext Additional data attached to the node by the user
-     * @param range If not NULL, then the datasource shall return only a
-     *        selection of the (nonscalar) data. Set
-     *        UA_STATUSCODE_BADINDEXRANGEINVALID in the value if this does not
-     *        apply
-     * @param value The (non-NULL) DataValue that has been written by the client.
-     *        The data source contains the written data, the result status and
-     *        optionally a sourcetimestamp
-     * @return Returns a status code for logging. Error codes intended for the
-     *         original caller are set in the value. If an error is returned,
-     *         then no releasing of the value is done
-     */
-    UA_StatusCode (*write)(UA_Server *server, const UA_NodeId *sessionId,
-                           void *sessionContext, const UA_NodeId *nodeId,
-                           void *nodeContext, const UA_NumericRange *range,
-                           const UA_DataValue *value);
-} UA_DataSource;
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId,
-                                     const UA_DataSource dataSource);
-
-/**
- * .. _value-callback:
- *
- * Value Callback
- * ^^^^^^^^^^^^^^
- * Value Callbacks can be attached to variable and variable type nodes. If
- * not ``NULL``, they are called before reading and after writing respectively. */
-typedef struct {
-    /* Called before the value attribute is read. It is possible to write into the
-     * value attribute during onRead (using the write service). The node is
-     * re-opened afterwards so that changes are considered in the following read
-     * operation.
-     *
-     * @param handle Points to user-provided data for the callback.
-     * @param nodeid The identifier of the node.
-     * @param data Points to the current node value.
-     * @param range Points to the numeric range the client wants to read from
-     *        (or NULL). */
-    void (*onRead)(UA_Server *server, const UA_NodeId *sessionId,
-                   void *sessionContext, const UA_NodeId *nodeid,
-                   void *nodeContext, const UA_NumericRange *range,
-                   const UA_DataValue *value);
-
-    /* Called after writing the value attribute. The node is re-opened after
-     * writing so that the new value is visible in the callback.
-     *
-     * @param server The server executing the callback
-     * @sessionId The identifier of the session
-     * @sessionContext Additional data attached to the session
-     *                 in the access control layer
-     * @param nodeid The identifier of the node.
-     * @param nodeUserContext Additional data attached to the node by
-     *        the user.
-     * @param nodeConstructorContext Additional data attached to the node
-     *        by the type constructor(s).
-     * @param range Points to the numeric range the client wants to write to (or
-     *        NULL). */
-    void (*onWrite)(UA_Server *server, const UA_NodeId *sessionId,
-                    void *sessionContext, const UA_NodeId *nodeId,
-                    void *nodeContext, const UA_NumericRange *range,
-                    const UA_DataValue *data);
-} UA_ValueCallback;
-
-UA_StatusCode UA_EXPORT
-UA_Server_setVariableNode_valueCallback(UA_Server *server,
-                                        const UA_NodeId nodeId,
-                                        const UA_ValueCallback callback);
-
-/**
- * .. _local-monitoreditems:
- *
- * Local MonitoredItems
- * ^^^^^^^^^^^^^^^^^^^^
- *
- * MonitoredItems are used with the Subscription mechanism of OPC UA to
- * transported notifications for data changes and events. MonitoredItems can
- * also be registered locally. Notifications are then forwarded to a
- * user-defined callback instead of a remote client. */
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-typedef void (*UA_Server_DataChangeNotificationCallback)
-    (UA_Server *server, UA_UInt32 monitoredItemId, void *monitoredItemContext,
-     const UA_NodeId *nodeId, void *nodeContext, UA_UInt32 attributeId,
-     const UA_DataValue *value);
-
-typedef void (*UA_Server_EventNotificationCallback)
-    (UA_Server *server, UA_UInt32 monId, void *monContext,
-     size_t nEventFields, const UA_Variant *eventFields);
-
-/* Create a local MonitoredItem with a sampling interval that detects data
- * changes.
- *
- * @param server The server executing the MonitoredItem
- * @timestampsToReturn Shall timestamps be added to the value for the callback?
- * @item The parameters of the new MonitoredItem. Note that the attribute of the
- *       ReadValueId (the node that is monitored) can not be
- *       ``UA_ATTRIBUTEID_EVENTNOTIFIER``. A different callback type needs to be
- *       registered for event notifications.
- * @monitoredItemContext A pointer that is forwarded with the callback
- * @callback The callback that is executed on detected data changes
- *
- * @return Returns a description of the created MonitoredItem. The structure
- * also contains a StatusCode (in case of an error) and the identifier of the
- * new MonitoredItem. */
-UA_MonitoredItemCreateResult UA_EXPORT UA_THREADSAFE
-UA_Server_createDataChangeMonitoredItem(UA_Server *server,
-          UA_TimestampsToReturn timestampsToReturn,
-          const UA_MonitoredItemCreateRequest item,
-          void *monitoredItemContext,
-          UA_Server_DataChangeNotificationCallback callback);
-
-/* UA_MonitoredItemCreateResult UA_EXPORT */
-/* UA_Server_createEventMonitoredItem(UA_Server *server, */
-/*           UA_TimestampsToReturn timestampsToReturn, */
-/*           const UA_MonitoredItemCreateRequest item, void *context, */
-/*           UA_Server_EventNotificationCallback callback); */
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_deleteMonitoredItem(UA_Server *server, UA_UInt32 monitoredItemId);
-
-#endif
-
-/**
- * Method Callbacks
- * ^^^^^^^^^^^^^^^^
- * Method callbacks are set to `NULL` (not executable) when a method node is
- * added over the network. In theory, it is possible to add a callback via
- * ``UA_Server_setMethodNode_callback`` within the global constructor when
- * adding methods over the network is really wanted. See the Section
- * :ref:`object-interaction` for calling methods on an object. */
-
-typedef UA_StatusCode
-(*UA_MethodCallback)(UA_Server *server, const UA_NodeId *sessionId,
-                     void *sessionContext, const UA_NodeId *methodId,
-                     void *methodContext, const UA_NodeId *objectId,
-                     void *objectContext, size_t inputSize,
-                     const UA_Variant *input, size_t outputSize,
-                     UA_Variant *output);
-
-#ifdef UA_ENABLE_METHODCALLS
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_setMethodNode_callback(UA_Server *server,
-                                 const UA_NodeId methodNodeId,
-                                 UA_MethodCallback methodCallback);
-#endif
-
-/**
- * .. _object-interaction:
- *
- * Interacting with Objects
- * ------------------------
- * Objects in the information model are represented as ObjectNodes. Some
- * convenience functions are provided to simplify the interaction with objects.
- */
-
-/* Write an object property. The property is represented as a VariableNode with
- * a ``HasProperty`` reference from the ObjectNode. The VariableNode is
- * identified by its BrowseName. Writing the property sets the value attribute
- * of the VariableNode.
- *
- * @param server The server object
- * @param objectId The identifier of the object (node)
- * @param propertyName The name of the property
- * @param value The value to be set for the event attribute
- * @return The StatusCode for setting the event attribute */
-UA_StatusCode UA_EXPORT
-UA_Server_writeObjectProperty(UA_Server *server, const UA_NodeId objectId,
-                              const UA_QualifiedName propertyName,
-                              const UA_Variant value);
-
-/* Directly point to the scalar value instead of a variant */
-UA_StatusCode UA_EXPORT
-UA_Server_writeObjectProperty_scalar(UA_Server *server, const UA_NodeId objectId,
-                                     const UA_QualifiedName propertyName,
-                                     const void *value, const UA_DataType *type);
-
-/* Read an object property.
- *
- * @param server The server object
- * @param objectId The identifier of the object (node)
- * @param propertyName The name of the property
- * @param value Contains the property value after reading. Must not be NULL.
- * @return The StatusCode for setting the event attribute */
-UA_StatusCode UA_EXPORT
-UA_Server_readObjectProperty(UA_Server *server, const UA_NodeId objectId,
-                             const UA_QualifiedName propertyName,
-                             UA_Variant *value);
-
-#ifdef UA_ENABLE_METHODCALLS
-UA_CallMethodResult UA_EXPORT UA_THREADSAFE
-UA_Server_call(UA_Server *server, const UA_CallMethodRequest *request);
-#endif
-
-/**
- * .. _addnodes:
- *
- * Node Addition and Deletion
- * --------------------------
- * When creating dynamic node instances at runtime, chances are that you will
- * not care about the specific NodeId of the new node, as long as you can
- * reference it later. When passing numeric NodeIds with a numeric identifier 0,
- * the stack evaluates this as "select a random unassigned numeric NodeId in
- * that namespace". To find out which NodeId was actually assigned to the new
- * node, you may pass a pointer `outNewNodeId`, which will (after a successful
- * node insertion) contain the nodeId of the new node. You may also pass a
- * ``NULL`` pointer if this result is not needed.
- *
- * See the Section :ref:`node-lifecycle` on constructors and on attaching
- * user-defined data to nodes.
- *
- * The methods for node addition and deletion take mostly const arguments that
- * are not modified. When creating a node, a deep copy of the node identifier,
- * node attributes, etc. is created. Therefore, it is possible to call for
- * example ``UA_Server_addVariablenode`` with a value attribute (a
- * :ref:`variant`) pointing to a memory location on the stack. If you need
- * changes to a variable value to manifest at a specific memory location, please
- * use a :ref:`datasource` or a :ref:`value-callback`. */
-
-/* Protect against redundant definitions for server/client */
-#ifndef UA_DEFAULT_ATTRIBUTES_DEFINED
-#define UA_DEFAULT_ATTRIBUTES_DEFINED
-/* The default for variables is "BaseDataType" for the datatype, -2 for the
- * valuerank and a read-accesslevel. */
-UA_EXPORT extern const UA_VariableAttributes UA_VariableAttributes_default;
-UA_EXPORT extern const UA_VariableTypeAttributes UA_VariableTypeAttributes_default;
-/* Methods are executable by default */
-UA_EXPORT extern const UA_MethodAttributes UA_MethodAttributes_default;
-/* The remaining attribute definitions are currently all zeroed out */
-UA_EXPORT extern const UA_ObjectAttributes UA_ObjectAttributes_default;
-UA_EXPORT extern const UA_ObjectTypeAttributes UA_ObjectTypeAttributes_default;
-UA_EXPORT extern const UA_ReferenceTypeAttributes UA_ReferenceTypeAttributes_default;
-UA_EXPORT extern const UA_DataTypeAttributes UA_DataTypeAttributes_default;
-UA_EXPORT extern const UA_ViewAttributes UA_ViewAttributes_default;
-#endif
-
-/* Don't use this function. There are typed versions as inline functions. */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-__UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass,
-                    const UA_NodeId *requestedNewNodeId,
-                    const UA_NodeId *parentNodeId,
-                    const UA_NodeId *referenceTypeId,
-                    const UA_QualifiedName browseName,
-                    const UA_NodeId *typeDefinition,
-                    const UA_NodeAttributes *attr,
-                    const UA_DataType *attributeType,
-                    void *nodeContext, UA_NodeId *outNewNodeId);
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_NodeId typeDefinition,
-                          const UA_VariableAttributes attr,
-                          void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_VARIABLE, &requestedNewNodeId,
-                               &parentNodeId, &referenceTypeId, browseName,
-                               &typeDefinition, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addVariableTypeNode(UA_Server *server,
-                              const UA_NodeId requestedNewNodeId,
-                              const UA_NodeId parentNodeId,
-                              const UA_NodeId referenceTypeId,
-                              const UA_QualifiedName browseName,
-                              const UA_NodeId typeDefinition,
-                              const UA_VariableTypeAttributes attr,
-                              void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_VARIABLETYPE,
-                               &requestedNewNodeId, &parentNodeId, &referenceTypeId,
-                               browseName, &typeDefinition,
-                               (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addObjectNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                        const UA_NodeId parentNodeId,
-                        const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName,
-                        const UA_NodeId typeDefinition,
-                        const UA_ObjectAttributes attr,
-                        void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_OBJECT, &requestedNewNodeId,
-                               &parentNodeId, &referenceTypeId, browseName,
-                               &typeDefinition, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addObjectTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                            const UA_NodeId parentNodeId,
-                            const UA_NodeId referenceTypeId,
-                            const UA_QualifiedName browseName,
-                            const UA_ObjectTypeAttributes attr,
-                            void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_OBJECTTYPE, &requestedNewNodeId,
-                               &parentNodeId, &referenceTypeId, browseName,
-                               &UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addViewNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                      const UA_NodeId parentNodeId,
-                      const UA_NodeId referenceTypeId,
-                      const UA_QualifiedName browseName,
-                      const UA_ViewAttributes attr,
-                      void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_VIEW, &requestedNewNodeId,
-                               &parentNodeId, &referenceTypeId, browseName,
-                               &UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_VIEWATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addReferenceTypeNode(UA_Server *server,
-                               const UA_NodeId requestedNewNodeId,
-                               const UA_NodeId parentNodeId,
-                               const UA_NodeId referenceTypeId,
-                               const UA_QualifiedName browseName,
-                               const UA_ReferenceTypeAttributes attr,
-                               void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_REFERENCETYPE,
-                               &requestedNewNodeId, &parentNodeId, &referenceTypeId,
-                               browseName, &UA_NODEID_NULL,
-                               (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addDataTypeNode(UA_Server *server,
-                          const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_DataTypeAttributes attr,
-                          void *nodeContext, UA_NodeId *outNewNodeId) {
-    return __UA_Server_addNode(server, UA_NODECLASS_DATATYPE, &requestedNewNodeId,
-                               &parentNodeId, &referenceTypeId, browseName,
-                               &UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
-                               &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],
-                               nodeContext, outNewNodeId);
-}
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_addDataSourceVariableNode(UA_Server *server,
-                                    const UA_NodeId requestedNewNodeId,
-                                    const UA_NodeId parentNodeId,
-                                    const UA_NodeId referenceTypeId,
-                                    const UA_QualifiedName browseName,
-                                    const UA_NodeId typeDefinition,
-                                    const UA_VariableAttributes attr,
-                                    const UA_DataSource dataSource,
-                                    void *nodeContext, UA_NodeId *outNewNodeId);
-
-#ifdef UA_ENABLE_METHODCALLS
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_addMethodNodeEx(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_MethodAttributes attr, UA_MethodCallback method,
-                          size_t inputArgumentsSize, const UA_Argument *inputArguments,
-                          const UA_NodeId inputArgumentsRequestedNewNodeId,
-                          UA_NodeId *inputArgumentsOutNewNodeId,
-                          size_t outputArgumentsSize, const UA_Argument *outputArguments,
-                          const UA_NodeId outputArgumentsRequestedNewNodeId,
-                          UA_NodeId *outputArgumentsOutNewNodeId,
-                          void *nodeContext, UA_NodeId *outNewNodeId);
-
-static UA_INLINE UA_THREADSAFE UA_StatusCode
-UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                        const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName, const UA_MethodAttributes attr,
-                        UA_MethodCallback method,
-                        size_t inputArgumentsSize, const UA_Argument *inputArguments,
-                        size_t outputArgumentsSize, const UA_Argument *outputArguments,
-                        void *nodeContext, UA_NodeId *outNewNodeId) {
-    return UA_Server_addMethodNodeEx(server, requestedNewNodeId,  parentNodeId,
-                                     referenceTypeId, browseName, attr, method,
-                                     inputArgumentsSize, inputArguments, UA_NODEID_NULL, NULL,
-                                     outputArgumentsSize, outputArguments, UA_NODEID_NULL, NULL,
-                                     nodeContext, outNewNodeId);
-}
-
-#endif
-
-
-/**
- * The method pair UA_Server_addNode_begin and _finish splits the AddNodes
- * service in two parts. This is useful if the node shall be modified before
- * finish the instantiation. For example to add children with specific NodeIds.
- * Otherwise, mandatory children (e.g. of an ObjectType) are added with
- * pseudo-random unique NodeIds. Existing children are detected during the
- * _finish part via their matching BrowseName.
- *
- * The _begin method:
- *  - prepares the node and adds it to the nodestore
- *  - copies some unassigned attributes from the TypeDefinition node internally
- *  - adds the references to the parent (and the TypeDefinition if applicable)
- *  - performs type-checking of variables.
- *
- * You can add an object node without a parent if you set the parentNodeId and
- * referenceTypeId to UA_NODE_ID_NULL. Then you need to add the parent reference
- * and hasTypeDef reference yourself before calling the _finish method.
- * Not that this is only allowed for object nodes.
- *
- * The _finish method:
- *  - copies mandatory children
- *  - calls the node constructor(s) at the end
- *  - may remove the node if it encounters an error.
- *
- * The special UA_Server_addMethodNode_finish method needs to be used for
- * method nodes, since there you need to explicitly specifiy the input
- * and output arguments which are added in the finish step (if not yet already there)
- **/
-
-/* The ``attr`` argument must have a type according to the NodeClass.
- * ``VariableAttributes`` for variables, ``ObjectAttributes`` for objects, and
- * so on. Missing attributes are taken from the TypeDefinition node if
- * applicable. */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass,
-                        const UA_NodeId requestedNewNodeId,
-                        const UA_NodeId parentNodeId,
-                        const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName,
-                        const UA_NodeId typeDefinition,
-                        const void *attr, const UA_DataType *attributeType,
-                        void *nodeContext, UA_NodeId *outNewNodeId);
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId);
-
-#ifdef UA_ENABLE_METHODCALLS
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId,
-                         UA_MethodCallback method,
-                         size_t inputArgumentsSize, const UA_Argument* inputArguments,
-                         size_t outputArgumentsSize, const UA_Argument* outputArguments);
-
-#endif
-
-/* Deletes a node and optionally all references leading to the node. */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId,
-                     UA_Boolean deleteReferences);
-
-/**
- * Reference Management
- * -------------------- */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
-                       const UA_NodeId refTypeId,
-                       const UA_ExpandedNodeId targetId, UA_Boolean isForward);
-
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId,
-                          const UA_NodeId referenceTypeId, UA_Boolean isForward,
-                          const UA_ExpandedNodeId targetNodeId,
-                          UA_Boolean deleteBidirectional);
-
-/**
- * .. _events:
- *
- * Events
- * ------
- * The method ``UA_Server_createEvent`` creates an event and represents it as node. The node receives a unique `EventId`
- * which is automatically added to the node.
- * The method returns a `NodeId` to the object node which represents the event through ``outNodeId``. The `NodeId` can
- * be used to set the attributes of the event. The generated `NodeId` is always numeric. ``outNodeId`` cannot be
- * ``NULL``.
- *
- * Note: In order to see an event in UAExpert, the field `Time` must be given a value!
- *
- * The method ``UA_Server_triggerEvent`` "triggers" an event by adding it to all monitored items of the specified
- * origin node and those of all its parents. Any filters specified by the monitored items are automatically applied.
- * Using this method deletes the node generated by ``UA_Server_createEvent``. The `EventId` for the new event is
- * generated automatically and is returned through ``outEventId``. ``NULL`` can be passed if the `EventId` is not
- * needed. ``deleteEventNode`` specifies whether the node representation of the event should be deleted after invoking
- * the method. This can be useful if events with the similar attributes are triggered frequently. ``UA_TRUE`` would
- * cause the node to be deleted. */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-
-/* The EventQueueOverflowEventType is defined as abstract, therefore we can not
- * create an instance of that type directly, but need to create a subtype. The
- * following is an arbitrary number which shall refer to our internal overflow
- * type. This is already posted on the OPC Foundation bug tracker under the
- * following link for clarification:
- * https://opcfoundation-onlineapplications.org/mantis/view.php?id=4206 */
-# define UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE 4035
-
-/* Creates a node representation of an event
- *
- * @param server The server object
- * @param eventType The type of the event for which a node should be created
- * @param outNodeId The NodeId of the newly created node for the event
- * @return The StatusCode of the UA_Server_createEvent method */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_createEvent(UA_Server *server, const UA_NodeId eventType,
-                      UA_NodeId *outNodeId);
-
-/* Triggers a node representation of an event by applying EventFilters and
-   adding the event to the appropriate queues.
- * @param server The server object
- * @param eventNodeId The NodeId of the node representation of the event which should be triggered
- * @param outEvent the EventId of the new event
- * @param deleteEventNode Specifies whether the node representation of the event should be deleted
- * @return The StatusCode of the UA_Server_triggerEvent method */
-UA_StatusCode UA_EXPORT UA_THREADSAFE
-UA_Server_triggerEvent(UA_Server *server, const UA_NodeId eventNodeId, const UA_NodeId originId,
-                       UA_ByteString *outEventId, const UA_Boolean deleteEventNode);
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS_EVENTS */
-
-UA_StatusCode UA_EXPORT
-UA_Server_updateCertificate(UA_Server *server,
-                            const UA_ByteString *oldCertificate,
-                            const UA_ByteString *newCertificate,
-                            const UA_ByteString *newPrivateKey,
-                            UA_Boolean closeSessions,
-                            UA_Boolean closeSecureChannels);
-
-/**
- * Utility Functions
- * ----------------- */
-/* Add a new namespace to the server. Returns the index of the new namespace */
-UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
-
-/* Get namespace by name from the server. */
-UA_StatusCode UA_EXPORT
-UA_Server_getNamespaceByName(UA_Server *server, const UA_String namespaceUri,
-                             size_t* foundIndex);
-
-#ifdef UA_ENABLE_HISTORIZING
-UA_Boolean UA_EXPORT
-UA_Server_AccessControl_allowHistoryUpdateUpdateData(UA_Server *server,
-                                                     const UA_NodeId *sessionId, void *sessionContext,
-                                                     const UA_NodeId *nodeId,
-                                                     UA_PerformUpdateType performInsertReplace,
-                                                     const UA_DataValue *value);
-
-UA_Boolean UA_EXPORT
-UA_Server_AccessControl_allowHistoryUpdateDeleteRawModified(UA_Server *server,
-                                                            const UA_NodeId *sessionId, void *sessionContext,
-                                                            const UA_NodeId *nodeId,
-                                                            UA_DateTime startTimestamp,
-                                                            UA_DateTime endTimestamp,
-                                                            bool isDeleteModified);
-#endif // UA_ENABLE_HISTORIZING
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_H_ */
diff --git a/ext/open62541/include/open62541/server_config.h b/ext/open62541/include/open62541/server_config.h
deleted file mode 100644
index 4d27769..0000000
--- a/ext/open62541/include/open62541/server_config.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Henrik Norrman
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- */
-
-#ifndef UA_SERVER_CONFIG_H_
-#define UA_SERVER_CONFIG_H_
-
-#include <open62541/plugin/accesscontrol.h>
-#include <open62541/plugin/log.h>
-#include <open62541/plugin/network.h>
-#include <open62541/plugin/pki.h>
-#include <open62541/plugin/securitypolicy.h>
-#include <open62541/server.h>
-
-#ifdef UA_ENABLE_PUBSUB
-#include <open62541/plugin/pubsub.h>
-#endif
-
-#ifdef UA_ENABLE_HISTORIZING
-#include <open62541/plugin/historydatabase.h>
-#endif
-
-_UA_BEGIN_DECLS
-
-/**
- * .. _server-configuration:
- *
- * Server Configuration
- * --------------------
-
- * The configuration structure is passed to the server during initialization.
- * The server expects that the configuration is not modified during runtime.
- * Currently, only one server can use a configuration at a time. During
- * shutdown, the server will clean up the parts of the configuration that are
- * modified at runtime through the provided API.
- *
- * Examples for configurations are provided in the ``/plugins`` folder.
- * The usual usage is as follows:
- *
- * 1. Create a server configuration with default settings as a starting point
- * 2. Modifiy the configuration, e.g. by adding a server certificate
- * 3. Instantiate a server with it
- * 4. After shutdown of the server, clean up the configuration (free memory)
- *
- * The :ref:`tutorials` provide a good starting point for this. */
-
-typedef struct {
-    UA_UInt32 min;
-    UA_UInt32 max;
-} UA_UInt32Range;
-
-typedef struct {
-    UA_Duration min;
-    UA_Duration max;
-} UA_DurationRange;
-
-#ifdef UA_ENABLE_DISCOVERY
-typedef struct {
-
-    /* Timeout in seconds when to automatically remove a registered server from
-     * the list, if it doesn't re-register within the given time frame. A value
-     * of 0 disables automatic removal. Default is 60 Minutes (60*60). Must be
-     * bigger than 10 seconds, because cleanup is only triggered approximately
-     * every 10 seconds. The server will still be removed depending on the
-     * state of the semaphore file. */
-    UA_UInt32 cleanupTimeout;
-
-    /* Enable mDNS announce and response to queries */
-    bool mdnsEnable;
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    UA_MdnsDiscoveryConfiguration mdns;
-    UA_String mdnsInterfaceIP;
-#endif
-
-} UA_ServerConfig_Discovery;
-
-#endif
-
-struct UA_ServerConfig {
-    UA_UInt16 nThreads; /* only if multithreading is enabled */
-    UA_Logger logger;
-
-    /* Server Description */
-    UA_BuildInfo buildInfo;
-    UA_ApplicationDescription applicationDescription;
-    UA_ByteString serverCertificate;
-
-    UA_Double shutdownDelay; /* Delay in ms from the shutdown signal (ctrl-c)
-                                until the actual shutdown. Clients need to be
-                                able to get a notification ahead of time. */
-
-    /* Rule Handling */
-    UA_RuleHandling verifyRequestTimestamp; /* Verify that the server sends a
-                                             * timestamp in the request header */
-
-    /* Custom DataTypes. Attention! Custom datatypes are not cleaned up together
-     * with the configuration. So it is possible to allocate them on ROM. */
-    const UA_DataTypeArray *customDataTypes;
-
-    /**
-     * .. note:: See the section on :ref:`generic-types`. Examples for working
-     *    with custom data types are provided in
-     *    ``/examples/custom_datatype/``. */
-
-    /* Networking */
-    size_t networkLayersSize;
-    UA_ServerNetworkLayer *networkLayers;
-    UA_String customHostname;
-
-#ifdef UA_ENABLE_PUBSUB
-    /*PubSub network layer */
-    size_t pubsubTransportLayersSize;
-    UA_PubSubTransportLayer *pubsubTransportLayers;
-#endif
-
-    /* Available security policies */
-    size_t securityPoliciesSize;
-    UA_SecurityPolicy* securityPolicies;
-
-    /* Available endpoints */
-    size_t endpointsSize;
-    UA_EndpointDescription *endpoints;
-
-    /* Node Lifecycle callbacks */
-    UA_GlobalNodeLifecycle nodeLifecycle;
-    /**
-     * .. note:: See the section for :ref:`node lifecycle
-     *    handling<node-lifecycle>`. */
-
-    /* Access Control */
-    UA_AccessControl accessControl;
-    /**
-     * .. note:: See the section for :ref:`access-control
-     *    handling<access-control>`. */
-
-    /* Certificate Verification */
-    UA_CertificateVerification certificateVerification;
-
-    /* Relax constraints for the InformationModel */
-    UA_Boolean relaxEmptyValueConstraint; /* Nominally, only variables with data
-                                           * type BaseDataType can have an empty
-                                           * value. */
-
-    /* Limits for SecureChannels */
-    UA_UInt16 maxSecureChannels;
-    UA_UInt32 maxSecurityTokenLifetime; /* in ms */
-
-    /* Limits for Sessions */
-    UA_UInt16 maxSessions;
-    UA_Double maxSessionTimeout; /* in ms */
-
-    /* Operation limits */
-    UA_UInt32 maxNodesPerRead;
-    UA_UInt32 maxNodesPerWrite;
-    UA_UInt32 maxNodesPerMethodCall;
-    UA_UInt32 maxNodesPerBrowse;
-    UA_UInt32 maxNodesPerRegisterNodes;
-    UA_UInt32 maxNodesPerTranslateBrowsePathsToNodeIds;
-    UA_UInt32 maxNodesPerNodeManagement;
-    UA_UInt32 maxMonitoredItemsPerCall;
-
-    /* Limits for Requests */
-    UA_UInt32 maxReferencesPerNode;
-
-    /* Limits for Subscriptions */
-    UA_UInt32 maxSubscriptions;
-    UA_UInt32 maxSubscriptionsPerSession;
-    UA_DurationRange publishingIntervalLimits; /* in ms (must not be less than 5) */
-    UA_UInt32Range lifeTimeCountLimits;
-    UA_UInt32Range keepAliveCountLimits;
-    UA_UInt32 maxNotificationsPerPublish;
-    UA_Boolean enableRetransmissionQueue;
-    UA_UInt32 maxRetransmissionQueueSize; /* 0 -> unlimited size */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    UA_UInt32 maxEventsPerNode; /* 0 -> unlimited size */
-#endif
-
-    /* Limits for MonitoredItems */
-    UA_UInt32 maxMonitoredItems;
-    UA_UInt32 maxMonitoredItemsPerSubscription;
-    UA_DurationRange samplingIntervalLimits; /* in ms (must not be less than 5) */
-    UA_UInt32Range queueSizeLimits; /* Negotiated with the client */
-
-    /* Limits for PublishRequests */
-    UA_UInt32 maxPublishReqPerSession;
-
-    /* Discovery */
-#ifdef UA_ENABLE_DISCOVERY
-    UA_ServerConfig_Discovery discovery;
-#endif
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* Register MonitoredItem in Userland
-     *
-     * @param server Allows the access to the server object
-     * @param sessionId The session id, represented as an node id
-     * @param sessionContext An optional pointer to user-defined data for the specific data source
-     * @param nodeid Id of the node in question
-     * @param nodeidContext An optional pointer to user-defined data, associated
-     *        with the node in the nodestore. Note that, if the node has already been removed,
-     *        this value contains a NULL pointer.
-     * @param attributeId Identifies which attribute (value, data type etc.) is monitored
-     * @param removed Determines if the MonitoredItem was removed or created. */
-    void (*monitoredItemRegisterCallback)(UA_Server *server,
-                                          const UA_NodeId *sessionId, void *sessionContext,
-                                          const UA_NodeId *nodeId, void *nodeContext,
-                                          UA_UInt32 attibuteId, UA_Boolean removed);
-#endif
-
-    /* Historical Access */
-#ifdef UA_ENABLE_HISTORIZING
-    UA_HistoryDatabase historyDatabase;
-
-    UA_Boolean accessHistoryDataCapability;
-    UA_UInt32  maxReturnDataValues; /* 0 -> unlimited size */
-
-    UA_Boolean accessHistoryEventsCapability;
-    UA_UInt32  maxReturnEventValues; /* 0 -> unlimited size */
-
-    UA_Boolean insertDataCapability;
-    UA_Boolean insertEventCapability;
-    UA_Boolean insertAnnotationsCapability;
-
-    UA_Boolean replaceDataCapability;
-    UA_Boolean replaceEventCapability;
-
-    UA_Boolean updateDataCapability;
-    UA_Boolean updateEventCapability;
-
-    UA_Boolean deleteRawCapability;
-    UA_Boolean deleteEventCapability;
-    UA_Boolean deleteAtTimeDataCapability;
-#endif
-};
-
-void UA_EXPORT
-UA_ServerConfig_clean(UA_ServerConfig *config);
-
-/* Set a custom hostname in server configuration */
-UA_EXPORT void
-UA_ServerConfig_setCustomHostname(UA_ServerConfig *config,
-                                  const UA_String customHostname);
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_CONFIG_H_ */
diff --git a/ext/open62541/include/open62541/server_pubsub.h b/ext/open62541/include/open62541/server_pubsub.h
deleted file mode 100644
index b2a5c02..0000000
--- a/ext/open62541/include/open62541/server_pubsub.h
+++ /dev/null
@@ -1,468 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-#ifndef UA_SERVER_PUBSUB_H
-#define UA_SERVER_PUBSUB_H
-
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_PUBSUB
-
-/**
- * .. _pubsub:
- *
- * Publish/Subscribe
- * =================
- *
- * Work in progress!
- * This part will be a new chapter later.
- *
- * TODO: write general PubSub introduction
- *
- * The Publish/Subscribe (PubSub) extension for OPC UA enables fast and efficient
- * 1:m communication. The PubSub extension is protocol agnostic and can be used
- * with broker based protocols like MQTT and AMQP or brokerless implementations like UDP-Multicasting.
- *
- * The PubSub API uses the following scheme:
- *
- * 1. Create a configuration for the needed PubSub element.
- *
- * 2. Call the add[element] function and pass in the configuration.
- *
- * 3. The add[element] function returns the unique nodeId of the internally created element.
- *
- * Take a look on the PubSub Tutorials for mor details about the API usage.::
- *
- *  +-----------+
- *  | UA_Server |
- *  +-----------+
- *   |    |
- *   |    |
- *   |    |
- *   |    |  +----------------------+
- *   |    +--> UA_PubSubConnection  |  UA_Server_addPubSubConnection
- *   |       +----------------------+
- *   |        |    |
- *   |        |    |    +----------------+
- *   |        |    +----> UA_WriterGroup |  UA_PubSubConnection_addWriterGroup
- *   |        |         +----------------+
- *   |        |              |
- *   |        |              |    +------------------+
- *   |        |              +----> UA_DataSetWriter |  UA_WriterGroup_addDataSetWriter  +-+
- *   |        |                   +------------------+                                     |
- *   |        |                                                                            |
- *   |        |         +----------------+                                                 | r
- *   |        +---------> UA_ReaderGroup |                                                 | e
- *   |                  +----------------+                                                 | f
- *   |                                                                                     |
- *   |       +---------------------------+                                                 |
- *   +-------> UA_PubSubPublishedDataSet |  UA_Server_addPublishedDataSet                <-+
- *           +---------------------------+
- *                 |
- *                 |    +-----------------+
- *                 +----> UA_DataSetField |  UA_PublishedDataSet_addDataSetField
- *                      +-----------------+
- *
- * PubSub compile flags
- * --------------------
- *
- * **UA_ENABLE_PUBSUB**
- *  Enable the experimental OPC UA PubSub support. The option will include the PubSub UDP multicast plugin. Disabled by default.
- * **UA_ENABLE_PUBSUB_DELTAFRAMES**
- *  The PubSub messages differentiate between keyframe (all published values contained) and deltaframe (only changed values contained) messages.
- *  Deltaframe messages creation consumes some additional ressources and can be disabled with this flag. Disabled by default.
- *  Compile the human-readable name of the StatusCodes into the binary. Disabled by default.
- * **UA_ENABLE_PUBSUB_INFORMATIONMODEL**
- *  Enable the information model representation of the PubSub configuration. For more details take a look at the following section `PubSub Information Model Representation`. Disabled by default.
- *
- * PubSub Information Model Representation
- * ---------------------------------------
- * .. _pubsub_informationmodel:
- *
- * The complete PubSub configuration is available inside the information model.
- * The entry point is the node 'PublishSubscribe, located under the Server node.
- * The standard defines for PubSub no new Service set. The configuration can optionally
- * done over methods inside the information model. The information model representation
- * of the current PubSub configuration is generated automatically. This feature
- * can enabled/disable by changing the UA_ENABLE_PUBSUB_INFORMATIONMODEL option.
- *
- * Connections
- * -----------
- * The PubSub connections are the abstraction between the concrete transport protocol
- * and the PubSub functionality. It is possible to create multiple connections with
- * different transport protocols at runtime.
- *
- * Take a look on the PubSub Tutorials for mor details about the API usage.
- */
-
-typedef enum {
-    UA_PUBSUB_PUBLISHERID_NUMERIC,
-    UA_PUBSUB_PUBLISHERID_STRING
-} UA_PublisherIdType;
-
-typedef struct {
-    UA_String name;
-    UA_Boolean enabled;
-    UA_PublisherIdType publisherIdType;
-    union { /* std: valid types UInt or String */
-        UA_UInt32 numeric;
-        UA_String string;
-    } publisherId;
-    UA_String transportProfileUri;
-    UA_Variant address;
-    size_t connectionPropertiesSize;
-    UA_KeyValuePair *connectionProperties;
-    UA_Variant connectionTransportSettings;
-} UA_PubSubConnectionConfig;
-
-UA_StatusCode UA_EXPORT
-UA_Server_addPubSubConnection(UA_Server *server,
-                              const UA_PubSubConnectionConfig *connectionConfig,
-                              UA_NodeId *connectionIdentifier);
-
-/* Returns a deep copy of the config */
-UA_StatusCode UA_EXPORT
-UA_Server_getPubSubConnectionConfig(UA_Server *server,
-                                    const UA_NodeId connection,
-                                    UA_PubSubConnectionConfig *config);
-
-/* Remove Connection, identified by the NodeId. Deletion of Connection
- * removes all contained WriterGroups and Writers. */
-UA_StatusCode UA_EXPORT
-UA_Server_removePubSubConnection(UA_Server *server, const UA_NodeId connection);
-
-/**
- * PublishedDataSets
- * -----------------
- * The PublishedDataSets (PDS) are containers for the published information. The
- * PDS contain the published variables and meta informations. The metadata is
- * commonly autogenerated or given as constant argument as part of the template
- * functions. The template functions are standard defined and intended for
- * configuration tools. You should normally create a empty PDS and call the
- * functions to add new fields. */
-
-/* The UA_PUBSUB_DATASET_PUBLISHEDITEMS has currently no additional members and
- * thus no dedicated config structure. */
-
-typedef enum {
-    UA_PUBSUB_DATASET_PUBLISHEDITEMS,
-    UA_PUBSUB_DATASET_PUBLISHEDEVENTS,
-    UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE,
-    UA_PUBSUB_DATASET_PUBLISHEDEVENTS_TEMPLATE,
-} UA_PublishedDataSetType;
-
-typedef struct {
-    UA_DataSetMetaDataType metaData;
-    size_t variablesToAddSize;
-    UA_PublishedVariableDataType *variablesToAdd;
-} UA_PublishedDataItemsTemplateConfig;
-
-typedef struct {
-    UA_NodeId eventNotfier;
-    UA_ContentFilter filter;
-} UA_PublishedEventConfig;
-
-typedef struct {
-    UA_DataSetMetaDataType metaData;
-    UA_NodeId eventNotfier;
-    size_t selectedFieldsSize;
-    UA_SimpleAttributeOperand *selectedFields;
-    UA_ContentFilter filter;
-} UA_PublishedEventTemplateConfig;
-
-/* Configuration structure for PublishedDataSet */
-typedef struct {
-    UA_String name;
-    UA_PublishedDataSetType publishedDataSetType;
-    union {
-        /* The UA_PUBSUB_DATASET_PUBLISHEDITEMS has currently no additional members
-         * and thus no dedicated config structure.*/
-        UA_PublishedDataItemsTemplateConfig itemsTemplate;
-        UA_PublishedEventConfig event;
-        UA_PublishedEventTemplateConfig eventTemplate;
-    } config;
-} UA_PublishedDataSetConfig;
-
-void UA_EXPORT
-UA_PublishedDataSetConfig_deleteMembers(UA_PublishedDataSetConfig *pdsConfig);
-
-typedef struct {
-    UA_StatusCode addResult;
-    size_t fieldAddResultsSize;
-    UA_StatusCode *fieldAddResults;
-    UA_ConfigurationVersionDataType configurationVersion;
-} UA_AddPublishedDataSetResult;
-
-UA_AddPublishedDataSetResult UA_EXPORT
-UA_Server_addPublishedDataSet(UA_Server *server,
-                              const UA_PublishedDataSetConfig *publishedDataSetConfig,
-                              UA_NodeId *pdsIdentifier);
-
-/* Returns a deep copy of the config */
-UA_StatusCode UA_EXPORT
-UA_Server_getPublishedDataSetConfig(UA_Server *server, const UA_NodeId pds,
-                                    UA_PublishedDataSetConfig *config);
-
-/* Remove PublishedDataSet, identified by the NodeId. Deletion of PDS removes
- * all contained and linked PDS Fields. Connected WriterGroups will be also
- * removed. */
-UA_StatusCode UA_EXPORT
-UA_Server_removePublishedDataSet(UA_Server *server, const UA_NodeId pds);
-
-/**
- * DataSetFields
- * -------------
- * The description of published variables is named DataSetField. Each
- * DataSetField contains the selection of one information model node. The
- * DataSetField has additional parameters for the publishing, sampling and error
- * handling process. */
-
-typedef struct{
-    UA_ConfigurationVersionDataType configurationVersion;
-    UA_String fieldNameAlias;
-    UA_Boolean promotedField;
-    UA_PublishedVariableDataType publishParameters;
-} UA_DataSetVariableConfig;
-
-typedef enum {
-    UA_PUBSUB_DATASETFIELD_VARIABLE,
-    UA_PUBSUB_DATASETFIELD_EVENT
-} UA_DataSetFieldType;
-
-typedef struct {
-    UA_DataSetFieldType dataSetFieldType;
-    union {
-        /* events need other config later */
-        UA_DataSetVariableConfig variable;
-    } field;
-} UA_DataSetFieldConfig;
-
-void UA_EXPORT
-UA_DataSetFieldConfig_deleteMembers(UA_DataSetFieldConfig *dataSetFieldConfig);
-
-typedef struct {
-    UA_StatusCode result;
-    UA_ConfigurationVersionDataType configurationVersion;
-} UA_DataSetFieldResult;
-
-UA_DataSetFieldResult UA_EXPORT
-UA_Server_addDataSetField(UA_Server *server,
-                          const UA_NodeId publishedDataSet,
-                          const UA_DataSetFieldConfig *fieldConfig,
-                          UA_NodeId *fieldIdentifier);
-
-/* Returns a deep copy of the config */
-UA_StatusCode UA_EXPORT
-UA_Server_getDataSetFieldConfig(UA_Server *server, const UA_NodeId dsf,
-                                UA_DataSetFieldConfig *config);
-
-UA_DataSetFieldResult UA_EXPORT
-UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf);
-
-/**
- * WriterGroup
- * -----------
- * All WriterGroups are created within a PubSubConnection and automatically
- * deleted if the connection is removed. The WriterGroup is primary used as
- * container for :ref:`dsw` and network message settings. The WriterGroup can be
- * imagined as producer of the network messages. The creation of network
- * messages is controlled by parameters like the publish interval, which is e.g.
- * contained in the WriterGroup. */
-
-typedef enum {
-    UA_PUBSUB_ENCODING_BINARY,
-    UA_PUBSUB_ENCODING_JSON,
-    UA_PUBSUB_ENCODING_UADP
-} UA_PubSubEncodingType;
-
-typedef struct {
-    UA_String name;
-    UA_Boolean enabled;
-    UA_UInt16 writerGroupId;
-    UA_Duration publishingInterval;
-    UA_Double keepAliveTime;
-    UA_Byte priority;
-    UA_MessageSecurityMode securityMode;
-    UA_ExtensionObject transportSettings;
-    UA_ExtensionObject messageSettings;
-    size_t groupPropertiesSize;
-    UA_KeyValuePair *groupProperties;
-    UA_PubSubEncodingType encodingMimeType;
-
-    /* non std. config parameter. maximum count of embedded DataSetMessage in
-     * one NetworkMessage */
-    UA_UInt16 maxEncapsulatedDataSetMessageCount;
-} UA_WriterGroupConfig;
-
-void UA_EXPORT
-UA_WriterGroupConfig_deleteMembers(UA_WriterGroupConfig *writerGroupConfig);
-
-/* Add a new WriterGroup to an existing Connection */
-UA_StatusCode UA_EXPORT
-UA_Server_addWriterGroup(UA_Server *server, const UA_NodeId connection,
-                         const UA_WriterGroupConfig *writerGroupConfig,
-                         UA_NodeId *writerGroupIdentifier);
-
-/* Returns a deep copy of the config */
-UA_StatusCode UA_EXPORT
-UA_Server_getWriterGroupConfig(UA_Server *server, const UA_NodeId writerGroup,
-                               UA_WriterGroupConfig *config);
-
-UA_StatusCode UA_EXPORT
-UA_Server_updateWriterGroupConfig(UA_Server *server, UA_NodeId writerGroupIdentifier,
-                                  const UA_WriterGroupConfig *config);
-
-UA_StatusCode UA_EXPORT
-UA_Server_removeWriterGroup(UA_Server *server, const UA_NodeId writerGroup);
-
-/**
- * .. _dsw:
- *
- * DataSetWriter
- * -------------
- * The DataSetWriters are the glue between the WriterGroups and the
- * PublishedDataSets. The DataSetWriter contain configuration parameters and
- * flags which influence the creation of DataSet messages. These messages are
- * encapsulated inside the network message. The DataSetWriter must be linked
- * with an existing PublishedDataSet and be contained within a WriterGroup. */
-
-typedef struct {
-    UA_String name;
-    UA_UInt16 dataSetWriterId;
-    UA_DataSetFieldContentMask dataSetFieldContentMask;
-    UA_UInt32 keyFrameCount;
-    UA_ExtensionObject messageSettings;
-    UA_String dataSetName;
-    size_t dataSetWriterPropertiesSize;
-    UA_KeyValuePair *dataSetWriterProperties;
-} UA_DataSetWriterConfig;
-
-void UA_EXPORT
-UA_DataSetWriterConfig_deleteMembers(UA_DataSetWriterConfig *pdsConfig);
-
-/* Add a new DataSetWriter to a existing WriterGroup. The DataSetWriter must be
- * coupled with a PublishedDataSet on creation.
- *
- * Part 14, 7.1.5.2.1 defines: The link between the PublishedDataSet and
- * DataSetWriter shall be created when an instance of the DataSetWriterType is
- * created. */
-UA_StatusCode UA_EXPORT
-UA_Server_addDataSetWriter(UA_Server *server,
-                           const UA_NodeId writerGroup, const UA_NodeId dataSet,
-                           const UA_DataSetWriterConfig *dataSetWriterConfig,
-                           UA_NodeId *writerIdentifier);
-
-/* Returns a deep copy of the config */
-UA_StatusCode UA_EXPORT
-UA_Server_getDataSetWriterConfig(UA_Server *server, const UA_NodeId dsw,
-                                 UA_DataSetWriterConfig *config);
-
-UA_StatusCode UA_EXPORT
-UA_Server_removeDataSetWriter(UA_Server *server, const UA_NodeId dsw);
-
-/**
- * DataSetReader
- * -------------
- * DataSetReader can receive NetworkMessages with the DataSet
- * of interest sent by the Publisher. DataSetReaders represent
- * the configuration necessary to receive and process DataSetMessages
- * on the Subscriber side */
-
-/* Parameters for PubSubSecurity */
-typedef struct {
-    UA_Int32 securityMode;          /* placeholder datatype 'MessageSecurityMode' */
-    UA_String securityGroupId;
-    size_t keyServersSize;
-    UA_Int32 *keyServers;
-} UA_PubSubSecurityParameters;
-
-/* Parameters for PubSub DataSetReader Configuration */
-typedef struct {
-    UA_String name;
-    UA_Variant publisherId;
-    UA_UInt16 writerGroupId;
-    UA_UInt16 dataSetWriterId;
-    UA_DataSetMetaDataType dataSetMetaData;
-    UA_DataSetFieldContentMask dataSetFieldContentMask;
-    UA_Double messageReceiveTimeout;
-    UA_PubSubSecurityParameters securityParameters;
-    UA_UadpDataSetReaderMessageDataType messageSettings;
-    UA_TargetVariablesDataType subscribedDataSetTarget;
-} UA_DataSetReaderConfig;
-
-/* Update configuration to the dataSetReader */
-UA_StatusCode
-UA_Server_DataSetReader_updateConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier,
-                                   UA_NodeId readerGroupIdentifier, const UA_DataSetReaderConfig *config);
-
-/* Get configuration of the dataSetReader */
-UA_StatusCode
-UA_Server_DataSetReader_getConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier,
-                                 UA_DataSetReaderConfig *config);
-
-/* Return Status Code after creating TargetVariables in Subscriber AddressSpace
- * TargetVariables define a list of variable mappings between received DataSet fields
- * and the TargetVariables in the Subscriber AddressSpace */
-UA_StatusCode
-UA_Server_DataSetReader_createTargetVariables(UA_Server *server, UA_NodeId dataSetReaderIdentifier,
-                                             UA_TargetVariablesDataType* targetVariables);
-
-/* To Do:Implementation of SubscribedDataSetMirrorType
- * UA_StatusCode
- * A_PubSubDataSetReader_createDataSetMirror(UA_Server *server, UA_NodeId dataSetReaderIdentifier,
- * UA_SubscribedDataSetMirrorDataType* mirror) */
-
-/**
- * ReaderGroup
- * -----------
- * All ReaderGroups are created within a PubSubConnection and automatically
- * deleted if the connection is removed. */
-
-/* ReaderGroup configuration */
-typedef struct {
-    UA_String name;
-    UA_PubSubSecurityParameters securityParameters;
-} UA_ReaderGroupConfig;
-
-/* Add DataSetReader to the ReaderGroup */
-UA_StatusCode
-UA_Server_addDataSetReader(UA_Server *server, UA_NodeId readerGroupIdentifier,
-                                      const UA_DataSetReaderConfig *dataSetReaderConfig,
-                                      UA_NodeId *readerIdentifier);
-
-/* Remove DataSetReader from ReaderGroup */
-UA_StatusCode
-UA_Server_removeDataSetReader(UA_Server *server, UA_NodeId readerIdentifier);
-
-/* To Do: Update Configuration of ReaderGroup */
-UA_StatusCode
-UA_Server_ReaderGroup_updateConfig(UA_Server *server, UA_NodeId readerGroupIdentifier,
-                                  const UA_ReaderGroupConfig *config);
-
-/* Get configuraiton of ReaderGroup */
-UA_StatusCode
-UA_Server_ReaderGroup_getConfig(UA_Server *server, UA_NodeId readerGroupIdentifier,
-                               UA_ReaderGroupConfig *config);
-
-/* Add ReaderGroup to the created connection */
-UA_StatusCode
-UA_Server_addReaderGroup(UA_Server *server, UA_NodeId connectionIdentifier,
-                                   const UA_ReaderGroupConfig *readerGroupConfig,
-                                   UA_NodeId *readerGroupIdentifier);
-
-/* Remove ReaderGroup from connection */
-UA_StatusCode
-UA_Server_removeReaderGroup(UA_Server *server, UA_NodeId groupIdentifier);
-
-#endif /* UA_ENABLE_PUBSUB */
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_PUBSUB_H */
diff --git a/ext/open62541/include/open62541/types.h b/ext/open62541/include/open62541/types.h
deleted file mode 100644
index 1d40f86..0000000
--- a/ext/open62541/include/open62541/types.h
+++ /dev/null
@@ -1,1020 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014 (c) Leon Urbas
- *    Copyright 2014, 2016-2017 (c) Florian Palm
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015 (c) Nick Goossens
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#ifndef UA_TYPES_H_
-#define UA_TYPES_H_
-
-#include <open62541/config.h>
-#include <open62541/constants.h>
-#include <open62541/statuscodes.h>
-
-_UA_BEGIN_DECLS
-
-#define UA_BUILTIN_TYPES_COUNT 25U
-
-/**
- * .. _types:
- *
- * Data Types
- * ==========
- *
- * The OPC UA protocol defines 25 builtin data types and three ways of combining
- * them into higher-order types: arrays, structures and unions. In open62541,
- * only the builtin data types are defined manually. All other data types are
- * generated from standard XML definitions. Their exact definitions can be
- * looked up at https://opcfoundation.org/UA/schemas/Opc.Ua.Types.bsd.
- *
- * For users that are new to open62541, take a look at the :ref:`tutorial for
- * working with data types<types-tutorial>` before diving into the
- * implementation details.
- *
- * Builtin Types
- * -------------
- *
- * Boolean
- * ^^^^^^^
- * A two-state logical value (true or false). */
-typedef bool UA_Boolean;
-#define UA_TRUE true UA_INTERNAL_DEPRECATED
-#define UA_FALSE false UA_INTERNAL_DEPRECATED
-
-/**
- * SByte
- * ^^^^^
- * An integer value between -128 and 127. */
-typedef int8_t UA_SByte;
-#define UA_SBYTE_MIN (-128)
-#define UA_SBYTE_MAX 127
-
-/**
- * Byte
- * ^^^^
- * An integer value between 0 and 255. */
-typedef uint8_t UA_Byte;
-#define UA_BYTE_MIN 0
-#define UA_BYTE_MAX 255
-
-/**
- * Int16
- * ^^^^^
- * An integer value between -32 768 and 32 767. */
-typedef int16_t UA_Int16;
-#define UA_INT16_MIN (-32768)
-#define UA_INT16_MAX 32767
-
-/**
- * UInt16
- * ^^^^^^
- * An integer value between 0 and 65 535. */
-typedef uint16_t UA_UInt16;
-#define UA_UINT16_MIN 0
-#define UA_UINT16_MAX 65535
-
-/**
- * Int32
- * ^^^^^
- * An integer value between -2 147 483 648 and 2 147 483 647. */
-typedef int32_t UA_Int32;
-#define UA_INT32_MIN (-2147483648)
-#define UA_INT32_MAX 2147483647
-
-/**
- * UInt32
- * ^^^^^^
- * An integer value between 0 and 4 294 967 295. */
-typedef uint32_t UA_UInt32;
-#define UA_UINT32_MIN 0
-#define UA_UINT32_MAX 4294967295
-
-/**
- * Int64
- * ^^^^^
- * An integer value between -9 223 372 036 854 775 808 and
- * 9 223 372 036 854 775 807. */
-typedef int64_t UA_Int64;
-#define UA_INT64_MIN ((int64_t)-9223372036854775808)
-#define UA_INT64_MAX (int64_t)9223372036854775807
-
-/**
- * UInt64
- * ^^^^^^
- * An integer value between 0 and 18 446 744 073 709 551 615. */
-typedef uint64_t UA_UInt64;
-#define UA_UINT64_MIN (int64_t)0
-#define UA_UINT64_MAX (int64_t)18446744073709551615
-
-/**
- * Float
- * ^^^^^
- * An IEEE single precision (32 bit) floating point value. */
-typedef float UA_Float;
-
-/**
- * Double
- * ^^^^^^
- * An IEEE double precision (64 bit) floating point value. */
-typedef double UA_Double;
-
-/**
- * .. _statuscode:
- *
- * StatusCode
- * ^^^^^^^^^^
- * A numeric identifier for a error or condition that is associated with a value
- * or an operation. See the section :ref:`statuscodes` for the meaning of a
- * specific code. */
-typedef uint32_t UA_StatusCode;
-
-/* Returns the human-readable name of the StatusCode. If no matching StatusCode
- * is found, a default string for "Unknown" is returned. This feature might be
- * disabled to create a smaller binary with the
- * UA_ENABLE_STATUSCODE_DESCRIPTIONS build-flag. Then the function returns an
- * empty string for every StatusCode. */
-UA_EXPORT const char *
-UA_StatusCode_name(UA_StatusCode code);
-
-/**
- * String
- * ^^^^^^
- * A sequence of Unicode characters. Strings are just an array of UA_Byte. */
-typedef struct {
-    size_t length; /* The length of the string */
-    UA_Byte *data; /* The content (not null-terminated) */
-} UA_String;
-
-/* Copies the content on the heap. Returns a null-string when alloc fails */
-UA_String UA_EXPORT UA_String_fromChars(const char *src) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-UA_Boolean UA_EXPORT UA_String_equal(const UA_String *s1, const UA_String *s2);
-
-UA_EXPORT extern const UA_String UA_STRING_NULL;
-
-/**
- * ``UA_STRING`` returns a string pointing to the original char-array.
- * ``UA_STRING_ALLOC`` is shorthand for ``UA_String_fromChars`` and makes a copy
- * of the char-array. */
-static UA_INLINE UA_String
-UA_STRING(char *chars) {
-    UA_String s; s.length = 0; s.data = NULL;
-    if(!chars)
-        return s;
-    s.length = strlen(chars); s.data = (UA_Byte*)chars; return s;
-}
-
-#define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS)
-
-/* Define strings at compile time (in ROM) */
-#define UA_STRING_STATIC(CHARS) {sizeof(CHARS)-1, (UA_Byte*)CHARS}
-
-/**
- * .. _datetime:
- *
- * DateTime
- * ^^^^^^^^
- * An instance in time. A DateTime value is encoded as a 64-bit signed integer
- * which represents the number of 100 nanosecond intervals since January 1, 1601
- * (UTC).
- *
- * The methods providing an interface to the system clock are provided by a
- * "plugin" that is statically linked with the library. */
-
-typedef int64_t UA_DateTime;
-
-/* Multiples to convert durations to DateTime */
-#define UA_DATETIME_USEC 10LL
-#define UA_DATETIME_MSEC (UA_DATETIME_USEC * 1000LL)
-#define UA_DATETIME_SEC (UA_DATETIME_MSEC * 1000LL)
-
-/* The current time in UTC time */
-UA_DateTime UA_EXPORT UA_DateTime_now(void);
-
-/* Offset between local time and UTC time */
-UA_Int64 UA_EXPORT UA_DateTime_localTimeUtcOffset(void);
-
-/* CPU clock invariant to system time changes. Use only to measure durations,
- * not absolute time. */
-UA_DateTime UA_EXPORT UA_DateTime_nowMonotonic(void);
-
-/* Represents a Datetime as a structure */
-typedef struct UA_DateTimeStruct {
-    UA_UInt16 nanoSec;
-    UA_UInt16 microSec;
-    UA_UInt16 milliSec;
-    UA_UInt16 sec;
-    UA_UInt16 min;
-    UA_UInt16 hour;
-    UA_UInt16 day;
-    UA_UInt16 month;
-    UA_UInt16 year;
-} UA_DateTimeStruct;
-
-UA_DateTimeStruct UA_EXPORT UA_DateTime_toStruct(UA_DateTime t);
-
-/* The C99 standard (7.23.1) says: "The range and precision of times
- * representable in clock_t and time_t are implementation-defined." On most
- * systems, time_t is a 4 or 8 byte integer counting seconds since the UTC Unix
- * epoch. The following methods are used for conversion. */
-
-/* Datetime of 1 Jan 1970 00:00 */
-#define UA_DATETIME_UNIX_EPOCH (11644473600LL * UA_DATETIME_SEC)
-
-static UA_INLINE UA_Int64
-UA_DateTime_toUnixTime(UA_DateTime date) {
-    return (date - UA_DATETIME_UNIX_EPOCH) / UA_DATETIME_SEC;
-}
-
-static UA_INLINE UA_DateTime
-UA_DateTime_fromUnixTime(UA_Int64 unixDate) {
-    return (unixDate * UA_DATETIME_SEC) + UA_DATETIME_UNIX_EPOCH;
-}
-
-/**
- * Guid
- * ^^^^
- * A 16 byte value that can be used as a globally unique identifier. */
-typedef struct {
-    UA_UInt32 data1;
-    UA_UInt16 data2;
-    UA_UInt16 data3;
-    UA_Byte   data4[8];
-} UA_Guid;
-
-UA_Boolean UA_EXPORT UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2);
-
-UA_EXPORT extern const UA_Guid UA_GUID_NULL;
-
-/**
- * ByteString
- * ^^^^^^^^^^
- * A sequence of octets. */
-typedef UA_String UA_ByteString;
-
-static UA_INLINE UA_Boolean
-UA_ByteString_equal(const UA_ByteString *string1,
-                    const UA_ByteString *string2) {
-    return UA_String_equal((const UA_String*)string1,
-                           (const UA_String*)string2);
-}
-
-/* Allocates memory of size length for the bytestring.
- * The content is not set to zero. */
-UA_StatusCode UA_EXPORT
-UA_ByteString_allocBuffer(UA_ByteString *bs, size_t length);
-
-UA_EXPORT extern const UA_ByteString UA_BYTESTRING_NULL;
-
-static UA_INLINE UA_ByteString
-UA_BYTESTRING(char *chars) {
-    UA_ByteString bs; bs.length = 0; bs.data = NULL;
-    if(!chars)
-        return bs;
-    bs.length = strlen(chars); bs.data = (UA_Byte*)chars; return bs;
-}
-
-static UA_INLINE UA_ByteString
-UA_BYTESTRING_ALLOC(const char *chars) {
-    UA_String str = UA_String_fromChars(chars); UA_ByteString bstr;
-    bstr.length = str.length; bstr.data = str.data; return bstr;
-}
-
-/**
- * XmlElement
- * ^^^^^^^^^^
- * An XML element. */
-typedef UA_String UA_XmlElement;
-
-/**
- * .. _nodeid:
- *
- * NodeId
- * ^^^^^^
- * An identifier for a node in the address space of an OPC UA Server. */
-enum UA_NodeIdType {
-    UA_NODEIDTYPE_NUMERIC    = 0, /* In the binary encoding, this can also
-                                   * become 1 or 2 (two-byte and four-byte
-                                   * encoding of small numeric nodeids) */
-    UA_NODEIDTYPE_STRING     = 3,
-    UA_NODEIDTYPE_GUID       = 4,
-    UA_NODEIDTYPE_BYTESTRING = 5
-};
-
-typedef struct {
-    UA_UInt16 namespaceIndex;
-    enum UA_NodeIdType identifierType;
-    union {
-        UA_UInt32     numeric;
-        UA_String     string;
-        UA_Guid       guid;
-        UA_ByteString byteString;
-    } identifier;
-} UA_NodeId;
-
-UA_EXPORT extern const UA_NodeId UA_NODEID_NULL;
-
-UA_Boolean UA_EXPORT UA_NodeId_isNull(const UA_NodeId *p);
-
-UA_Order UA_EXPORT UA_NodeId_order(const UA_NodeId *n1, const UA_NodeId *n2);
-
-static UA_INLINE UA_Boolean
-UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2) {
-    return (UA_NodeId_order(n1, n2) == UA_ORDER_EQ);
-}
-
-/* Returns a non-cryptographic hash for the NodeId */
-UA_UInt32 UA_EXPORT UA_NodeId_hash(const UA_NodeId *n);
-
-/** The following functions are shorthand for creating NodeIds. */
-static UA_INLINE UA_NodeId
-UA_NODEID_NUMERIC(UA_UInt16 nsIndex, UA_UInt32 identifier) {
-    UA_NodeId id; id.namespaceIndex = nsIndex;
-    id.identifierType = UA_NODEIDTYPE_NUMERIC;
-    id.identifier.numeric = identifier; return id;
-}
-
-static UA_INLINE UA_NodeId
-UA_NODEID_STRING(UA_UInt16 nsIndex, char *chars) {
-    UA_NodeId id; id.namespaceIndex = nsIndex;
-    id.identifierType = UA_NODEIDTYPE_STRING;
-    id.identifier.string = UA_STRING(chars); return id;
-}
-
-static UA_INLINE UA_NodeId
-UA_NODEID_STRING_ALLOC(UA_UInt16 nsIndex, const char *chars) {
-    UA_NodeId id; id.namespaceIndex = nsIndex;
-    id.identifierType = UA_NODEIDTYPE_STRING;
-    id.identifier.string = UA_STRING_ALLOC(chars); return id;
-}
-
-static UA_INLINE UA_NodeId
-UA_NODEID_GUID(UA_UInt16 nsIndex, UA_Guid guid) {
-    UA_NodeId id; id.namespaceIndex = nsIndex;
-    id.identifierType = UA_NODEIDTYPE_GUID;
-    id.identifier.guid = guid; return id;
-}
-
-static UA_INLINE UA_NodeId
-UA_NODEID_BYTESTRING(UA_UInt16 nsIndex, char *chars) {
-    UA_NodeId id; id.namespaceIndex = nsIndex;
-    id.identifierType = UA_NODEIDTYPE_BYTESTRING;
-    id.identifier.byteString = UA_BYTESTRING(chars); return id;
-}
-
-static UA_INLINE UA_NodeId
-UA_NODEID_BYTESTRING_ALLOC(UA_UInt16 nsIndex, const char *chars) {
-    UA_NodeId id; id.namespaceIndex = nsIndex;
-    id.identifierType = UA_NODEIDTYPE_BYTESTRING;
-    id.identifier.byteString = UA_BYTESTRING_ALLOC(chars); return id;
-}
-
-/**
- * ExpandedNodeId
- * ^^^^^^^^^^^^^^
- * A NodeId that allows the namespace URI to be specified instead of an index. */
-typedef struct {
-    UA_NodeId nodeId;
-    UA_String namespaceUri;
-    UA_UInt32 serverIndex;
-} UA_ExpandedNodeId;
-
-UA_EXPORT extern const UA_ExpandedNodeId UA_EXPANDEDNODEID_NULL;
-
-UA_Order UA_EXPORT
-UA_ExpandedNodeId_order(const UA_ExpandedNodeId *n1, const UA_ExpandedNodeId *n2);
-
-static UA_INLINE UA_Boolean
-UA_ExpandedNodeId_equal(const UA_ExpandedNodeId *n1, const UA_ExpandedNodeId *n2) {
-    return (UA_ExpandedNodeId_order(n1, n2) == UA_ORDER_EQ);
-}
-
-/* Returns a non-cryptographic hash for the NodeId */
-UA_UInt32 UA_EXPORT UA_ExpandedNodeId_hash(const UA_ExpandedNodeId *n);
-
-/** The following functions are shorthand for creating ExpandedNodeIds. */
-static UA_INLINE UA_ExpandedNodeId
-UA_EXPANDEDNODEID_NUMERIC(UA_UInt16 nsIndex, UA_UInt32 identifier) {
-    UA_ExpandedNodeId id; id.nodeId = UA_NODEID_NUMERIC(nsIndex, identifier);
-    id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id;
-}
-
-static UA_INLINE UA_ExpandedNodeId
-UA_EXPANDEDNODEID_STRING(UA_UInt16 nsIndex, char *chars) {
-    UA_ExpandedNodeId id; id.nodeId = UA_NODEID_STRING(nsIndex, chars);
-    id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id;
-}
-
-static UA_INLINE UA_ExpandedNodeId
-UA_EXPANDEDNODEID_STRING_ALLOC(UA_UInt16 nsIndex, const char *chars) {
-    UA_ExpandedNodeId id; id.nodeId = UA_NODEID_STRING_ALLOC(nsIndex, chars);
-    id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id;
-}
-
-static UA_INLINE UA_ExpandedNodeId
-UA_EXPANDEDNODEID_STRING_GUID(UA_UInt16 nsIndex, UA_Guid guid) {
-    UA_ExpandedNodeId id; id.nodeId = UA_NODEID_GUID(nsIndex, guid);
-    id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id;
-}
-
-static UA_INLINE UA_ExpandedNodeId
-UA_EXPANDEDNODEID_BYTESTRING(UA_UInt16 nsIndex, char *chars) {
-    UA_ExpandedNodeId id; id.nodeId = UA_NODEID_BYTESTRING(nsIndex, chars);
-    id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id;
-}
-
-static UA_INLINE UA_ExpandedNodeId
-UA_EXPANDEDNODEID_BYTESTRING_ALLOC(UA_UInt16 nsIndex, const char *chars) {
-    UA_ExpandedNodeId id; id.nodeId = UA_NODEID_BYTESTRING_ALLOC(nsIndex, chars);
-    id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id;
-}
-
-/**
- * .. _qualifiedname:
- *
- * QualifiedName
- * ^^^^^^^^^^^^^
- * A name qualified by a namespace. */
-typedef struct {
-    UA_UInt16 namespaceIndex;
-    UA_String name;
-} UA_QualifiedName;
-
-static UA_INLINE UA_Boolean
-UA_QualifiedName_isNull(const UA_QualifiedName *q) {
-    return (q->namespaceIndex == 0 && q->name.length == 0);
-}
-
-static UA_INLINE UA_QualifiedName
-UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) {
-    UA_QualifiedName qn; qn.namespaceIndex = nsIndex;
-    qn.name = UA_STRING(chars); return qn;
-}
-
-static UA_INLINE UA_QualifiedName
-UA_QUALIFIEDNAME_ALLOC(UA_UInt16 nsIndex, const char *chars) {
-    UA_QualifiedName qn; qn.namespaceIndex = nsIndex;
-    qn.name = UA_STRING_ALLOC(chars); return qn;
-}
-
-UA_Boolean UA_EXPORT
-UA_QualifiedName_equal(const UA_QualifiedName *qn1,
-                       const UA_QualifiedName *qn2);
-
-/**
- * LocalizedText
- * ^^^^^^^^^^^^^
- * Human readable text with an optional locale identifier. */
-typedef struct {
-    UA_String locale;
-    UA_String text;
-} UA_LocalizedText;
-
-static UA_INLINE UA_LocalizedText
-UA_LOCALIZEDTEXT(char *locale, char *text) {
-    UA_LocalizedText lt; lt.locale = UA_STRING(locale);
-    lt.text = UA_STRING(text); return lt;
-}
-
-static UA_INLINE UA_LocalizedText
-UA_LOCALIZEDTEXT_ALLOC(const char *locale, const char *text) {
-    UA_LocalizedText lt; lt.locale = UA_STRING_ALLOC(locale);
-    lt.text = UA_STRING_ALLOC(text); return lt;
-}
-
-/**
- * .. _numericrange:
- *
- * NumericRange
- * ^^^^^^^^^^^^
- *
- * NumericRanges are used to indicate subsets of a (multidimensional) array.
- * They no official data type in the OPC UA standard and are transmitted only
- * with a string encoding, such as "1:2,0:3,5". The colon separates min/max
- * index and the comma separates dimensions. A single value indicates a range
- * with a single element (min==max). */
-typedef struct {
-    UA_UInt32 min;
-    UA_UInt32 max;
-} UA_NumericRangeDimension;
-
-typedef struct  {
-    size_t dimensionsSize;
-    UA_NumericRangeDimension *dimensions;
-} UA_NumericRange;
-
-UA_StatusCode UA_EXPORT
-UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str);
-
-
-/**
- * .. _variant:
- *
- * Variant
- * ^^^^^^^
- *
- * Variants may contain values of any type together with a description of the
- * content. See the section on :ref:`generic-types` on how types are described.
- * The standard mandates that variants contain built-in data types only. If the
- * value is not of a builtin type, it is wrapped into an :ref:`extensionobject`.
- * open62541 hides this wrapping transparently in the encoding layer. If the
- * data type is unknown to the receiver, the variant contains the original
- * ExtensionObject in binary or XML encoding.
- *
- * Variants may contain a scalar value or an array. For details on the handling
- * of arrays, see the section on :ref:`array-handling`. Array variants can have
- * an additional dimensionality (matrix, 3-tensor, ...) defined in an array of
- * dimension lengths. The actual values are kept in an array of dimensions one.
- * For users who work with higher-dimensions arrays directly, keep in mind that
- * dimensions of higher rank are serialized first (the highest rank dimension
- * has stride 1 and elements follow each other directly). Usually it is simplest
- * to interact with higher-dimensional arrays via ``UA_NumericRange``
- * descriptions (see :ref:`array-handling`).
- *
- * To differentiate between scalar / array variants, the following definition is
- * used. ``UA_Variant_isScalar`` provides simplified access to these checks.
- *
- * - ``arrayLength == 0 && data == NULL``: undefined array of length -1
- * - ``arrayLength == 0 && data == UA_EMPTY_ARRAY_SENTINEL``: array of length 0
- * - ``arrayLength == 0 && data > UA_EMPTY_ARRAY_SENTINEL``: scalar value
- * - ``arrayLength > 0``: array of the given length
- *
- * Variants can also be *empty*. Then, the pointer to the type description is
- * ``NULL``. */
-/* Forward declaration. See the section on Generic Type Handling */
-struct UA_DataType;
-typedef struct UA_DataType UA_DataType;
-
-#define UA_EMPTY_ARRAY_SENTINEL ((void*)0x01)
-
-typedef enum {
-    UA_VARIANT_DATA,          /* The data has the same lifecycle as the
-                                 variant */
-    UA_VARIANT_DATA_NODELETE /* The data is "borrowed" by the variant and
-                                 shall not be deleted at the end of the
-                                 variant's lifecycle. */
-} UA_VariantStorageType;
-
-typedef struct {
-    const UA_DataType *type;      /* The data type description */
-    UA_VariantStorageType storageType;
-    size_t arrayLength;           /* The number of elements in the data array */
-    void *data;                   /* Points to the scalar or array data */
-    size_t arrayDimensionsSize;   /* The number of dimensions */
-    UA_UInt32 *arrayDimensions;   /* The length of each dimension */
-} UA_Variant;
-
-/* Returns true if the variant has no value defined (contains neither an array
- * nor a scalar value).
- *
- * @param v The variant
- * @return Is the variant empty */
-static UA_INLINE UA_Boolean
-UA_Variant_isEmpty(const UA_Variant *v) {
-    return v->type == NULL;
-}
-
-/* Returns true if the variant contains a scalar value. Note that empty variants
- * contain an array of length -1 (undefined).
- *
- * @param v The variant
- * @return Does the variant contain a scalar value */
-static UA_INLINE UA_Boolean
-UA_Variant_isScalar(const UA_Variant *v) {
-    return (v->arrayLength == 0 && v->data > UA_EMPTY_ARRAY_SENTINEL);
-}
-
-/* Returns true if the variant contains a scalar value of the given type.
- *
- * @param v The variant
- * @param type The data type
- * @return Does the variant contain a scalar value of the given type */
-static UA_INLINE UA_Boolean
-UA_Variant_hasScalarType(const UA_Variant *v, const UA_DataType *type) {
-    return UA_Variant_isScalar(v) && type == v->type;
-}
-
-/* Returns true if the variant contains an array of the given type.
- *
- * @param v The variant
- * @param type The data type
- * @return Does the variant contain an array of the given type */
-static UA_INLINE UA_Boolean
-UA_Variant_hasArrayType(const UA_Variant *v, const UA_DataType *type) {
-    return (!UA_Variant_isScalar(v)) && type == v->type;
-}
-
-/* Set the variant to a scalar value that already resides in memory. The value
- * takes on the lifecycle of the variant and is deleted with it.
- *
- * @param v The variant
- * @param p A pointer to the value data
- * @param type The datatype of the value in question */
-void UA_EXPORT
-UA_Variant_setScalar(UA_Variant *v, void * UA_RESTRICT p,
-                     const UA_DataType *type);
-
-/* Set the variant to a scalar value that is copied from an existing variable.
- * @param v The variant
- * @param p A pointer to the value data
- * @param type The datatype of the value
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Variant_setScalarCopy(UA_Variant *v, const void *p,
-                         const UA_DataType *type);
-
-/* Set the variant to an array that already resides in memory. The array takes
- * on the lifecycle of the variant and is deleted with it.
- *
- * @param v The variant
- * @param array A pointer to the array data
- * @param arraySize The size of the array
- * @param type The datatype of the array */
-void UA_EXPORT
-UA_Variant_setArray(UA_Variant *v, void * UA_RESTRICT array,
-                    size_t arraySize, const UA_DataType *type);
-
-/* Set the variant to an array that is copied from an existing array.
- *
- * @param v The variant
- * @param array A pointer to the array data
- * @param arraySize The size of the array
- * @param type The datatype of the array
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_Variant_setArrayCopy(UA_Variant *v, const void *array,
-                        size_t arraySize, const UA_DataType *type);
-
-/* Copy the variant, but use only a subset of the (multidimensional) array into
- * a variant. Returns an error code if the variant is not an array or if the
- * indicated range does not fit.
- *
- * @param src The source variant
- * @param dst The target variant
- * @param range The range of the copied data
- * @return Returns UA_STATUSCODE_GOOD or an error code */
-UA_StatusCode UA_EXPORT
-UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst,
-                     const UA_NumericRange range);
-
-/* Insert a range of data into an existing variant. The data array can't be
- * reused afterwards if it contains types without a fixed size (e.g. strings)
- * since the members are moved into the variant and take on its lifecycle.
- *
- * @param v The variant
- * @param dataArray The data array. The type must match the variant
- * @param dataArraySize The length of the data array. This is checked to match
- *        the range size.
- * @param range The range of where the new data is inserted
- * @return Returns UA_STATUSCODE_GOOD or an error code */
-UA_StatusCode UA_EXPORT
-UA_Variant_setRange(UA_Variant *v, void * UA_RESTRICT array,
-                    size_t arraySize, const UA_NumericRange range);
-
-/* Deep-copy a range of data into an existing variant.
- *
- * @param v The variant
- * @param dataArray The data array. The type must match the variant
- * @param dataArraySize The length of the data array. This is checked to match
- *        the range size.
- * @param range The range of where the new data is inserted
- * @return Returns UA_STATUSCODE_GOOD or an error code */
-UA_StatusCode UA_EXPORT
-UA_Variant_setRangeCopy(UA_Variant *v, const void *array,
-                        size_t arraySize, const UA_NumericRange range);
-
-/**
- * .. _extensionobject:
- *
- * ExtensionObject
- * ^^^^^^^^^^^^^^^
- *
- * ExtensionObjects may contain scalars of any data type. Even those that are
- * unknown to the receiver. See the section on :ref:`generic-types` on how types
- * are described. If the received data type is unknown, the encoded string and
- * target NodeId is stored instead of the decoded value. */
-typedef enum {
-    UA_EXTENSIONOBJECT_ENCODED_NOBODY     = 0,
-    UA_EXTENSIONOBJECT_ENCODED_BYTESTRING = 1,
-    UA_EXTENSIONOBJECT_ENCODED_XML        = 2,
-    UA_EXTENSIONOBJECT_DECODED            = 3,
-    UA_EXTENSIONOBJECT_DECODED_NODELETE   = 4 /* Don't delete the content
-                                                 together with the
-                                                 ExtensionObject */
-} UA_ExtensionObjectEncoding;
-
-typedef struct {
-    UA_ExtensionObjectEncoding encoding;
-    union {
-        struct {
-            UA_NodeId typeId;   /* The nodeid of the datatype */
-            UA_ByteString body; /* The bytestring of the encoded data */
-        } encoded;
-        struct {
-            const UA_DataType *type;
-            void *data;
-        } decoded;
-    } content;
-} UA_ExtensionObject;
-
-/**
- * .. _datavalue:
- *
- * DataValue
- * ^^^^^^^^^
- * A data value with an associated status code and timestamps. */
-typedef struct {
-    UA_Variant    value;
-    UA_DateTime   sourceTimestamp;
-    UA_DateTime   serverTimestamp;
-    UA_UInt16     sourcePicoseconds;
-    UA_UInt16     serverPicoseconds;
-    UA_StatusCode status;
-    UA_Boolean    hasValue             : 1;
-    UA_Boolean    hasStatus            : 1;
-    UA_Boolean    hasSourceTimestamp   : 1;
-    UA_Boolean    hasServerTimestamp   : 1;
-    UA_Boolean    hasSourcePicoseconds : 1;
-    UA_Boolean    hasServerPicoseconds : 1;
-} UA_DataValue;
-
-/**
- * DiagnosticInfo
- * ^^^^^^^^^^^^^^
- * A structure that contains detailed error and diagnostic information
- * associated with a StatusCode. */
-typedef struct UA_DiagnosticInfo {
-    UA_Boolean    hasSymbolicId          : 1;
-    UA_Boolean    hasNamespaceUri        : 1;
-    UA_Boolean    hasLocalizedText       : 1;
-    UA_Boolean    hasLocale              : 1;
-    UA_Boolean    hasAdditionalInfo      : 1;
-    UA_Boolean    hasInnerStatusCode     : 1;
-    UA_Boolean    hasInnerDiagnosticInfo : 1;
-    UA_Int32      symbolicId;
-    UA_Int32      namespaceUri;
-    UA_Int32      localizedText;
-    UA_Int32      locale;
-    UA_String     additionalInfo;
-    UA_StatusCode innerStatusCode;
-    struct UA_DiagnosticInfo *innerDiagnosticInfo;
-} UA_DiagnosticInfo;
-
-/**
- * .. _generic-types:
- *
- * Generic Type Handling
- * ---------------------
- *
- * All information about a (builtin/structured) data type is stored in a
- * ``UA_DataType``. The array ``UA_TYPES`` contains the description of all
- * standard-defined types. This type description is used for the following
- * generic operations that work on all types:
- *
- * - ``void T_init(T *ptr)``: Initialize the data type. This is synonymous with
- *   zeroing out the memory, i.e. ``memset(ptr, 0, sizeof(T))``.
- * - ``T* T_new()``: Allocate and return the memory for the data type. The
- *   value is already initialized.
- * - ``UA_StatusCode T_copy(const T *src, T *dst)``: Copy the content of the
- *   data type. Returns ``UA_STATUSCODE_GOOD`` or
- *   ``UA_STATUSCODE_BADOUTOFMEMORY``.
- * - ``void T_clear(T *ptr)``: Delete the dynamically allocated content
- *   of the data type and perform a ``T_init`` to reset the type.
- * - ``void T_delete(T *ptr)``: Delete the content of the data type and the
- *   memory for the data type itself.
- *
- * Specializations, such as ``UA_Int32_new()`` are derived from the generic
- * type operations as static inline functions. */
-
-typedef struct {
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-    const char *memberName;
-#endif
-    UA_UInt16 memberTypeIndex;    /* Index of the member in the array of data
-                                     types */
-    UA_Byte   padding;            /* How much padding is there before this
-                                     member element? For arrays this is the
-                                     padding before the size_t length member.
-                                     (No padding between size_t and the
-                                     following ptr.) */
-    UA_Boolean namespaceZero : 1; /* The type of the member is defined in
-                                     namespace zero. In this implementation,
-                                     types from custom namespace may contain
-                                     members from the same namespace or
-                                     namespace zero only.*/
-    UA_Boolean isArray       : 1; /* The member is an array */
-} UA_DataTypeMember;
-
-/* The DataType "kind" is an internal type classification. It is used to
- * dispatch handling to the correct routines. */
-#define UA_DATATYPEKINDS 31
-typedef enum {
-    UA_DATATYPEKIND_BOOLEAN = 0,
-    UA_DATATYPEKIND_SBYTE = 1,
-    UA_DATATYPEKIND_BYTE = 2,
-    UA_DATATYPEKIND_INT16 = 3,
-    UA_DATATYPEKIND_UINT16 = 4,
-    UA_DATATYPEKIND_INT32 = 5,
-    UA_DATATYPEKIND_UINT32 = 6,
-    UA_DATATYPEKIND_INT64 = 7,
-    UA_DATATYPEKIND_UINT64 = 8,
-    UA_DATATYPEKIND_FLOAT = 9,
-    UA_DATATYPEKIND_DOUBLE = 10,
-    UA_DATATYPEKIND_STRING = 11,
-    UA_DATATYPEKIND_DATETIME = 12,
-    UA_DATATYPEKIND_GUID = 13,
-    UA_DATATYPEKIND_BYTESTRING = 14,
-    UA_DATATYPEKIND_XMLELEMENT = 15,
-    UA_DATATYPEKIND_NODEID = 16,
-    UA_DATATYPEKIND_EXPANDEDNODEID = 17,
-    UA_DATATYPEKIND_STATUSCODE = 18,
-    UA_DATATYPEKIND_QUALIFIEDNAME = 19,
-    UA_DATATYPEKIND_LOCALIZEDTEXT = 20,
-    UA_DATATYPEKIND_EXTENSIONOBJECT = 21,
-    UA_DATATYPEKIND_DATAVALUE = 22,
-    UA_DATATYPEKIND_VARIANT = 23,
-    UA_DATATYPEKIND_DIAGNOSTICINFO = 24,
-    UA_DATATYPEKIND_DECIMAL = 25,
-    UA_DATATYPEKIND_ENUM = 26,
-    UA_DATATYPEKIND_STRUCTURE = 27,
-    UA_DATATYPEKIND_OPTSTRUCT = 28, /* struct with optional fields */
-    UA_DATATYPEKIND_UNION = 29,
-    UA_DATATYPEKIND_BITFIELDCLUSTER = 30 /* bitfields + padding */
-} UA_DataTypeKind;
-
-struct UA_DataType {
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-    const char *typeName;
-#endif
-    UA_NodeId typeId;                /* The nodeid of the type */
-    UA_UInt16 memSize;               /* Size of the struct in memory */
-    UA_UInt16 typeIndex;             /* Index of the type in the datatypetable */
-    UA_UInt32 typeKind         : 6;  /* Dispatch index for the handling routines */
-    UA_UInt32 pointerFree      : 1;  /* The type (and its members) contains no
-                                      * pointers that need to be freed */
-    UA_UInt32 overlayable      : 1;  /* The type has the identical memory layout
-                                      * in memory and on the binary stream. */
-    UA_UInt32 membersSize      : 8;  /* How many members does the type have? */
-    UA_UInt32 binaryEncodingId : 16; /* NodeId of datatype when encoded as binary */
-    //UA_UInt16  xmlEncodingId;      /* NodeId of datatype when encoded as XML */
-    UA_DataTypeMember *members;
-};
-
-/* Test if the data type is a numeric builtin data type. This includes Boolean,
- * integers and floating point numbers. Not included are DateTime and
- * StatusCode. */
-UA_Boolean
-UA_DataType_isNumeric(const UA_DataType *type);
-
-/**
- * Builtin data types can be accessed as UA_TYPES[UA_TYPES_XXX], where XXX is
- * the name of the data type. If only the NodeId of a type is known, use the
- * following method to retrieve the data type description. */
-
-/* Returns the data type description for the type's identifier or NULL if no
- * matching data type was found. */
-const UA_DataType UA_EXPORT *
-UA_findDataType(const UA_NodeId *typeId);
-
-/** The following functions are used for generic handling of data types. */
-
-/* Allocates and initializes a variable of type dataType
- *
- * @param type The datatype description
- * @return Returns the memory location of the variable or NULL if no
- *         memory could be allocated */
-void UA_EXPORT * UA_new(const UA_DataType *type) UA_FUNC_ATTR_MALLOC;
-
-/* Initializes a variable to default values
- *
- * @param p The memory location of the variable
- * @param type The datatype description */
-static UA_INLINE void
-UA_init(void *p, const UA_DataType *type) {
-    memset(p, 0, type->memSize);
-}
-
-/* Copies the content of two variables. If copying fails (e.g. because no memory
- * was available for an array), then dst is emptied and initialized to prevent
- * memory leaks.
- *
- * @param src The memory location of the source variable
- * @param dst The memory location of the destination variable
- * @param type The datatype description
- * @return Indicates whether the operation succeeded or returns an error code */
-UA_StatusCode UA_EXPORT
-UA_copy(const void *src, void *dst, const UA_DataType *type);
-
-/* Deletes the dynamically allocated content of a variable (e.g. resets all
- * arrays to undefined arrays). Afterwards, the variable can be safely deleted
- * without causing memory leaks. But the variable is not initialized and may
- * contain old data that is not memory-relevant.
- *
- * @param p The memory location of the variable
- * @param type The datatype description of the variable */
-void UA_EXPORT UA_clear(void *p, const UA_DataType *type);
-
-#define UA_deleteMembers(p, type) UA_clear(p, type)
-
-/* Frees a variable and all of its content.
- *
- * @param p The memory location of the variable
- * @param type The datatype description of the variable */
-void UA_EXPORT UA_delete(void *p, const UA_DataType *type);
-
-/**
- * .. _array-handling:
- *
- * Array handling
- * --------------
- * In OPC UA, arrays can have a length of zero or more with the usual meaning.
- * In addition, arrays can be undefined. Then, they don't even have a length. In
- * the binary encoding, this is indicated by an array of length -1.
- *
- * In open62541 however, we use ``size_t`` for array lengths. An undefined array
- * has length 0 and the data pointer is ``NULL``. An array of length 0 also has
- * length 0 but a data pointer ``UA_EMPTY_ARRAY_SENTINEL``. */
-
-/* Allocates and initializes an array of variables of a specific type
- *
- * @param size The requested array length
- * @param type The datatype description
- * @return Returns the memory location of the variable or NULL if no memory
-           could be allocated */
-void UA_EXPORT *
-UA_Array_new(size_t size, const UA_DataType *type) UA_FUNC_ATTR_MALLOC;
-
-/* Allocates and copies an array
- *
- * @param src The memory location of the source array
- * @param size The size of the array
- * @param dst The location of the pointer to the new array
- * @param type The datatype of the array members
- * @return Returns UA_STATUSCODE_GOOD or UA_STATUSCODE_BADOUTOFMEMORY */
-UA_StatusCode UA_EXPORT
-UA_Array_copy(const void *src, size_t size, void **dst,
-              const UA_DataType *type) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-/* Deletes an array.
- *
- * @param p The memory location of the array
- * @param size The size of the array
- * @param type The datatype of the array members */
-void UA_EXPORT UA_Array_delete(void *p, size_t size, const UA_DataType *type);
-
-/**
- * Random Number Generator
- * -----------------------
- * If UA_MULTITHREADING is defined, then the seed is stored in thread
- * local storage. The seed is initialized for every thread in the
- * server/client. */
-void UA_EXPORT UA_random_seed(UA_UInt64 seed);
-UA_UInt32 UA_EXPORT UA_UInt32_random(void); /* no cryptographic entropy */
-UA_Guid UA_EXPORT UA_Guid_random(void);     /* no cryptographic entropy */
-
-/**
- * .. _generated-types:
- *
- * Generated Data Type Definitions
- * -------------------------------
- *
- * The following data types were auto-generated from a definition in XML format.
- */
-
-/* The following is used to exclude type names in the definition of UA_DataType
- * structures if the feature is disabled. */
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-# define UA_TYPENAME(name) name,
-#else
-# define UA_TYPENAME(name)
-#endif
-
-/* Datatype arrays with custom type definitions can be added in a linked list to
- * the client or server configuration. Datatype members can point to types in
- * the same array via the ``memberTypeIndex``. If ``namespaceZero`` is set to
- * true, the member datatype is looked up in the array of builtin datatypes
- * instead. */
-typedef struct UA_DataTypeArray {
-    const struct UA_DataTypeArray *next;
-    const size_t typesSize;
-    const UA_DataType *types;
-} UA_DataTypeArray;
-
-/**
- *
- * .. toctree::
- *
- *    types_generated */
-
-_UA_END_DECLS
-
-#endif /* UA_TYPES_H_ */
diff --git a/ext/open62541/include/open62541/util.h b/ext/open62541/include/open62541/util.h
deleted file mode 100644
index 95283b2..0000000
--- a/ext/open62541/include/open62541/util.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_HELPER_H_
-#define UA_HELPER_H_
-
-#include <open62541/types.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Endpoint URL Parser
- * -------------------
- * The endpoint URL parser is generally useful for the implementation of network
- * layer plugins. */
-
-/* Split the given endpoint url into hostname, port and path. All arguments must
- * be non-NULL. EndpointUrls have the form "opc.tcp://hostname:port/path", port
- * and path may be omitted (together with the prefix colon and slash).
- *
- * @param endpointUrl The endpoint URL.
- * @param outHostname Set to the parsed hostname. The string points into the
- *        original endpointUrl, so no memory is allocated. If an IPv6 address is
- *        given, hostname contains e.g. '[2001:0db8:85a3::8a2e:0370:7334]'
- * @param outPort Set to the port of the url or left unchanged.
- * @param outPath Set to the path if one is present in the endpointUrl.
- *        Starting or trailing '/' are NOT included in the path. The string
- *        points into the original endpointUrl, so no memory is allocated.
- * @return Returns UA_STATUSCODE_BADTCPENDPOINTURLINVALID if parsing failed. */
-UA_StatusCode UA_EXPORT
-UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname,
-                    UA_UInt16 *outPort, UA_String *outPath);
-
-/* Split the given endpoint url into hostname, vid and pcp. All arguments must
- * be non-NULL. EndpointUrls have the form "opc.eth://<host>[:<VID>[.PCP]]".
- * The host is a MAC address, an IP address or a registered name like a
- * hostname. The format of a MAC address is six groups of hexadecimal digits,
- * separated by hyphens (e.g. 01-23-45-67-89-ab). A system may also accept
- * hostnames and/or IP addresses if it provides means to resolve it to a MAC
- * address (e.g. DNS and Reverse-ARP).
- *
- * Note: currently only parsing MAC address is supported.
- *
- * @param endpointUrl The endpoint URL.
- * @param vid Set to VLAN ID.
- * @param pcp Set to Priority Code Point.
- * @return Returns UA_STATUSCODE_BADINTERNALERROR if parsing failed. */
-UA_StatusCode UA_EXPORT
-UA_parseEndpointUrlEthernet(const UA_String *endpointUrl, UA_String *target,
-                            UA_UInt16 *vid, UA_Byte *pcp);
-
-/* Convert given byte string to a positive number. Returns the number of valid
- * digits. Stops if a non-digit char is found and returns the number of digits
- * up to that point. */
-size_t UA_EXPORT
-UA_readNumber(UA_Byte *buf, size_t buflen, UA_UInt32 *number);
-
-/* Same as UA_ReadNumber but with a base parameter */
-size_t UA_EXPORT
-UA_readNumberWithBase(const UA_Byte *buf, size_t buflen,
-                      UA_UInt32 *number, UA_Byte base);
-
-#ifndef UA_MIN
-#define UA_MIN(A,B) (A > B ? B : A)
-#endif
-
-#ifndef UA_MAX
-#define UA_MAX(A,B) (A > B ? A : B)
-#endif
-
-/**
- * Convenience macros for complex types
- * ------------------------------------ */
-#define UA_PRINTF_GUID_FORMAT "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-#define UA_PRINTF_GUID_DATA(GUID) (GUID).data1, (GUID).data2, (GUID).data3, \
-        (GUID).data4[0], (GUID).data4[1], (GUID).data4[2], (GUID).data4[3], \
-        (GUID).data4[4], (GUID).data4[5], (GUID).data4[6], (GUID).data4[7]
-
-#define UA_PRINTF_STRING_FORMAT "\"%.*s\""
-#define UA_PRINTF_STRING_DATA(STRING) (int)(STRING).length, (STRING).data
-
-/**
- * Helper functions for converting data types
- * ------------------------------------ */
-
-/* Converts a bytestring to the corresponding base64 encoded string
- * representation.
- *
- * @param byteString the original byte string
- * @param str the resulting base64 encoded byte string
- *
- * Returns UA_STATUSCODE_GOOD on success. */
-UA_StatusCode UA_EXPORT
-UA_ByteString_toBase64String(const UA_ByteString *byteString, UA_String *str);
-
-/* Converts a node id to the corresponding string representation.
- * It can be one of:
- * - Numeric: ns=0;i=123
- * - String: ns=0;s=Some String
- * - Guid: ns=0;g=A123456C-0ABC-1A2B-815F-687212AAEE1B
- * - ByteString: ns=0;b=AA== */
-UA_StatusCode UA_EXPORT
-UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr);
-
-/* Compare memory in constant time to mitigate timing attacks.
- * Returns true if ptr1 and ptr2 are equal for length bytes. */
-static UA_INLINE UA_Boolean
-UA_constantTimeEqual(const void *ptr1, const void *ptr2, size_t length) {
-    volatile const UA_Byte *a = (volatile const UA_Byte *)ptr1;
-    volatile const UA_Byte *b = (volatile const UA_Byte *)ptr2;
-    volatile UA_Byte c = 0;
-    for(size_t i = 0; i < length; ++i) {
-        UA_Byte x = a[i], y = b[i];
-        c |= x ^ y;
-    }
-    return !c;
-}
-
-_UA_END_DECLS
-
-#endif /* UA_HELPER_H_ */
diff --git a/ext/open62541/open62541.pc.in b/ext/open62541/open62541.pc.in
deleted file mode 100644
index 53d8e8e..0000000
--- a/ext/open62541/open62541.pc.in
+++ /dev/null
@@ -1,15 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=${prefix}
-libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
-sharedlibdir=${libdir}
-includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
-
-Name: open62541
-Description: open62541 is an open source C (C99) implementation of OPC UA
-Version: @OPEN62541_VER_MAJOR@.@OPEN62541_VER_MINOR@.@OPEN62541_VER_PATCH@
-Libs: -L${libdir} -lopen62541
-Cflags: -I${includedir}/open62541
diff --git a/ext/open62541/open62541.spec b/ext/open62541/open62541.spec
deleted file mode 100644
index 046b2a4..0000000
--- a/ext/open62541/open62541.spec
+++ /dev/null
@@ -1,65 +0,0 @@
-Name:     open62541
-Version:  0.3
-Release:  1%{?dist}
-Summary:  OPC UA implementation
-License:  MPLv2.0
-URL:      http://open62541.org
-Source0:  https://github.com/open62541/open62541/archive/%{name}-%{version}.tar.gz
-
-BuildRequires: cmake3, python
-
-%description
-open62541 is a C-based library (linking with C++ projects is possible)
-with all necessary tools to implement dedicated OPC UA clients and servers,
-or to integrate OPC UA-based communication into existing applications.
-
-%package  devel
-Summary:  Development files for %{name}
-Requires: %{name}%{?_isa} = %{version}-%{release}
-
-%description devel
-The %{name}-devel package contains libraries and header files for
-developing applications that use %{name}.
-
-%prep
-%setup -q -n %{name}-%{name}-%{version} # double-name prefix by GitHub
-
-%build
-%cmake3 -DUA_ENABLE_AMALGAMATION=ON .
-make
-
-%install
-%make_install
-
-# Remove this from the examples installation
-rm examples/CMakeLists.txt
-
-%post -p /sbin/ldconfig
-
-%postun -p /sbin/ldconfig
-
-%files
-%license LICENSE
-%doc AUTHORS CHANGELOG README.md
-%{_libdir}/libopen62541.so.*
-
-%files devel
-%license LICENSE LICENSE-CC0
-%{_libdir}/libopen62541.so
-%{_libdir}/pkgconfig/open62541.pc
-%dir %{_includedir}/open62541
-%{_includedir}/open62541/*
-%{_libdir}/cmake/open62541*
-%dir %{_exec_prefix}/share/open62541
-%{_exec_prefix}/share/open62541/*
-
-%doc FEATURES.md
-%doc examples/
-
-%changelog
-* Tue Sep 05 2017 Jens Reimann <jreimann@redhat.com> - 0.3-1
-- New version of open62541
-- Adapt for cmake3
-* Thu Aug 31 2017 Jens Reimann <jreimann@redhat.com> - 0.2-1
-- Initial version of the package
-
diff --git a/ext/open62541/plugins/historydata/ua_history_data_backend_memory.c b/ext/open62541/plugins/historydata/ua_history_data_backend_memory.c
deleted file mode 100644
index 218f7cf..0000000
--- a/ext/open62541/plugins/historydata/ua_history_data_backend_memory.c
+++ /dev/null
@@ -1,604 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/plugin/historydata/history_data_backend_memory.h>
-
-#include <limits.h>
-#include <string.h>
-
-typedef struct {
-    UA_DateTime timestamp;
-    UA_DataValue value;
-} UA_DataValueMemoryStoreItem;
-
-static void
-UA_DataValueMemoryStoreItem_deleteMembers(UA_DataValueMemoryStoreItem* item) {
-    UA_DateTime_deleteMembers(&item->timestamp);
-    UA_DataValue_deleteMembers(&item->value);
-}
-
-typedef struct {
-    UA_NodeId nodeId;
-    UA_DataValueMemoryStoreItem **dataStore;
-    size_t storeEnd;
-    size_t storeSize;
-} UA_NodeIdStoreContextItem_backend_memory;
-
-static void
-UA_NodeIdStoreContextItem_deleteMembers(UA_NodeIdStoreContextItem_backend_memory* item) {
-    UA_NodeId_deleteMembers(&item->nodeId);
-    for (size_t i = 0; i < item->storeEnd; ++i) {
-        UA_DataValueMemoryStoreItem_deleteMembers(item->dataStore[i]);
-        UA_free(item->dataStore[i]);
-    }
-    UA_free(item->dataStore);
-}
-
-typedef struct {
-    UA_NodeIdStoreContextItem_backend_memory *dataStore;
-    size_t storeEnd;
-    size_t storeSize;
-    size_t initialStoreSize;
-} UA_MemoryStoreContext;
-
-static void
-UA_MemoryStoreContext_deleteMembers(UA_MemoryStoreContext* ctx) {
-    for (size_t i = 0; i < ctx->storeEnd; ++i) {
-        UA_NodeIdStoreContextItem_deleteMembers(&ctx->dataStore[i]);
-    }
-    UA_free(ctx->dataStore);
-    memset(ctx, 0, sizeof(UA_MemoryStoreContext));
-}
-
-static UA_NodeIdStoreContextItem_backend_memory *
-getNewNodeIdContext_backend_memory(UA_MemoryStoreContext* context,
-                                   UA_Server *server,
-                                   const UA_NodeId *nodeId) {
-    UA_MemoryStoreContext *ctx = (UA_MemoryStoreContext*)context;
-    if (ctx->storeEnd >= ctx->storeSize) {
-        size_t newStoreSize = ctx->storeSize * 2;
-        if (newStoreSize == 0)
-            return NULL;
-        ctx->dataStore = (UA_NodeIdStoreContextItem_backend_memory*)UA_realloc(ctx->dataStore,  (newStoreSize * sizeof(UA_NodeIdStoreContextItem_backend_memory)));
-        if (!ctx->dataStore) {
-            ctx->storeSize = 0;
-            return NULL;
-        }
-        ctx->storeSize = newStoreSize;
-    }
-    UA_NodeIdStoreContextItem_backend_memory *item = &ctx->dataStore[ctx->storeEnd];
-    UA_NodeId_copy(nodeId, &item->nodeId);
-    UA_DataValueMemoryStoreItem ** store = (UA_DataValueMemoryStoreItem **)UA_calloc(ctx->initialStoreSize, sizeof(UA_DataValueMemoryStoreItem*));
-    if (!store) {
-        UA_NodeIdStoreContextItem_deleteMembers(item);
-        return NULL;
-    }
-    item->dataStore = store;
-    item->storeSize = ctx->initialStoreSize;
-    item->storeEnd = 0;
-    ++ctx->storeEnd;
-    return item;
-}
-
-static UA_NodeIdStoreContextItem_backend_memory *
-getNodeIdStoreContextItem_backend_memory(UA_MemoryStoreContext* context,
-                                         UA_Server *server,
-                                         const UA_NodeId *nodeId)
-{
-    for (size_t i = 0; i < context->storeEnd; ++i) {
-        if (UA_NodeId_equal(nodeId, &context->dataStore[i].nodeId)) {
-            return &context->dataStore[i];
-        }
-    }
-    return getNewNodeIdContext_backend_memory(context, server, nodeId);
-}
-
-static UA_Boolean
-binarySearch_backend_memory(const UA_NodeIdStoreContextItem_backend_memory* item,
-                            const UA_DateTime timestamp,
-                            size_t *index) {
-    if (item->storeEnd == 0) {
-        *index = item->storeEnd;
-        return false;
-    }
-    size_t min = 0;
-    size_t max = item->storeEnd - 1;
-    while (min <= max) {
-        *index = (min + max) / 2;
-        if (item->dataStore[*index]->timestamp == timestamp) {
-            return true;
-        } else if (item->dataStore[*index]->timestamp < timestamp) {
-            if (*index == item->storeEnd - 1) {
-                *index = item->storeEnd;
-                return false;
-            }
-            min = *index + 1;
-        } else {
-            if (*index == 0)
-                return false;
-            max = *index - 1;
-        }
-    }
-    *index = min;
-    return false;
-
-}
-
-static size_t
-resultSize_backend_memory(UA_Server *server,
-                          void *context,
-                          const UA_NodeId *sessionId,
-                          void *sessionContext,
-                          const UA_NodeId * nodeId,
-                          size_t startIndex,
-                          size_t endIndex) {
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);
-    if (item->storeEnd == 0
-            || startIndex == item->storeEnd
-            || endIndex == item->storeEnd)
-        return 0;
-    return endIndex - startIndex + 1;
-}
-
-static size_t
-getDateTimeMatch_backend_memory(UA_Server *server,
-                                void *context,
-                                const UA_NodeId *sessionId,
-                                void *sessionContext,
-                                const UA_NodeId * nodeId,
-                                const UA_DateTime timestamp,
-                                const MatchStrategy strategy) {
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);
-    size_t current;
-    UA_Boolean retval = binarySearch_backend_memory(item, timestamp, &current);
-
-    if ((strategy == MATCH_EQUAL
-         || strategy == MATCH_EQUAL_OR_AFTER
-         || strategy == MATCH_EQUAL_OR_BEFORE)
-            && retval)
-        return current;
-    switch (strategy) {
-    case MATCH_AFTER:
-        if (retval)
-            return current+1;
-        return current;
-    case MATCH_EQUAL_OR_AFTER:
-        return current;
-    case MATCH_EQUAL_OR_BEFORE:
-        // retval == true aka "equal" is handled before
-        // Fall through if !retval
-    case MATCH_BEFORE:
-        if (current > 0)
-            return current-1;
-        else
-            return item->storeEnd;
-    default:
-        break;
-    }
-    return item->storeEnd;
-}
-
-
-static UA_StatusCode
-serverSetHistoryData_backend_memory(UA_Server *server,
-                                    void *context,
-                                    const UA_NodeId *sessionId,
-                                    void *sessionContext,
-                                    const UA_NodeId * nodeId,
-                                    UA_Boolean historizing,
-                                    const UA_DataValue *value)
-{
-    UA_NodeIdStoreContextItem_backend_memory *item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);
-
-    if (item->storeEnd >= item->storeSize) {
-        size_t newStoreSize = item->storeSize == 0 ? INITIAL_MEMORY_STORE_SIZE : item->storeSize * 2;
-        item->dataStore = (UA_DataValueMemoryStoreItem **)UA_realloc(item->dataStore,  (newStoreSize * sizeof(UA_DataValueMemoryStoreItem*)));
-        if (!item->dataStore) {
-            item->storeSize = 0;
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        item->storeSize = newStoreSize;
-    }
-    UA_DateTime timestamp = 0;
-    if (value->hasSourceTimestamp) {
-        timestamp = value->sourceTimestamp;
-    } else if (value->hasServerTimestamp) {
-        timestamp = value->serverTimestamp;
-    } else {
-        timestamp = UA_DateTime_now();
-    }
-    UA_DataValueMemoryStoreItem *newItem = (UA_DataValueMemoryStoreItem *)UA_calloc(1, sizeof(UA_DataValueMemoryStoreItem));
-    newItem->timestamp = timestamp;
-    UA_DataValue_copy(value, &newItem->value);
-    size_t index = getDateTimeMatch_backend_memory(server,
-                                                   context,
-                                                   NULL,
-                                                   NULL,
-                                                   nodeId,
-                                                   timestamp,
-                                                   MATCH_EQUAL_OR_AFTER);
-    if (item->storeEnd > 0 && index < item->storeEnd) {
-        memmove(&item->dataStore[index+1], &item->dataStore[index], sizeof(UA_DataValueMemoryStoreItem*) * (item->storeEnd - index));
-    }
-    item->dataStore[index] = newItem;
-    ++item->storeEnd;
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-UA_MemoryStoreContext_delete(UA_MemoryStoreContext* ctx) {
-    UA_MemoryStoreContext_deleteMembers(ctx);
-    UA_free(ctx);
-}
-
-static size_t
-getEnd_backend_memory(UA_Server *server,
-                      void *context,
-                      const UA_NodeId *sessionId,
-                      void *sessionContext,
-                      const UA_NodeId * nodeId) {
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);;
-    return item->storeEnd;
-}
-
-static size_t
-lastIndex_backend_memory(UA_Server *server,
-                         void *context,
-                         const UA_NodeId *sessionId,
-                         void *sessionContext,
-                         const UA_NodeId * nodeId) {
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);;
-    if (item->storeEnd == 0)
-        return 0;
-    return item->storeEnd - 1;
-}
-
-static size_t
-firstIndex_backend_memory(UA_Server *server,
-                          void *context,
-                          const UA_NodeId *sessionId,
-                          void *sessionContext,
-                          const UA_NodeId * nodeId) {
-    return 0;
-}
-
-static UA_Boolean
-boundSupported_backend_memory(UA_Server *server,
-                              void *context,
-                              const UA_NodeId *sessionId,
-                              void *sessionContext,
-                              const UA_NodeId * nodeId) {
-    return true;
-}
-
-static UA_Boolean
-timestampsToReturnSupported_backend_memory(UA_Server *server,
-                                           void *context,
-                                           const UA_NodeId *sessionId,
-                                           void *sessionContext,
-                                           const UA_NodeId *nodeId,
-                                           const UA_TimestampsToReturn timestampsToReturn) {
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);;
-    if (item->storeEnd == 0) {
-        return true;
-    }
-    if (timestampsToReturn == UA_TIMESTAMPSTORETURN_NEITHER
-            || timestampsToReturn == UA_TIMESTAMPSTORETURN_INVALID
-            || (timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER
-                && !item->dataStore[0]->value.hasServerTimestamp)
-            || (timestampsToReturn == UA_TIMESTAMPSTORETURN_SOURCE
-                && !item->dataStore[0]->value.hasSourceTimestamp)
-            || (timestampsToReturn == UA_TIMESTAMPSTORETURN_BOTH
-                && !(item->dataStore[0]->value.hasSourceTimestamp
-                     && item->dataStore[0]->value.hasServerTimestamp))) {
-        return false;
-    }
-    return true;
-}
-
-static const UA_DataValue*
-getDataValue_backend_memory(UA_Server *server,
-                            void *context,
-                            const UA_NodeId *sessionId,
-                            void *sessionContext,
-                            const UA_NodeId * nodeId, size_t index) {
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);;
-    return &item->dataStore[index]->value;
-}
-
-static UA_StatusCode
-UA_DataValue_backend_copyRange(const UA_DataValue *src, UA_DataValue *dst,
-                               const UA_NumericRange range)
-{
-    memcpy(dst, src, sizeof(UA_DataValue));
-    if (src->hasValue)
-        return UA_Variant_copyRange(&src->value, &dst->value, range);
-    return UA_STATUSCODE_BADDATAUNAVAILABLE;
-}
-
-static UA_StatusCode
-copyDataValues_backend_memory(UA_Server *server,
-                              void *context,
-                              const UA_NodeId *sessionId,
-                              void *sessionContext,
-                              const UA_NodeId * nodeId,
-                              size_t startIndex,
-                              size_t endIndex,
-                              UA_Boolean reverse,
-                              size_t maxValues,
-                              UA_NumericRange range,
-                              UA_Boolean releaseContinuationPoints,
-                              const UA_ByteString *continuationPoint,
-                              UA_ByteString *outContinuationPoint,
-                              size_t * providedValues,
-                              UA_DataValue * values)
-{
-    size_t skip = 0;
-    if (continuationPoint->length > 0) {
-        if (continuationPoint->length == sizeof(size_t)) {
-            skip = *((size_t*)(continuationPoint->data));
-        } else {
-            return UA_STATUSCODE_BADCONTINUATIONPOINTINVALID;
-        }
-    }
-    const UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)context, server, nodeId);;
-    size_t index = startIndex;
-    size_t counter = 0;
-    size_t skipedValues = 0;
-    if (reverse) {
-        while (index >= endIndex && index < item->storeEnd && counter < maxValues) {
-            if (skipedValues++ >= skip) {
-                if (range.dimensionsSize > 0) {
-                    UA_DataValue_backend_copyRange(&item->dataStore[index]->value, &values[counter], range);
-                } else {
-                    UA_DataValue_copy(&item->dataStore[index]->value, &values[counter]);
-                }
-                ++counter;
-            }
-            --index;
-        }
-    } else {
-        while (index <= endIndex && counter < maxValues) {
-            if (skipedValues++ >= skip) {
-                if (range.dimensionsSize > 0) {
-                    UA_DataValue_backend_copyRange(&item->dataStore[index]->value, &values[counter], range);
-                } else {
-                    UA_DataValue_copy(&item->dataStore[index]->value, &values[counter]);
-                }
-                ++counter;
-            }
-            ++index;
-        }
-    }
-
-    if (providedValues)
-        *providedValues = counter;
-
-    if ((!reverse && (endIndex-startIndex-skip+1) > counter) || (reverse && (startIndex-endIndex-skip+1) > counter)) {
-        outContinuationPoint->length = sizeof(size_t);
-        size_t t = sizeof(size_t);
-        outContinuationPoint->data = (UA_Byte*)UA_malloc(t);
-        *((size_t*)(outContinuationPoint->data)) = skip + counter;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-insertDataValue_backend_memory(UA_Server *server,
-                   void *hdbContext,
-                   const UA_NodeId *sessionId,
-                   void *sessionContext,
-                   const UA_NodeId *nodeId,
-                   const UA_DataValue *value)
-{
-    if (!value->hasSourceTimestamp && !value->hasServerTimestamp)
-        return UA_STATUSCODE_BADINVALIDTIMESTAMP;
-    const UA_DateTime timestamp = value->hasSourceTimestamp ? value->sourceTimestamp : value->serverTimestamp;
-    UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)hdbContext, server, nodeId);
-
-    size_t index = getDateTimeMatch_backend_memory(server,
-                                    hdbContext,
-                                    sessionId,
-                                    sessionContext,
-                                    nodeId,
-                                    timestamp,
-                                    MATCH_EQUAL_OR_AFTER);
-    if (item->storeEnd != index && item->dataStore[index]->timestamp == timestamp)
-        return UA_STATUSCODE_BADENTRYEXISTS;
-
-    if (item->storeEnd >= item->storeSize) {
-        size_t newStoreSize = item->storeSize == 0 ? INITIAL_MEMORY_STORE_SIZE : item->storeSize * 2;
-        item->dataStore = (UA_DataValueMemoryStoreItem **)UA_realloc(item->dataStore,  (newStoreSize * sizeof(UA_DataValueMemoryStoreItem*)));
-        if (!item->dataStore) {
-            item->storeSize = 0;
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        item->storeSize = newStoreSize;
-    }
-    UA_DataValueMemoryStoreItem *newItem = (UA_DataValueMemoryStoreItem *)UA_calloc(1, sizeof(UA_DataValueMemoryStoreItem));
-    newItem->timestamp = timestamp;
-    UA_DataValue_copy(value, &newItem->value);
-    if (item->storeEnd > 0 && index < item->storeEnd) {
-        memmove(&item->dataStore[index+1], &item->dataStore[index], sizeof(UA_DataValueMemoryStoreItem*) * (item->storeEnd - index));
-    }
-    item->dataStore[index] = newItem;
-    ++item->storeEnd;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-replaceDataValue_backend_memory(UA_Server *server,
-                    void *hdbContext,
-                    const UA_NodeId *sessionId,
-                    void *sessionContext,
-                    const UA_NodeId *nodeId,
-                    const UA_DataValue *value)
-{
-    if (!value->hasSourceTimestamp && !value->hasServerTimestamp)
-        return UA_STATUSCODE_BADINVALIDTIMESTAMP;
-    const UA_DateTime timestamp = value->hasSourceTimestamp ? value->sourceTimestamp : value->serverTimestamp;
-    UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)hdbContext, server, nodeId);
-
-    size_t index = getDateTimeMatch_backend_memory(server,
-                                    hdbContext,
-                                    sessionId,
-                                    sessionContext,
-                                    nodeId,
-                                    timestamp,
-                                    MATCH_EQUAL);
-    if (index == item->storeEnd)
-        return UA_STATUSCODE_BADNOENTRYEXISTS;
-    UA_DataValue_deleteMembers(&item->dataStore[index]->value);
-    UA_DataValue_copy(value, &item->dataStore[index]->value);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-updateDataValue_backend_memory(UA_Server *server,
-                   void *hdbContext,
-                   const UA_NodeId *sessionId,
-                   void *sessionContext,
-                   const UA_NodeId *nodeId,
-                   const UA_DataValue *value)
-{
-    // we first try to replace, because it is cheap
-    UA_StatusCode ret = replaceDataValue_backend_memory(server,
-                                                        hdbContext,
-                                                        sessionId,
-                                                        sessionContext,
-                                                        nodeId,
-                                                        value);
-    if (ret == UA_STATUSCODE_GOOD)
-        return UA_STATUSCODE_GOODENTRYREPLACED;
-
-    ret = insertDataValue_backend_memory(server,
-                                          hdbContext,
-                                          sessionId,
-                                          sessionContext,
-                                          nodeId,
-                                          value);
-    if (ret == UA_STATUSCODE_GOOD)
-        return UA_STATUSCODE_GOODENTRYINSERTED;
-
-    return ret;
-}
-
-static UA_StatusCode
-removeDataValue_backend_memory(UA_Server *server,
-                               void *hdbContext,
-                               const UA_NodeId *sessionId,
-                               void *sessionContext,
-                               const UA_NodeId *nodeId,
-                               UA_DateTime startTimestamp,
-                               UA_DateTime endTimestamp)
-{
-    UA_NodeIdStoreContextItem_backend_memory* item = getNodeIdStoreContextItem_backend_memory((UA_MemoryStoreContext*)hdbContext, server, nodeId);
-    size_t storeEnd = item->storeEnd;
-    // The first index which will be deleted
-    size_t index1;
-    // the first index which is not deleted
-    size_t index2;
-    if (startTimestamp > endTimestamp) {
-        return UA_STATUSCODE_BADTIMESTAMPNOTSUPPORTED;
-    }
-    if (startTimestamp == endTimestamp) {
-        index1 = getDateTimeMatch_backend_memory(server,
-                                        hdbContext,
-                                        sessionId,
-                                        sessionContext,
-                                        nodeId,
-                                        startTimestamp,
-                                        MATCH_EQUAL);
-        if (index1 == storeEnd)
-            return UA_STATUSCODE_BADNODATA;
-        index2 = index1 + 1;
-    } else {
-        index1 = getDateTimeMatch_backend_memory(server,
-                                        hdbContext,
-                                        sessionId,
-                                        sessionContext,
-                                        nodeId,
-                                        startTimestamp,
-                                        MATCH_EQUAL_OR_AFTER);
-        index2 = getDateTimeMatch_backend_memory(server,
-                                        hdbContext,
-                                        sessionId,
-                                        sessionContext,
-                                        nodeId,
-                                        endTimestamp,
-                                        MATCH_BEFORE);
-        if (index2 == storeEnd || index1 == storeEnd || index1 > index2 )
-            return UA_STATUSCODE_BADNODATA;
-        ++index2;
-    }
-#ifndef __clang_analyzer__
-    for (size_t i = index1; i < index2; ++i) {
-        UA_DataValueMemoryStoreItem_deleteMembers(item->dataStore[i]);
-        UA_free(item->dataStore[i]);
-    }
-    memmove(&item->dataStore[index1], &item->dataStore[index2], sizeof(UA_DataValueMemoryStoreItem*) * (item->storeEnd - index2));
-    item->storeEnd -= index2 - index1;
-#else
-    (void)index1;
-    (void)index2;
-#endif
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-deleteMembers_backend_memory(UA_HistoryDataBackend *backend)
-{
-    if (backend == NULL || backend->context == NULL)
-        return;
-    UA_MemoryStoreContext_deleteMembers((UA_MemoryStoreContext*)backend->context);
-}
-
-
-
-UA_HistoryDataBackend
-UA_HistoryDataBackend_Memory(size_t initialNodeIdStoreSize, size_t initialDataStoreSize) {
-    if (initialNodeIdStoreSize == 0)
-        initialNodeIdStoreSize = 1;
-    if (initialDataStoreSize == 0)
-        initialDataStoreSize = 1;
-    UA_HistoryDataBackend result;
-    memset(&result, 0, sizeof(UA_HistoryDataBackend));
-    UA_MemoryStoreContext *ctx = (UA_MemoryStoreContext *)UA_calloc(1, sizeof(UA_MemoryStoreContext));
-    if (!ctx)
-        return result;
-    ctx->dataStore = (UA_NodeIdStoreContextItem_backend_memory*)UA_calloc(initialNodeIdStoreSize, sizeof(UA_NodeIdStoreContextItem_backend_memory));
-    ctx->initialStoreSize = initialDataStoreSize;
-    ctx->storeSize = initialNodeIdStoreSize;
-    ctx->storeEnd = 0;
-    result.serverSetHistoryData = &serverSetHistoryData_backend_memory;
-    result.resultSize = &resultSize_backend_memory;
-    result.getEnd = &getEnd_backend_memory;
-    result.lastIndex = &lastIndex_backend_memory;
-    result.firstIndex = &firstIndex_backend_memory;
-    result.getDateTimeMatch = &getDateTimeMatch_backend_memory;
-    result.copyDataValues = &copyDataValues_backend_memory;
-    result.getDataValue = &getDataValue_backend_memory;
-    result.boundSupported = &boundSupported_backend_memory;
-    result.timestampsToReturnSupported = &timestampsToReturnSupported_backend_memory;
-    result.insertDataValue =  &insertDataValue_backend_memory;
-    result.updateDataValue =  &updateDataValue_backend_memory;
-    result.replaceDataValue =  &replaceDataValue_backend_memory;
-    result.removeDataValue =  &removeDataValue_backend_memory;
-    result.deleteMembers = &deleteMembers_backend_memory;
-    result.getHistoryData = NULL;
-    result.context = ctx;
-    return result;
-}
-
-void
-UA_HistoryDataBackend_Memory_deleteMembers(UA_HistoryDataBackend *backend)
-{
-    UA_MemoryStoreContext *ctx = (UA_MemoryStoreContext*)backend->context;
-    UA_MemoryStoreContext_delete(ctx);
-    memset(backend, 0, sizeof(UA_HistoryDataBackend));
-}
diff --git a/ext/open62541/plugins/historydata/ua_history_data_gathering_default.c b/ext/open62541/plugins/historydata/ua_history_data_gathering_default.c
deleted file mode 100644
index e276d44..0000000
--- a/ext/open62541/plugins/historydata/ua_history_data_gathering_default.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/client_subscriptions.h>
-#include <open62541/plugin/historydata/history_data_gathering_default.h>
-#include <open62541/plugin/historydata/history_database_default.h>
-
-#include <string.h>
-
-typedef struct {
-    UA_NodeId nodeId;
-    UA_HistorizingNodeIdSettings setting;
-    UA_MonitoredItemCreateResult monitoredResult;
-} UA_NodeIdStoreContextItem_gathering_default;
-
-typedef struct {
-    UA_NodeIdStoreContextItem_gathering_default *dataStore;
-    size_t storeEnd;
-    size_t storeSize;
-} UA_NodeIdStoreContext;
-
-static void
-dataChangeCallback_gathering_default(UA_Server *server,
-                                     UA_UInt32 monitoredItemId,
-                                     void *monitoredItemContext,
-                                     const UA_NodeId *nodeId,
-                                     void *nodeContext,
-                                     UA_UInt32 attributeId,
-                                     const UA_DataValue *value)
-{
-    UA_NodeIdStoreContextItem_gathering_default *context = (UA_NodeIdStoreContextItem_gathering_default*)monitoredItemContext;
-    context->setting.historizingBackend.serverSetHistoryData(server,
-                                                             context->setting.historizingBackend.context,
-                                                             NULL,
-                                                             NULL,
-                                                             nodeId,
-                                                             UA_TRUE,
-                                                             value);
-}
-
-static UA_NodeIdStoreContextItem_gathering_default*
-getNodeIdStoreContextItem_gathering_default(UA_NodeIdStoreContext *context,
-                                            const UA_NodeId *nodeId)
-{
-    for (size_t i = 0; i < context->storeEnd; ++i) {
-        if (UA_NodeId_equal(&context->dataStore[i].nodeId, nodeId)) {
-            return &context->dataStore[i];
-        }
-    }
-    return NULL;
-}
-
-static UA_StatusCode
-startPoll(UA_Server *server, UA_NodeIdStoreContextItem_gathering_default *item)
-{
-    UA_MonitoredItemCreateRequest monitorRequest =
-            UA_MonitoredItemCreateRequest_default(item->nodeId);
-    monitorRequest.requestedParameters.samplingInterval = (double)item->setting.pollingInterval;
-    monitorRequest.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    item->monitoredResult =
-            UA_Server_createDataChangeMonitoredItem(server,
-                                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                                    monitorRequest,
-                                                    item,
-                                                    &dataChangeCallback_gathering_default);
-    return item->monitoredResult.statusCode;
-}
-
-static UA_StatusCode
-stopPoll(UA_Server *server, UA_NodeIdStoreContextItem_gathering_default *item)
-{
-    UA_StatusCode retval = UA_Server_deleteMonitoredItem(server, item->monitoredResult.monitoredItemId);
-    UA_MonitoredItemCreateResult_init(&item->monitoredResult);
-    return retval;
-}
-
-static UA_StatusCode
-stopPoll_gathering_default(UA_Server *server,
-                           void *context,
-                           const UA_NodeId *nodeId)
-{
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext *)context;
-    UA_NodeIdStoreContextItem_gathering_default *item = getNodeIdStoreContextItem_gathering_default(ctx, nodeId);
-    if (!item) {
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-    if (item->setting.historizingUpdateStrategy != UA_HISTORIZINGUPDATESTRATEGY_POLL)
-        return UA_STATUSCODE_BADNODEIDINVALID;
-    if (item->monitoredResult.monitoredItemId == 0)
-        return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
-    return stopPoll(server, item);
-}
-
-static UA_StatusCode
-startPoll_gathering_default(UA_Server *server,
-                            void *context,
-                            const UA_NodeId *nodeId)
-{
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext *)context;
-    UA_NodeIdStoreContextItem_gathering_default *item = getNodeIdStoreContextItem_gathering_default(ctx, nodeId);
-    if (!item) {
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-    if (item->setting.historizingUpdateStrategy != UA_HISTORIZINGUPDATESTRATEGY_POLL)
-        return UA_STATUSCODE_BADNODEIDINVALID;
-    if (item->monitoredResult.monitoredItemId > 0)
-        return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
-    return startPoll(server, item);
-}
-
-static UA_StatusCode
-registerNodeId_gathering_default(UA_Server *server,
-                                 void *context,
-                                 const UA_NodeId *nodeId,
-                                 const UA_HistorizingNodeIdSettings setting)
-{
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext*)context;
-    if (getNodeIdStoreContextItem_gathering_default(ctx, nodeId)) {
-        return UA_STATUSCODE_BADNODEIDEXISTS;
-    }
-    if (ctx->storeEnd >= ctx->storeSize) {
-        size_t newStoreSize = ctx->storeSize * 2;
-        ctx->dataStore = (UA_NodeIdStoreContextItem_gathering_default*)UA_realloc(ctx->dataStore,  (newStoreSize * sizeof(UA_NodeIdStoreContextItem_gathering_default)));
-        if (!ctx->dataStore) {
-            ctx->storeSize = 0;
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        ctx->storeSize = newStoreSize;
-    }
-    UA_NodeId_copy(nodeId, &ctx->dataStore[ctx->storeEnd].nodeId);
-    size_t current = ctx->storeEnd;
-    ctx->dataStore[current].setting = setting;
-    ++ctx->storeEnd;
-    return UA_STATUSCODE_GOOD;
-}
-
-static const UA_HistorizingNodeIdSettings*
-getHistorizingSetting_gathering_default(UA_Server *server,
-                                        void *context,
-                                        const UA_NodeId *nodeId)
-{
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext*)context;
-    UA_NodeIdStoreContextItem_gathering_default *item = getNodeIdStoreContextItem_gathering_default(ctx, nodeId);
-    if (item) {
-        return &item->setting;
-    }
-    return NULL;
-}
-
-static void
-deleteMembers_gathering_default(UA_HistoryDataGathering *gathering)
-{
-    if (gathering == NULL || gathering->context == NULL)
-        return;
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext*)gathering->context;
-    for (size_t i = 0; i < ctx->storeEnd; ++i) {
-        UA_NodeId_deleteMembers(&ctx->dataStore[i].nodeId);
-        // There is still a monitored item present for this gathering
-        // You need to remove it with UA_Server_deleteMonitoredItem
-        UA_assert(ctx->dataStore[i].monitoredResult.monitoredItemId == 0);
-    }
-    UA_free(ctx->dataStore);
-    UA_free(gathering->context);
-}
-
-static UA_Boolean
-updateNodeIdSetting_gathering_default(UA_Server *server,
-                                      void *context,
-                                      const UA_NodeId *nodeId,
-                                      const UA_HistorizingNodeIdSettings setting)
-{
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext*)context;
-    UA_NodeIdStoreContextItem_gathering_default *item = getNodeIdStoreContextItem_gathering_default(ctx, nodeId);
-    if (!item) {
-        return false;
-    }
-    stopPoll_gathering_default(server, context, nodeId);
-    item->setting = setting;
-    return true;
-}
-
-static void
-setValue_gathering_default(UA_Server *server,
-                           void *context,
-                           const UA_NodeId *sessionId,
-                           void *sessionContext,
-                           const UA_NodeId *nodeId,
-                           UA_Boolean historizing,
-                           const UA_DataValue *value)
-{
-    UA_NodeIdStoreContext *ctx = (UA_NodeIdStoreContext*)context;
-    UA_NodeIdStoreContextItem_gathering_default *item = getNodeIdStoreContextItem_gathering_default(ctx, nodeId);
-    if (!item) {
-        return;
-    }
-    if (item->setting.historizingUpdateStrategy == UA_HISTORIZINGUPDATESTRATEGY_VALUESET) {
-        item->setting.historizingBackend.serverSetHistoryData(server,
-                                                              item->setting.historizingBackend.context,
-                                                              sessionId,
-                                                              sessionContext,
-                                                              nodeId,
-                                                              historizing,
-                                                              value);
-    }
-}
-
-UA_HistoryDataGathering
-UA_HistoryDataGathering_Default(size_t initialNodeIdStoreSize)
-{
-    UA_HistoryDataGathering gathering;
-    memset(&gathering, 0, sizeof(UA_HistoryDataGathering));
-    gathering.setValue = &setValue_gathering_default;
-    gathering.getHistorizingSetting = &getHistorizingSetting_gathering_default;
-    gathering.registerNodeId = &registerNodeId_gathering_default;
-    gathering.startPoll = &startPoll_gathering_default;
-    gathering.stopPoll = &stopPoll_gathering_default;
-    gathering.deleteMembers = &deleteMembers_gathering_default;
-    gathering.updateNodeIdSetting = &updateNodeIdSetting_gathering_default;
-    UA_NodeIdStoreContext *context = (UA_NodeIdStoreContext*)UA_calloc(1, sizeof(UA_NodeIdStoreContext));
-    context->storeEnd = 0;
-    context->storeSize = initialNodeIdStoreSize;
-    context->dataStore = (UA_NodeIdStoreContextItem_gathering_default*)UA_calloc(initialNodeIdStoreSize, sizeof(UA_NodeIdStoreContextItem_gathering_default));
-    gathering.context = context;
-    return gathering;
-}
diff --git a/ext/open62541/plugins/historydata/ua_history_database_default.c b/ext/open62541/plugins/historydata/ua_history_database_default.c
deleted file mode 100644
index 090a72b..0000000
--- a/ext/open62541/plugins/historydata/ua_history_database_default.c
+++ /dev/null
@@ -1,629 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/plugin/historydata/history_data_gathering_default.h>
-#include <open62541/plugin/historydata/history_database_default.h>
-
-#include <limits.h>
-
-typedef struct {
-    UA_HistoryDataGathering gathering;
-} UA_HistoryDatabaseContext_default;
-
-static size_t
-getResultSize_service_default(const UA_HistoryDataBackend* backend,
-                              UA_Server *server,
-                              const UA_NodeId *sessionId,
-                              void* sessionContext,
-                              const UA_NodeId *nodeId,
-                              UA_DateTime start,
-                              UA_DateTime end,
-                              UA_UInt32 numValuesPerNode,
-                              UA_Boolean returnBounds,
-                              size_t *startIndex,
-                              size_t *endIndex,
-                              UA_Boolean *addFirst,
-                              UA_Boolean *addLast,
-                              UA_Boolean *reverse)
-{
-    size_t storeEnd = backend->getEnd(server, backend->context, sessionId, sessionContext, nodeId);
-    size_t firstIndex = backend->firstIndex(server, backend->context, sessionId, sessionContext, nodeId);
-    size_t lastIndex = backend->lastIndex(server, backend->context, sessionId, sessionContext, nodeId);
-    *startIndex = storeEnd;
-    *endIndex = storeEnd;
-    *addFirst = false;
-    *addLast = false;
-    if (end == LLONG_MIN) {
-        *reverse = false;
-    } else if (start == LLONG_MIN) {
-        *reverse = true;
-    } else {
-        *reverse = end < start;
-    }
-    UA_Boolean equal = start == end;
-    size_t size = 0;
-    if (lastIndex != storeEnd) {
-        if (equal) {
-            if (returnBounds) {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_BEFORE);
-                if (*startIndex == storeEnd) {
-                    *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_AFTER);
-                    *addFirst = true;
-                }
-                *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_AFTER);
-                size = backend->resultSize(server, backend->context, sessionId, sessionContext, nodeId, *startIndex, *endIndex);
-            } else {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL);
-                *endIndex = *startIndex;
-                if (*startIndex == storeEnd)
-                    size = 0;
-                else
-                    size = 1;
-            }
-        } else if (start == LLONG_MIN) {
-            *endIndex = firstIndex;
-            if (returnBounds) {
-                *addLast = true;
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_EQUAL_OR_AFTER);
-                if (*startIndex == storeEnd) {
-                    *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_EQUAL_OR_BEFORE);
-                    *addFirst = true;
-                }
-            } else {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_EQUAL_OR_BEFORE);
-            }
-            size = backend->resultSize(server, backend->context, sessionId, sessionContext, nodeId, *endIndex, *startIndex);
-        } else if (end == LLONG_MIN) {
-            *endIndex = lastIndex;
-            if (returnBounds) {
-                *addLast = true;
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_BEFORE);
-                if (*startIndex == storeEnd) {
-                    *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_AFTER);
-                    *addFirst = true;
-                }
-            } else {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_AFTER);
-            }
-            size = backend->resultSize(server, backend->context, sessionId, sessionContext, nodeId, *startIndex, *endIndex);
-        } else if (*reverse) {
-            if (returnBounds) {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_AFTER);
-                if (*startIndex == storeEnd) {
-                    *addFirst = true;
-                    *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_BEFORE);
-                }
-                *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_EQUAL_OR_BEFORE);
-                if (*endIndex == storeEnd) {
-                    *addLast = true;
-                    *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_AFTER);
-                }
-            } else {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_BEFORE);
-                *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_AFTER);
-            }
-            size = backend->resultSize(server, backend->context, sessionId, sessionContext, nodeId, *endIndex, *startIndex);
-        } else {
-            if (returnBounds) {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_BEFORE);
-                if (*startIndex == storeEnd) {
-                    *addFirst = true;
-                    *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_AFTER);
-                }
-                *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_EQUAL_OR_AFTER);
-                if (*endIndex == storeEnd) {
-                    *addLast = true;
-                    *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_BEFORE);
-                }
-            } else {
-                *startIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, start, MATCH_EQUAL_OR_AFTER);
-                *endIndex = backend->getDateTimeMatch(server, backend->context, sessionId, sessionContext, nodeId, end, MATCH_BEFORE);
-            }
-            size = backend->resultSize(server, backend->context, sessionId, sessionContext, nodeId, *startIndex, *endIndex);
-        }
-    } else if (returnBounds) {
-        *addLast = true;
-        *addFirst = true;
-    }
-
-    if (*addLast)
-        ++size;
-    if (*addFirst)
-        ++size;
-
-    if (numValuesPerNode > 0 && size > numValuesPerNode) {
-        size = numValuesPerNode;
-        *addLast = false;
-    }
-    return size;
-}
-
-static UA_StatusCode
-getHistoryData_service_default(const UA_HistoryDataBackend* backend,
-                               const UA_DateTime start,
-                               const UA_DateTime end,
-                               UA_Server *server,
-                               const UA_NodeId *sessionId,
-                               void *sessionContext,
-                               const UA_NodeId* nodeId,
-                               size_t maxSize,
-                               UA_UInt32 numValuesPerNode,
-                               UA_Boolean returnBounds,
-                               UA_TimestampsToReturn timestampsToReturn,
-                               UA_NumericRange range,
-                               UA_Boolean releaseContinuationPoints,
-                               const UA_ByteString *continuationPoint,
-                               UA_ByteString *outContinuationPoint,
-                               size_t *resultSize,
-                               UA_DataValue ** result)
-{
-    size_t skip = 0;
-    UA_ByteString backendContinuationPoint;
-    UA_ByteString_init(&backendContinuationPoint);
-    if (continuationPoint->length > 0) {
-        if (continuationPoint->length >= sizeof(size_t)) {
-            skip = *((size_t*)(continuationPoint->data));
-            if (continuationPoint->length > 0) {
-                backendContinuationPoint.length = continuationPoint->length - sizeof(size_t);
-                backendContinuationPoint.data = continuationPoint->data + sizeof(size_t);
-            }
-        } else {
-            return UA_STATUSCODE_BADCONTINUATIONPOINTINVALID;
-        }
-    }
-
-    size_t storeEnd = backend->getEnd(server, backend->context, sessionId, sessionContext, nodeId);
-    size_t startIndex;
-    size_t endIndex;
-    UA_Boolean addFirst;
-    UA_Boolean addLast;
-    UA_Boolean reverse;
-    size_t _resultSize = getResultSize_service_default(backend,
-                                                       server,
-                                                       sessionId,
-                                                       sessionContext,
-                                                       nodeId,
-                                                       start,
-                                                       end,
-                                                       numValuesPerNode == 0 ? 0 : numValuesPerNode + (UA_UInt32)skip,
-                                                       returnBounds,
-                                                       &startIndex,
-                                                       &endIndex,
-                                                       &addFirst,
-                                                       &addLast,
-                                                       &reverse);
-    *resultSize = _resultSize - skip;
-    if (*resultSize > maxSize) {
-        *resultSize = maxSize;
-    }
-    UA_DataValue *outResult= (UA_DataValue*)UA_Array_new(*resultSize, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    if (!outResult) {
-        *resultSize = 0;
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    *result = outResult;
-
-    size_t counter = 0;
-    if (addFirst) {
-        if (skip == 0) {
-            outResult[counter].hasStatus = true;
-            outResult[counter].status = UA_STATUSCODE_BADBOUNDNOTFOUND;
-            outResult[counter].hasSourceTimestamp = true;
-            if (start == LLONG_MIN) {
-                outResult[counter].sourceTimestamp = end;
-            } else {
-                outResult[counter].sourceTimestamp = start;
-            }
-            ++counter;
-        }
-    }
-    UA_ByteString backendOutContinuationPoint;
-    UA_ByteString_init(&backendOutContinuationPoint);
-    if (endIndex != storeEnd && startIndex != storeEnd) {
-        size_t retval = 0;
-
-        size_t valueSize = *resultSize - counter;
-        if (valueSize + skip > _resultSize - addFirst - addLast) {
-            if (skip == 0) {
-                valueSize = _resultSize - addFirst - addLast;
-            } else {
-                valueSize = _resultSize - skip - addLast;
-            }
-
-        }
-
-        UA_StatusCode ret = UA_STATUSCODE_GOOD;
-        if (valueSize > 0)
-            ret = backend->copyDataValues(server,
-                                          backend->context,
-                                          sessionId,
-                                          sessionContext,
-                                          nodeId,
-                                          startIndex,
-                                          endIndex,
-                                          reverse,
-                                          valueSize,
-                                          range,
-                                          releaseContinuationPoints,
-                                          &backendContinuationPoint,
-                                          &backendOutContinuationPoint,
-                                          &retval,
-                                          &outResult[counter]);
-        if (ret != UA_STATUSCODE_GOOD) {
-            UA_Array_delete(outResult, *resultSize, &UA_TYPES[UA_TYPES_DATAVALUE]);
-            *result = NULL;
-            *resultSize = 0;
-            return ret;
-        }
-        counter += retval;
-    }
-    if (addLast && counter < *resultSize) {
-        outResult[counter].hasStatus = true;
-        outResult[counter].status = UA_STATUSCODE_BADBOUNDNOTFOUND;
-        outResult[counter].hasSourceTimestamp = true;
-        if (start == LLONG_MIN && storeEnd != backend->firstIndex(server, backend->context, sessionId, sessionContext, nodeId)) {
-            outResult[counter].sourceTimestamp = backend->getDataValue(server, backend->context, sessionId, sessionContext, nodeId, endIndex)->sourceTimestamp - UA_DATETIME_SEC;
-        } else if (end == LLONG_MIN && storeEnd != backend->firstIndex(server, backend->context, sessionId, sessionContext, nodeId)) {
-            outResult[counter].sourceTimestamp = backend->getDataValue(server, backend->context, sessionId, sessionContext, nodeId, endIndex)->sourceTimestamp + UA_DATETIME_SEC;
-        } else {
-            outResult[counter].sourceTimestamp = end;
-        }
-    }
-    // there are more values
-    if (skip + *resultSize < _resultSize
-            // there are not more values for this request, but there are more values in database
-            || (backendOutContinuationPoint.length > 0
-                && numValuesPerNode != 0)
-            // we deliver just one value which is a FIRST/LAST value
-            || (skip == 0
-                && addFirst == true
-                && *resultSize == 1)) {
-        if(UA_ByteString_allocBuffer(outContinuationPoint, backendOutContinuationPoint.length + sizeof(size_t))
-                != UA_STATUSCODE_GOOD) {
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        *((size_t*)(outContinuationPoint->data)) = skip + *resultSize;
-        if(backendOutContinuationPoint.length > 0)
-            memcpy(outContinuationPoint->data + sizeof(size_t), backendOutContinuationPoint.data, backendOutContinuationPoint.length);
-    }
-    UA_ByteString_deleteMembers(&backendOutContinuationPoint);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-updateData_service_default(UA_Server *server,
-                           void *hdbContext,
-                           const UA_NodeId *sessionId,
-                           void *sessionContext,
-                           const UA_RequestHeader *requestHeader,
-                           const UA_UpdateDataDetails *details,
-                           UA_HistoryUpdateResult *result)
-{
-    UA_HistoryDatabaseContext_default *ctx = (UA_HistoryDatabaseContext_default*)hdbContext;
-    UA_Byte accessLevel = 0;
-    UA_Server_readAccessLevel(server,
-                              details->nodeId,
-                              &accessLevel);
-    if (!(accessLevel & UA_ACCESSLEVELMASK_HISTORYWRITE)) {
-        result->statusCode = UA_STATUSCODE_BADUSERACCESSDENIED;
-        return;
-    }
-
-    UA_Boolean historizing = false;
-    UA_Server_readHistorizing(server,
-                              details->nodeId,
-                              &historizing);
-    if (!historizing) {
-        result->statusCode = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-        return;
-    }
-    const UA_HistorizingNodeIdSettings *setting = ctx->gathering.getHistorizingSetting(
-                server,
-                ctx->gathering.context,
-                &details->nodeId);
-
-    if (!setting) {
-        result->statusCode = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-        return;
-    }
-
-    result->operationResultsSize = details->updateValuesSize;
-    result->operationResults = (UA_StatusCode*)UA_Array_new(result->operationResultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-    for (size_t i = 0; i < details->updateValuesSize; ++i) {
-        if (!UA_Server_AccessControl_allowHistoryUpdateUpdateData(server,
-                                                                  sessionId,
-                                                                  sessionContext,
-                                                                  &details->nodeId,
-                                                                  details->performInsertReplace,
-                                                                  &details->updateValues[i])) {
-            result->operationResults[i] = UA_STATUSCODE_BADUSERACCESSDENIED;
-            continue;
-        }
-        switch (details->performInsertReplace) {
-        case UA_PERFORMUPDATETYPE_INSERT:
-            if (!setting->historizingBackend.insertDataValue) {
-                result->operationResults[i] = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-                continue;
-            }
-            result->operationResults[i]
-                    = setting->historizingBackend.insertDataValue(server,
-                                                                  setting->historizingBackend.context,
-                                                                  sessionId,
-                                                                  sessionContext,
-                                                                  &details->nodeId,
-                                                                  &details->updateValues[i]);
-            continue;
-        case UA_PERFORMUPDATETYPE_REPLACE:
-            if (!setting->historizingBackend.replaceDataValue) {
-                result->operationResults[i] = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-                continue;
-            }
-            result->operationResults[i]
-                    = setting->historizingBackend.replaceDataValue(server,
-                                                                   setting->historizingBackend.context,
-                                                                   sessionId,
-                                                                   sessionContext,
-                                                                   &details->nodeId,
-                                                                   &details->updateValues[i]);
-            continue;
-        case UA_PERFORMUPDATETYPE_UPDATE:
-            if (!setting->historizingBackend.updateDataValue) {
-                result->operationResults[i] = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-                continue;
-            }
-            result->operationResults[i]
-                    = setting->historizingBackend.updateDataValue(server,
-                                                                  setting->historizingBackend.context,
-                                                                  sessionId,
-                                                                  sessionContext,
-                                                                  &details->nodeId,
-                                                                  &details->updateValues[i]);
-            continue;
-        default:
-            result->operationResults[i] = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-            continue;
-        }
-    }
-}
-
-
-static void
-deleteRawModified_service_default(UA_Server *server,
-                                  void *hdbContext,
-                                  const UA_NodeId *sessionId,
-                                  void *sessionContext,
-                                  const UA_RequestHeader *requestHeader,
-                                  const UA_DeleteRawModifiedDetails *details,
-                                  UA_HistoryUpdateResult *result)
-{
-    if (details->isDeleteModified) {
-        result->statusCode = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-        return;
-    }
-    UA_HistoryDatabaseContext_default *ctx = (UA_HistoryDatabaseContext_default*)hdbContext;
-    UA_Byte accessLevel = 0;
-    UA_Server_readAccessLevel(server,
-                              details->nodeId,
-                              &accessLevel);
-    if (!(accessLevel & UA_ACCESSLEVELMASK_HISTORYWRITE)) {
-        result->statusCode = UA_STATUSCODE_BADUSERACCESSDENIED;
-        return;
-    }
-
-    UA_Boolean historizing = false;
-    UA_Server_readHistorizing(server,
-                              details->nodeId,
-                              &historizing);
-    if (!historizing) {
-        result->statusCode = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-        return;
-    }
-    const UA_HistorizingNodeIdSettings *setting = ctx->gathering.getHistorizingSetting(
-                server,
-                ctx->gathering.context,
-                &details->nodeId);
-
-    if (!setting) {
-        result->statusCode = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-        return;
-    }
-    if (!setting->historizingBackend.removeDataValue) {
-        result->statusCode = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-        return;
-    }
-
-    if (!UA_Server_AccessControl_allowHistoryUpdateDeleteRawModified(server,
-                                                                     sessionId,
-                                                                     sessionContext,
-                                                                     &details->nodeId,
-                                                                     details->startTime,
-                                                                     details->endTime,
-                                                                     details->isDeleteModified)) {
-        result->statusCode = UA_STATUSCODE_BADUSERACCESSDENIED;
-        return;
-    }
-
-    result->statusCode
-            = setting->historizingBackend.removeDataValue(server,
-                                                          setting->historizingBackend.context,
-                                                          sessionId,
-                                                          sessionContext,
-                                                          &details->nodeId,
-                                                          details->startTime,
-                                                          details->endTime);
-}
-
-static void
-readRaw_service_default(UA_Server *server,
-                        void *context,
-                        const UA_NodeId *sessionId,
-                        void *sessionContext,
-                        const UA_RequestHeader *requestHeader,
-                        const UA_ReadRawModifiedDetails *historyReadDetails,
-                        UA_TimestampsToReturn timestampsToReturn,
-                        UA_Boolean releaseContinuationPoints,
-                        size_t nodesToReadSize,
-                        const UA_HistoryReadValueId *nodesToRead,
-                        UA_HistoryReadResponse *response,
-                        UA_HistoryData * const * const historyData)
-{
-    UA_HistoryDatabaseContext_default *ctx = (UA_HistoryDatabaseContext_default*)context;
-    for (size_t i = 0; i < nodesToReadSize; ++i) {
-        UA_Byte accessLevel = 0;
-        UA_Server_readAccessLevel(server,
-                                  nodesToRead[i].nodeId,
-                                  &accessLevel);
-        if (!(accessLevel & UA_ACCESSLEVELMASK_HISTORYREAD)) {
-            response->results[i].statusCode = UA_STATUSCODE_BADUSERACCESSDENIED;
-            continue;
-        }
-
-        UA_Boolean historizing = false;
-        UA_Server_readHistorizing(server,
-                                  nodesToRead[i].nodeId,
-                                  &historizing);
-        if (!historizing) {
-            response->results[i].statusCode = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-            continue;
-        }
-
-        const UA_HistorizingNodeIdSettings *setting = ctx->gathering.getHistorizingSetting(
-                    server,
-                    ctx->gathering.context,
-                    &nodesToRead[i].nodeId);
-
-        if (!setting) {
-            response->results[i].statusCode = UA_STATUSCODE_BADHISTORYOPERATIONINVALID;
-            continue;
-        }
-
-        if (historyReadDetails->returnBounds && !setting->historizingBackend.boundSupported(
-                    server,
-                    setting->historizingBackend.context,
-                    sessionId,
-                    sessionContext,
-                    &nodesToRead[i].nodeId)) {
-            response->results[i].statusCode = UA_STATUSCODE_BADBOUNDNOTSUPPORTED;
-            continue;
-        }
-
-        if (!setting->historizingBackend.timestampsToReturnSupported(
-                    server,
-                    setting->historizingBackend.context,
-                    sessionId,
-                    sessionContext,
-                    &nodesToRead[i].nodeId,
-                    timestampsToReturn)) {
-            response->results[i].statusCode = UA_STATUSCODE_BADTIMESTAMPNOTSUPPORTED;
-            continue;
-        }
-
-        UA_NumericRange range;
-        range.dimensionsSize = 0;
-        range.dimensions = NULL;
-        if (nodesToRead[i].indexRange.length > 0) {
-            UA_StatusCode rangeParseResult = UA_NumericRange_parseFromString(&range, &nodesToRead[i].indexRange);
-            if (rangeParseResult != UA_STATUSCODE_GOOD) {
-                response->results[i].statusCode = rangeParseResult;
-                continue;
-            }
-        }
-
-        UA_StatusCode getHistoryDataStatusCode;
-        if (setting->historizingBackend.getHistoryData) {
-            getHistoryDataStatusCode = setting->historizingBackend.getHistoryData(
-                        server,
-                        sessionId,
-                        sessionContext,
-                        &setting->historizingBackend,
-                        historyReadDetails->startTime,
-                        historyReadDetails->endTime,
-                        &nodesToRead[i].nodeId,
-                        setting->maxHistoryDataResponseSize,
-                        historyReadDetails->numValuesPerNode,
-                        historyReadDetails->returnBounds,
-                        timestampsToReturn,
-                        range,
-                        releaseContinuationPoints,
-                        &nodesToRead[i].continuationPoint,
-                        &response->results[i].continuationPoint,
-                        historyData[i]);
-        } else {
-            getHistoryDataStatusCode = getHistoryData_service_default(
-                        &setting->historizingBackend,
-                        historyReadDetails->startTime,
-                        historyReadDetails->endTime,
-                        server,
-                        sessionId,
-                        sessionContext,
-                        &nodesToRead[i].nodeId,
-                        setting->maxHistoryDataResponseSize,
-                        historyReadDetails->numValuesPerNode,
-                        historyReadDetails->returnBounds,
-                        timestampsToReturn,
-                        range,
-                        releaseContinuationPoints,
-                        &nodesToRead[i].continuationPoint,
-                        &response->results[i].continuationPoint,
-                        &historyData[i]->dataValuesSize,
-                        &historyData[i]->dataValues);
-        }
-        if (getHistoryDataStatusCode != UA_STATUSCODE_GOOD) {
-            response->results[i].statusCode = getHistoryDataStatusCode;
-            continue;
-        }
-    }
-    response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
-    return;
-}
-
-static void
-setValue_service_default(UA_Server *server,
-                         void *context,
-                         const UA_NodeId *sessionId,
-                         void *sessionContext,
-                         const UA_NodeId *nodeId,
-                         UA_Boolean historizing,
-                         const UA_DataValue *value)
-{
-    UA_HistoryDatabaseContext_default *ctx = (UA_HistoryDatabaseContext_default*)context;
-    if (ctx->gathering.setValue)
-        ctx->gathering.setValue(server,
-                                ctx->gathering.context,
-                                sessionId,
-                                sessionContext,
-                                nodeId,
-                                historizing,
-                                value);
-}
-
-static void
-deleteMembers_service_default(UA_HistoryDatabase *hdb)
-{
-    if (hdb == NULL || hdb->context == NULL)
-        return;
-    UA_HistoryDatabaseContext_default *ctx = (UA_HistoryDatabaseContext_default*)hdb->context;
-    ctx->gathering.deleteMembers(&ctx->gathering);
-    UA_free(ctx);
-}
-
-UA_HistoryDatabase
-UA_HistoryDatabase_default(UA_HistoryDataGathering gathering)
-{
-    UA_HistoryDatabase hdb;
-    UA_HistoryDatabaseContext_default *context =
-            (UA_HistoryDatabaseContext_default*)
-            UA_calloc(1, sizeof(UA_HistoryDatabaseContext_default));
-    context->gathering = gathering;
-    hdb.context = context;
-    hdb.readRaw = &readRaw_service_default;
-    hdb.setValue = &setValue_service_default;
-    hdb.updateData = &updateData_service_default;
-    hdb.deleteRawModified = &deleteRawModified_service_default;
-    hdb.deleteMembers = &deleteMembers_service_default;
-    return hdb;
-}
diff --git a/ext/open62541/plugins/include/open62541/client_config_default.h b/ext/open62541/plugins/include/open62541/client_config_default.h
deleted file mode 100644
index 8df28d3..0000000
--- a/ext/open62541/plugins/include/open62541/client_config_default.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#ifndef UA_CLIENT_CONFIG_DEFAULT_H_
-#define UA_CLIENT_CONFIG_DEFAULT_H_
-
-#include <open62541/client_config.h>
-
-_UA_BEGIN_DECLS
-
-UA_StatusCode UA_EXPORT
-UA_ClientConfig_setDefault(UA_ClientConfig *config);
-
-#ifdef UA_ENABLE_ENCRYPTION
-UA_StatusCode UA_EXPORT
-UA_ClientConfig_setDefaultEncryption(UA_ClientConfig *config,
-                                     UA_ByteString localCertificate, UA_ByteString privateKey,
-                                     const UA_ByteString *trustList, size_t trustListSize,
-                                     const UA_ByteString *revocationList, size_t revocationListSize);
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_CONFIG_DEFAULT_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/accesscontrol_default.h b/ext/open62541/plugins/include/open62541/plugin/accesscontrol_default.h
deleted file mode 100644
index 7f60b14..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/accesscontrol_default.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_ACCESSCONTROL_DEFAULT_H_
-#define UA_ACCESSCONTROL_DEFAULT_H_
-
-#include <open62541/plugin/accesscontrol.h>
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-typedef struct {
-    UA_String username;
-    UA_String password;
-} UA_UsernamePasswordLogin;
-
-/* Default access control. The log-in can be anonymous or username-password. A
- * logged-in user has all access rights. */
-UA_EXPORT UA_StatusCode
-UA_AccessControl_default(UA_ServerConfig *config, UA_Boolean allowAnonymous,
-                         const UA_ByteString *userTokenPolicyUri,
-                         size_t usernamePasswordLoginSize,
-                         const UA_UsernamePasswordLogin *usernamePasswordLogin);
-
-_UA_END_DECLS
-
-#endif /* UA_ACCESSCONTROL_DEFAULT_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_backend.h b/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_backend.h
deleted file mode 100644
index e7722f3..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_backend.h
+++ /dev/null
@@ -1,291 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#ifndef UA_PLUGIN_HISTORY_DATA_BACKEND_H_
-#define UA_PLUGIN_HISTORY_DATA_BACKEND_H_
-
-#include <open62541/server.h>
-
-_UA_BEGIN_DECLS
-
-typedef enum {
-    MATCH_EQUAL, /* Match with the exact timestamp. */
-    MATCH_AFTER, /* Match the value with the timestamp in the
-                    database that is the first later in time from the provided timestamp. */
-    MATCH_EQUAL_OR_AFTER, /* Match exactly if possible, or the first timestamp
-                             later in time from the provided timestamp. */
-    MATCH_BEFORE, /* Match the first timestamp in the database that is earlier
-                     in time from the provided timestamp. */
-    MATCH_EQUAL_OR_BEFORE /* Match exactly if possible, or the first timestamp
-                             that is earlier in time from the provided timestamp. */
-} MatchStrategy;
-
-typedef struct UA_HistoryDataBackend UA_HistoryDataBackend;
-
-struct UA_HistoryDataBackend {
-    void *context;
-
-    void
-    (*deleteMembers)(UA_HistoryDataBackend *backend);
-
-    /* This function sets a DataValue for a node in the historical data storage.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node for which the value shall be stored.
-     * value is the value which shall be stored.
-     * historizing is the historizing flag of the node identified by nodeId.
-     * If sessionId is NULL, the historizing flag is invalid and must not be used. */
-    UA_StatusCode
-    (*serverSetHistoryData)(UA_Server *server,
-                            void *hdbContext,
-                            const UA_NodeId *sessionId,
-                            void *sessionContext,
-                            const UA_NodeId *nodeId,
-                            UA_Boolean historizing,
-                            const UA_DataValue *value);
-
-    /* This function is the high level interface for the ReadRaw operation. Set
-     * it to NULL if you use the low level API for your plugin. It should be
-     * used if the low level interface does not suite your database. It is more
-     * complex to implement the high level interface but it also provide more
-     * freedom. If you implement this, then set all low level api function
-     * pointer to NULL.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * backend is the HistoryDataBackend whose storage is to be queried.
-     * start is the start time of the HistoryRead request.
-     * end is the end time of the HistoryRead request.
-     * nodeId is the node id of the node for which historical data is requested.
-     * maxSizePerResponse is the maximum number of items per response the server can provide.
-     * numValuesPerNode is the maximum number of items per response the client wants to receive.
-     * returnBounds determines if the client wants to receive bounding values.
-     * timestampsToReturn contains the time stamps the client is interested in.
-     * range is the numeric range the client wants to read.
-     * releaseContinuationPoints determines if the continuation points shall be released.
-     * continuationPoint is the continuation point the client wants to release or start from.
-     * outContinuationPoint is the continuation point that gets passed to the
-     *                      client by the HistoryRead service.
-     * result contains the result histoy data that gets passed to the client. */
-    UA_StatusCode
-    (*getHistoryData)(UA_Server *server,
-                      const UA_NodeId *sessionId,
-                      void *sessionContext,
-                      const UA_HistoryDataBackend *backend,
-                      const UA_DateTime start,
-                      const UA_DateTime end,
-                      const UA_NodeId *nodeId,
-                      size_t maxSizePerResponse,
-                      UA_UInt32 numValuesPerNode,
-                      UA_Boolean returnBounds,
-                      UA_TimestampsToReturn timestampsToReturn,
-                      UA_NumericRange range,
-                      UA_Boolean releaseContinuationPoints,
-                      const UA_ByteString *continuationPoint,
-                      UA_ByteString *outContinuationPoint,
-                      UA_HistoryData *result);
-
-    /* This function is part of the low level HistoryRead API. It returns the
-     * index of a value in the database which matches certain criteria.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the matching value shall be found.
-     * timestamp is the timestamp of the requested index.
-     * strategy is the matching strategy which shall be applied in finding the index. */
-    size_t
-    (*getDateTimeMatch)(UA_Server *server,
-                        void *hdbContext,
-                        const UA_NodeId *sessionId,
-                        void *sessionContext,
-                        const UA_NodeId *nodeId,
-                        const UA_DateTime timestamp,
-                        const MatchStrategy strategy);
-
-    /* This function is part of the low level HistoryRead API. It returns the
-     * index of the element after the last valid entry in the database for a
-     * node.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the end of storage shall be returned. */
-    size_t
-    (*getEnd)(UA_Server *server,
-              void *hdbContext,
-              const UA_NodeId *sessionId,
-              void *sessionContext,
-              const UA_NodeId *nodeId);
-
-    /* This function is part of the low level HistoryRead API. It returns the
-     * index of the last element in the database for a node.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the index of the last element
-     *        shall be returned. */
-    size_t
-    (*lastIndex)(UA_Server *server,
-                 void *hdbContext,
-                 const UA_NodeId *sessionId,
-                 void *sessionContext,
-                 const UA_NodeId *nodeId);
-
-    /* This function is part of the low level HistoryRead API. It returns the
-     * index of the first element in the database for a node.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the index of the first
-     *        element shall be returned. */
-    size_t
-    (*firstIndex)(UA_Server *server,
-                  void *hdbContext,
-                  const UA_NodeId *sessionId,
-                  void *sessionContext,
-                  const UA_NodeId *nodeId);
-
-    /* This function is part of the low level HistoryRead API. It returns the
-     * number of elements between startIndex and endIndex including both.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the number of elements shall be returned.
-     * startIndex is the index of the first element in the range.
-     * endIndex is the index of the last element in the range. */
-    size_t
-    (*resultSize)(UA_Server *server,
-                  void *hdbContext,
-                  const UA_NodeId *sessionId,
-                  void *sessionContext,
-                  const UA_NodeId *nodeId,
-                  size_t startIndex,
-                  size_t endIndex);
-
-    /* This function is part of the low level HistoryRead API. It copies data
-     * values inside a certain range into a buffer.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the data values shall be copied.
-     * startIndex is the index of the first value in the range.
-     * endIndex is the index of the last value in the range.
-     * reverse determines if the values shall be copied in reverse order.
-     * valueSize is the maximal number of data values to copy.
-     * range is the numeric range which shall be copied for every data value.
-     * releaseContinuationPoints determines if the continuation points shall be released.
-     * continuationPoint is a continuation point the client wants to release or start from.
-     * outContinuationPoint is a continuation point which will be passed to the client.
-     * providedValues contains the number of values that were copied.
-     * values contains the values that have been copied from the database. */
-    UA_StatusCode
-    (*copyDataValues)(UA_Server *server,
-                      void *hdbContext,
-                      const UA_NodeId *sessionId,
-                      void *sessionContext,
-                      const UA_NodeId *nodeId,
-                      size_t startIndex,
-                      size_t endIndex,
-                      UA_Boolean reverse,
-                      size_t valueSize,
-                      UA_NumericRange range,
-                      UA_Boolean releaseContinuationPoints,
-                      const UA_ByteString *continuationPoint,
-                      UA_ByteString *outContinuationPoint,
-                      size_t *providedValues,
-                      UA_DataValue *values);
-
-    /* This function is part of the low level HistoryRead API. It returns the
-     * data value stored at a certain index in the database.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the data value shall be returned.
-     * index is the index in the database for which the data value is requested. */
-    const UA_DataValue*
-    (*getDataValue)(UA_Server *server,
-                    void *hdbContext,
-                    const UA_NodeId *sessionId,
-                    void *sessionContext,
-                    const UA_NodeId *nodeId,
-                    size_t index);
-
-    /* This function returns UA_TRUE if the backend supports returning bounding
-     * values for a node. This function is mandatory.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read
-     *           historical data.
-     * nodeId is the node id of the node for which the capability to return
-     *        bounds shall be queried. */
-    UA_Boolean
-    (*boundSupported)(UA_Server *server,
-                      void *hdbContext,
-                      const UA_NodeId *sessionId,
-                      void *sessionContext,
-                      const UA_NodeId *nodeId);
-
-    /* This function returns UA_TRUE if the backend supports returning the
-     * requested timestamps for a node. This function is mandatory.
-     *
-     * server is the server the node lives in.
-     * hdbContext is the context of the UA_HistoryDataBackend.
-     * sessionId and sessionContext identify the session that wants to read historical data.
-     * nodeId is the node id of the node for which the capability to return
-     *        certain timestamps shall be queried. */
-    UA_Boolean
-    (*timestampsToReturnSupported)(UA_Server *server,
-                                   void *hdbContext,
-                                   const UA_NodeId *sessionId,
-                                   void *sessionContext,
-                                   const UA_NodeId *nodeId,
-                                   const UA_TimestampsToReturn timestampsToReturn);
-
-    UA_StatusCode
-    (*insertDataValue)(UA_Server *server,
-                       void *hdbContext,
-                       const UA_NodeId *sessionId,
-                       void *sessionContext,
-                       const UA_NodeId *nodeId,
-                       const UA_DataValue *value);
-    UA_StatusCode
-    (*replaceDataValue)(UA_Server *server,
-                        void *hdbContext,
-                        const UA_NodeId *sessionId,
-                        void *sessionContext,
-                        const UA_NodeId *nodeId,
-                        const UA_DataValue *value);
-    UA_StatusCode
-    (*updateDataValue)(UA_Server *server,
-                       void *hdbContext,
-                       const UA_NodeId *sessionId,
-                       void *sessionContext,
-                       const UA_NodeId *nodeId,
-                       const UA_DataValue *value);
-    UA_StatusCode
-    (*removeDataValue)(UA_Server *server,
-                       void *hdbContext,
-                       const UA_NodeId *sessionId,
-                       void *sessionContext,
-                       const UA_NodeId *nodeId,
-                       UA_DateTime startTimestamp,
-                       UA_DateTime endTimestamp);
-};
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_HISTORY_DATA_BACKEND_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_backend_memory.h b/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_backend_memory.h
deleted file mode 100644
index ac0a3ea..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_backend_memory.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#ifndef UA_HISTORYDATABACKEND_MEMORY_H_
-#define UA_HISTORYDATABACKEND_MEMORY_H_
-
-#include "history_data_backend.h"
-
-_UA_BEGIN_DECLS
-
-#define INITIAL_MEMORY_STORE_SIZE 1000
-
-UA_HistoryDataBackend UA_EXPORT
-UA_HistoryDataBackend_Memory(size_t initialNodeIdStoreSize, size_t initialDataStoreSize);
-
-void UA_EXPORT
-UA_HistoryDataBackend_Memory_deleteMembers(UA_HistoryDataBackend *backend);
-
-_UA_END_DECLS
-
-#endif /* UA_HISTORYDATABACKEND_MEMORY_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_gathering.h b/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_gathering.h
deleted file mode 100644
index 6ecf659..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_gathering.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#ifndef UA_PLUGIN_HISTORY_DATA_GATHERING_H_
-#define UA_PLUGIN_HISTORY_DATA_GATHERING_H_
-
-#include "history_data_backend.h"
-
-_UA_BEGIN_DECLS
-
-typedef enum {
-    UA_HISTORIZINGUPDATESTRATEGY_USER     = 0x00, /* The user of the api stores the values to the database himself.
-                                                     The api will not store any value to the database. */
-    UA_HISTORIZINGUPDATESTRATEGY_VALUESET = 0x01, /* Values will be stored when a node's value is set.
-                                                     The values will be stored when a node is updated via write service.*/
-    UA_HISTORIZINGUPDATESTRATEGY_POLL     = 0x02  /* The value of the node will be read periodically.
-                                                     This is mainly relevant for datasource nodes which do
-                                                     not use the write service.
-                                                     Values will not be stored if the value is
-                                                     equal to the old value. */
-} UA_HistorizingUpdateStrategy;
-
-typedef struct {
-    UA_HistoryDataBackend historizingBackend; /* The database backend used for this node. */
-    size_t maxHistoryDataResponseSize; /* The maximum number of values returned by the server in one response.
-                                          If the result has more values, continuation points will be used. */
-    UA_HistorizingUpdateStrategy historizingUpdateStrategy; /* Defines how the values in the database will be updated.
-                                                               See UA_HistorizingUpdateStrategy for details. */
-    size_t pollingInterval; /* The polling interval for UA_HISTORIZINGUPDATESTRATEGY_POLL. */
-    void *userContext; /* A pointer to store your own settings. */
-} UA_HistorizingNodeIdSettings;
-
-typedef struct UA_HistoryDataGathering UA_HistoryDataGathering;
-struct UA_HistoryDataGathering {
-    void *context;
-
-    void
-    (*deleteMembers)(UA_HistoryDataGathering *gathering);
-
-    /* This function registers a node for the gathering of historical data.
-     *
-     * server is the server the node lives in.
-     * hdgContext is the context of the UA_HistoryDataGathering.
-     * nodeId is the node id of the node to register.
-     * setting contains the gatering settings for the node to register. */
-    UA_StatusCode
-    (*registerNodeId)(UA_Server *server,
-                      void *hdgContext,
-                      const UA_NodeId *nodeId,
-                      const UA_HistorizingNodeIdSettings setting);
-
-    /* This function stops polling a node for value changes.
-     *
-     * server is the server the node lives in.
-     * hdgContext is the context of the UA_HistoryDataGathering.
-     * nodeId is id of the node for which polling shall be stopped.
-     * setting contains the gatering settings for the node. */
-    UA_StatusCode
-    (*stopPoll)(UA_Server *server,
-                void *hdgContext,
-                const UA_NodeId *nodeId);
-
-    /* This function starts polling a node for value changes.
-     *
-     * server is the server the node lives in.
-     * hdgContext is the context of the UA_HistoryDataGathering.
-     * nodeId is the id of the node for which polling shall be started. */
-    UA_StatusCode
-    (*startPoll)(UA_Server *server,
-                 void *hdgContext,
-                 const UA_NodeId *nodeId);
-
-    /* This function modifies the gathering settings for a node.
-     *
-     * server is the server the node lives in.
-     * hdgContext is the context of the UA_HistoryDataGathering.
-     * nodeId is the node id of the node for which gathering shall be modified.
-     * setting contains the new gatering settings for the node. */
-    UA_Boolean
-    (*updateNodeIdSetting)(UA_Server *server,
-                           void *hdgContext,
-                           const UA_NodeId *nodeId,
-                           const UA_HistorizingNodeIdSettings setting);
-
-    /* Returns the gathering settings for a node.
-     *
-     * server is the server the node lives in.
-     * hdgContext is the context of the UA_HistoryDataGathering.
-     * nodeId is the node id of the node for which the gathering settings shall
-     *        be retrieved. */
-    const UA_HistorizingNodeIdSettings*
-    (*getHistorizingSetting)(UA_Server *server,
-                             void *hdgContext,
-                             const UA_NodeId *nodeId);
-
-    /* Sets a DataValue for a node in the historical data storage.
-     *
-     * server is the server the node lives in.
-     * hdgContext is the context of the UA_HistoryDataGathering.
-     * sessionId and sessionContext identify the session which wants to set this value.
-     * nodeId is the node id of the node for which a value shall be set.
-     * historizing is the historizing flag of the node identified by nodeId.
-     * value is the value to set in the history data storage. */
-    void
-    (*setValue)(UA_Server *server,
-                void *hdgContext,
-                const UA_NodeId *sessionId,
-                void *sessionContext,
-                const UA_NodeId *nodeId,
-                UA_Boolean historizing,
-                const UA_DataValue *value);
-};
-
-_UA_END_DECLS
-
-#endif /* UA_PLUGIN_HISTORY_DATA_GATHERING_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_gathering_default.h b/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_gathering_default.h
deleted file mode 100644
index cfd039e..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/historydata/history_data_gathering_default.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#ifndef UA_HISTORYDATAGATHERING_DEFAULT_H_
-#define UA_HISTORYDATAGATHERING_DEFAULT_H_
-
-#include "history_data_gathering.h"
-
-_UA_BEGIN_DECLS
-
-UA_HistoryDataGathering UA_EXPORT
-UA_HistoryDataGathering_Default(size_t initialNodeIdStoreSize);
-
-_UA_END_DECLS
-
-#endif /* UA_HISTORYDATAGATHERING_DEFAULT_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/historydata/history_database_default.h b/ext/open62541/plugins/include/open62541/plugin/historydata/history_database_default.h
deleted file mode 100644
index 7445fdd..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/historydata/history_database_default.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#ifndef UA_HISTORYDATASERVICE_DEFAULT_H_
-#define UA_HISTORYDATASERVICE_DEFAULT_H_
-
-#include <open62541/plugin/historydatabase.h>
-
-#include "history_data_gathering.h"
-
-_UA_BEGIN_DECLS
-
-UA_HistoryDatabase UA_EXPORT
-UA_HistoryDatabase_default(UA_HistoryDataGathering gathering);
-
-_UA_END_DECLS
-
-#endif /* UA_HISTORYDATASERVICE_DEFAULT_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/log_stdout.h b/ext/open62541/plugins/include/open62541/plugin/log_stdout.h
deleted file mode 100644
index 06a39c9..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/log_stdout.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifndef UA_LOG_STDOUT_H_
-#define UA_LOG_STDOUT_H_
-
-#include <open62541/plugin/log.h>
-
-_UA_BEGIN_DECLS
-
-extern UA_EXPORT const UA_Logger UA_Log_Stdout_; /* Logger structure */
-extern UA_EXPORT const UA_Logger *UA_Log_Stdout; /* Shorthand pointer */
-
-/* Don't use these definitions. They are only exported as long as the client
- * config is static and required compile-time  */
-UA_EXPORT void
-UA_Log_Stdout_log(void *_, UA_LogLevel level, UA_LogCategory category,
-                  const char *msg, va_list args);
-UA_EXPORT void
-UA_Log_Stdout_clear(void *logContext);
-
-_UA_END_DECLS
-
-#endif /* UA_LOG_STDOUT_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/pki_default.h b/ext/open62541/plugins/include/open62541/plugin/pki_default.h
deleted file mode 100644
index d6a66be..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/pki_default.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#ifndef UA_PKI_CERTIFICATE_H_
-#define UA_PKI_CERTIFICATE_H_
-
-#include <open62541/plugin/pki.h>
-
-_UA_BEGIN_DECLS
-
-/* Default implementation that accepts all certificates */
-UA_EXPORT void
-UA_CertificateVerification_AcceptAll(UA_CertificateVerification *cv);
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-/* Accept certificates based on a trust-list and a revocation-list. Based on
- * mbedTLS. */
-UA_EXPORT UA_StatusCode
-UA_CertificateVerification_Trustlist(UA_CertificateVerification *cv,
-                                     const UA_ByteString *certificateTrustList,
-                                     size_t certificateTrustListSize,
-                                     const UA_ByteString *certificateIssuerList,
-                                     size_t certificateIssuerListSize,
-                                     const UA_ByteString *certificateRevocationList,
-                                     size_t certificateRevocationListSize);
-
-#ifdef __linux__ /* Linux only so far */
-UA_EXPORT UA_StatusCode
-UA_CertificateVerification_CertFolders(UA_CertificateVerification *cv,
-                                       const char *trustListFolder,
-                                       const char *issuerListFolder,
-                                       const char *revocationListFolder);
-#endif
-
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_PKI_CERTIFICATE_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/pubsub_ethernet.h b/ext/open62541/plugins/include/open62541/plugin/pubsub_ethernet.h
deleted file mode 100644
index cbf6268..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/pubsub_ethernet.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *   Copyright 2018 (c) Kontron Europe GmbH (Author: Rudolf Hoyler)
- */
-
-#ifndef UA_NETWORK_PUBSUB_ETHERNET_H_
-#define UA_NETWORK_PUBSUB_ETHERNET_H_
-
-#include <open62541/plugin/pubsub.h>
-
-_UA_BEGIN_DECLS
-
-UA_PubSubTransportLayer UA_EXPORT
-UA_PubSubTransportLayerEthernet(void);
-
-_UA_END_DECLS
-
-#endif /* UA_NETWORK_PUBSUB_ETHERNET_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/pubsub_udp.h b/ext/open62541/plugins/include/open62541/plugin/pubsub_udp.h
deleted file mode 100644
index 7c590d1..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/pubsub_udp.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2017-2018 (c) Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#ifndef UA_NETWORK_UDPMC_H_
-#define UA_NETWORK_UDPMC_H_
-
-#include <open62541/plugin/pubsub.h>
-
-_UA_BEGIN_DECLS
-
-UA_PubSubTransportLayer UA_EXPORT
-UA_PubSubTransportLayerUDPMP(void);
-
-_UA_END_DECLS
-
-#endif /* UA_NETWORK_UDPMC_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/securitypolicy_default.h b/ext/open62541/plugins/include/open62541/plugin/securitypolicy_default.h
deleted file mode 100644
index 27f9c2e..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/securitypolicy_default.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG
- */
-
-#ifndef UA_SECURITYPOLICIES_H_
-#define UA_SECURITYPOLICIES_H_
-
-#include <open62541/plugin/securitypolicy.h>
-
-_UA_BEGIN_DECLS
-
-UA_EXPORT UA_StatusCode
-UA_SecurityPolicy_None(UA_SecurityPolicy *policy,
-                       UA_CertificateVerification *certificateVerification,
-                       const UA_ByteString localCertificate, const UA_Logger *logger);
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-UA_EXPORT UA_StatusCode
-UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy,
-                                UA_CertificateVerification *certificateVerification,
-                                const UA_ByteString localCertificate,
-                                const UA_ByteString localPrivateKey,
-                                const UA_Logger *logger);
-
-UA_EXPORT UA_StatusCode
-UA_SecurityPolicy_Basic256(UA_SecurityPolicy *policy,
-                           UA_CertificateVerification *certificateVerification,
-                           const UA_ByteString localCertificate,
-                           const UA_ByteString localPrivateKey, const UA_Logger *logger);
-
-UA_EXPORT UA_StatusCode
-UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy,
-                                 UA_CertificateVerification *certificateVerification,
-                                 const UA_ByteString localCertificate,
-                                 const UA_ByteString localPrivateKey,
-                                 const UA_Logger *logger);
-
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_SECURITYPOLICIES_H_ */
diff --git a/ext/open62541/plugins/include/open62541/plugin/securitypolicy_mbedtls_common.h b/ext/open62541/plugins/include/open62541/plugin/securitypolicy_mbedtls_common.h
deleted file mode 100644
index 7d7f44d..0000000
--- a/ext/open62541/plugins/include/open62541/plugin/securitypolicy_mbedtls_common.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifndef UA_SECURITYPOLICY_MBEDTLS_COMMON_H_
-#define UA_SECURITYPOLICY_MBEDTLS_COMMON_H_
-
-#include <open62541/plugin/securitypolicy.h>
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-#include <mbedtls/md.h>
-#include <mbedtls/x509_crt.h>
-#include <mbedtls/ctr_drbg.h>
-
-#define UA_SHA1_LENGTH 20
-
-_UA_BEGIN_DECLS
-
-void
-swapBuffers(UA_ByteString *const bufA, UA_ByteString *const bufB);
-
-void
-mbedtls_hmac(mbedtls_md_context_t *context, const UA_ByteString *key,
-             const UA_ByteString *in, unsigned char *out);
-
-UA_StatusCode
-mbedtls_generateKey(mbedtls_md_context_t *context,
-                    const UA_ByteString *secret, const UA_ByteString *seed,
-                    UA_ByteString *out);
-
-UA_StatusCode
-mbedtls_verifySig_sha1(mbedtls_x509_crt *certificate, const UA_ByteString *message,
-                       const UA_ByteString *signature);
-
-UA_StatusCode
-mbedtls_sign_sha1(mbedtls_pk_context *localPrivateKey,
-                  mbedtls_ctr_drbg_context *drbgContext,
-                  const UA_ByteString *message,
-                  UA_ByteString *signature);
-
-UA_StatusCode
-mbedtls_thumbprint_sha1(const UA_ByteString *certificate,
-                        UA_ByteString *thumbprint);
-
-/* Set the hashing scheme before calling
- * E.g. mbedtls_rsa_set_padding(context, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); */
-UA_StatusCode
-mbedtls_encrypt_rsaOaep(mbedtls_rsa_context *context,
-                        mbedtls_ctr_drbg_context *drbgContext,
-                        UA_ByteString *data, const size_t plainTextBlockSize);
-
-UA_StatusCode
-mbedtls_decrypt_rsaOaep(mbedtls_pk_context *localPrivateKey,
-                        mbedtls_ctr_drbg_context *drbgContext,
-                        UA_ByteString *data);
-
-_UA_END_DECLS
-
-#endif
-
-#endif /* UA_SECURITYPOLICY_MBEDTLS_COMMON_H_ */
diff --git a/ext/open62541/plugins/include/open62541/server_config_default.h b/ext/open62541/plugins/include/open62541/server_config_default.h
deleted file mode 100644
index 66d9fa0..0000000
--- a/ext/open62541/plugins/include/open62541/server_config_default.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#ifndef UA_SERVER_CONFIG_DEFAULT_H_
-#define UA_SERVER_CONFIG_DEFAULT_H_
-
-#include <open62541/server_config.h>
-
-_UA_BEGIN_DECLS
-
-/**********************/
-/* Default Connection */
-/**********************/
-
-extern const UA_EXPORT
-UA_ConnectionConfig UA_ConnectionConfig_default;
-
-/*************************/
-/* Default Server Config */
-/*************************/
-
-/* Creates a new server config with one endpoint and custom buffer size.
- *
- * The config will set the tcp network layer to the given port and adds a single
- * endpoint with the security policy ``SecurityPolicy#None`` to the server. A
- * server certificate may be supplied but is optional.
- * Additionally you can define a custom buffer size for send and receive buffer.
- *
- * @param portNumber The port number for the tcp network layer
- * @param certificate Optional certificate for the server endpoint. Can be
- *        ``NULL``.
- * @param sendBufferSize The size in bytes for the network send buffer
- * @param recvBufferSize The size in bytes for the network receive buffer
- *
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_setMinimalCustomBuffer(UA_ServerConfig *config,
-                                       UA_UInt16 portNumber,
-                                       const UA_ByteString *certificate,
-                                       UA_UInt32 sendBufferSize,
-                                       UA_UInt32 recvBufferSize);
-
-/* Creates a new server config with one endpoint.
- *
- * The config will set the tcp network layer to the given port and adds a single
- * endpoint with the security policy ``SecurityPolicy#None`` to the server. A
- * server certificate may be supplied but is optional. */
-static UA_INLINE UA_StatusCode
-UA_ServerConfig_setMinimal(UA_ServerConfig *config, UA_UInt16 portNumber,
-                           const UA_ByteString *certificate) {
-    return UA_ServerConfig_setMinimalCustomBuffer(config, portNumber,
-                                                  certificate, 0, 0);
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_setDefaultWithSecurityPolicies(UA_ServerConfig *conf,
-                                               UA_UInt16 portNumber,
-                                               const UA_ByteString *certificate,
-                                               const UA_ByteString *privateKey,
-                                               const UA_ByteString *trustList,
-                                               size_t trustListSize,
-                                               const UA_ByteString *issuerList,
-                                               size_t issuerListSize,
-                                               const UA_ByteString *revocationList,
-                                               size_t revocationListSize);
-
-#endif
-
-/* Creates a server config on the default port 4840 with no server
- * certificate. */
-static UA_INLINE UA_StatusCode
-UA_ServerConfig_setDefault(UA_ServerConfig *config) {
-    return UA_ServerConfig_setMinimal(config, 4840, NULL);
-}
-
-/* Creates a new server config with no network layer and no endpoints.
- *
- * It initializes reasonable defaults for many things, but does not
- * add any network layer, security policies and endpoints.
- * Use the various UA_ServerConfig_addXxx functions to add them.
- * 
- * @param conf The configuration to manipulate
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_setBasics(UA_ServerConfig *conf);
-
-/* Adds a TCP network layer with custom buffer sizes
- *
- * @param conf The configuration to manipulate
- * @param portNumber The port number for the tcp network layer
- * @param sendBufferSize The size in bytes for the network send buffer. Pass 0
- *        to use defaults.
- * @param recvBufferSize The size in bytes for the network receive buffer.
- *        Pass 0 to use defaults.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addNetworkLayerTCP(UA_ServerConfig *conf, UA_UInt16 portNumber,
-                                   UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize);
-
-#ifdef UA_ENABLE_WEBSOCKET_SERVER
-/* Adds a Websocket network layer with custom buffer sizes
- *
- * @param conf The configuration to manipulate
- * @param portNumber The port number for the tcp network layer
- * @param sendBufferSize The size in bytes for the network send buffer. Pass 0
- *        to use defaults.
- * @param recvBufferSize The size in bytes for the network receive buffer.
- *        Pass 0 to use defaults.
- */
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addNetworkLayerWS(UA_ServerConfig *conf, UA_UInt16 portNumber,
-                                  UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize);
-#endif
-
-/* Adds the security policy ``SecurityPolicy#None`` to the server. A
- * server certificate may be supplied but is optional.
- *
- * @param config The configuration to manipulate
- * @param certificate The optional server certificate.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyNone(UA_ServerConfig *config, 
-                                      const UA_ByteString *certificate);
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-/* Adds the security policy ``SecurityPolicy#Basic128Rsa15`` to the server. A
- * server certificate may be supplied but is optional.
- * 
- * Certificate verification should be configured before calling this
- * function. See PKI plugin.
- *
- * @param config The configuration to manipulate
- * @param certificate The server certificate.
- * @param privateKey The private key that corresponds to the certificate.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyBasic128Rsa15(UA_ServerConfig *config, 
-                                               const UA_ByteString *certificate,
-                                               const UA_ByteString *privateKey);
-
-/* Adds the security policy ``SecurityPolicy#Basic256`` to the server. A
- * server certificate may be supplied but is optional.
- *
- * Certificate verification should be configured before calling this
- * function. See PKI plugin.
- * 
- * @param config The configuration to manipulate
- * @param certificate The server certificate.
- * @param privateKey The private key that corresponds to the certificate.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyBasic256(UA_ServerConfig *config, 
-                                          const UA_ByteString *certificate,
-                                          const UA_ByteString *privateKey);
-
-/* Adds the security policy ``SecurityPolicy#Basic256Sha256`` to the server. A
- * server certificate may be supplied but is optional.
- *
- * Certificate verification should be configured before calling this
- * function. See PKI plugin.
- *
- * @param config The configuration to manipulate
- * @param certificate The server certificate.
- * @param privateKey The private key that corresponds to the certificate.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyBasic256Sha256(UA_ServerConfig *config, 
-                                                const UA_ByteString *certificate,
-                                                const UA_ByteString *privateKey);
-
-/* Adds all supported security policies and sets up certificate
- * validation procedures.
- *
- * Certificate verification should be configured before calling this
- * function. See PKI plugin.
- * 
- * @param config The configuration to manipulate
- * @param certificate The server certificate.
- * @param privateKey The private key that corresponds to the certificate.
- * @param trustList The trustList for client certificate validation.
- * @param trustListSize The trustList size.
- * @param revocationList The revocationList for client certificate validation.
- * @param revocationListSize The revocationList size.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addAllSecurityPolicies(UA_ServerConfig *config,
-                                       const UA_ByteString *certificate,
-                                       const UA_ByteString *privateKey);
-
-#endif
-
-/* Adds an endpoint for the given security policy and mode. The security
- * policy has to be added already. See UA_ServerConfig_addXxx functions.
- *
- * @param config The configuration to manipulate
- * @param securityPolicyUri The security policy for which to add the endpoint.
- * @param securityMode The security mode for which to add the endpoint.
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addEndpoint(UA_ServerConfig *config, const UA_String securityPolicyUri, 
-                            UA_MessageSecurityMode securityMode);
-
-/* Adds endpoints for all configured security policies in each mode.
- *
- * @param config The configuration to manipulate
- */
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addAllEndpoints(UA_ServerConfig *config);
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_CONFIG_DEFAULT_H_ */
diff --git a/ext/open62541/plugins/securityPolicies/securitypolicy_mbedtls_common.c b/ext/open62541/plugins/securityPolicies/securitypolicy_mbedtls_common.c
deleted file mode 100644
index c2ba6ba..0000000
--- a/ext/open62541/plugins/securityPolicies/securitypolicy_mbedtls_common.c
+++ /dev/null
@@ -1,244 +0,0 @@
-#include <open62541/plugin/securitypolicy.h>
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-#include <open62541/plugin/pki.h>
-#include <open62541/plugin/securitypolicy_mbedtls_common.h>
-#include <open62541/types.h>
-
-#include <mbedtls/aes.h>
-#include <mbedtls/ctr_drbg.h>
-#include <mbedtls/entropy.h>
-#include <mbedtls/entropy_poll.h>
-#include <mbedtls/error.h>
-#include <mbedtls/md.h>
-#include <mbedtls/sha1.h>
-#include <mbedtls/version.h>
-#include <mbedtls/x509_crt.h>
-
-void
-swapBuffers(UA_ByteString *const bufA, UA_ByteString *const bufB) {
-    UA_ByteString tmp = *bufA;
-    *bufA = *bufB;
-    *bufB = tmp;
-}
-
-void
-mbedtls_hmac(mbedtls_md_context_t *context, const UA_ByteString *key,
-             const UA_ByteString *in, unsigned char *out) {
-    mbedtls_md_hmac_starts(context, key->data, key->length);
-    mbedtls_md_hmac_update(context, in->data, in->length);
-    mbedtls_md_hmac_finish(context, out);
-}
-
-UA_StatusCode
-mbedtls_generateKey(mbedtls_md_context_t *context,
-                    const UA_ByteString *secret, const UA_ByteString *seed,
-                    UA_ByteString *out) {
-    size_t hashLen = (size_t)mbedtls_md_get_size(context->md_info);
-
-    UA_ByteString A_and_seed;
-    UA_ByteString_allocBuffer(&A_and_seed, hashLen + seed->length);
-    memcpy(A_and_seed.data + hashLen, seed->data, seed->length);
-
-    UA_ByteString ANext_and_seed;
-    UA_ByteString_allocBuffer(&ANext_and_seed, hashLen + seed->length);
-    memcpy(ANext_and_seed.data + hashLen, seed->data, seed->length);
-
-    UA_ByteString A = {
-        hashLen,
-        A_and_seed.data
-    };
-
-    UA_ByteString ANext = {
-        hashLen,
-        ANext_and_seed.data
-    };
-
-    mbedtls_hmac(context, secret, seed, A.data);
-
-    UA_StatusCode retval = 0;
-    for(size_t offset = 0; offset < out->length; offset += hashLen) {
-        UA_ByteString outSegment = {
-            hashLen,
-            out->data + offset
-        };
-        UA_Boolean bufferAllocated = UA_FALSE;
-        // Not enough room in out buffer to write the hash.
-        if(offset + hashLen > out->length) {
-            outSegment.data = NULL;
-            outSegment.length = 0;
-            retval = UA_ByteString_allocBuffer(&outSegment, hashLen);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_ByteString_deleteMembers(&A_and_seed);
-                UA_ByteString_deleteMembers(&ANext_and_seed);
-                return retval;
-            }
-            bufferAllocated = UA_TRUE;
-        }
-
-        mbedtls_hmac(context, secret, &A_and_seed, outSegment.data);
-        mbedtls_hmac(context, secret, &A, ANext.data);
-
-        if(retval != UA_STATUSCODE_GOOD) {
-            if(bufferAllocated)
-                UA_ByteString_deleteMembers(&outSegment);
-            UA_ByteString_deleteMembers(&A_and_seed);
-            UA_ByteString_deleteMembers(&ANext_and_seed);
-            return retval;
-        }
-
-        if(bufferAllocated) {
-            memcpy(out->data + offset, outSegment.data, out->length - offset);
-            UA_ByteString_deleteMembers(&outSegment);
-        }
-
-        swapBuffers(&ANext_and_seed, &A_and_seed);
-        swapBuffers(&ANext, &A);
-    }
-
-    UA_ByteString_deleteMembers(&A_and_seed);
-    UA_ByteString_deleteMembers(&ANext_and_seed);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-mbedtls_verifySig_sha1(mbedtls_x509_crt *certificate, const UA_ByteString *message,
-                       const UA_ByteString *signature) {
-    /* Compute the sha1 hash */
-    unsigned char hash[UA_SHA1_LENGTH];
-#if MBEDTLS_VERSION_NUMBER >= 0x02070000
-    mbedtls_sha1_ret(message->data, message->length, hash);
-#else
-    mbedtls_sha1(message->data, message->length, hash);
-#endif
-
-    /* Set the RSA settings */
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(certificate->pk);
-    if(!rsaContext)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0);
-
-    /* Verify */
-    int mbedErr = mbedtls_pk_verify(&certificate->pk,
-                                    MBEDTLS_MD_SHA1, hash, UA_SHA1_LENGTH,
-                                    signature->data, signature->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-mbedtls_sign_sha1(mbedtls_pk_context *localPrivateKey,
-                  mbedtls_ctr_drbg_context *drbgContext,
-                  const UA_ByteString *message,
-                  UA_ByteString *signature) {
-    unsigned char hash[UA_SHA1_LENGTH];
-#if MBEDTLS_VERSION_NUMBER >= 0x02070000
-    mbedtls_sha1_ret(message->data, message->length, hash);
-#else
-    mbedtls_sha1(message->data, message->length, hash);
-#endif
-
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(*localPrivateKey);
-    mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0);
-
-    size_t sigLen = 0;
-    int mbedErr = mbedtls_pk_sign(localPrivateKey, MBEDTLS_MD_SHA1, hash,
-                                  UA_SHA1_LENGTH, signature->data, &sigLen,
-                                  mbedtls_ctr_drbg_random, drbgContext);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-mbedtls_thumbprint_sha1(const UA_ByteString *certificate,
-                        UA_ByteString *thumbprint) {
-    if(UA_ByteString_equal(certificate, &UA_BYTESTRING_NULL))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(thumbprint->length != UA_SHA1_LENGTH)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* The certificate thumbprint is always a 20 bit sha1 hash, see Part 4 of the Specification. */
-#if MBEDTLS_VERSION_NUMBER >= 0x02070000
-    mbedtls_sha1_ret(certificate->data, certificate->length, thumbprint->data);
-#else
-    mbedtls_sha1(certificate->data, certificate->length, thumbprint->data);
-#endif
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-mbedtls_encrypt_rsaOaep(mbedtls_rsa_context *context,
-                        mbedtls_ctr_drbg_context *drbgContext,
-                        UA_ByteString *data, const size_t plainTextBlockSize) {
-    if(data->length % plainTextBlockSize != 0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t max_blocks = data->length / plainTextBlockSize;
-
-    UA_ByteString encrypted;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&encrypted, max_blocks * context->len);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    size_t lenDataToEncrypt = data->length;
-    size_t inOffset = 0;
-    size_t offset = 0;
-    const unsigned char *label = NULL;
-    while(lenDataToEncrypt >= plainTextBlockSize) {
-        int mbedErr = mbedtls_rsa_rsaes_oaep_encrypt(context, mbedtls_ctr_drbg_random,
-                                                     drbgContext, MBEDTLS_RSA_PUBLIC,
-                                                     label, 0, plainTextBlockSize,
-                                                     data->data + inOffset, encrypted.data + offset);
-        if(mbedErr) {
-            UA_ByteString_deleteMembers(&encrypted);
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-
-        inOffset += plainTextBlockSize;
-        offset += context->len;
-        lenDataToEncrypt -= plainTextBlockSize;
-    }
-
-    memcpy(data->data, encrypted.data, offset);
-    UA_ByteString_deleteMembers(&encrypted);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-mbedtls_decrypt_rsaOaep(mbedtls_pk_context *localPrivateKey,
-                        mbedtls_ctr_drbg_context *drbgContext,
-                        UA_ByteString *data) {
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(*localPrivateKey);
-    mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1);
-
-    if(data->length % rsaContext->len != 0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t inOffset = 0;
-    size_t outOffset = 0;
-    size_t outLength = 0;
-    unsigned char buf[512];
-
-    while(inOffset < data->length) {
-        int mbedErr = mbedtls_rsa_rsaes_oaep_decrypt(rsaContext, mbedtls_ctr_drbg_random,
-                                                     drbgContext, MBEDTLS_RSA_PRIVATE,
-                                                     NULL, 0, &outLength,
-                                                     data->data + inOffset,
-                                                     buf, 512);
-        if(mbedErr)
-            return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-        memcpy(data->data + outOffset, buf, outLength);
-        inOffset += rsaContext->len;
-        outOffset += outLength;
-    }
-
-    data->length = outOffset;
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
diff --git a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c b/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c
deleted file mode 100644
index 1a27aa9..0000000
--- a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c
+++ /dev/null
@@ -1,877 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- *
- */
-
-#include <open62541/plugin/securitypolicy_default.h>
-#include <open62541/plugin/securitypolicy_mbedtls_common.h>
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-#include <open62541/util.h>
-
-
-#include <mbedtls/aes.h>
-#include <mbedtls/ctr_drbg.h>
-#include <mbedtls/entropy.h>
-#include <mbedtls/entropy_poll.h>
-#include <mbedtls/error.h>
-#include <mbedtls/md.h>
-#include <mbedtls/sha1.h>
-#include <mbedtls/version.h>
-#include <mbedtls/x509_crt.h>
-
-/* Notes:
- * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to
- * allocate temp buffers.
- * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer
- */
-
-#define UA_SECURITYPOLICY_BASIC128RSA15_RSAPADDING_LEN 11
-#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_KEY_LENGTH 16
-#define UA_BASIC128RSA15_SYM_SIGNING_KEY_LENGTH 16
-#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_ENCRYPTION_BLOCK_SIZE 16
-#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_PLAIN_TEXT_BLOCK_SIZE 16
-#define UA_SECURITYPOLICY_BASIC128RSA15_MINASYMKEYLENGTH 128
-#define UA_SECURITYPOLICY_BASIC128RSA15_MAXASYMKEYLENGTH 512
-
-typedef struct {
-    const UA_SecurityPolicy *securityPolicy;
-    UA_ByteString localCertThumbprint;
-
-    mbedtls_ctr_drbg_context drbgContext;
-    mbedtls_entropy_context entropyContext;
-    mbedtls_md_context_t sha1MdContext;
-    mbedtls_pk_context localPrivateKey;
-} Basic128Rsa15_PolicyContext;
-
-typedef struct {
-    Basic128Rsa15_PolicyContext *policyContext;
-
-    UA_ByteString localSymSigningKey;
-    UA_ByteString localSymEncryptingKey;
-    UA_ByteString localSymIv;
-
-    UA_ByteString remoteSymSigningKey;
-    UA_ByteString remoteSymEncryptingKey;
-    UA_ByteString remoteSymIv;
-
-    mbedtls_x509_crt remoteCertificate;
-} Basic128Rsa15_ChannelContext;
-
-/********************/
-/* AsymmetricModule */
-/********************/
-
-static UA_StatusCode
-asym_verify_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                             Basic128Rsa15_ChannelContext *cc,
-                             const UA_ByteString *message,
-                             const UA_ByteString *signature) {
-    if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    return mbedtls_verifySig_sha1(&cc->remoteCertificate, message, signature);
-}
-
-static UA_StatusCode
-asym_sign_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                           Basic128Rsa15_ChannelContext *cc,
-                           const UA_ByteString *message,
-                           UA_ByteString *signature) {
-    if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic128Rsa15_PolicyContext *pc = cc->policyContext;
-    return mbedtls_sign_sha1(&pc->localPrivateKey, &pc->drbgContext,
-                             message, signature);
-}
-
-static size_t
-asym_getLocalSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                            const Basic128Rsa15_ChannelContext *cc) {
-    if(securityPolicy == NULL || cc == NULL)
-        return 0;
-
-    return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len;
-}
-
-static size_t
-asym_getRemoteSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                             const Basic128Rsa15_ChannelContext *cc) {
-    if(securityPolicy == NULL || cc == NULL)
-        return 0;
-
-    return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len;
-}
-
-static UA_StatusCode
-asym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                              Basic128Rsa15_ChannelContext *cc,
-                              UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm.
-        getRemotePlainTextBlockSize(securityPolicy, cc);
-
-    if(data->length % plainTextBlockSize != 0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V15, 0);
-
-    UA_ByteString encrypted;
-    const size_t bufferOverhead =
-        UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, cc, data->length);
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&encrypted, data->length + bufferOverhead);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    size_t lenDataToEncrypt = data->length;
-    size_t inOffset = 0;
-    size_t offset = 0;
-    size_t outLength = 0;
-    Basic128Rsa15_PolicyContext *pc = cc->policyContext;
-    while(lenDataToEncrypt >= plainTextBlockSize) {
-        int mbedErr = mbedtls_pk_encrypt(&cc->remoteCertificate.pk,
-                                         data->data + inOffset, plainTextBlockSize,
-                                         encrypted.data + offset, &outLength,
-                                         encrypted.length - offset,
-                                         mbedtls_ctr_drbg_random,
-                                         &pc->drbgContext);
-        if(mbedErr) {
-            UA_ByteString_deleteMembers(&encrypted);
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-
-        inOffset += plainTextBlockSize;
-        offset += outLength;
-        lenDataToEncrypt -= plainTextBlockSize;
-    }
-
-    memcpy(data->data, encrypted.data, offset);
-    UA_ByteString_deleteMembers(&encrypted);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-asym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                              Basic128Rsa15_ChannelContext *cc,
-                              UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->policyContext->localPrivateKey);
-    mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0);
-
-    if(data->length % rsaContext->len != 0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t inOffset = 0;
-    size_t outOffset = 0;
-    size_t outLength = 0;
-    unsigned char buf[512];
-
-    while(inOffset < data->length) {
-        int mbedErr = mbedtls_pk_decrypt(&cc->policyContext->localPrivateKey,
-                                         data->data + inOffset, rsaContext->len,
-                                         buf, &outLength, 512, NULL, NULL);
-        if(mbedErr)
-            return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-        memcpy(data->data + outOffset, buf, outLength);
-        inOffset += rsaContext->len;
-        outOffset += outLength;
-    }
-
-    data->length = outOffset;
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-asym_getRemoteEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                                   const Basic128Rsa15_ChannelContext *cc) {
-    return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8;
-}
-
-static size_t
-asym_getRemoteBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                         const Basic128Rsa15_ChannelContext *cc) {
-    mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    return rsaContext->len;
-}
-
-static size_t
-asym_getRemotePlainTextBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                                  const Basic128Rsa15_ChannelContext *cc) {
-    mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    return rsaContext->len - UA_SECURITYPOLICY_BASIC128RSA15_RSAPADDING_LEN;
-}
-
-static UA_StatusCode
-asym_makeThumbprint_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                     const UA_ByteString *certificate,
-                                     UA_ByteString *thumbprint) {
-    if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return mbedtls_thumbprint_sha1(certificate, thumbprint);
-}
-
-static UA_StatusCode
-asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                                               const UA_ByteString *certificateThumbprint) {
-    if(securityPolicy == NULL || certificateThumbprint == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext;
-    if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint))
-        return UA_STATUSCODE_BADCERTIFICATEINVALID;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/*******************/
-/* SymmetricModule */
-/*******************/
-
-static UA_StatusCode
-sym_verify_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                            Basic128Rsa15_ChannelContext *cc,
-                            const UA_ByteString *message,
-                            const UA_ByteString *signature) {
-    if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Compute MAC */
-    if(signature->length != UA_SHA1_LENGTH) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Signature size does not have the desired size defined by the security policy");
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    }
-
-    Basic128Rsa15_PolicyContext *pc =
-        (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext;
-
-    unsigned char mac[UA_SHA1_LENGTH];
-    mbedtls_hmac(&pc->sha1MdContext, &cc->remoteSymSigningKey, message, mac);
-
-    /* Compare with Signature */
-    if(!UA_constantTimeEqual(signature->data, mac, UA_SHA1_LENGTH))
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-sym_sign_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                          const Basic128Rsa15_ChannelContext *cc,
-                          const UA_ByteString *message,
-                          UA_ByteString *signature) {
-    if(signature->length != UA_SHA1_LENGTH)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_hmac(&cc->policyContext->sha1MdContext, &cc->localSymSigningKey,
-                 message, signature->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-sym_getSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                      const void *channelContext) {
-    return UA_SHA1_LENGTH;
-}
-
-static size_t
-sym_getSigningKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy,
-                                         const void *const channelContext) {
-    return UA_BASIC128RSA15_SYM_SIGNING_KEY_LENGTH;
-}
-
-static size_t
-sym_getEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                            const void *channelContext) {
-    return UA_SECURITYPOLICY_BASIC128RSA15_SYM_KEY_LENGTH;
-}
-
-static size_t
-sym_getEncryptionBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy,
-                                            const void *const channelContext) {
-    return UA_SECURITYPOLICY_BASIC128RSA15_SYM_ENCRYPTION_BLOCK_SIZE;
-}
-
-static size_t
-sym_getPlainTextBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy,
-                                           const void *const channelContext) {
-    return UA_SECURITYPOLICY_BASIC128RSA15_SYM_PLAIN_TEXT_BLOCK_SIZE;
-}
-
-static UA_StatusCode
-sym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                             const Basic128Rsa15_ChannelContext *cc,
-                             UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(cc->localSymIv.length !=
-       securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t plainTextBlockSize =
-        securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalPlainTextBlockSize(securityPolicy, cc);
-
-    if(data->length % plainTextBlockSize != 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Length of data to encrypt is not a multiple of the plain text block size."
-                         "Padding might not have been calculated appropriately.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Keylength in bits */
-    unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8);
-    mbedtls_aes_context aesContext;
-    int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString ivCopy;
-    UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length,
-                                    ivCopy.data, data->data, data->data);
-    if(mbedErr)
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    UA_ByteString_deleteMembers(&ivCopy);
-    return retval;
-}
-
-static UA_StatusCode
-sym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                             const Basic128Rsa15_ChannelContext *cc,
-                             UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemoteBlockSize(securityPolicy, cc);
-
-    if(cc->remoteSymIv.length != encryptionBlockSize)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(data->length % encryptionBlockSize != 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Length of data to decrypt is not a multiple of the encryptingBlock size.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8);
-    mbedtls_aes_context aesContext;
-    int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString ivCopy;
-    UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length,
-                                    ivCopy.data, data->data, data->data);
-    if(mbedErr)
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    UA_ByteString_deleteMembers(&ivCopy);
-    return retval;
-}
-
-static UA_StatusCode
-sym_generateKey_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                 const UA_ByteString *secret, const UA_ByteString *seed,
-                                 UA_ByteString *out) {
-    if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic128Rsa15_PolicyContext *pc =
-        (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext;
-
-    return mbedtls_generateKey(&pc->sha1MdContext, secret, seed, out);
-}
-
-static UA_StatusCode
-sym_generateNonce_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                   UA_ByteString *out) {
-    if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic128Rsa15_PolicyContext *pc =
-        (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext;
-
-    int mbedErr = mbedtls_ctr_drbg_random(&pc->drbgContext, out->data, out->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/*****************/
-/* ChannelModule */
-/*****************/
-
-/* Assumes that the certificate has been verified externally */
-static UA_StatusCode
-parseRemoteCertificate_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                        const UA_ByteString *remoteCertificate) {
-    if(remoteCertificate == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Parse the certificate */
-    int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data,
-                                         remoteCertificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    /* Check the key length */
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    if(rsaContext->len < UA_SECURITYPOLICY_BASIC128RSA15_MINASYMKEYLENGTH ||
-       rsaContext->len > UA_SECURITYPOLICY_BASIC128RSA15_MAXASYMKEYLENGTH)
-        return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-channelContext_deleteContext_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc) {
-    UA_ByteString_deleteMembers(&cc->localSymSigningKey);
-    UA_ByteString_deleteMembers(&cc->localSymEncryptingKey);
-    UA_ByteString_deleteMembers(&cc->localSymIv);
-
-    UA_ByteString_deleteMembers(&cc->remoteSymSigningKey);
-    UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey);
-    UA_ByteString_deleteMembers(&cc->remoteSymIv);
-
-    mbedtls_x509_crt_free(&cc->remoteCertificate);
-
-    UA_free(cc);
-}
-
-static UA_StatusCode
-channelContext_newContext_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy,
-                                           const UA_ByteString *remoteCertificate,
-                                           void **pp_contextData) {
-    if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Allocate the channel context */
-    *pp_contextData = UA_malloc(sizeof(Basic128Rsa15_ChannelContext));
-    if(*pp_contextData == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    Basic128Rsa15_ChannelContext *cc = (Basic128Rsa15_ChannelContext *)*pp_contextData;
-
-    /* Initialize the channel context */
-    cc->policyContext = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext;
-
-    UA_ByteString_init(&cc->localSymSigningKey);
-    UA_ByteString_init(&cc->localSymEncryptingKey);
-    UA_ByteString_init(&cc->localSymIv);
-
-    UA_ByteString_init(&cc->remoteSymSigningKey);
-    UA_ByteString_init(&cc->remoteSymEncryptingKey);
-    UA_ByteString_init(&cc->remoteSymIv);
-
-    mbedtls_x509_crt_init(&cc->remoteCertificate);
-
-    // TODO: this can be optimized so that we dont allocate memory before parsing the certificate
-    UA_StatusCode retval = parseRemoteCertificate_sp_basic128rsa15(cc, remoteCertificate);
-    if(retval != UA_STATUSCODE_GOOD) {
-        channelContext_deleteContext_sp_basic128rsa15(cc);
-        *pp_contextData = NULL;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-channelContext_setLocalSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                                         const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymEncryptingKey);
-    return UA_ByteString_copy(key, &cc->localSymEncryptingKey);
-}
-
-static UA_StatusCode
-channelContext_setLocalSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                                      const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymSigningKey);
-    return UA_ByteString_copy(key, &cc->localSymSigningKey);
-}
-
-
-static UA_StatusCode
-channelContext_setLocalSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                              const UA_ByteString *iv) {
-    if(iv == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymIv);
-    return UA_ByteString_copy(iv, &cc->localSymIv);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                                          const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey);
-    return UA_ByteString_copy(key, &cc->remoteSymEncryptingKey);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                                       const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymSigningKey);
-    return UA_ByteString_copy(key, &cc->remoteSymSigningKey);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc,
-                                               const UA_ByteString *iv) {
-    if(iv == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymIv);
-    return UA_ByteString_copy(iv, &cc->remoteSymIv);
-}
-
-static UA_StatusCode
-channelContext_compareCertificate_sp_basic128rsa15(const Basic128Rsa15_ChannelContext *cc,
-                                                   const UA_ByteString *certificate) {
-    if(cc == NULL || certificate == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_x509_crt cert;
-    mbedtls_x509_crt_init(&cert);
-    int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(cert.raw.len != cc->remoteCertificate.raw.len ||
-       memcmp(cert.raw.p, cc->remoteCertificate.raw.p, cert.raw.len) != 0)
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    mbedtls_x509_crt_free(&cert);
-    return retval;
-}
-
-static void
-deleteMembers_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy) {
-    if(securityPolicy == NULL)
-        return;
-
-    if(securityPolicy->policyContext == NULL)
-        return;
-
-    UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
-
-    /* delete all allocated members in the context */
-    Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)
-        securityPolicy->policyContext;
-
-    mbedtls_ctr_drbg_free(&pc->drbgContext);
-    mbedtls_entropy_free(&pc->entropyContext);
-    mbedtls_pk_free(&pc->localPrivateKey);
-    mbedtls_md_free(&pc->sha1MdContext);
-    UA_ByteString_deleteMembers(&pc->localCertThumbprint);
-
-    UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Deleted members of EndpointContext for sp_basic128rsa15");
-
-    UA_free(pc);
-    securityPolicy->policyContext = NULL;
-}
-
-static UA_StatusCode
-updateCertificateAndPrivateKey_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy,
-                                                const UA_ByteString newCertificate,
-                                                const UA_ByteString newPrivateKey) {
-    if(securityPolicy == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(securityPolicy->policyContext == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext;
-
-    UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
-
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&securityPolicy->localCertificate, newCertificate.length + 1);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length);
-    securityPolicy->localCertificate.data[newCertificate.length] = '\0';
-    securityPolicy->localCertificate.length--;
-
-    /* Set the new private key */
-    mbedtls_pk_free(&pc->localPrivateKey);
-    mbedtls_pk_init(&pc->localPrivateKey);
-    int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey,
-                                       newPrivateKey.data, newPrivateKey.length,
-                                       NULL, 0);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    retval = asym_makeThumbprint_sp_basic128rsa15(pc->securityPolicy,
-                                                  &securityPolicy->localCertificate,
-                                                  &pc->localCertThumbprint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return retval;
-
-    error:
-    UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Could not update certificate and private key");
-    if(securityPolicy->policyContext != NULL)
-        deleteMembers_sp_basic128rsa15(securityPolicy);
-    return retval;
-}
-
-static UA_StatusCode
-policyContext_newContext_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy,
-                                          const UA_ByteString localPrivateKey) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(securityPolicy == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if (localPrivateKey.length == 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Can not initialize security policy. Private key is empty.");
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)
-        UA_malloc(sizeof(Basic128Rsa15_PolicyContext));
-    securityPolicy->policyContext = (void *)pc;
-    if(!pc) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto error;
-    }
-
-    /* Initialize the PolicyContext */
-    memset(pc, 0, sizeof(Basic128Rsa15_PolicyContext));
-    mbedtls_ctr_drbg_init(&pc->drbgContext);
-    mbedtls_entropy_init(&pc->entropyContext);
-    mbedtls_pk_init(&pc->localPrivateKey);
-    mbedtls_md_init(&pc->sha1MdContext);
-    pc->securityPolicy = securityPolicy;
-
-    /* Initialized the message digest */
-    const mbedtls_md_info_t *const mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
-    int mbedErr = mbedtls_md_setup(&pc->sha1MdContext, mdInfo, MBEDTLS_MD_SHA1);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto error;
-    }
-
-    /* Add the system entropy source */
-    mbedErr = mbedtls_entropy_add_source(&pc->entropyContext,
-                                         mbedtls_platform_entropy_poll, NULL, 0,
-                                         MBEDTLS_ENTROPY_SOURCE_STRONG);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Seed the RNG */
-    char *personalization = "open62541-drbg";
-    mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func,
-                                    &pc->entropyContext,
-                                    (const unsigned char *)personalization, 14);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Set the private key */
-    mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey,
-                                   localPrivateKey.data, localPrivateKey.length,
-                                   NULL, 0);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Set the local certificate thumbprint */
-    retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-    retval = asym_makeThumbprint_sp_basic128rsa15(pc->securityPolicy,
-                                                  &securityPolicy->localCertificate,
-                                                  &pc->localCertThumbprint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return UA_STATUSCODE_GOOD;
-
-error:
-    UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Could not create securityContext: %s", UA_StatusCode_name(retval));
-    if(securityPolicy->policyContext != NULL)
-        deleteMembers_sp_basic128rsa15(securityPolicy);
-    return retval;
-}
-
-UA_StatusCode
-UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy,
-                                UA_CertificateVerification *certificateVerification,
-                                const UA_ByteString localCertificate,
-                                const UA_ByteString localPrivateKey, const UA_Logger *logger) {
-    memset(policy, 0, sizeof(UA_SecurityPolicy));
-    policy->logger = logger;
-
-    policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15");
-
-    UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule;
-    UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule;
-    UA_SecurityPolicyChannelModule *const channelModule = &policy->channelModule;
-
-    /* Copy the certificate and add a NULL to the end */
-    UA_StatusCode retval =
-        UA_ByteString_allocBuffer(&policy->localCertificate, localCertificate.length + 1);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(policy->localCertificate.data, localCertificate.data, localCertificate.length);
-    policy->localCertificate.data[localCertificate.length] = '\0';
-    policy->localCertificate.length--;
-    policy->certificateVerification = certificateVerification;
-
-    /* AsymmetricModule */
-    UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm =
-        &asymmetricModule->cryptoModule.signatureAlgorithm;
-    asym_signatureAlgorithm->uri =
-        UA_STRING("http://www.w3.org/2000/09/xmldsig#rsa-sha1\0");
-    asym_signatureAlgorithm->verify =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic128rsa15;
-    asym_signatureAlgorithm->sign =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic128rsa15;
-    asym_signatureAlgorithm->getLocalSignatureSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic128rsa15;
-    asym_signatureAlgorithm->getRemoteSignatureSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic128rsa15;
-    asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function
-    asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function
-
-    UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm =
-        &asymmetricModule->cryptoModule.encryptionAlgorithm;
-    asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-1_5");
-    asym_encryptionAlgorithm->encrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic128rsa15;
-    asym_encryptionAlgorithm->decrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))
-            asym_decrypt_sp_basic128rsa15;
-    asym_encryptionAlgorithm->getLocalKeyLength = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemoteKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic128rsa15;
-    asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *,
-                                                               const void *))asym_getRemoteBlockSize_sp_basic128rsa15;
-    asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemotePlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic128rsa15;
-
-    asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic128rsa15;
-    asymmetricModule->compareCertificateThumbprint =
-        asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15;
-
-    /* SymmetricModule */
-    symmetricModule->generateKey = sym_generateKey_sp_basic128rsa15;
-    symmetricModule->generateNonce = sym_generateNonce_sp_basic128rsa15;
-
-    UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm =
-        &symmetricModule->cryptoModule.signatureAlgorithm;
-    sym_signatureAlgorithm->uri =
-        UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0");
-    sym_signatureAlgorithm->verify =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *,
-                           const UA_ByteString *))sym_verify_sp_basic128rsa15;
-    sym_signatureAlgorithm->sign =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic128rsa15;
-    sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic128rsa15;
-    sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic128rsa15;
-    sym_signatureAlgorithm->getLocalKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *,
-                    const void *))sym_getSigningKeyLength_sp_basic128rsa15;
-    sym_signatureAlgorithm->getRemoteKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *,
-                    const void *))sym_getSigningKeyLength_sp_basic128rsa15;
-
-    UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm =
-        &symmetricModule->cryptoModule.encryptionAlgorithm;
-    sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes128-cbc");
-    sym_encryptionAlgorithm->encrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic128rsa15;
-    sym_encryptionAlgorithm->decrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic128rsa15;
-    sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic128rsa15;
-    sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic128rsa15;
-    sym_encryptionAlgorithm->getLocalBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic128rsa15;
-    sym_encryptionAlgorithm->getRemoteBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic128rsa15;
-    sym_encryptionAlgorithm->getLocalPlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic128rsa15;
-    sym_encryptionAlgorithm->getRemotePlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic128rsa15;
-    symmetricModule->secureChannelNonceLength = 16;
-
-    // Use the same signature algorithm as the asymmetric component for certificate signing (see standard)
-    policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm;
-
-    /* ChannelModule */
-    channelModule->newContext = channelContext_newContext_sp_basic128rsa15;
-    channelModule->deleteContext = (void (*)(void *))
-        channelContext_deleteContext_sp_basic128rsa15;
-
-    channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymEncryptingKey_sp_basic128rsa15;
-    channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymSigningKey_sp_basic128rsa15;
-    channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymIv_sp_basic128rsa15;
-
-    channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15;
-    channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymSigningKey_sp_basic128rsa15;
-    channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymIv_sp_basic128rsa15;
-
-    channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *))
-        channelContext_compareCertificate_sp_basic128rsa15;
-
-    policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic128rsa15;
-    policy->deleteMembers = deleteMembers_sp_basic128rsa15;
-
-    return policyContext_newContext_sp_basic128rsa15(policy, localPrivateKey);
-}
-
-#endif
diff --git a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic256.c b/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic256.c
deleted file mode 100644
index 18aff9a..0000000
--- a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic256.c
+++ /dev/null
@@ -1,827 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- *
- */
-
-#include <open62541/plugin/securitypolicy.h>
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-#include <open62541/plugin/pki.h>
-#include <open62541/plugin/securitypolicy_default.h>
-#include <open62541/plugin/securitypolicy_mbedtls_common.h>
-#include <open62541/types.h>
-#include <open62541/util.h>
-
-
-#include <mbedtls/aes.h>
-#include <mbedtls/entropy.h>
-#include <mbedtls/entropy_poll.h>
-#include <mbedtls/error.h>
-#include <mbedtls/sha1.h>
-#include <mbedtls/version.h>
-
-/* Notes:
- * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to
- * allocate temp buffers.
- * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer
- */
-
-#define UA_SECURITYPOLICY_BASIC256SHA1_RSAPADDING_LEN 42
-#define UA_SHA1_LENGTH 20
-#define UA_BASIC256_SYM_SIGNING_KEY_LENGTH 24
-#define UA_SECURITYPOLICY_BASIC256_SYM_KEY_LENGTH 32
-#define UA_SECURITYPOLICY_BASIC256_SYM_ENCRYPTION_BLOCK_SIZE 16
-#define UA_SECURITYPOLICY_BASIC256_SYM_PLAIN_TEXT_BLOCK_SIZE 16
-#define UA_SECURITYPOLICY_BASIC256_MINASYMKEYLENGTH 128
-#define UA_SECURITYPOLICY_BASIC256_MAXASYMKEYLENGTH 512
-
-typedef struct {
-    const UA_SecurityPolicy *securityPolicy;
-    UA_ByteString localCertThumbprint;
-
-    mbedtls_ctr_drbg_context drbgContext;
-    mbedtls_entropy_context entropyContext;
-    mbedtls_md_context_t sha1MdContext;
-    mbedtls_pk_context localPrivateKey;
-} Basic256_PolicyContext;
-
-typedef struct {
-    Basic256_PolicyContext *policyContext;
-
-    UA_ByteString localSymSigningKey;
-    UA_ByteString localSymEncryptingKey;
-    UA_ByteString localSymIv;
-
-    UA_ByteString remoteSymSigningKey;
-    UA_ByteString remoteSymEncryptingKey;
-    UA_ByteString remoteSymIv;
-
-    mbedtls_x509_crt remoteCertificate;
-} Basic256_ChannelContext;
-
-/********************/
-/* AsymmetricModule */
-/********************/
-
-/* VERIFY AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */
-static UA_StatusCode
-asym_verify_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                        Basic256_ChannelContext *cc,
-                        const UA_ByteString *message,
-                        const UA_ByteString *signature) {
-    if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    return mbedtls_verifySig_sha1(&cc->remoteCertificate, message, signature);
-}
-
-/* AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */
-static UA_StatusCode
-asym_sign_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                      Basic256_ChannelContext *cc,
-                      const UA_ByteString *message,
-                      UA_ByteString *signature) {
-    if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256_PolicyContext *pc = cc->policyContext;
-    return mbedtls_sign_sha1(&pc->localPrivateKey, &pc->drbgContext,
-                             message, signature);
-}
-
-static size_t
-asym_getLocalSignatureSize_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                       const Basic256_ChannelContext *cc) {
-    if(securityPolicy == NULL || cc == NULL)
-        return 0;
-    return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len;
-}
-
-static size_t
-asym_getRemoteSignatureSize_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                        const Basic256_ChannelContext *cc) {
-    if(securityPolicy == NULL || cc == NULL)
-        return 0;
-    return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len;
-}
-
-/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */
-static UA_StatusCode
-asym_encrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                         Basic256_ChannelContext *cc,
-                         UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, cc);
-
-    mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1);
-
-    return mbedtls_encrypt_rsaOaep(remoteRsaContext, &cc->policyContext->drbgContext,
-                                   data, plainTextBlockSize);
-}
-
-/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */
-static UA_StatusCode
-asym_decrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                         Basic256_ChannelContext *cc,
-                         UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return mbedtls_decrypt_rsaOaep(&cc->policyContext->localPrivateKey,
-                                   &cc->policyContext->drbgContext, data);
-}
-
-static size_t
-asym_getRemoteEncryptionKeyLength_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                              const Basic256_ChannelContext *cc) {
-    return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8;
-}
-
-static size_t
-asym_getRemoteBlockSize_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                          const Basic256_ChannelContext *cc) {
-    mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    return rsaContext->len;
-}
-
-static size_t
-asym_getRemotePlainTextBlockSize_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                             const Basic256_ChannelContext *cc) {
-    mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    return rsaContext->len - UA_SECURITYPOLICY_BASIC256SHA1_RSAPADDING_LEN;
-}
-
-static UA_StatusCode
-asym_makeThumbprint_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                const UA_ByteString *certificate,
-                                UA_ByteString *thumbprint) {
-    if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return mbedtls_thumbprint_sha1(certificate, thumbprint);
-}
-
-static UA_StatusCode
-asymmetricModule_compareCertificateThumbprint_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                                          const UA_ByteString *certificateThumbprint) {
-    if(securityPolicy == NULL || certificateThumbprint == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256_PolicyContext *pc = (Basic256_PolicyContext *)securityPolicy->policyContext;
-    if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint))
-        return UA_STATUSCODE_BADCERTIFICATEINVALID;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/*******************/
-/* SymmetricModule */
-/*******************/
-
-static UA_StatusCode
-sym_verify_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                       Basic256_ChannelContext *cc,
-                       const UA_ByteString *message,
-                       const UA_ByteString *signature) {
-    if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Compute MAC */
-    if(signature->length != UA_SHA1_LENGTH) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Signature size does not have the desired size defined by the security policy");
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    }
-
-    Basic256_PolicyContext *pc =
-        (Basic256_PolicyContext *)securityPolicy->policyContext;
-    
-    unsigned char mac[UA_SHA1_LENGTH];
-    mbedtls_hmac(&pc->sha1MdContext, &cc->remoteSymSigningKey, message, mac);
-
-    /* Compare with Signature */
-    if(!UA_constantTimeEqual(signature->data, mac, UA_SHA1_LENGTH))
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-sym_sign_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                           const Basic256_ChannelContext *cc,
-                           const UA_ByteString *message,
-                           UA_ByteString *signature) {
-    if(signature->length != UA_SHA1_LENGTH)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_hmac(&cc->policyContext->sha1MdContext, &cc->localSymSigningKey,
-                 message, signature->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-sym_getSignatureSize_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                 const void *channelContext) {
-    return UA_SHA1_LENGTH;
-}
-
-static size_t
-sym_getSigningKeyLength_sp_basic256(const UA_SecurityPolicy *const securityPolicy,
-                                    const void *const channelContext) {
-    return UA_BASIC256_SYM_SIGNING_KEY_LENGTH;
-}
-
-static size_t
-sym_getEncryptionKeyLength_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                       const void *channelContext) {
-    return UA_SECURITYPOLICY_BASIC256_SYM_KEY_LENGTH;
-}
-
-static size_t
-sym_getEncryptionBlockSize_sp_basic256(const UA_SecurityPolicy *const securityPolicy,
-                                       const void *const channelContext) {
-    return UA_SECURITYPOLICY_BASIC256_SYM_ENCRYPTION_BLOCK_SIZE;
-}
-
-static size_t
-sym_getPlainTextBlockSize_sp_basic256(const UA_SecurityPolicy *const securityPolicy,
-                                      const void *const channelContext) {
-    return UA_SECURITYPOLICY_BASIC256_SYM_PLAIN_TEXT_BLOCK_SIZE;
-}
-
-static UA_StatusCode
-sym_encrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                              const Basic256_ChannelContext *cc,
-                              UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(cc->localSymIv.length !=
-       securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.
-       getLocalBlockSize(securityPolicy, cc))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t plainTextBlockSize =
-        securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.
-        getLocalPlainTextBlockSize(securityPolicy, cc);
-
-    if(data->length % plainTextBlockSize != 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Length of data to encrypt is not a multiple of the plain text block size."
-                         "Padding might not have been calculated appropriately.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Keylength in bits */
-    unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8);
-    mbedtls_aes_context aesContext;
-    int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString ivCopy;
-    UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length,
-                                    ivCopy.data, data->data, data->data);
-    if(mbedErr)
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    UA_ByteString_deleteMembers(&ivCopy);
-    return retval;
-}
-
-static UA_StatusCode
-sym_decrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                              const Basic256_ChannelContext *cc,
-                              UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t encryptionBlockSize =
-        securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.
-        getRemoteBlockSize(securityPolicy, cc);
-
-    if(cc->remoteSymIv.length != encryptionBlockSize)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(data->length % encryptionBlockSize != 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Length of data to decrypt is not a multiple of the encryptingBlock size.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8);
-    mbedtls_aes_context aesContext;
-    int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString ivCopy;
-    UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length,
-                                    ivCopy.data, data->data, data->data);
-    if(mbedErr)
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    UA_ByteString_deleteMembers(&ivCopy);
-    return retval;
-}
-
-static UA_StatusCode
-sym_generateKey_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                            const UA_ByteString *secret, const UA_ByteString *seed,
-                            UA_ByteString *out) {
-    if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256_PolicyContext *pc =
-        (Basic256_PolicyContext *)securityPolicy->policyContext;
-
-    return mbedtls_generateKey(&pc->sha1MdContext, secret, seed, out);
-}
-
-static UA_StatusCode
-sym_generateNonce_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                              UA_ByteString *out) {
-    if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256_PolicyContext *pc =
-        (Basic256_PolicyContext *)securityPolicy->policyContext;
-
-    int mbedErr = mbedtls_ctr_drbg_random(&pc->drbgContext, out->data, out->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/*****************/
-/* ChannelModule */
-/*****************/
-
-/* Assumes that the certificate has been verified externally */
-static UA_StatusCode
-parseRemoteCertificate_sp_basic256(Basic256_ChannelContext *cc,
-                                   const UA_ByteString *remoteCertificate) {
-    if(remoteCertificate == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Parse the certificate */
-    int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data,
-                                         remoteCertificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    /* Check the key length */
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    if(rsaContext->len < UA_SECURITYPOLICY_BASIC256_MINASYMKEYLENGTH ||
-       rsaContext->len > UA_SECURITYPOLICY_BASIC256_MAXASYMKEYLENGTH)
-        return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-channelContext_deleteContext_sp_basic256(Basic256_ChannelContext *cc) {
-    UA_ByteString_deleteMembers(&cc->localSymSigningKey);
-    UA_ByteString_deleteMembers(&cc->localSymEncryptingKey);
-    UA_ByteString_deleteMembers(&cc->localSymIv);
-
-    UA_ByteString_deleteMembers(&cc->remoteSymSigningKey);
-    UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey);
-    UA_ByteString_deleteMembers(&cc->remoteSymIv);
-
-    mbedtls_x509_crt_free(&cc->remoteCertificate);
-
-    UA_free(cc);
-}
-
-static UA_StatusCode
-channelContext_newContext_sp_basic256(const UA_SecurityPolicy *securityPolicy,
-                                      const UA_ByteString *remoteCertificate,
-                                      void **pp_contextData) {
-    if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Allocate the channel context */
-    *pp_contextData = UA_malloc(sizeof(Basic256_ChannelContext));
-    if(*pp_contextData == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    Basic256_ChannelContext *cc = (Basic256_ChannelContext *)*pp_contextData;
-
-    /* Initialize the channel context */
-    cc->policyContext = (Basic256_PolicyContext *)securityPolicy->policyContext;
-
-    UA_ByteString_init(&cc->localSymSigningKey);
-    UA_ByteString_init(&cc->localSymEncryptingKey);
-    UA_ByteString_init(&cc->localSymIv);
-
-    UA_ByteString_init(&cc->remoteSymSigningKey);
-    UA_ByteString_init(&cc->remoteSymEncryptingKey);
-    UA_ByteString_init(&cc->remoteSymIv);
-
-    mbedtls_x509_crt_init(&cc->remoteCertificate);
-
-    // TODO: this can be optimized so that we dont allocate memory before parsing the certificate
-    UA_StatusCode retval = parseRemoteCertificate_sp_basic256(cc, remoteCertificate);
-    if(retval != UA_STATUSCODE_GOOD) {
-        channelContext_deleteContext_sp_basic256(cc);
-        *pp_contextData = NULL;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-channelContext_setLocalSymEncryptingKey_sp_basic256(Basic256_ChannelContext *cc,
-                                                    const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymEncryptingKey);
-    return UA_ByteString_copy(key, &cc->localSymEncryptingKey);
-}
-
-static UA_StatusCode
-channelContext_setLocalSymSigningKey_sp_basic256(Basic256_ChannelContext *cc,
-                                                 const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymSigningKey);
-    return UA_ByteString_copy(key, &cc->localSymSigningKey);
-}
-
-
-static UA_StatusCode
-channelContext_setLocalSymIv_sp_basic256(Basic256_ChannelContext *cc,
-                                         const UA_ByteString *iv) {
-    if(iv == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymIv);
-    return UA_ByteString_copy(iv, &cc->localSymIv);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymEncryptingKey_sp_basic256(Basic256_ChannelContext *cc,
-                                                     const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey);
-    return UA_ByteString_copy(key, &cc->remoteSymEncryptingKey);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymSigningKey_sp_basic256(Basic256_ChannelContext *cc,
-                                                  const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymSigningKey);
-    return UA_ByteString_copy(key, &cc->remoteSymSigningKey);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymIv_sp_basic256(Basic256_ChannelContext *cc,
-                                          const UA_ByteString *iv) {
-    if(iv == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymIv);
-    return UA_ByteString_copy(iv, &cc->remoteSymIv);
-}
-
-static UA_StatusCode
-channelContext_compareCertificate_sp_basic256(const Basic256_ChannelContext *cc,
-                                              const UA_ByteString *certificate) {
-    if(cc == NULL || certificate == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_x509_crt cert;
-    mbedtls_x509_crt_init(&cert);
-    int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(cert.raw.len != cc->remoteCertificate.raw.len ||
-       memcmp(cert.raw.p, cc->remoteCertificate.raw.p, cert.raw.len) != 0)
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    mbedtls_x509_crt_free(&cert);
-    return retval;
-}
-
-static void
-deleteMembers_sp_basic256(UA_SecurityPolicy *securityPolicy) {
-    if(securityPolicy == NULL)
-        return;
-
-    if(securityPolicy->policyContext == NULL)
-        return;
-
-    UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
-
-    /* delete all allocated members in the context */
-    Basic256_PolicyContext *pc = (Basic256_PolicyContext *)
-        securityPolicy->policyContext;
-
-    mbedtls_ctr_drbg_free(&pc->drbgContext);
-    mbedtls_entropy_free(&pc->entropyContext);
-    mbedtls_pk_free(&pc->localPrivateKey);
-    mbedtls_md_free(&pc->sha1MdContext);
-    UA_ByteString_deleteMembers(&pc->localCertThumbprint);
-
-    UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Deleted members of EndpointContext for sp_basic256");
-
-    UA_free(pc);
-    securityPolicy->policyContext = NULL;
-}
-
-static UA_StatusCode
-updateCertificateAndPrivateKey_sp_basic256(UA_SecurityPolicy *securityPolicy,
-                                           const UA_ByteString newCertificate,
-                                           const UA_ByteString newPrivateKey) {
-    if(securityPolicy == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(securityPolicy->policyContext == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256_PolicyContext *pc = (Basic256_PolicyContext *)
-        securityPolicy->policyContext;
-
-    UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
-
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&securityPolicy->localCertificate,
-                                                     newCertificate.length + 1);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length);
-    securityPolicy->localCertificate.data[newCertificate.length] = '\0';
-    securityPolicy->localCertificate.length--;
-
-    /* Set the new private key */
-    mbedtls_pk_free(&pc->localPrivateKey);
-    mbedtls_pk_init(&pc->localPrivateKey);
-    int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey,
-                                       newPrivateKey.data, newPrivateKey.length,
-                                       NULL, 0);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    retval = asym_makeThumbprint_sp_basic256(pc->securityPolicy,
-                                             &securityPolicy->localCertificate,
-                                             &pc->localCertThumbprint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return retval;
-
-    error:
-    UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Could not update certificate and private key");
-    if(securityPolicy->policyContext != NULL)
-        deleteMembers_sp_basic256(securityPolicy);
-    return retval;
-}
-
-static UA_StatusCode
-policyContext_newContext_sp_basic256(UA_SecurityPolicy *securityPolicy,
-                                     const UA_ByteString localPrivateKey) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(securityPolicy == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if (localPrivateKey.length == 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Can not initialize security policy. Private key is empty.");
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    Basic256_PolicyContext *pc = (Basic256_PolicyContext *)
-        UA_malloc(sizeof(Basic256_PolicyContext));
-    securityPolicy->policyContext = (void *)pc;
-    if(!pc) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto error;
-    }
-
-    /* Initialize the PolicyContext */
-    memset(pc, 0, sizeof(Basic256_PolicyContext));
-    mbedtls_ctr_drbg_init(&pc->drbgContext);
-    mbedtls_entropy_init(&pc->entropyContext);
-    mbedtls_pk_init(&pc->localPrivateKey);
-    mbedtls_md_init(&pc->sha1MdContext);
-    pc->securityPolicy = securityPolicy;
-
-    /* Initialized the message digest */
-    const mbedtls_md_info_t *mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
-    int mbedErr = mbedtls_md_setup(&pc->sha1MdContext, mdInfo, MBEDTLS_MD_SHA1);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto error;
-    }
-
-    /* Add the system entropy source */
-    mbedErr = mbedtls_entropy_add_source(&pc->entropyContext,
-                                         mbedtls_platform_entropy_poll, NULL, 0,
-                                         MBEDTLS_ENTROPY_SOURCE_STRONG);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Seed the RNG */
-    char *personalization = "open62541-drbg";
-    mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func,
-                                    &pc->entropyContext,
-                                    (const unsigned char *)personalization, 14);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Set the private key */
-    mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, localPrivateKey.data,
-                                   localPrivateKey.length, NULL, 0);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Set the local certificate thumbprint */
-    retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-    retval = asym_makeThumbprint_sp_basic256(pc->securityPolicy,
-                                                  &securityPolicy->localCertificate,
-                                                  &pc->localCertThumbprint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return UA_STATUSCODE_GOOD;
-
-error:
-    UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Could not create securityContext: %s", UA_StatusCode_name(retval));
-    if(securityPolicy->policyContext != NULL)
-        deleteMembers_sp_basic256(securityPolicy);
-    return retval;
-}
-
-UA_StatusCode
-UA_SecurityPolicy_Basic256(UA_SecurityPolicy *policy,
-                           UA_CertificateVerification *certificateVerification,
-                           const UA_ByteString localCertificate,
-                           const UA_ByteString localPrivateKey, const UA_Logger *logger) {
-    memset(policy, 0, sizeof(UA_SecurityPolicy));
-    policy->logger = logger;
-
-    policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256");
-
-    UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule;
-    UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule;
-    UA_SecurityPolicyChannelModule *const channelModule = &policy->channelModule;
-
-    /* Copy the certificate and add a NULL to the end */
-    UA_StatusCode retval =
-        UA_ByteString_allocBuffer(&policy->localCertificate, localCertificate.length + 1);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(policy->localCertificate.data, localCertificate.data, localCertificate.length);
-    policy->localCertificate.data[localCertificate.length] = '\0';
-    policy->localCertificate.length--;
-    policy->certificateVerification = certificateVerification;
-
-    /* AsymmetricModule */
-    UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm =
-        &asymmetricModule->cryptoModule.signatureAlgorithm;
-    asym_signatureAlgorithm->uri =
-        UA_STRING("http://www.w3.org/2000/09/xmldsig#rsa-sha1\0");
-    asym_signatureAlgorithm->verify =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic256;
-    asym_signatureAlgorithm->sign =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic256;
-    asym_signatureAlgorithm->getLocalSignatureSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic256;
-    asym_signatureAlgorithm->getRemoteSignatureSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic256;
-    asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function
-    asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function
-
-    UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm =
-        &asymmetricModule->cryptoModule.encryptionAlgorithm;
-    asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-oaep\0");
-    asym_encryptionAlgorithm->encrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic256;
-    asym_encryptionAlgorithm->decrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))
-            asym_decrypt_sp_basic256;
-    asym_encryptionAlgorithm->getLocalKeyLength = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemoteKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic256;
-    asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *,
-                                                               const void *))asym_getRemoteBlockSize_sp_basic256;
-    asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemotePlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic256;
-
-    asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic256;
-    asymmetricModule->compareCertificateThumbprint =
-        asymmetricModule_compareCertificateThumbprint_sp_basic256;
-
-    /* SymmetricModule */
-    symmetricModule->generateKey = sym_generateKey_sp_basic256;
-    symmetricModule->generateNonce = sym_generateNonce_sp_basic256;
-
-    UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm =
-        &symmetricModule->cryptoModule.signatureAlgorithm;
-    sym_signatureAlgorithm->uri =
-        UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0");
-    sym_signatureAlgorithm->verify =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *,
-                           const UA_ByteString *))sym_verify_sp_basic256;
-    sym_signatureAlgorithm->sign =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic256;
-    sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic256;
-    sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic256;
-    sym_signatureAlgorithm->getLocalKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *,
-                    const void *))sym_getSigningKeyLength_sp_basic256;
-    sym_signatureAlgorithm->getRemoteKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *,
-                    const void *))sym_getSigningKeyLength_sp_basic256;
-
-    UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm =
-        &symmetricModule->cryptoModule.encryptionAlgorithm;
-    sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes256-cbc\0");
-    sym_encryptionAlgorithm->encrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic256;
-    sym_encryptionAlgorithm->decrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic256;
-    sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic256;
-    sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic256;
-    sym_encryptionAlgorithm->getLocalBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256;
-    sym_encryptionAlgorithm->getRemoteBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256;
-    sym_encryptionAlgorithm->getLocalPlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256;
-    sym_encryptionAlgorithm->getRemotePlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256;
-    symmetricModule->secureChannelNonceLength = 32;
-
-    // Use the same signature algorithm as the asymmetric component for certificate signing (see standard)
-    policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm;
-
-    /* ChannelModule */
-    channelModule->newContext = channelContext_newContext_sp_basic256;
-    channelModule->deleteContext = (void (*)(void *))
-        channelContext_deleteContext_sp_basic256;
-
-    channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymEncryptingKey_sp_basic256;
-    channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymSigningKey_sp_basic256;
-    channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymIv_sp_basic256;
-
-    channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymEncryptingKey_sp_basic256;
-    channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymSigningKey_sp_basic256;
-    channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymIv_sp_basic256;
-
-    channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *))
-        channelContext_compareCertificate_sp_basic256;
-
-    policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic256;
-    policy->deleteMembers = deleteMembers_sp_basic256;
-
-    return policyContext_newContext_sp_basic256(policy, localPrivateKey);
-}
-
-#endif
diff --git a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c b/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c
deleted file mode 100644
index 18f628d..0000000
--- a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c
+++ /dev/null
@@ -1,867 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG
- */
-
-#include <open62541/plugin/securitypolicy_default.h>
-#include <open62541/plugin/securitypolicy_mbedtls_common.h>
-#include <open62541/util.h>
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-
-#include <mbedtls/aes.h>
-#include <mbedtls/ctr_drbg.h>
-#include <mbedtls/entropy.h>
-#include <mbedtls/entropy_poll.h>
-#include <mbedtls/error.h>
-#include <mbedtls/md.h>
-#include <mbedtls/sha1.h>
-#include <mbedtls/sha256.h>
-#include <mbedtls/version.h>
-#include <mbedtls/x509_crt.h>
-
-/* Notes:
- * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to
- * allocate temp buffers.
- * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer
- */
-
-#define UA_SECURITYPOLICY_BASIC256SHA256_RSAPADDING_LEN 42
-#define UA_SHA1_LENGTH 20
-#define UA_SHA256_LENGTH 32
-#define UA_BASIC256SHA256_SYM_SIGNING_KEY_LENGTH 32
-#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_KEY_LENGTH 32
-#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_ENCRYPTION_BLOCK_SIZE 16
-#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_PLAIN_TEXT_BLOCK_SIZE 16
-#define UA_SECURITYPOLICY_BASIC256SHA256_MINASYMKEYLENGTH 256
-#define UA_SECURITYPOLICY_BASIC256SHA256_MAXASYMKEYLENGTH 512
-
-typedef struct {
-    const UA_SecurityPolicy *securityPolicy;
-    UA_ByteString localCertThumbprint;
-
-    mbedtls_ctr_drbg_context drbgContext;
-    mbedtls_entropy_context entropyContext;
-    mbedtls_md_context_t sha256MdContext;
-    mbedtls_pk_context localPrivateKey;
-} Basic256Sha256_PolicyContext;
-
-typedef struct {
-    Basic256Sha256_PolicyContext *policyContext;
-
-    UA_ByteString localSymSigningKey;
-    UA_ByteString localSymEncryptingKey;
-    UA_ByteString localSymIv;
-
-    UA_ByteString remoteSymSigningKey;
-    UA_ByteString remoteSymEncryptingKey;
-    UA_ByteString remoteSymIv;
-
-    mbedtls_x509_crt remoteCertificate;
-} Basic256Sha256_ChannelContext;
-
-/********************/
-/* AsymmetricModule */
-/********************/
-
-/* VERIFY AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */
-static UA_StatusCode
-asym_verify_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                              Basic256Sha256_ChannelContext *cc,
-                              const UA_ByteString *message,
-                              const UA_ByteString *signature) {
-    if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    unsigned char hash[UA_SHA256_LENGTH];
-#if MBEDTLS_VERSION_NUMBER >= 0x02070000
-    // TODO check return status
-    mbedtls_sha256_ret(message->data, message->length, hash, 0);
-#else
-    mbedtls_sha256(message->data, message->length, hash, 0);
-#endif
-
-    /* Set the RSA settings */
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);
-
-    /* For RSA keys, the default padding type is PKCS#1 v1.5 in mbedtls_pk_verify() */
-    /* Alternatively, use more specific function mbedtls_rsa_rsassa_pkcs1_v15_verify(), i.e. */
-    /* int mbedErr = mbedtls_rsa_rsassa_pkcs1_v15_verify(rsaContext, NULL, NULL,
-                                                         MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256,
-                                                         UA_SHA256_LENGTH, hash,
-                                                         signature->data); */
-    int mbedErr = mbedtls_pk_verify(&cc->remoteCertificate.pk,
-                                    MBEDTLS_MD_SHA256, hash, UA_SHA256_LENGTH,
-                                    signature->data, signature->length);
-
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */
-static UA_StatusCode
-asym_sign_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                            Basic256Sha256_ChannelContext *cc,
-                            const UA_ByteString *message,
-                            UA_ByteString *signature) {
-    if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    unsigned char hash[UA_SHA256_LENGTH];
-#if MBEDTLS_VERSION_NUMBER >= 0x02070000
-    // TODO check return status
-    mbedtls_sha256_ret(message->data, message->length, hash, 0);
-#else
-    mbedtls_sha256(message->data, message->length, hash, 0);
-#endif
-
-    Basic256Sha256_PolicyContext *pc = cc->policyContext;
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(pc->localPrivateKey);
-    mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);
-
-    size_t sigLen = 0;
-
-    /* For RSA keys, the default padding type is PKCS#1 v1.5 in mbedtls_pk_sign */
-    /* Alternatively use more specific function mbedtls_rsa_rsassa_pkcs1_v15_sign() */
-    int mbedErr = mbedtls_pk_sign(&pc->localPrivateKey,
-                                  MBEDTLS_MD_SHA256, hash,
-                                  UA_SHA256_LENGTH, signature->data,
-                                  &sigLen, mbedtls_ctr_drbg_random,
-                                  &pc->drbgContext);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-asym_getLocalSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                             const Basic256Sha256_ChannelContext *cc) {
-    if(securityPolicy == NULL || cc == NULL)
-        return 0;
-
-    return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len;
-}
-
-static size_t
-asym_getRemoteSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                              const Basic256Sha256_ChannelContext *cc) {
-    if(securityPolicy == NULL || cc == NULL)
-        return 0;
-
-    return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len;
-}
-
-/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */
-static UA_StatusCode
-asym_encrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                               Basic256Sha256_ChannelContext *cc,
-                               UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, cc);
-
-    mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1);
-
-    return mbedtls_encrypt_rsaOaep(remoteRsaContext, &cc->policyContext->drbgContext,
-                                   data, plainTextBlockSize);
-}
-
-/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */
-static UA_StatusCode
-asym_decrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                               Basic256Sha256_ChannelContext *cc,
-                               UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return mbedtls_decrypt_rsaOaep(&cc->policyContext->localPrivateKey,
-                                   &cc->policyContext->drbgContext, data);
-}
-
-static size_t
-asym_getRemoteEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                                    const Basic256Sha256_ChannelContext *cc) {
-    return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8;
-}
-
-static size_t
-asym_getRemoteBlockSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                          const Basic256Sha256_ChannelContext *cc) {
-    mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    return rsaContext->len;
-}
-
-static size_t
-asym_getRemotePlainTextBlockSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                                   const Basic256Sha256_ChannelContext *cc) {
-    mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    return rsaContext->len - UA_SECURITYPOLICY_BASIC256SHA256_RSAPADDING_LEN;
-}
-
-static UA_StatusCode
-asym_makeThumbprint_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                      const UA_ByteString *certificate,
-                                      UA_ByteString *thumbprint) {
-    if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    return mbedtls_thumbprint_sha1(certificate, thumbprint);
-}
-
-static UA_StatusCode
-asymmetricModule_compareCertificateThumbprint_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                                                const UA_ByteString *certificateThumbprint) {
-    if(securityPolicy == NULL || certificateThumbprint == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *)securityPolicy->policyContext;
-    if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint))
-        return UA_STATUSCODE_BADCERTIFICATEINVALID;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/*******************/
-/* SymmetricModule */
-/*******************/
-
-static UA_StatusCode
-sym_verify_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                             Basic256Sha256_ChannelContext *cc,
-                             const UA_ByteString *message,
-                             const UA_ByteString *signature) {
-    if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Compute MAC */
-    if(signature->length != UA_SHA256_LENGTH) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Signature size does not have the desired size defined by the security policy");
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    }
-
-    Basic256Sha256_PolicyContext *pc =
-        (Basic256Sha256_PolicyContext *)securityPolicy->policyContext;
-
-    unsigned char mac[UA_SHA256_LENGTH];
-    mbedtls_hmac(&pc->sha256MdContext, &cc->remoteSymSigningKey, message, mac);
-
-    /* Compare with Signature */
-    if(!UA_constantTimeEqual(signature->data, mac, UA_SHA256_LENGTH))
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-sym_sign_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                           const Basic256Sha256_ChannelContext *cc,
-                           const UA_ByteString *message,
-                           UA_ByteString *signature) {
-    if(signature->length != UA_SHA256_LENGTH)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_hmac(&cc->policyContext->sha256MdContext, &cc->localSymSigningKey,
-                 message, signature->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-sym_getSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                       const void *channelContext) {
-    return UA_SHA256_LENGTH;
-}
-
-static size_t
-sym_getSigningKeyLength_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy,
-                                          const void *const channelContext) {
-    return UA_BASIC256SHA256_SYM_SIGNING_KEY_LENGTH;
-}
-
-static size_t
-sym_getEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                             const void *channelContext) {
-    return UA_SECURITYPOLICY_BASIC256SHA256_SYM_KEY_LENGTH;
-}
-
-static size_t
-sym_getEncryptionBlockSize_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy,
-                                             const void *const channelContext) {
-    return UA_SECURITYPOLICY_BASIC256SHA256_SYM_ENCRYPTION_BLOCK_SIZE;
-}
-
-static size_t
-sym_getPlainTextBlockSize_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy,
-                                            const void *const channelContext) {
-    return UA_SECURITYPOLICY_BASIC256SHA256_SYM_PLAIN_TEXT_BLOCK_SIZE;
-}
-
-static UA_StatusCode
-sym_encrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                              const Basic256Sha256_ChannelContext *cc,
-                              UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(cc->localSymIv.length != securityPolicy->symmetricModule.cryptoModule.
-       encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t plainTextBlockSize = securityPolicy->symmetricModule.cryptoModule.
-        encryptionAlgorithm.getLocalPlainTextBlockSize(securityPolicy, cc);
-
-    if(data->length % plainTextBlockSize != 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Length of data to encrypt is not a multiple of the plain text block size."
-                     "Padding might not have been calculated appropriately.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Keylength in bits */
-    unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8);
-    mbedtls_aes_context aesContext;
-    int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString ivCopy;
-    UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length,
-                                    ivCopy.data, data->data, data->data);
-    if(mbedErr)
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    UA_ByteString_deleteMembers(&ivCopy);
-    return retval;
-}
-
-static UA_StatusCode
-sym_decrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                              const Basic256Sha256_ChannelContext *cc,
-                              UA_ByteString *data) {
-    if(securityPolicy == NULL || cc == NULL || data == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemoteBlockSize(securityPolicy, cc);
-
-    if(cc->remoteSymIv.length != encryptionBlockSize)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(data->length % encryptionBlockSize != 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Length of data to decrypt is not a multiple of the encryptingBlock size.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8);
-    mbedtls_aes_context aesContext;
-    int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength);
-    if(mbedErr)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString ivCopy;
-    UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length,
-                                    ivCopy.data, data->data, data->data);
-    if(mbedErr)
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    UA_ByteString_deleteMembers(&ivCopy);
-    return retval;
-}
-
-static UA_StatusCode
-sym_generateKey_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                  const UA_ByteString *secret, const UA_ByteString *seed,
-                                  UA_ByteString *out) {
-    if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256Sha256_PolicyContext *pc =
-        (Basic256Sha256_PolicyContext *)securityPolicy->policyContext;
-
-    return mbedtls_generateKey(&pc->sha256MdContext, secret, seed, out);
-}
-
-static UA_StatusCode
-sym_generateNonce_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                    UA_ByteString *out) {
-    if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256Sha256_PolicyContext *pc =
-        (Basic256Sha256_PolicyContext *)securityPolicy->policyContext;
-    int mbedErr = mbedtls_ctr_drbg_random(&pc->drbgContext, out->data, out->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    return UA_STATUSCODE_GOOD;
-}
-
-/*****************/
-/* ChannelModule */
-/*****************/
-
-/* Assumes that the certificate has been verified externally */
-static UA_StatusCode
-parseRemoteCertificate_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                         const UA_ByteString *remoteCertificate) {
-    if(remoteCertificate == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Parse the certificate */
-    int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data,
-                                         remoteCertificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    /* Check the key length */
-    mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk);
-    if(rsaContext->len < UA_SECURITYPOLICY_BASIC256SHA256_MINASYMKEYLENGTH ||
-       rsaContext->len > UA_SECURITYPOLICY_BASIC256SHA256_MAXASYMKEYLENGTH)
-        return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-channelContext_deleteContext_sp_basic256sha256(Basic256Sha256_ChannelContext *cc) {
-    UA_ByteString_deleteMembers(&cc->localSymSigningKey);
-    UA_ByteString_deleteMembers(&cc->localSymEncryptingKey);
-    UA_ByteString_deleteMembers(&cc->localSymIv);
-
-    UA_ByteString_deleteMembers(&cc->remoteSymSigningKey);
-    UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey);
-    UA_ByteString_deleteMembers(&cc->remoteSymIv);
-
-    mbedtls_x509_crt_free(&cc->remoteCertificate);
-
-    UA_free(cc);
-}
-
-static UA_StatusCode
-channelContext_newContext_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy,
-                                            const UA_ByteString *remoteCertificate,
-                                            void **pp_contextData) {
-    if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Allocate the channel context */
-    *pp_contextData = UA_malloc(sizeof(Basic256Sha256_ChannelContext));
-    if(*pp_contextData == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    Basic256Sha256_ChannelContext *cc = (Basic256Sha256_ChannelContext *)*pp_contextData;
-
-    /* Initialize the channel context */
-    cc->policyContext = (Basic256Sha256_PolicyContext *)securityPolicy->policyContext;
-
-    UA_ByteString_init(&cc->localSymSigningKey);
-    UA_ByteString_init(&cc->localSymEncryptingKey);
-    UA_ByteString_init(&cc->localSymIv);
-
-    UA_ByteString_init(&cc->remoteSymSigningKey);
-    UA_ByteString_init(&cc->remoteSymEncryptingKey);
-    UA_ByteString_init(&cc->remoteSymIv);
-
-    mbedtls_x509_crt_init(&cc->remoteCertificate);
-
-    // TODO: this can be optimized so that we dont allocate memory before parsing the certificate
-    UA_StatusCode retval = parseRemoteCertificate_sp_basic256sha256(cc, remoteCertificate);
-    if(retval != UA_STATUSCODE_GOOD) {
-        channelContext_deleteContext_sp_basic256sha256(cc);
-        *pp_contextData = NULL;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-channelContext_setLocalSymEncryptingKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                                          const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymEncryptingKey);
-    return UA_ByteString_copy(key, &cc->localSymEncryptingKey);
-}
-
-static UA_StatusCode
-channelContext_setLocalSymSigningKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                                       const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymSigningKey);
-    return UA_ByteString_copy(key, &cc->localSymSigningKey);
-}
-
-
-static UA_StatusCode
-channelContext_setLocalSymIv_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                               const UA_ByteString *iv) {
-    if(iv == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->localSymIv);
-    return UA_ByteString_copy(iv, &cc->localSymIv);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymEncryptingKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                                           const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey);
-    return UA_ByteString_copy(key, &cc->remoteSymEncryptingKey);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymSigningKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                                        const UA_ByteString *key) {
-    if(key == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymSigningKey);
-    return UA_ByteString_copy(key, &cc->remoteSymSigningKey);
-}
-
-static UA_StatusCode
-channelContext_setRemoteSymIv_sp_basic256sha256(Basic256Sha256_ChannelContext *cc,
-                                                const UA_ByteString *iv) {
-    if(iv == NULL || cc == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString_deleteMembers(&cc->remoteSymIv);
-    return UA_ByteString_copy(iv, &cc->remoteSymIv);
-}
-
-static UA_StatusCode
-channelContext_compareCertificate_sp_basic256sha256(const Basic256Sha256_ChannelContext *cc,
-                                                    const UA_ByteString *certificate) {
-    if(cc == NULL || certificate == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    mbedtls_x509_crt cert;
-    mbedtls_x509_crt_init(&cert);
-    int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(cert.raw.len != cc->remoteCertificate.raw.len ||
-       memcmp(cert.raw.p, cc->remoteCertificate.raw.p, cert.raw.len) != 0)
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    mbedtls_x509_crt_free(&cert);
-    return retval;
-}
-
-static void
-deleteMembers_sp_basic256sha256(UA_SecurityPolicy *securityPolicy) {
-    if(securityPolicy == NULL)
-        return;
-
-    if(securityPolicy->policyContext == NULL)
-        return;
-
-    UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
-
-    /* delete all allocated members in the context */
-    Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *)
-        securityPolicy->policyContext;
-
-    mbedtls_ctr_drbg_free(&pc->drbgContext);
-    mbedtls_entropy_free(&pc->entropyContext);
-    mbedtls_pk_free(&pc->localPrivateKey);
-    mbedtls_md_free(&pc->sha256MdContext);
-    UA_ByteString_deleteMembers(&pc->localCertThumbprint);
-
-    UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Deleted members of EndpointContext for sp_basic256sha256");
-
-    UA_free(pc);
-    securityPolicy->policyContext = NULL;
-}
-
-static UA_StatusCode
-updateCertificateAndPrivateKey_sp_basic256sha256(UA_SecurityPolicy *securityPolicy,
-                                                 const UA_ByteString newCertificate,
-                                                 const UA_ByteString newPrivateKey) {
-    if(securityPolicy == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(securityPolicy->policyContext == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    Basic256Sha256_PolicyContext *pc =
-            (Basic256Sha256_PolicyContext *) securityPolicy->policyContext;
-
-    UA_ByteString_deleteMembers(&securityPolicy->localCertificate);
-
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&securityPolicy->localCertificate,
-                                                     newCertificate.length + 1);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length);
-    securityPolicy->localCertificate.data[newCertificate.length] = '\0';
-    securityPolicy->localCertificate.length--;
-
-    /* Set the new private key */
-    mbedtls_pk_free(&pc->localPrivateKey);
-    mbedtls_pk_init(&pc->localPrivateKey);
-    int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, newPrivateKey.data,
-                                       newPrivateKey.length, NULL, 0);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    retval = asym_makeThumbprint_sp_basic256sha256(pc->securityPolicy,
-                                                   &securityPolicy->localCertificate,
-                                                   &pc->localCertThumbprint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return retval;
-
-    error:
-    UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Could not update certificate and private key");
-    if(securityPolicy->policyContext != NULL)
-        deleteMembers_sp_basic256sha256(securityPolicy);
-    return retval;
-}
-
-static UA_StatusCode
-policyContext_newContext_sp_basic256sha256(UA_SecurityPolicy *securityPolicy,
-                                           const UA_ByteString localPrivateKey) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(securityPolicy == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if (localPrivateKey.length == 0) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Can not initialize security policy. Private key is empty.");
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *)
-        UA_malloc(sizeof(Basic256Sha256_PolicyContext));
-    securityPolicy->policyContext = (void *)pc;
-    if(!pc) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto error;
-    }
-
-    /* Initialize the PolicyContext */
-    memset(pc, 0, sizeof(Basic256Sha256_PolicyContext));
-    mbedtls_ctr_drbg_init(&pc->drbgContext);
-    mbedtls_entropy_init(&pc->entropyContext);
-    mbedtls_pk_init(&pc->localPrivateKey);
-    mbedtls_md_init(&pc->sha256MdContext);
-    pc->securityPolicy = securityPolicy;
-
-    /* Initialized the message digest */
-    const mbedtls_md_info_t *const mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
-    int mbedErr = mbedtls_md_setup(&pc->sha256MdContext, mdInfo, MBEDTLS_MD_SHA256);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto error;
-    }
-
-    /* Add the system entropy source */
-    mbedErr = mbedtls_entropy_add_source(&pc->entropyContext,
-                                         mbedtls_platform_entropy_poll, NULL, 0,
-                                         MBEDTLS_ENTROPY_SOURCE_STRONG);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Seed the RNG */
-    char *personalization = "open62541-drbg";
-    mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func,
-                                    &pc->entropyContext,
-                                    (const unsigned char *)personalization, 14);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Set the private key */
-    mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, localPrivateKey.data,
-                                   localPrivateKey.length, NULL, 0);
-    if(mbedErr) {
-        retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        goto error;
-    }
-
-    /* Set the local certificate thumbprint */
-    retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-    retval = asym_makeThumbprint_sp_basic256sha256(pc->securityPolicy,
-                                                  &securityPolicy->localCertificate,
-                                                  &pc->localCertThumbprint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return UA_STATUSCODE_GOOD;
-
-error:
-    UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                 "Could not create securityContext: %s", UA_StatusCode_name(retval));
-    if(securityPolicy->policyContext != NULL)
-        deleteMembers_sp_basic256sha256(securityPolicy);
-    return retval;
-}
-
-UA_StatusCode
-UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy,
-                                 UA_CertificateVerification *certificateVerification,
-                                 const UA_ByteString localCertificate,
-                                 const UA_ByteString localPrivateKey, const UA_Logger *logger) {
-    memset(policy, 0, sizeof(UA_SecurityPolicy));
-    policy->logger = logger;
-
-    policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256");
-
-    UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule;
-    UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule;
-    UA_SecurityPolicyChannelModule *const channelModule = &policy->channelModule;
-
-    /* Copy the certificate and add a NULL to the end */
-    UA_StatusCode retval =
-        UA_ByteString_allocBuffer(&policy->localCertificate, localCertificate.length + 1);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(policy->localCertificate.data, localCertificate.data, localCertificate.length);
-    policy->localCertificate.data[localCertificate.length] = '\0';
-    policy->localCertificate.length--;
-    policy->certificateVerification = certificateVerification;
-
-    /* AsymmetricModule */
-    UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm =
-        &asymmetricModule->cryptoModule.signatureAlgorithm;
-    asym_signatureAlgorithm->uri =
-        UA_STRING("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\0");
-    asym_signatureAlgorithm->verify =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic256sha256;
-    asym_signatureAlgorithm->sign =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic256sha256;
-    asym_signatureAlgorithm->getLocalSignatureSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic256sha256;
-    asym_signatureAlgorithm->getRemoteSignatureSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic256sha256;
-    asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function
-    asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function
-
-    UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm =
-        &asymmetricModule->cryptoModule.encryptionAlgorithm;
-    asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-oaep\0");
-    asym_encryptionAlgorithm->encrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic256sha256;
-    asym_encryptionAlgorithm->decrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))
-            asym_decrypt_sp_basic256sha256;
-    asym_encryptionAlgorithm->getLocalKeyLength = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemoteKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic256sha256;
-    asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *,
-                                                               const void *))asym_getRemoteBlockSize_sp_basic256sha256;
-    asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function
-    asym_encryptionAlgorithm->getRemotePlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic256sha256;
-
-    asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic256sha256;
-    asymmetricModule->compareCertificateThumbprint =
-        asymmetricModule_compareCertificateThumbprint_sp_basic256sha256;
-
-    /* SymmetricModule */
-    symmetricModule->generateKey = sym_generateKey_sp_basic256sha256;
-    symmetricModule->generateNonce = sym_generateNonce_sp_basic256sha256;
-
-    UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm =
-        &symmetricModule->cryptoModule.signatureAlgorithm;
-    sym_signatureAlgorithm->uri =
-        UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0");
-    sym_signatureAlgorithm->verify =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *,
-                           const UA_ByteString *))sym_verify_sp_basic256sha256;
-    sym_signatureAlgorithm->sign =
-        (UA_StatusCode (*)(const UA_SecurityPolicy *, void *,
-                           const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic256sha256;
-    sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic256sha256;
-    sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic256sha256;
-    sym_signatureAlgorithm->getLocalKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *,
-                    const void *))sym_getSigningKeyLength_sp_basic256sha256;
-    sym_signatureAlgorithm->getRemoteKeyLength =
-        (size_t (*)(const UA_SecurityPolicy *,
-                    const void *))sym_getSigningKeyLength_sp_basic256sha256;
-
-    UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm =
-        &symmetricModule->cryptoModule.encryptionAlgorithm;
-    sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes128-cbc");
-    sym_encryptionAlgorithm->encrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic256sha256;
-    sym_encryptionAlgorithm->decrypt =
-        (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic256sha256;
-    sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic256sha256;
-    sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic256sha256;
-    sym_encryptionAlgorithm->getLocalBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256sha256;
-    sym_encryptionAlgorithm->getRemoteBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256sha256;
-    sym_encryptionAlgorithm->getLocalPlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256sha256;
-    sym_encryptionAlgorithm->getRemotePlainTextBlockSize =
-        (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256sha256;
-    symmetricModule->secureChannelNonceLength = 32;
-
-    // Use the same signature algorithm as the asymmetric component for certificate signing (see standard)
-    policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm;
-
-    /* ChannelModule */
-    channelModule->newContext = channelContext_newContext_sp_basic256sha256;
-    channelModule->deleteContext = (void (*)(void *))
-        channelContext_deleteContext_sp_basic256sha256;
-
-    channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymEncryptingKey_sp_basic256sha256;
-    channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymSigningKey_sp_basic256sha256;
-    channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setLocalSymIv_sp_basic256sha256;
-
-    channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymEncryptingKey_sp_basic256sha256;
-    channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymSigningKey_sp_basic256sha256;
-    channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *))
-        channelContext_setRemoteSymIv_sp_basic256sha256;
-
-    channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *))
-        channelContext_compareCertificate_sp_basic256sha256;
-
-    policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic256sha256;
-    policy->deleteMembers = deleteMembers_sp_basic256sha256;
-
-    return policyContext_newContext_sp_basic256sha256(policy, localPrivateKey);
-}
-
-#endif
diff --git a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_none.c b/ext/open62541/plugins/securityPolicies/ua_securitypolicy_none.c
deleted file mode 100644
index 2198fed..0000000
--- a/ext/open62541/plugins/securityPolicies/ua_securitypolicy_none.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include <open62541/plugin/securitypolicy_default.h>
-
-static UA_StatusCode
-verify_none(const UA_SecurityPolicy *securityPolicy,
-            void *channelContext,
-            const UA_ByteString *message,
-            const UA_ByteString *signature) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-sign_none(const UA_SecurityPolicy *securityPolicy,
-          void *channelContext,
-          const UA_ByteString *message,
-          UA_ByteString *signature) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-length_none(const UA_SecurityPolicy *securityPolicy,
-            const void *channelContext) {
-    return 0;
-}
-
-static UA_StatusCode
-encrypt_none(const UA_SecurityPolicy *securityPolicy,
-             void *channelContext,
-             UA_ByteString *data) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-decrypt_none(const UA_SecurityPolicy *securityPolicy,
-             void *channelContext,
-             UA_ByteString *data) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-makeThumbprint_none(const UA_SecurityPolicy *securityPolicy,
-                    const UA_ByteString *certificate,
-                    UA_ByteString *thumbprint) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-compareThumbprint_none(const UA_SecurityPolicy *securityPolicy,
-                       const UA_ByteString *certificateThumbprint) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-generateKey_none(const UA_SecurityPolicy *securityPolicy,
-                 const UA_ByteString *secret,
-                 const UA_ByteString *seed,
-                 UA_ByteString *out) {
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Use the non-cryptographic RNG to set the nonce */
-static UA_StatusCode
-generateNonce_none(const UA_SecurityPolicy *securityPolicy, UA_ByteString *out) {
-    if(securityPolicy == NULL || out == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(out->length == 0)
-        return UA_STATUSCODE_GOOD;
-
-    /* Fill blocks of four byte */
-    size_t i = 0;
-    while(i + 3 < out->length) {
-        UA_UInt32 rand = UA_UInt32_random();
-        memcpy(&out->data[i], &rand, 4);
-        i = i+4;
-    }
-
-    /* Fill the remaining byte */
-    UA_UInt32 rand = UA_UInt32_random();
-    memcpy(&out->data[i], &rand, out->length % 4);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-newContext_none(const UA_SecurityPolicy *securityPolicy,
-                const UA_ByteString *remoteCertificate,
-                void **channelContext) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-deleteContext_none(void *channelContext) {
-}
-
-static UA_StatusCode
-setContextValue_none(void *channelContext,
-                     const UA_ByteString *key) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-compareCertificate_none(const void *channelContext,
-                        const UA_ByteString *certificate) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-updateCertificateAndPrivateKey_none(UA_SecurityPolicy *policy,
-                                    const UA_ByteString newCertificate,
-                                    const UA_ByteString newPrivateKey) {
-    UA_ByteString_deleteMembers(&policy->localCertificate);
-    UA_ByteString_copy(&newCertificate, &policy->localCertificate);
-    return UA_STATUSCODE_GOOD;
-}
-
-
-static void
-policy_deletemembers_none(UA_SecurityPolicy *policy) {
-    UA_ByteString_deleteMembers(&policy->localCertificate);
-}
-
-UA_StatusCode
-UA_SecurityPolicy_None(UA_SecurityPolicy *policy,
-                       UA_CertificateVerification *certificateVerification,
-                       const UA_ByteString localCertificate, const UA_Logger *logger) {
-    policy->policyContext = (void *)(uintptr_t)logger;
-    policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
-    policy->logger = logger;
-    UA_ByteString_copy(&localCertificate, &policy->localCertificate);
-
-    policy->certificateVerification = certificateVerification;
-
-    policy->symmetricModule.generateKey = generateKey_none;
-    policy->symmetricModule.generateNonce = generateNonce_none;
-
-    UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm =
-        &policy->symmetricModule.cryptoModule.signatureAlgorithm;
-    sym_signatureAlgorithm->uri = UA_STRING_NULL;
-    sym_signatureAlgorithm->verify = verify_none;
-    sym_signatureAlgorithm->sign = sign_none;
-    sym_signatureAlgorithm->getLocalSignatureSize = length_none;
-    sym_signatureAlgorithm->getRemoteSignatureSize = length_none;
-    sym_signatureAlgorithm->getLocalKeyLength = length_none;
-    sym_signatureAlgorithm->getRemoteKeyLength = length_none;
-
-    UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm =
-        &policy->symmetricModule.cryptoModule.encryptionAlgorithm;
-    sym_encryptionAlgorithm->encrypt = encrypt_none;
-    sym_encryptionAlgorithm->decrypt = decrypt_none;
-    sym_encryptionAlgorithm->getLocalKeyLength = length_none;
-    sym_encryptionAlgorithm->getRemoteKeyLength = length_none;
-    sym_encryptionAlgorithm->getLocalBlockSize = length_none;
-    sym_encryptionAlgorithm->getRemoteBlockSize = length_none;
-    sym_encryptionAlgorithm->getLocalPlainTextBlockSize = length_none;
-    sym_encryptionAlgorithm->getRemotePlainTextBlockSize = length_none;
-    policy->symmetricModule.secureChannelNonceLength = 0;
-
-    policy->asymmetricModule.makeCertificateThumbprint = makeThumbprint_none;
-    policy->asymmetricModule.compareCertificateThumbprint = compareThumbprint_none;
-
-    // This only works for none since symmetric and asymmetric crypto modules do the same i.e. nothing
-    policy->asymmetricModule.cryptoModule = policy->symmetricModule.cryptoModule;
-
-    // Use the same signing algorithm as for asymmetric signing
-    policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm;
-
-    policy->channelModule.newContext = newContext_none;
-    policy->channelModule.deleteContext = deleteContext_none;
-    policy->channelModule.setLocalSymEncryptingKey = setContextValue_none;
-    policy->channelModule.setLocalSymSigningKey = setContextValue_none;
-    policy->channelModule.setLocalSymIv = setContextValue_none;
-    policy->channelModule.setRemoteSymEncryptingKey = setContextValue_none;
-    policy->channelModule.setRemoteSymSigningKey = setContextValue_none;
-    policy->channelModule.setRemoteSymIv = setContextValue_none;
-    policy->channelModule.compareCertificate = compareCertificate_none;
-    policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_none;
-    policy->deleteMembers = policy_deletemembers_none;
-
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/plugins/ua_accesscontrol_default.c b/ext/open62541/plugins/ua_accesscontrol_default.c
deleted file mode 100644
index c1fa1bc..0000000
--- a/ext/open62541/plugins/ua_accesscontrol_default.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include <open62541/plugin/accesscontrol_default.h>
-#include <open62541/server_config.h>
-
-/* Example access control management. Anonymous and username / password login.
- * The access rights are maximally permissive. */
-
-typedef struct {
-    UA_Boolean allowAnonymous;
-    size_t usernamePasswordLoginSize;
-    UA_UsernamePasswordLogin *usernamePasswordLogin;
-} AccessControlContext;
-
-#define ANONYMOUS_POLICY "open62541-anonymous-policy"
-#define USERNAME_POLICY "open62541-username-policy"
-const UA_String anonymous_policy = UA_STRING_STATIC(ANONYMOUS_POLICY);
-const UA_String username_policy = UA_STRING_STATIC(USERNAME_POLICY);
-
-/************************/
-/* Access Control Logic */
-/************************/
-
-static UA_StatusCode
-activateSession_default(UA_Server *server, UA_AccessControl *ac,
-                        const UA_EndpointDescription *endpointDescription,
-                        const UA_ByteString *secureChannelRemoteCertificate,
-                        const UA_NodeId *sessionId,
-                        const UA_ExtensionObject *userIdentityToken,
-                        void **sessionContext) {
-    AccessControlContext *context = (AccessControlContext*)ac->context;
-
-    /* The empty token is interpreted as anonymous */
-    if(userIdentityToken->encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) {
-        if(!context->allowAnonymous)
-            return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-        /* No userdata atm */
-        *sessionContext = NULL;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Could the token be decoded? */
-    if(userIdentityToken->encoding < UA_EXTENSIONOBJECT_DECODED)
-        return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-    /* Anonymous login */
-    if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]) {
-        if(!context->allowAnonymous)
-            return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-        const UA_AnonymousIdentityToken *token = (UA_AnonymousIdentityToken*)
-            userIdentityToken->content.decoded.data;
-
-        /* Compatibility notice: Siemens OPC Scout v10 provides an empty
-         * policyId. This is not compliant. For compatibility, assume that empty
-         * policyId == ANONYMOUS_POLICY */
-        if(token->policyId.data && !UA_String_equal(&token->policyId, &anonymous_policy))
-            return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-        /* No userdata atm */
-        *sessionContext = NULL;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Username and password */
-    if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) {
-        const UA_UserNameIdentityToken *userToken =
-            (UA_UserNameIdentityToken*)userIdentityToken->content.decoded.data;
-
-        if(!UA_String_equal(&userToken->policyId, &username_policy))
-            return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-        /* The userToken has been decrypted by the server before forwarding
-         * it to the plugin. This information can be used here. */
-        /* if(userToken->encryptionAlgorithm.length > 0) {} */
-
-        /* Empty username and password */
-        if(userToken->userName.length == 0 && userToken->password.length == 0)
-            return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-        /* Try to match username/pw */
-        UA_Boolean match = false;
-        for(size_t i = 0; i < context->usernamePasswordLoginSize; i++) {
-            if(UA_String_equal(&userToken->userName, &context->usernamePasswordLogin[i].username) &&
-               UA_String_equal(&userToken->password, &context->usernamePasswordLogin[i].password)) {
-                match = true;
-                break;
-            }
-        }
-        if(!match)
-            return UA_STATUSCODE_BADUSERACCESSDENIED;
-
-        /* No userdata atm */
-        *sessionContext = NULL;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Unsupported token type */
-    return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-}
-
-static void
-closeSession_default(UA_Server *server, UA_AccessControl *ac,
-                     const UA_NodeId *sessionId, void *sessionContext) {
-    /* no context to clean up */
-}
-
-static UA_UInt32
-getUserRightsMask_default(UA_Server *server, UA_AccessControl *ac,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_NodeId *nodeId, void *nodeContext) {
-    return 0xFFFFFFFF;
-}
-
-static UA_Byte
-getUserAccessLevel_default(UA_Server *server, UA_AccessControl *ac,
-                           const UA_NodeId *sessionId, void *sessionContext,
-                           const UA_NodeId *nodeId, void *nodeContext) {
-    return 0xFF;
-}
-
-static UA_Boolean
-getUserExecutable_default(UA_Server *server, UA_AccessControl *ac,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_NodeId *methodId, void *methodContext) {
-    return true;
-}
-
-static UA_Boolean
-getUserExecutableOnObject_default(UA_Server *server, UA_AccessControl *ac,
-                                  const UA_NodeId *sessionId, void *sessionContext,
-                                  const UA_NodeId *methodId, void *methodContext,
-                                  const UA_NodeId *objectId, void *objectContext) {
-    return true;
-}
-
-static UA_Boolean
-allowAddNode_default(UA_Server *server, UA_AccessControl *ac,
-                     const UA_NodeId *sessionId, void *sessionContext,
-                     const UA_AddNodesItem *item) {
-    return true;
-}
-
-static UA_Boolean
-allowAddReference_default(UA_Server *server, UA_AccessControl *ac,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_AddReferencesItem *item) {
-    return true;
-}
-
-static UA_Boolean
-allowDeleteNode_default(UA_Server *server, UA_AccessControl *ac,
-                        const UA_NodeId *sessionId, void *sessionContext,
-                        const UA_DeleteNodesItem *item) {
-    return true;
-}
-
-static UA_Boolean
-allowDeleteReference_default(UA_Server *server, UA_AccessControl *ac,
-                             const UA_NodeId *sessionId, void *sessionContext,
-                             const UA_DeleteReferencesItem *item) {
-    return true;
-}
-
-#ifdef UA_ENABLE_HISTORIZING
-static UA_Boolean
-allowHistoryUpdateUpdateData_default(UA_Server *server, UA_AccessControl *ac,
-                                     const UA_NodeId *sessionId, void *sessionContext,
-                                     const UA_NodeId *nodeId,
-                                     UA_PerformUpdateType performInsertReplace,
-                                     const UA_DataValue *value) {
-    return true;
-}
-
-static UA_Boolean
-allowHistoryUpdateDeleteRawModified_default(UA_Server *server, UA_AccessControl *ac,
-                                            const UA_NodeId *sessionId, void *sessionContext,
-                                            const UA_NodeId *nodeId,
-                                            UA_DateTime startTimestamp,
-                                            UA_DateTime endTimestamp,
-                                            bool isDeleteModified) {
-    return true;
-}
-#endif
-
-/***************************************/
-/* Create Delete Access Control Plugin */
-/***************************************/
-
-static void deleteMembers_default(UA_AccessControl *ac) {
-    UA_Array_delete((void*)(uintptr_t)ac->userTokenPolicies,
-                    ac->userTokenPoliciesSize,
-                    &UA_TYPES[UA_TYPES_USERTOKENPOLICY]);
-    ac->userTokenPolicies = NULL;
-    ac->userTokenPoliciesSize = 0;
-
-    AccessControlContext *context = (AccessControlContext*)ac->context;
-
-    if (context) {
-        for(size_t i = 0; i < context->usernamePasswordLoginSize; i++) {
-            UA_String_deleteMembers(&context->usernamePasswordLogin[i].username);
-            UA_String_deleteMembers(&context->usernamePasswordLogin[i].password);
-        }
-        if(context->usernamePasswordLoginSize > 0)
-            UA_free(context->usernamePasswordLogin);
-        UA_free(ac->context);
-    }
-}
-
-UA_StatusCode
-UA_AccessControl_default(UA_ServerConfig *config, UA_Boolean allowAnonymous,
-                         const UA_ByteString *userTokenPolicyUri,
-                         size_t usernamePasswordLoginSize,
-                         const UA_UsernamePasswordLogin *usernamePasswordLogin) {
-    UA_AccessControl *ac = &config->accessControl;
-    ac->deleteMembers = deleteMembers_default;
-    ac->activateSession = activateSession_default;
-    ac->closeSession = closeSession_default;
-    ac->getUserRightsMask = getUserRightsMask_default;
-    ac->getUserAccessLevel = getUserAccessLevel_default;
-    ac->getUserExecutable = getUserExecutable_default;
-    ac->getUserExecutableOnObject = getUserExecutableOnObject_default;
-    ac->allowAddNode = allowAddNode_default;
-    ac->allowAddReference = allowAddReference_default;
-
-#ifdef UA_ENABLE_HISTORIZING
-    ac->allowHistoryUpdateUpdateData = allowHistoryUpdateUpdateData_default;
-    ac->allowHistoryUpdateDeleteRawModified = allowHistoryUpdateDeleteRawModified_default;
-#endif
-
-    ac->allowDeleteNode = allowDeleteNode_default;
-    ac->allowDeleteReference = allowDeleteReference_default;
-
-    AccessControlContext *context = (AccessControlContext*)
-            UA_malloc(sizeof(AccessControlContext));
-    if (!context)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    memset(context, 0, sizeof(AccessControlContext));
-    ac->context = context;
-
-    /* Allow anonymous? */
-    context->allowAnonymous = allowAnonymous;
-
-    /* Copy username/password to the access control plugin */
-    if(usernamePasswordLoginSize > 0) {
-        context->usernamePasswordLogin = (UA_UsernamePasswordLogin*)
-            UA_malloc(usernamePasswordLoginSize * sizeof(UA_UsernamePasswordLogin));
-        if(!context->usernamePasswordLogin)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        context->usernamePasswordLoginSize = usernamePasswordLoginSize;
-        for(size_t i = 0; i < usernamePasswordLoginSize; i++) {
-            UA_String_copy(&usernamePasswordLogin[i].username, &context->usernamePasswordLogin[i].username);
-            UA_String_copy(&usernamePasswordLogin[i].password, &context->usernamePasswordLogin[i].password);
-        }
-    }
-
-    /* Set the allowed policies */
-    size_t policies = 0;
-    if(allowAnonymous)
-        policies++;
-    if(usernamePasswordLoginSize > 0)
-        policies++;
-    ac->userTokenPoliciesSize = 0;
-    ac->userTokenPolicies = (UA_UserTokenPolicy *)
-        UA_Array_new(policies, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]);
-    if(!ac->userTokenPolicies)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    ac->userTokenPoliciesSize = policies;
-
-    policies = 0;
-    if(allowAnonymous) {
-        ac->userTokenPolicies[policies].tokenType = UA_USERTOKENTYPE_ANONYMOUS;
-        ac->userTokenPolicies[policies].policyId = UA_STRING_ALLOC(ANONYMOUS_POLICY);
-        if (!ac->userTokenPolicies[policies].policyId.data)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        policies++;
-    }
-
-    if(usernamePasswordLoginSize > 0) {
-        ac->userTokenPolicies[policies].tokenType = UA_USERTOKENTYPE_USERNAME;
-        ac->userTokenPolicies[policies].policyId = UA_STRING_ALLOC(USERNAME_POLICY);
-        if(!ac->userTokenPolicies[policies].policyId.data)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-
-#if UA_LOGLEVEL <= 400
-        const UA_String noneUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
-        if(UA_ByteString_equal(userTokenPolicyUri, &noneUri)) {
-            UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_SERVER,
-                           "Username/Password configured, but no encrypting SecurityPolicy. "
-                           "This can leak credentials on the network.");
-        }
-#endif
-        return UA_ByteString_copy(userTokenPolicyUri,
-                                  &ac->userTokenPolicies[policies].securityPolicyUri);
-    }
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/plugins/ua_config_default.c b/ext/open62541/plugins/ua_config_default.c
deleted file mode 100644
index 8ee8b7c..0000000
--- a/ext/open62541/plugins/ua_config_default.c
+++ /dev/null
@@ -1,751 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#include <open62541/client_config_default.h>
-#include <open62541/network_tcp.h>
-#ifdef UA_ENABLE_WEBSOCKET_SERVER
-#include <open62541/network_ws.h>
-#endif
-#include <open62541/plugin/accesscontrol_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pki_default.h>
-#include <open62541/plugin/securitypolicy_default.h>
-#include <open62541/server_config_default.h>
-
-/* Struct initialization works across ANSI C/C99/C++ if it is done when the
- * variable is first declared. Assigning values to existing structs is
- * heterogeneous across the three. */
-static UA_INLINE UA_UInt32Range
-UA_UINT32RANGE(UA_UInt32 min, UA_UInt32 max) {
-    UA_UInt32Range range = {min, max};
-    return range;
-}
-
-static UA_INLINE UA_DurationRange
-UA_DURATIONRANGE(UA_Duration min, UA_Duration max) {
-    UA_DurationRange range = {min, max};
-    return range;
-}
-
-/*******************************/
-/* Default Connection Settings */
-/*******************************/
-
-const UA_ConnectionConfig UA_ConnectionConfig_default = {
-    0, /* .protocolVersion */
-    65535, /* .sendBufferSize, 64k per chunk */
-    65535, /* .recvBufferSize, 64k per chunk */
-    0, /* .maxMessageSize, 0 -> unlimited */
-    0 /* .maxChunkCount, 0 -> unlimited */
-};
-
-/***************************/
-/* Default Server Settings */
-/***************************/
-
-#define MANUFACTURER_NAME "open62541"
-#define PRODUCT_NAME "open62541 OPC UA Server"
-#define PRODUCT_URI "http://open62541.org"
-#define APPLICATION_NAME "open62541-based OPC UA Application"
-#define APPLICATION_URI "urn:unconfigured:application"
-#define APPLICATION_URI_SERVER "urn:open62541.server.application"
-
-#define STRINGIFY(arg) #arg
-#define VERSION(MAJOR, MINOR, PATCH, LABEL) \
-    STRINGIFY(MAJOR) "." STRINGIFY(MINOR) "." STRINGIFY(PATCH) LABEL
-
-static UA_StatusCode
-createEndpoint(UA_ServerConfig *conf, UA_EndpointDescription *endpoint,
-               const UA_SecurityPolicy *securityPolicy,
-               UA_MessageSecurityMode securityMode) {
-    UA_EndpointDescription_init(endpoint);
-
-    endpoint->securityMode = securityMode;
-    UA_String_copy(&securityPolicy->policyUri, &endpoint->securityPolicyUri);
-    endpoint->transportProfileUri =
-        UA_STRING_ALLOC("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary");
-
-    /* Add security level value for the corresponding message security mode */
-    endpoint->securityLevel = (UA_Byte) securityMode;
-
-    /* Enable all login mechanisms from the access control plugin  */
-    UA_StatusCode retval = UA_Array_copy(conf->accessControl.userTokenPolicies,
-                                         conf->accessControl.userTokenPoliciesSize,
-                                         (void **)&endpoint->userIdentityTokens,
-                                         &UA_TYPES[UA_TYPES_USERTOKENPOLICY]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    endpoint->userIdentityTokensSize = conf->accessControl.userTokenPoliciesSize;
-
-    UA_String_copy(&securityPolicy->localCertificate, &endpoint->serverCertificate);
-    UA_ApplicationDescription_copy(&conf->applicationDescription, &endpoint->server);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static const size_t usernamePasswordsSize = 2;
-static UA_UsernamePasswordLogin usernamePasswords[2] = {
-    {UA_STRING_STATIC("user1"), UA_STRING_STATIC("password")},
-    {UA_STRING_STATIC("user2"), UA_STRING_STATIC("password1")}};
-
-static UA_StatusCode
-setDefaultConfig(UA_ServerConfig *conf) {
-    if (!conf)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    /* Zero out.. All members have a valid initial value */
-    UA_ServerConfig_clean(conf);
-    memset(conf, 0, sizeof(UA_ServerConfig));
-
-    /* --> Start setting the default static config <-- */
-    conf->nThreads = 1;
-    conf->logger = UA_Log_Stdout_;
-
-    conf->shutdownDelay = 0.0;
-
-    /* Server Description */
-    conf->buildInfo.productUri = UA_STRING_ALLOC(PRODUCT_URI);
-    conf->buildInfo.manufacturerName = UA_STRING_ALLOC(MANUFACTURER_NAME);
-    conf->buildInfo.productName = UA_STRING_ALLOC(PRODUCT_NAME);
-    conf->buildInfo.softwareVersion =
-        UA_STRING_ALLOC(VERSION(UA_OPEN62541_VER_MAJOR, UA_OPEN62541_VER_MINOR,
-                                UA_OPEN62541_VER_PATCH, UA_OPEN62541_VER_LABEL));
-    #ifdef UA_PACK_DEBIAN
-    conf->buildInfo.buildNumber = UA_STRING_ALLOC("deb");
-    #else
-    conf->buildInfo.buildNumber = UA_STRING_ALLOC(__DATE__ " " __TIME__);
-    #endif
-    conf->buildInfo.buildDate = UA_DateTime_now();
-
-    conf->applicationDescription.applicationUri = UA_STRING_ALLOC(APPLICATION_URI_SERVER);
-    conf->applicationDescription.productUri = UA_STRING_ALLOC(PRODUCT_URI);
-    conf->applicationDescription.applicationName =
-        UA_LOCALIZEDTEXT_ALLOC("en", APPLICATION_NAME);
-    conf->applicationDescription.applicationType = UA_APPLICATIONTYPE_SERVER;
-    /* conf->applicationDescription.gatewayServerUri = UA_STRING_NULL; */
-    /* conf->applicationDescription.discoveryProfileUri = UA_STRING_NULL; */
-    /* conf->applicationDescription.discoveryUrlsSize = 0; */
-    /* conf->applicationDescription.discoveryUrls = NULL; */
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    UA_MdnsDiscoveryConfiguration_init(&conf->discovery.mdns);
-    conf->discovery.mdnsInterfaceIP = UA_STRING_NULL;
-#endif
-
-    /* Custom DataTypes */
-    /* conf->customDataTypesSize = 0; */
-    /* conf->customDataTypes = NULL; */
-
-    /* Networking */
-    /* conf->networkLayersSize = 0; */
-    /* conf->networkLayers = NULL; */
-    /* conf->customHostname = UA_STRING_NULL; */
-
-    /* Endpoints */
-    /* conf->endpoints = {0, NULL}; */
-
-    /* Certificate Verification that accepts every certificate. Can be
-     * overwritten when the policy is specialized. */
-    UA_CertificateVerification_AcceptAll(&conf->certificateVerification);
-
-    /* Global Node Lifecycle */
-    conf->nodeLifecycle.constructor = NULL;
-    conf->nodeLifecycle.destructor = NULL;
-    conf->nodeLifecycle.createOptionalChild = NULL;
-    conf->nodeLifecycle.generateChildNodeId = NULL;
-
-    /* Relax constraints for the InformationModel */
-    conf->relaxEmptyValueConstraint = true; /* Allow empty values */
-
-    /* Limits for SecureChannels */
-    conf->maxSecureChannels = 40;
-    conf->maxSecurityTokenLifetime = 10 * 60 * 1000; /* 10 minutes */
-
-    /* Limits for Sessions */
-    conf->maxSessions = 100;
-    conf->maxSessionTimeout = 60.0 * 60.0 * 1000.0; /* 1h */
-
-    /* Limits for Subscriptions */
-    conf->publishingIntervalLimits = UA_DURATIONRANGE(100.0, 3600.0 * 1000.0);
-    conf->lifeTimeCountLimits = UA_UINT32RANGE(3, 15000);
-    conf->keepAliveCountLimits = UA_UINT32RANGE(1, 100);
-    conf->maxNotificationsPerPublish = 1000;
-    conf->enableRetransmissionQueue = true;
-    conf->maxRetransmissionQueueSize = 0; /* unlimited */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    conf->maxEventsPerNode = 0; /* unlimited */
-#endif
-
-    /* Limits for MonitoredItems */
-    conf->samplingIntervalLimits = UA_DURATIONRANGE(50.0, 24.0 * 3600.0 * 1000.0);
-    conf->queueSizeLimits = UA_UINT32RANGE(1, 100);
-
-#ifdef UA_ENABLE_DISCOVERY
-    conf->discovery.cleanupTimeout = 60 * 60;
-#endif
-
-#ifdef UA_ENABLE_HISTORIZING
-    /* conf->accessHistoryDataCapability = UA_FALSE; */
-    /* conf->maxReturnDataValues = 0; */
-
-    /* conf->accessHistoryEventsCapability = UA_FALSE; */
-    /* conf->maxReturnEventValues = 0; */
-
-    /* conf->insertDataCapability = UA_FALSE; */
-    /* conf->insertEventCapability = UA_FALSE; */
-    /* conf->insertAnnotationsCapability = UA_FALSE; */
-
-    /* conf->replaceDataCapability = UA_FALSE; */
-    /* conf->replaceEventCapability = UA_FALSE; */
-
-    /* conf->updateDataCapability = UA_FALSE; */
-    /* conf->updateEventCapability = UA_FALSE; */
-
-    /* conf->deleteRawCapability = UA_FALSE; */
-    /* conf->deleteEventCapability = UA_FALSE; */
-    /* conf->deleteAtTimeDataCapability = UA_FALSE; */
-#endif
-
-    /* --> Finish setting the default static config <-- */
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_setBasics(UA_ServerConfig* conf) {
-    return setDefaultConfig(conf);
-}
-
-static UA_StatusCode
-addDefaultNetworkLayers(UA_ServerConfig *conf, UA_UInt16 portNumber,
-                        UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize) {
-    return UA_ServerConfig_addNetworkLayerTCP(conf, portNumber, sendBufferSize, recvBufferSize);
-}
-
-
-
-#ifdef UA_ENABLE_WEBSOCKET_SERVER
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addNetworkLayerWS(UA_ServerConfig *conf, UA_UInt16 portNumber,
-                                   UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize) {
-    /* Add a network layer */
-    UA_ServerNetworkLayer *tmp = (UA_ServerNetworkLayer *)
-        UA_realloc(conf->networkLayers, sizeof(UA_ServerNetworkLayer) * (1 + conf->networkLayersSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    conf->networkLayers = tmp;
-
-    UA_ConnectionConfig config = UA_ConnectionConfig_default;
-    if (sendBufferSize > 0)
-        config.sendBufferSize = sendBufferSize;
-    if (recvBufferSize > 0)
-        config.recvBufferSize = recvBufferSize;
-
-    conf->networkLayers[conf->networkLayersSize] =
-        UA_ServerNetworkLayerWS(config, portNumber, &conf->logger);
-    if (!conf->networkLayers[conf->networkLayersSize].handle)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    conf->networkLayersSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addNetworkLayerTCP(UA_ServerConfig *conf, UA_UInt16 portNumber,
-                                   UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize) {
-    /* Add a network layer */
-    UA_ServerNetworkLayer *tmp = (UA_ServerNetworkLayer *)
-        UA_realloc(conf->networkLayers, sizeof(UA_ServerNetworkLayer) * (1 + conf->networkLayersSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    conf->networkLayers = tmp;
-
-    UA_ConnectionConfig config = UA_ConnectionConfig_default;
-    if (sendBufferSize > 0)
-        config.sendBufferSize = sendBufferSize;
-    if (recvBufferSize > 0)
-        config.recvBufferSize = recvBufferSize;
-
-    conf->networkLayers[conf->networkLayersSize] =
-        UA_ServerNetworkLayerTCP(config, portNumber, &conf->logger);
-    if (!conf->networkLayers[conf->networkLayersSize].handle)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    conf->networkLayersSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyNone(UA_ServerConfig *config, 
-                                      const UA_ByteString *certificate) {
-    UA_StatusCode retval;
-
-    /* Allocate the SecurityPolicies */
-    UA_SecurityPolicy *tmp = (UA_SecurityPolicy *)
-        UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    config->securityPolicies = tmp;
-    
-    /* Populate the SecurityPolicies */
-    UA_ByteString localCertificate = UA_BYTESTRING_NULL;
-    if(certificate)
-        localCertificate = *certificate;
-    retval = UA_SecurityPolicy_None(&config->securityPolicies[config->securityPoliciesSize], NULL,
-                                    localCertificate, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addEndpoint(UA_ServerConfig *config, const UA_String securityPolicyUri, 
-                            UA_MessageSecurityMode securityMode)
-{
-    UA_StatusCode retval;
-
-    /* Allocate the endpoint */
-    UA_EndpointDescription * tmp = (UA_EndpointDescription *)
-        UA_realloc(config->endpoints, sizeof(UA_EndpointDescription) * (1 + config->endpointsSize));
-    if(!tmp) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    config->endpoints = tmp;
-
-    /* Lookup the security policy */
-    const UA_SecurityPolicy *policy = NULL;
-    for (size_t i = 0; i < config->securityPoliciesSize; ++i) {
-        if (UA_String_equal(&securityPolicyUri, &config->securityPolicies[i].policyUri)) {
-            policy = &config->securityPolicies[i];
-            break;
-        }
-    }
-    if (!policy)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    /* Populate the endpoint */
-    retval = createEndpoint(config, &config->endpoints[config->endpointsSize],
-                            policy, securityMode);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->endpointsSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addAllEndpoints(UA_ServerConfig *config) {
-    UA_StatusCode retval;
-
-    /* Allocate the endpoints */
-    UA_EndpointDescription * tmp = (UA_EndpointDescription *)
-        UA_realloc(config->endpoints, sizeof(UA_EndpointDescription) * (2 * config->securityPoliciesSize + config->endpointsSize));
-    if(!tmp) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    config->endpoints = tmp;
-
-    /* Populate the endpoints */
-    for (size_t i = 0; i < config->securityPoliciesSize; ++i) {
-        if (UA_String_equal(&UA_SECURITY_POLICY_NONE_URI, &config->securityPolicies[i].policyUri)) {
-            retval = createEndpoint(config, &config->endpoints[config->endpointsSize],
-                                    &config->securityPolicies[i], UA_MESSAGESECURITYMODE_NONE);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-            config->endpointsSize++;
-        } else {
-            retval = createEndpoint(config, &config->endpoints[config->endpointsSize],
-                                    &config->securityPolicies[i], UA_MESSAGESECURITYMODE_SIGN);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-            config->endpointsSize++;
-
-            retval = createEndpoint(config, &config->endpoints[config->endpointsSize],
-                                    &config->securityPolicies[i], UA_MESSAGESECURITYMODE_SIGNANDENCRYPT);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-            config->endpointsSize++;
-        }
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_setMinimalCustomBuffer(UA_ServerConfig *config, UA_UInt16 portNumber,
-                                       const UA_ByteString *certificate,
-                                       UA_UInt32 sendBufferSize,
-                                       UA_UInt32 recvBufferSize) {
-    if (!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_StatusCode retval = setDefaultConfig(config);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(config);
-        return retval;
-    }
-
-    retval = addDefaultNetworkLayers(config, portNumber, sendBufferSize, recvBufferSize);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(config);
-        return retval;
-    }
-
-    /* Allocate the SecurityPolicies */
-    retval = UA_ServerConfig_addSecurityPolicyNone(config, certificate);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(config);
-        return retval;
-    }
-
-    /* Initialize the Access Control plugin */
-    retval = UA_AccessControl_default(config, true,
-                &config->securityPolicies[config->securityPoliciesSize-1].policyUri,
-                usernamePasswordsSize, usernamePasswords);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(config);
-        return retval;
-    }
-
-    /* Allocate the endpoint */
-    retval = UA_ServerConfig_addEndpoint(config, UA_SECURITY_POLICY_NONE_URI, UA_MESSAGESECURITYMODE_NONE);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(config);
-        return retval;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyBasic128Rsa15(UA_ServerConfig *config, 
-                                               const UA_ByteString *certificate,
-                                               const UA_ByteString *privateKey) {
-    UA_StatusCode retval;
-
-    /* Allocate the SecurityPolicies */
-    UA_SecurityPolicy *tmp = (UA_SecurityPolicy *)
-        UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    config->securityPolicies = tmp;
-    
-    /* Populate the SecurityPolicies */
-    UA_ByteString localCertificate = UA_BYTESTRING_NULL;
-    UA_ByteString localPrivateKey  = UA_BYTESTRING_NULL;
-    if(certificate)
-        localCertificate = *certificate;
-    if(privateKey)
-       localPrivateKey = *privateKey;
-    retval = UA_SecurityPolicy_Basic128Rsa15(&config->securityPolicies[config->securityPoliciesSize],
-                                             &config->certificateVerification,
-                                             localCertificate, localPrivateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyBasic256(UA_ServerConfig *config, 
-                                          const UA_ByteString *certificate,
-                                          const UA_ByteString *privateKey) {
-    UA_StatusCode retval;
-
-    /* Allocate the SecurityPolicies */
-    UA_SecurityPolicy *tmp = (UA_SecurityPolicy *)
-        UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    config->securityPolicies = tmp;
-    
-    /* Populate the SecurityPolicies */
-    UA_ByteString localCertificate = UA_BYTESTRING_NULL;
-    UA_ByteString localPrivateKey  = UA_BYTESTRING_NULL;
-    if(certificate)
-        localCertificate = *certificate;
-    if(privateKey)
-       localPrivateKey = *privateKey;
-    retval = UA_SecurityPolicy_Basic256(&config->securityPolicies[config->securityPoliciesSize],
-                                        &config->certificateVerification,
-                                        localCertificate, localPrivateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addSecurityPolicyBasic256Sha256(UA_ServerConfig *config, 
-                                                const UA_ByteString *certificate,
-                                                const UA_ByteString *privateKey) {
-    UA_StatusCode retval;
-
-    /* Allocate the SecurityPolicies */
-    UA_SecurityPolicy *tmp = (UA_SecurityPolicy *)
-        UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    config->securityPolicies = tmp;
-    
-    /* Populate the SecurityPolicies */
-    UA_ByteString localCertificate = UA_BYTESTRING_NULL;
-    UA_ByteString localPrivateKey  = UA_BYTESTRING_NULL;
-    if(certificate)
-        localCertificate = *certificate;
-    if(privateKey)
-       localPrivateKey = *privateKey;
-    retval = UA_SecurityPolicy_Basic256Sha256(&config->securityPolicies[config->securityPoliciesSize],
-                                              &config->certificateVerification,
-                                              localCertificate, localPrivateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_addAllSecurityPolicies(UA_ServerConfig *config,
-                                       const UA_ByteString *certificate,
-                                       const UA_ByteString *privateKey) {
-    UA_StatusCode retval;
-
-    /* Allocate the SecurityPolicies */
-    UA_SecurityPolicy *tmp = (UA_SecurityPolicy *)
-        UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (4 + config->securityPoliciesSize));
-    if(!tmp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    config->securityPolicies = tmp;
-    
-    /* Populate the SecurityPolicies */
-    UA_ByteString localCertificate = UA_BYTESTRING_NULL;
-    UA_ByteString localPrivateKey  = UA_BYTESTRING_NULL;
-    if(certificate)
-        localCertificate = *certificate;
-    if(privateKey)
-       localPrivateKey = *privateKey;
-
-    retval = UA_SecurityPolicy_None(&config->securityPolicies[config->securityPoliciesSize], NULL,
-                                    localCertificate, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    retval = UA_SecurityPolicy_Basic128Rsa15(&config->securityPolicies[config->securityPoliciesSize],
-                                             &config->certificateVerification,
-                                             localCertificate, localPrivateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    retval = UA_SecurityPolicy_Basic256(&config->securityPolicies[config->securityPoliciesSize],
-                                        &config->certificateVerification,
-                                        localCertificate, localPrivateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    retval = UA_SecurityPolicy_Basic256Sha256(&config->securityPolicies[config->securityPoliciesSize],
-                                              &config->certificateVerification,
-                                              localCertificate, localPrivateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    config->securityPoliciesSize++;
-
-    return retval;
-}
-
-UA_EXPORT UA_StatusCode
-UA_ServerConfig_setDefaultWithSecurityPolicies(UA_ServerConfig *conf,
-                                               UA_UInt16 portNumber,
-                                               const UA_ByteString *certificate,
-                                               const UA_ByteString *privateKey,
-                                               const UA_ByteString *trustList,
-                                               size_t trustListSize,
-                                               const UA_ByteString *issuerList,
-                                               size_t issuerListSize,
-                                               const UA_ByteString *revocationList,
-                                               size_t revocationListSize) {
-    UA_StatusCode retval = setDefaultConfig(conf);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(conf);
-        return retval;
-    }
-
-    retval = UA_CertificateVerification_Trustlist(&conf->certificateVerification,
-                                                  trustList, trustListSize,
-                                                  issuerList, issuerListSize,
-                                                  revocationList, revocationListSize);
-    if (retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    if(trustListSize == 0)
-        UA_LOG_WARNING(&conf->logger, UA_LOGCATEGORY_USERLAND,
-                       "No CA trust-list provided. "
-                       "Any remote certificate will be accepted.");
-
-    retval = addDefaultNetworkLayers(conf, portNumber, 0, 0);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(conf);
-        return retval;
-    }
-
-    retval = UA_ServerConfig_addAllSecurityPolicies(conf, certificate, privateKey);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(conf);
-        return retval;
-    }
-
-    retval = UA_AccessControl_default(conf, true,
-                &conf->securityPolicies[conf->securityPoliciesSize-1].policyUri,
-                usernamePasswordsSize, usernamePasswords);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(conf);
-        return retval;
-    }
-
-    retval = UA_ServerConfig_addAllEndpoints(conf);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ServerConfig_clean(conf);
-        return retval;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-/***************************/
-/* Default Client Settings */
-/***************************/
-
-static UA_INLINE void
-UA_ClientConnectionTCP_poll_callback(UA_Client *client, void *data) {
-    UA_ClientConnectionTCP_poll(client, data);
-}
-
-UA_StatusCode
-UA_ClientConfig_setDefault(UA_ClientConfig *config) {
-    config->timeout = 5000;
-    config->secureChannelLifeTime = 10 * 60 * 1000; /* 10 minutes */
-
-    config->logger.log = UA_Log_Stdout_log;
-    config->logger.context = NULL;
-    config->logger.clear = UA_Log_Stdout_clear;
-
-    config->localConnectionConfig = UA_ConnectionConfig_default;
-
-    /* Certificate Verification that accepts every certificate. Can be
-     * overwritten when the policy is specialized. */
-    UA_CertificateVerification_AcceptAll(&config->certificateVerification);
-
-    /* With encryption enabled, the applicationUri needs to match the URI from
-     * the certificate */
-    config->clientDescription.applicationUri = UA_STRING_ALLOC(APPLICATION_URI);
-    config->clientDescription.applicationType = UA_APPLICATIONTYPE_CLIENT;
-
-    if(config->securityPoliciesSize > 0) {
-        UA_LOG_ERROR(&config->logger, UA_LOGCATEGORY_NETWORK,
-                     "Could not initialize a config that already has SecurityPolicies");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    config->securityPolicies = (UA_SecurityPolicy*)UA_malloc(sizeof(UA_SecurityPolicy));
-    if(!config->securityPolicies)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    UA_StatusCode retval = UA_SecurityPolicy_None(config->securityPolicies, NULL,
-                                                  UA_BYTESTRING_NULL, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(config->securityPolicies);
-        config->securityPolicies = NULL;
-        return retval;
-    }
-    config->securityPoliciesSize = 1;
-
-    config->connectionFunc = UA_ClientConnectionTCP;
-    config->initConnectionFunc = UA_ClientConnectionTCP_init; /* for async client */
-    config->pollConnectionFunc = UA_ClientConnectionTCP_poll_callback; /* for async connection */
-
-    config->customDataTypes = NULL;
-    config->stateCallback = NULL;
-    config->connectivityCheckInterval = 0;
-
-    config->requestedSessionTimeout = 1200000; /* requestedSessionTimeout */
-
-    config->inactivityCallback = NULL;
-    config->clientContext = NULL;
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    config->outStandingPublishRequests = 10;
-    config->subscriptionInactivityCallback = NULL;
-#endif
-
-    return UA_STATUSCODE_GOOD;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-UA_StatusCode
-UA_ClientConfig_setDefaultEncryption(UA_ClientConfig *config,
-                                     UA_ByteString localCertificate, UA_ByteString privateKey,
-                                     const UA_ByteString *trustList, size_t trustListSize,
-                                     const UA_ByteString *revocationList, size_t revocationListSize) {
-    UA_StatusCode retval = UA_ClientConfig_setDefault(config);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_CertificateVerification_Trustlist(&config->certificateVerification,
-                                                  trustList, trustListSize,
-                                                  NULL, 0,
-                                                  revocationList, revocationListSize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Populate SecurityPolicies */
-    UA_SecurityPolicy *sp = (UA_SecurityPolicy*)
-        UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * 4);
-    if(!sp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    config->securityPolicies = sp;
-
-    retval = UA_SecurityPolicy_Basic128Rsa15(&config->securityPolicies[1],
-                                             &config->certificateVerification,
-                                             localCertificate, privateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    ++config->securityPoliciesSize;
-
-    retval = UA_SecurityPolicy_Basic256(&config->securityPolicies[2],
-                                        &config->certificateVerification,
-                                        localCertificate, privateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    ++config->securityPoliciesSize;
-
-    retval = UA_SecurityPolicy_Basic256Sha256(&config->securityPolicies[3],
-                                              &config->certificateVerification,
-                                              localCertificate, privateKey, &config->logger);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    ++config->securityPoliciesSize;
-
-    return UA_STATUSCODE_GOOD;
-}
-#endif
diff --git a/ext/open62541/plugins/ua_debug_dump_pkgs.c b/ext/open62541/plugins/ua_debug_dump_pkgs.c
deleted file mode 100644
index ee42dea..0000000
--- a/ext/open62541/plugins/ua_debug_dump_pkgs.c
+++ /dev/null
@@ -1,43 +0,0 @@
-
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include "ua_util_internal.h"
-
-#include <ctype.h>
-#include <stdio.h>
-
-#ifdef UA_DEBUG_DUMP_PKGS
-void UA_dump_hex_pkg(UA_Byte* buffer, size_t bufferLen) {
-    printf("--------------- HEX Package Start ---------------\n");
-    char ascii[17];
-    memset(ascii,0,17);
-    for (size_t i = 0; i < bufferLen; i++)
-    {
-        if (i == 0)
-            printf("%08zx ", i);
-        else if (i%16 == 0)
-            printf(" |%s|\n%08zx ", ascii, i);
-        if (isprint((int)(buffer[i])))
-            ascii[i%16] = (char)buffer[i];
-        else
-            ascii[i%16] = '.';
-        if (i%8==0)
-            printf(" ");
-        printf("%02X ", (unsigned char)buffer[i]);
-
-    }
-    size_t fillPos = bufferLen %16;
-    ascii[fillPos] = 0;
-    for (size_t i=fillPos; i<16; i++) {
-        if (i%8==0)
-            printf(" ");
-        printf("   ");
-    }
-    printf(" |%s|\n%08zx\n", ascii, bufferLen);
-    printf("--------------- HEX Package END ---------------\n");
-}
-#endif
diff --git a/ext/open62541/plugins/ua_log_stdout.c b/ext/open62541/plugins/ua_log_stdout.c
deleted file mode 100644
index ab064ea..0000000
--- a/ext/open62541/plugins/ua_log_stdout.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2016-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/types.h>
-
-#include <stdio.h>
-
-#if UA_MULTITHREADING >= 200
-#include <pthread.h>
-static pthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER;
-#endif
-
-/* ANSI escape sequences for color output taken from here:
- * https://stackoverflow.com/questions/3219393/stdlib-and-colored-output-in-c*/
-
-#ifdef UA_ENABLE_LOG_COLORS
-# define ANSI_COLOR_RED     "\x1b[31m"
-# define ANSI_COLOR_GREEN   "\x1b[32m"
-# define ANSI_COLOR_YELLOW  "\x1b[33m"
-# define ANSI_COLOR_BLUE    "\x1b[34m"
-# define ANSI_COLOR_MAGENTA "\x1b[35m"
-# define ANSI_COLOR_CYAN    "\x1b[36m"
-# define ANSI_COLOR_RESET   "\x1b[0m"
-#else
-# define ANSI_COLOR_RED     ""
-# define ANSI_COLOR_GREEN   ""
-# define ANSI_COLOR_YELLOW  ""
-# define ANSI_COLOR_BLUE    ""
-# define ANSI_COLOR_MAGENTA ""
-# define ANSI_COLOR_CYAN    ""
-# define ANSI_COLOR_RESET   ""
-#endif
-
-const char *logLevelNames[6] = {"trace", "debug",
-                                ANSI_COLOR_GREEN "info",
-                                ANSI_COLOR_YELLOW "warn",
-                                ANSI_COLOR_RED "error",
-                                ANSI_COLOR_MAGENTA "fatal"};
-const char *logCategoryNames[7] = {"network", "channel", "session", "server",
-                                   "client", "userland", "securitypolicy"};
-
-#ifdef __clang__
-__attribute__((__format__(__printf__, 4 , 0)))
-#endif
-void
-UA_Log_Stdout_log(void *_, UA_LogLevel level, UA_LogCategory category,
-                  const char *msg, va_list args) {
-    UA_Int64 tOffset = UA_DateTime_localTimeUtcOffset();
-    UA_DateTimeStruct dts = UA_DateTime_toStruct(UA_DateTime_now() + tOffset);
-
-#if UA_MULTITHREADING >= 200
-    pthread_mutex_lock(&printf_mutex);
-#endif
-
-    printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u (UTC%+05d)] %s/%s" ANSI_COLOR_RESET "\t",
-           dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.milliSec,
-           (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]);
-    vprintf(msg, args);
-    printf("\n");
-    fflush(stdout);
-
-#if UA_MULTITHREADING >= 200
-    pthread_mutex_unlock(&printf_mutex);
-#endif
-}
-
-void
-UA_Log_Stdout_clear(void *logContext) {
-
-}
-
-const UA_Logger UA_Log_Stdout_ = {UA_Log_Stdout_log, NULL, UA_Log_Stdout_clear};
-const UA_Logger *UA_Log_Stdout = &UA_Log_Stdout_;
diff --git a/ext/open62541/plugins/ua_nodestore_default.c b/ext/open62541/plugins/ua_nodestore_default.c
deleted file mode 100644
index 4c25677..0000000
--- a/ext/open62541/plugins/ua_nodestore_default.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include <open62541/plugin/nodestore.h>
-#include "ziptree.h"
-
-#ifndef UA_ENABLE_CUSTOM_NODESTORE
-
-#if UA_MULTITHREADING >= 100
-#define BEGIN_CRITSECT(NODEMAP) UA_LOCK(NODEMAP->lock)
-#define END_CRITSECT(NODEMAP) UA_UNLOCK(NODEMAP->lock)
-#else
-#define BEGIN_CRITSECT(NODEMAP) do {} while(0)
-#define END_CRITSECT(NODEMAP) do {} while(0)
-#endif
-
-/* container_of */
-#define container_of(ptr, type, member) \
-    (type *)((uintptr_t)ptr - offsetof(type,member))
-
-struct NodeEntry;
-typedef struct NodeEntry NodeEntry;
-
-struct NodeEntry {
-    ZIP_ENTRY(NodeEntry) zipfields;
-    UA_UInt32 nodeIdHash;
-    UA_UInt16 refCount; /* How many consumers have a reference to the node? */
-    UA_Boolean deleted; /* Node was marked as deleted and can be deleted when refCount == 0 */
-    NodeEntry *orig;    /* If a copy is made to replace a node, track that we
-                         * replace only the node from which the copy was made.
-                         * Important for concurrent operations. */
-    UA_NodeId nodeId; /* This is actually a UA_Node that also starts with a NodeId */
-};
-
-/* Absolute ordering for NodeIds */
-static enum ZIP_CMP
-cmpNodeId(const void *a, const void *b) {
-    const NodeEntry *aa = (const NodeEntry*)a;
-    const NodeEntry *bb = (const NodeEntry*)b;
-
-    /* Compare hash */
-    if(aa->nodeIdHash < bb->nodeIdHash)
-        return ZIP_CMP_LESS;
-    if(aa->nodeIdHash > bb->nodeIdHash)
-        return ZIP_CMP_MORE;
-
-    /* Compore nodes in detail */
-    return (enum ZIP_CMP)UA_NodeId_order(&aa->nodeId, &bb->nodeId);
-}
-
-ZIP_HEAD(NodeTree, NodeEntry);
-typedef struct NodeTree NodeTree;
-
-typedef struct {
-    NodeTree root;
-#if UA_MULTITHREADING >= 100
-    UA_LOCK_TYPE(lock) /* Protect access */
-#endif
-} NodeMap;
-
-ZIP_PROTTYPE(NodeTree, NodeEntry, NodeEntry)
-ZIP_IMPL(NodeTree, NodeEntry, zipfields, NodeEntry, zipfields, cmpNodeId)
-
-static NodeEntry *
-newEntry(UA_NodeClass nodeClass) {
-    size_t size = sizeof(NodeEntry) - sizeof(UA_NodeId);
-    switch(nodeClass) {
-    case UA_NODECLASS_OBJECT:
-        size += sizeof(UA_ObjectNode);
-        break;
-    case UA_NODECLASS_VARIABLE:
-        size += sizeof(UA_VariableNode);
-        break;
-    case UA_NODECLASS_METHOD:
-        size += sizeof(UA_MethodNode);
-        break;
-    case UA_NODECLASS_OBJECTTYPE:
-        size += sizeof(UA_ObjectTypeNode);
-        break;
-    case UA_NODECLASS_VARIABLETYPE:
-        size += sizeof(UA_VariableTypeNode);
-        break;
-    case UA_NODECLASS_REFERENCETYPE:
-        size += sizeof(UA_ReferenceTypeNode);
-        break;
-    case UA_NODECLASS_DATATYPE:
-        size += sizeof(UA_DataTypeNode);
-        break;
-    case UA_NODECLASS_VIEW:
-        size += sizeof(UA_ViewNode);
-        break;
-    default:
-        return NULL;
-    }
-    NodeEntry *entry = (NodeEntry*)UA_calloc(1, size);
-    if(!entry)
-        return NULL;
-    UA_Node *node = (UA_Node*)&entry->nodeId;
-    node->nodeClass = nodeClass;
-    return entry;
-}
-
-static void
-deleteEntry(NodeEntry *entry) {
-    UA_Node_deleteMembers((UA_Node*)&entry->nodeId);
-    UA_free(entry);
-}
-
-static void
-cleanupEntry(NodeEntry *entry) {
-    if(entry->deleted && entry->refCount == 0)
-        deleteEntry(entry);
-}
-
-/***********************/
-/* Interface functions */
-/***********************/
-
-/* Not yet inserted into the NodeMap */
-UA_Node *
-UA_Nodestore_newNode(void *nsCtx, UA_NodeClass nodeClass) {
-    NodeEntry *entry = newEntry(nodeClass);
-    if(!entry)
-        return NULL;
-    return (UA_Node*)&entry->nodeId;
-}
-
-/* Not yet inserted into the NodeMap */
-void
-UA_Nodestore_deleteNode(void *nsCtx, UA_Node *node) {
-    deleteEntry(container_of(node, NodeEntry, nodeId));
-}
-
-const UA_Node *
-UA_Nodestore_getNode(void *nsCtx, const UA_NodeId *nodeId) {
-    NodeMap *ns = (NodeMap*)nsCtx;
-    BEGIN_CRITSECT(ns);
-    NodeEntry dummy;
-    dummy.nodeIdHash = UA_NodeId_hash(nodeId);
-    dummy.nodeId = *nodeId;
-    NodeEntry *entry = ZIP_FIND(NodeTree, &ns->root, &dummy);
-    if(!entry) {
-        END_CRITSECT(ns);
-        return NULL;
-    }
-    ++entry->refCount;
-    END_CRITSECT(ns);
-    return (const UA_Node*)&entry->nodeId;
-}
-
-void
-UA_Nodestore_releaseNode(void *nsCtx, const UA_Node *node) {
-    if(!node)
-        return;
-#if UA_MULTITHREADING >= 100
-        NodeMap *ns = (NodeMap*)nsCtx;
-#endif
-    BEGIN_CRITSECT(ns);
-    NodeEntry *entry = container_of(node, NodeEntry, nodeId);
-    UA_assert(entry->refCount > 0);
-    --entry->refCount;
-    cleanupEntry(entry);
-    END_CRITSECT(ns);
-}
-
-UA_StatusCode
-UA_Nodestore_getNodeCopy(void *nsCtx, const UA_NodeId *nodeId,
-                         UA_Node **outNode) {
-    /* Find the node */
-    const UA_Node *node = UA_Nodestore_getNode(nsCtx, nodeId);
-    if(!node)
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-
-    /* Create the new entry */
-    NodeEntry *ne = newEntry(node->nodeClass);
-    if(!ne) {
-        UA_Nodestore_releaseNode(nsCtx, node);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    /* Copy the node content */
-    UA_Node *nnode = (UA_Node*)&ne->nodeId;
-    UA_StatusCode retval = UA_Node_copy(node, nnode);
-    UA_Nodestore_releaseNode(nsCtx, node);
-    if(retval != UA_STATUSCODE_GOOD) {
-        deleteEntry(ne);
-        return retval;
-    }
-
-    ne->orig = container_of(node, NodeEntry, nodeId);
-    *outNode = nnode;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Nodestore_insertNode(void *nsCtx, UA_Node *node, UA_NodeId *addedNodeId) {
-    NodeEntry *entry = container_of(node, NodeEntry, nodeId);
-    NodeMap *ns = (NodeMap*)nsCtx;
-    BEGIN_CRITSECT(ns);
-
-    /* Ensure that the NodeId is unique */
-    NodeEntry dummy;
-    dummy.nodeId = node->nodeId;
-    if(node->nodeId.identifierType == UA_NODEIDTYPE_NUMERIC &&
-       node->nodeId.identifier.numeric == 0) {
-        do { /* Create a random nodeid until we find an unoccupied id */
-            node->nodeId.identifier.numeric = UA_UInt32_random();
-            dummy.nodeId.identifier.numeric = node->nodeId.identifier.numeric;
-            dummy.nodeIdHash = UA_NodeId_hash(&node->nodeId);
-        } while(ZIP_FIND(NodeTree, &ns->root, &dummy));
-    } else {
-        dummy.nodeIdHash = UA_NodeId_hash(&node->nodeId);
-        if(ZIP_FIND(NodeTree, &ns->root, &dummy)) { /* The nodeid exists */
-            deleteEntry(entry);
-            END_CRITSECT(ns);
-            return UA_STATUSCODE_BADNODEIDEXISTS;
-        }
-    }
-
-    /* Copy the NodeId */
-    if(addedNodeId) {
-        UA_StatusCode retval = UA_NodeId_copy(&node->nodeId, addedNodeId);
-        if(retval != UA_STATUSCODE_GOOD) {
-            deleteEntry(entry);
-            END_CRITSECT(ns);
-            return retval;
-        }
-    }
-
-    /* Insert the node */
-    entry->nodeIdHash = dummy.nodeIdHash;
-    ZIP_INSERT(NodeTree, &ns->root, entry, ZIP_FFS32(UA_UInt32_random()));
-    END_CRITSECT(ns);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Nodestore_replaceNode(void *nsCtx, UA_Node *node) {
-    /* Find the node */
-    const UA_Node *oldNode = UA_Nodestore_getNode(nsCtx, &node->nodeId);
-    if(!oldNode) {
-        deleteEntry(container_of(node, NodeEntry, nodeId));
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-
-    /* Test if the copy is current */
-    NodeEntry *entry = container_of(node, NodeEntry, nodeId);
-    NodeEntry *oldEntry = container_of(oldNode, NodeEntry, nodeId);
-    if(oldEntry != entry->orig) {
-        /* The node was already updated since the copy was made */
-        deleteEntry(entry);
-        UA_Nodestore_releaseNode(nsCtx, oldNode);
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Replace */
-    NodeMap *ns = (NodeMap*)nsCtx;
-    BEGIN_CRITSECT(ns);
-    ZIP_REMOVE(NodeTree, &ns->root, oldEntry);
-    entry->nodeIdHash = oldEntry->nodeIdHash;
-    ZIP_INSERT(NodeTree, &ns->root, entry, ZIP_RANK(entry, zipfields));
-    oldEntry->deleted = true;
-    END_CRITSECT(ns);
-
-    UA_Nodestore_releaseNode(nsCtx, oldNode);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Nodestore_removeNode(void *nsCtx, const UA_NodeId *nodeId) {
-    NodeMap *ns = (NodeMap*)nsCtx;
-    BEGIN_CRITSECT(ns);
-    NodeEntry dummy;
-    dummy.nodeIdHash = UA_NodeId_hash(nodeId);
-    dummy.nodeId = *nodeId;
-    NodeEntry *entry = ZIP_FIND(NodeTree, &ns->root, &dummy);
-    if(!entry) {
-        END_CRITSECT(ns);
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-    ZIP_REMOVE(NodeTree, &ns->root, entry);
-    entry->deleted = true;
-    cleanupEntry(entry);
-    END_CRITSECT(ns);
-    return UA_STATUSCODE_GOOD;
-}
-
-struct VisitorData {
-    UA_NodestoreVisitor visitor;
-    void *visitorContext;
-};
-
-static void
-nodeVisitor(NodeEntry *entry, void *data) {
-    struct VisitorData *d = (struct VisitorData*)data;
-    d->visitor(d->visitorContext, (UA_Node*)&entry->nodeId);
-}
-
-void
-UA_Nodestore_iterate(void *nsCtx, UA_NodestoreVisitor visitor,
-                     void *visitorCtx) {
-    struct VisitorData d;
-    d.visitor = visitor;
-    d.visitorContext = visitorCtx;
-    NodeMap *ns = (NodeMap*)nsCtx;
-    BEGIN_CRITSECT(ns);
-    ZIP_ITER(NodeTree, &ns->root, nodeVisitor, &d);
-    END_CRITSECT(ns);
-}
-
-static void
-deleteNodeVisitor(NodeEntry *entry, void *data) {
-    deleteEntry(entry);
-}
-
-/***********************/
-/* Nodestore Lifecycle */
-/***********************/
-
-const UA_Boolean inPlaceEditAllowed = true;
-
-UA_StatusCode
-UA_Nodestore_new(void **nsCtx) {
-    /* Allocate and initialize the nodemap */
-    NodeMap *nodemap = (NodeMap*)UA_malloc(sizeof(NodeMap));
-    if(!nodemap)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-#if UA_MULTITHREADING >= 100
-    UA_LOCK_INIT(nodemap->lock)
-#endif
-
-    ZIP_INIT(&nodemap->root);
-
-    /* Populate the nodestore */
-    *nsCtx = (void*)nodemap;
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_Nodestore_delete(void *nsCtx) {
-    if (!nsCtx)
-        return;
-
-    NodeMap *ns = (NodeMap*)nsCtx;
-#if UA_MULTITHREADING >= 100
-    UA_LOCK_DESTROY(ns->lock);
-#endif
-    ZIP_ITER(NodeTree, &ns->root, deleteNodeVisitor, NULL);
-    UA_free(ns);
-}
-
-#endif /* UA_ENABLE_CUSTOM_NODESTORE */
diff --git a/ext/open62541/plugins/ua_pki_default.c b/ext/open62541/plugins/ua_pki_default.c
deleted file mode 100644
index 79331bc..0000000
--- a/ext/open62541/plugins/ua_pki_default.c
+++ /dev/null
@@ -1,589 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- *
- *    Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- *    Copyright 2019 (c) Julius Pfrommer, Fraunhofer IOSB
- */
-
-#include <open62541/server_config.h>
-#include <open62541/plugin/pki_default.h>
-#include <open62541/plugin/log_stdout.h>
-
-#ifdef UA_ENABLE_ENCRYPTION
-#include <mbedtls/x509.h>
-#include <mbedtls/x509_crt.h>
-#include <mbedtls/error.h>
-#endif
-
-#define REMOTECERTIFICATETRUSTED 1
-#define ISSUERKNOWN              2
-#define DUALPARENT               3
-#define PARENTFOUND              4
-
-/************/
-/* AllowAll */
-/************/
-
-static UA_StatusCode
-verifyCertificateAllowAll(void *verificationContext,
-               const UA_ByteString *certificate) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-verifyApplicationURIAllowAll(void *verificationContext,
-                             const UA_ByteString *certificate,
-                             const UA_String *applicationURI) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-deleteVerifyAllowAll(UA_CertificateVerification *cv) {
-
-}
-
-void UA_CertificateVerification_AcceptAll(UA_CertificateVerification *cv) {
-    cv->verifyCertificate = verifyCertificateAllowAll;
-    cv->verifyApplicationURI = verifyApplicationURIAllowAll;
-    cv->deleteMembers = deleteVerifyAllowAll;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-typedef struct {
-    /* If the folders are defined, we use them to reload the certificates during
-     * runtime */
-    UA_String trustListFolder;
-    UA_String issuerListFolder;
-    UA_String revocationListFolder;
-
-    mbedtls_x509_crt certificateTrustList;
-    mbedtls_x509_crt certificateIssuerList;
-    mbedtls_x509_crl certificateRevocationList;
-} CertInfo;
-
-#ifdef __linux__ /* Linux only so far */
-
-#include <dirent.h>
-#include <limits.h>
-
-static UA_StatusCode
-fileNamesFromFolder(const UA_String *folder, size_t *pathsSize, UA_String **paths) {
-    char buf[PATH_MAX + 1];
-    if(folder->length > PATH_MAX)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    memcpy(buf, folder->data, folder->length);
-    buf[folder->length] = 0;
-    
-    DIR *dir = opendir(buf);
-    if(!dir)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    *paths = (UA_String*)UA_Array_new(256, &UA_TYPES[UA_TYPES_STRING]);
-    if(*paths == NULL) {
-        closedir(dir);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    struct dirent *ent;
-    char buf2[PATH_MAX + 1];
-    realpath(buf, buf2);
-    size_t pathlen = strlen(buf2);
-    *pathsSize = 0;
-    while((ent = readdir (dir)) != NULL && *pathsSize < 256) {
-        if(ent->d_type != DT_REG)
-            continue;
-        buf2[pathlen] = '/';
-        buf2[pathlen+1] = 0;
-        strcat(buf2, ent->d_name);
-        (*paths)[*pathsSize] = UA_STRING_ALLOC(buf2);
-        *pathsSize += 1;
-    }
-    closedir(dir);
-
-    if(*pathsSize == 0) {
-        UA_free(*paths);
-        *paths = NULL;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-reloadCertificates(CertInfo *ci) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    int err = 0;
-
-    /* Load the trustlists */
-    if(ci->trustListFolder.length > 0) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Reloading the trust-list");
-        mbedtls_x509_crt_free(&ci->certificateTrustList);
-        mbedtls_x509_crt_init(&ci->certificateTrustList);
-
-        char f[PATH_MAX];
-        memcpy(f, ci->trustListFolder.data, ci->trustListFolder.length);
-        f[ci->trustListFolder.length] = 0;
-        err = mbedtls_x509_crt_parse_path(&ci->certificateTrustList, f);
-        if(err == 0) {
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                        "Loaded certificate from %s", f);
-        } else {
-            char errBuff[300];
-            mbedtls_strerror(err, errBuff, 300);
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                        "Failed to load certificate from %s", f);
-        }
-    }
-
-    /* Load the revocationlists */
-    if(ci->revocationListFolder.length > 0) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Reloading the revocation-list");
-        size_t pathsSize = 0;
-        UA_String *paths = NULL;
-        retval = fileNamesFromFolder(&ci->revocationListFolder, &pathsSize, &paths);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-        mbedtls_x509_crl_free(&ci->certificateRevocationList);
-        mbedtls_x509_crl_init(&ci->certificateRevocationList);
-        for(size_t i = 0; i < pathsSize; i++) {
-            char f[PATH_MAX];
-            memcpy(f, paths[i].data, paths[i].length);
-            f[paths[i].length] = 0;
-            err = mbedtls_x509_crl_parse_file(&ci->certificateRevocationList, f);
-            if(err == 0) {
-                UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                            "Loaded certificate from %.*s",
-                            (int)paths[i].length, paths[i].data);
-            } else {
-                UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                            "Failed to load certificate from %.*s",
-                            (int)paths[i].length, paths[i].data);
-            }
-        }
-        UA_Array_delete(paths, pathsSize, &UA_TYPES[UA_TYPES_STRING]);
-        paths = NULL;
-        pathsSize = 0;
-    }
-
-    /* Load the issuerlists */
-    if(ci->issuerListFolder.length > 0) {
-        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Reloading the issuer-list");
-        mbedtls_x509_crt_free(&ci->certificateIssuerList);
-        mbedtls_x509_crt_init(&ci->certificateIssuerList);
-        char f[PATH_MAX];
-        memcpy(f, ci->issuerListFolder.data, ci->issuerListFolder.length);
-        f[ci->issuerListFolder.length] = 0;
-        err = mbedtls_x509_crt_parse_path(&ci->certificateIssuerList, f);
-        if(err == 0) {
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                        "Loaded certificate from %s", f);
-        } else {
-            UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                        "Failed to load certificate from %s", f);
-        }
-    }
-
-    return retval;
-}
-
-#endif
-
-static UA_StatusCode
-certificateVerification_verify(void *verificationContext,
-                               const UA_ByteString *certificate) {
-    CertInfo *ci = (CertInfo*)verificationContext;
-    if(!ci)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-#ifdef __linux__ /* Reload certificates if folder paths are specified */
-    reloadCertificates(ci);
-#endif
-
-    /* if(ci->certificateTrustList.raw.len == 0) { */
-    /*     UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, */
-    /*                    "No Trustlist loaded. Accepting the certificate."); */
-    /*     return UA_STATUSCODE_GOOD; */
-    /* } */
-
-    /* Parse the certificate */
-    mbedtls_x509_crt remoteCertificate;
-
-    /* Temporary Object to parse the trustList */
-    mbedtls_x509_crt *tempCert;
-
-    /* Temporary Object to parse the revocationList */
-    mbedtls_x509_crl *tempCrl;
-
-    /* Temporary Object to identify the parent CA when there is no intermediate CA */
-    mbedtls_x509_crt *parentCert;
-
-    /* Temporary Object to identify the parent CA when there is intermediate CA */
-    mbedtls_x509_crt *parentCert_2;
-
-    /* Flag value to identify if the issuer certificate is found */
-    int issuerKnown = 0;
-
-    /* Flag value to identify if the parent certificate found */
-    int parentFound = 0;
-
-    mbedtls_x509_crt_init(&remoteCertificate);
-    int mbedErr = mbedtls_x509_crt_parse(&remoteCertificate, certificate->data,
-                                         certificate->length);
-    if(mbedErr) {
-        /* char errBuff[300]; */
-        /* mbedtls_strerror(mbedErr, errBuff, 300); */
-        /* UA_LOG_WARNING(data->policyContext->securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, */
-        /*                "Could not parse the remote certificate with error: %s", errBuff); */
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    }
-
-    /* Verify */
-    mbedtls_x509_crt_profile crtProfile = {
-        MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256),
-        0xFFFFFF, 0x000000, 128 * 8 // in bits
-    }; // TODO: remove magic numbers
-
-    uint32_t flags = 0;
-    mbedErr = mbedtls_x509_crt_verify_with_profile(&remoteCertificate,
-                                                   &ci->certificateTrustList,
-                                                   &ci->certificateRevocationList,
-                                                   &crtProfile, NULL, &flags, NULL, NULL);
-
-    /* Flag to check if the remote certificate is trusted or not */
-    int TRUSTED = 0;
-
-    /* Check if the remoteCertificate is present in the trustList while mbedErr value is not zero */
-    if(mbedErr && !(flags & MBEDTLS_X509_BADCERT_EXPIRED) && !(flags & MBEDTLS_X509_BADCERT_FUTURE)) {
-        for(tempCert = &ci->certificateTrustList; tempCert != NULL; tempCert = tempCert->next) {
-            if(remoteCertificate.raw.len == tempCert->raw.len &&
-               memcmp(remoteCertificate.raw.p, tempCert->raw.p, remoteCertificate.raw.len) == 0) {
-                TRUSTED = REMOTECERTIFICATETRUSTED;
-                break;
-            }
-        }
-    }
-
-    /* If the remote certificate is present in the trustList then check if the issuer certificate
-     * of remoteCertificate is present in issuerList */
-    if(TRUSTED && mbedErr) {
-        mbedErr = mbedtls_x509_crt_verify_with_profile(&remoteCertificate,
-                                                       &ci->certificateIssuerList,
-                                                       &ci->certificateRevocationList,
-                                                       &crtProfile, NULL, &flags, NULL, NULL);
-
-        /* Check if the parent certificate has a CRL file available */
-        if(!mbedErr) {
-            /* Flag value to identify if that there is an intermediate CA present */
-            int dualParent = 0;
-
-            /* Identify the topmost parent certificate for the remoteCertificate */
-            for( parentCert = &ci->certificateIssuerList; parentCert != NULL; parentCert = parentCert->next ) {
-                if(memcmp(remoteCertificate.issuer_raw.p, parentCert->subject_raw.p, parentCert->subject_raw.len) == 0) {
-                    for(parentCert_2 = &ci->certificateTrustList; parentCert_2 != NULL; parentCert_2 = parentCert_2->next) {
-                        if(memcmp(parentCert->issuer_raw.p, parentCert_2->subject_raw.p, parentCert_2->subject_raw.len) == 0) {
-                            dualParent = DUALPARENT;
-                            parentFound = PARENTFOUND;
-                            break;
-                        }
-
-                    }
-
-                    parentFound = PARENTFOUND;
-                }
-
-                if(parentFound == PARENTFOUND) {
-                    break;
-                }
-
-            }
-
-            /* Check if there is an intermediate certificate between the topmost parent
-             * certificate and child certificate
-             * If yes the topmost parent certificate is to be checked whether it has a
-             * CRL file avaiable */
-            if(dualParent == DUALPARENT && parentFound == PARENTFOUND) {
-                parentCert = parentCert_2;
-            }
-
-            /* If a parent certificate is found traverse the revocationList and identify
-             * if there is any CRL file that corresponds to the parentCertificate */
-            if(parentFound == PARENTFOUND) {
-                tempCrl = &ci->certificateRevocationList;
-                while(tempCrl != NULL) {
-                    if(tempCrl->version != 0 &&
-                       tempCrl->issuer_raw.len == parentCert->subject_raw.len &&
-                       memcmp(tempCrl->issuer_raw.p,
-                              parentCert->subject_raw.p,
-                              tempCrl->issuer_raw.len) == 0) {
-                        issuerKnown = ISSUERKNOWN;
-                        break;
-                    }
-
-                    tempCrl = tempCrl->next;
-                }
-
-                /* If the CRL file corresponding to the parent certificate is not present
-                 * then return UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN */
-                if(!issuerKnown) {
-                    return UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN;
-                }
-
-            }
-
-        }
-
-    }
-    else if(!mbedErr && !TRUSTED) {
-        /* This else if section is to identify if the parent certificate which is present in trustList
-         * has CRL file corresponding to it */
-
-        /* Identify the parent certificate of the remoteCertificate */
-        for(parentCert = &ci->certificateTrustList; parentCert != NULL; parentCert = parentCert->next) {
-            if(memcmp(remoteCertificate.issuer_raw.p, parentCert->subject_raw.p, parentCert->subject_raw.len) == 0) {
-                parentFound = PARENTFOUND;
-                break;
-            }
-
-        }
-
-        /* If the parent certificate is found traverse the revocationList and identify
-         * if there is any CRL file that corresponds to the parentCertificate */
-        if(parentFound == PARENTFOUND &&
-            memcmp(remoteCertificate.issuer_raw.p, remoteCertificate.subject_raw.p, remoteCertificate.subject_raw.len) != 0) {
-            tempCrl = &ci->certificateRevocationList;
-            while(tempCrl != NULL) {
-                if(tempCrl->version != 0 &&
-                   tempCrl->issuer_raw.len == parentCert->subject_raw.len &&
-                   memcmp(tempCrl->issuer_raw.p,
-                          parentCert->subject_raw.p,
-                          tempCrl->issuer_raw.len) == 0) {
-                    issuerKnown = ISSUERKNOWN;
-                    break;
-                }
-
-                tempCrl = tempCrl->next;
-            }
-
-            /* If the CRL file corresponding to the parent certificate is not present
-             * then return UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN */
-            if(!issuerKnown) {
-                return UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN;
-            }
-
-        }
-
-    }
-
-    // TODO: Extend verification
-
-    /* This condition will check whether the certificate is a User certificate
-     * or a CA certificate. If the MBEDTLS_X509_KU_KEY_CERT_SIGN and
-     * MBEDTLS_X509_KU_CRL_SIGN of key_usage are set, then the certificate
-     * shall be condidered as CA Certificate and cannot be used to establish a
-     * connection. Refer the test case CTT/Security/Security Certificate Validation/029.js
-     * for more details */
-    if((remoteCertificate.key_usage & MBEDTLS_X509_KU_KEY_CERT_SIGN) &&
-       (remoteCertificate.key_usage & MBEDTLS_X509_KU_CRL_SIGN)) {
-        return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(mbedErr) {
-        /* char buff[100]; */
-        /* mbedtls_x509_crt_verify_info(buff, 100, "", flags); */
-        /* UA_LOG_ERROR(channelContextData->policyContext->securityPolicy->logger, */
-        /*              UA_LOGCATEGORY_SECURITYPOLICY, */
-        /*              "Verifying the certificate failed with error: %s", buff); */
-
-        if(flags & (uint32_t)MBEDTLS_X509_BADCERT_NOT_TRUSTED) {
-            retval = UA_STATUSCODE_BADCERTIFICATEUNTRUSTED;
-        } else if(flags & (uint32_t)MBEDTLS_X509_BADCERT_FUTURE ||
-                  flags & (uint32_t)MBEDTLS_X509_BADCERT_EXPIRED) {
-            retval = UA_STATUSCODE_BADCERTIFICATETIMEINVALID;
-        } else if(flags & (uint32_t)MBEDTLS_X509_BADCERT_REVOKED ||
-                  flags & (uint32_t)MBEDTLS_X509_BADCRL_EXPIRED) {
-            retval = UA_STATUSCODE_BADCERTIFICATEREVOKED;
-        } else {
-            retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        }
-    }
-
-    mbedtls_x509_crt_free(&remoteCertificate);
-    return retval;
-}
-
-/* Find binary substring. Taken and adjusted from
- * http://tungchingkai.blogspot.com/2011/07/binary-strstr.html */
-
-static const unsigned char *
-bstrchr(const unsigned char *s, const unsigned char ch, size_t l) {
-    /* find first occurrence of c in char s[] for length l*/
-    /* handle special case */
-    if(l == 0)
-        return (NULL);
-
-    for(; *s != ch; ++s, --l)
-        if(l == 0)
-            return (NULL);
-    return s;
-}
-
-static const unsigned char *
-bstrstr(const unsigned char *s1, size_t l1, const unsigned char *s2, size_t l2) {
-    /* find first occurrence of s2[] in s1[] for length l1*/
-    const unsigned char *ss1 = s1;
-    const unsigned char *ss2 = s2;
-    /* handle special case */
-    if(l1 == 0)
-        return (NULL);
-    if(l2 == 0)
-        return s1;
-
-    /* match prefix */
-    for (; (s1 = bstrchr(s1, *s2, (uintptr_t)ss1-(uintptr_t)s1+(uintptr_t)l1)) != NULL &&
-             (uintptr_t)ss1-(uintptr_t)s1+(uintptr_t)l1 != 0; ++s1) {
-
-        /* match rest of prefix */
-        const unsigned char *sc1, *sc2;
-        for (sc1 = s1, sc2 = s2; ;)
-            if (++sc2 >= ss2+l2)
-                return s1;
-            else if (*++sc1 != *sc2)
-                break;
-    }
-    return NULL;
-}
-
-static UA_StatusCode
-certificateVerification_verifyApplicationURI(void *verificationContext,
-                                             const UA_ByteString *certificate,
-                                             const UA_String *applicationURI) {
-    CertInfo *ci = (CertInfo*)verificationContext;
-    if(!ci)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Parse the certificate */
-    mbedtls_x509_crt remoteCertificate;
-    mbedtls_x509_crt_init(&remoteCertificate);
-    int mbedErr = mbedtls_x509_crt_parse(&remoteCertificate, certificate->data,
-                                         certificate->length);
-    if(mbedErr)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    /* Poor man's ApplicationUri verification. mbedTLS does not parse all fields
-     * of the Alternative Subject Name. Instead test whether the URI-string is
-     * present in the v3_ext field in general.
-     *
-     * TODO: Improve parsing of the Alternative Subject Name */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(bstrstr(remoteCertificate.v3_ext.p, remoteCertificate.v3_ext.len,
-               applicationURI->data, applicationURI->length) == NULL)
-        retval = UA_STATUSCODE_BADCERTIFICATEURIINVALID;
-
-    mbedtls_x509_crt_free(&remoteCertificate);
-    return retval;
-}
-
-static void
-certificateVerification_deleteMembers(UA_CertificateVerification *cv) {
-    CertInfo *ci = (CertInfo*)cv->context;
-    if(!ci)
-        return;
-    mbedtls_x509_crt_free(&ci->certificateTrustList);
-    mbedtls_x509_crl_free(&ci->certificateRevocationList);
-    mbedtls_x509_crt_free(&ci->certificateIssuerList);
-    UA_String_clear(&ci->trustListFolder);
-    UA_String_clear(&ci->issuerListFolder);
-    UA_String_clear(&ci->revocationListFolder);
-    UA_free(ci);
-    cv->context = NULL;
-}
-
-UA_StatusCode
-UA_CertificateVerification_Trustlist(UA_CertificateVerification *cv,
-                                     const UA_ByteString *certificateTrustList,
-                                     size_t certificateTrustListSize,
-                                     const UA_ByteString *certificateIssuerList,
-                                     size_t certificateIssuerListSize,
-                                     const UA_ByteString *certificateRevocationList,
-                                     size_t certificateRevocationListSize) {
-    CertInfo *ci = (CertInfo*)UA_malloc(sizeof(CertInfo));
-    if(!ci)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    memset(ci, 0, sizeof(CertInfo));
-    mbedtls_x509_crt_init(&ci->certificateTrustList);
-    mbedtls_x509_crl_init(&ci->certificateRevocationList);
-    mbedtls_x509_crt_init(&ci->certificateIssuerList);
-
-    cv->context = (void*)ci;
-    if(certificateTrustListSize > 0)
-        cv->verifyCertificate = certificateVerification_verify;
-    else
-        cv->verifyCertificate = verifyCertificateAllowAll;
-    cv->deleteMembers = certificateVerification_deleteMembers;
-    cv->verifyApplicationURI = certificateVerification_verifyApplicationURI;
-
-    int err = 0;
-    for(size_t i = 0; i < certificateTrustListSize; i++) {
-        err = mbedtls_x509_crt_parse(&ci->certificateTrustList,
-                                     certificateTrustList[i].data,
-                                     certificateTrustList[i].length);
-        if(err)
-            goto error;
-    }
-    for(size_t i = 0; i < certificateIssuerListSize; i++) {
-        err = mbedtls_x509_crt_parse(&ci->certificateIssuerList,
-                                     certificateIssuerList[i].data,
-                                     certificateIssuerList[i].length);
-        if(err)
-            goto error;
-    }
-    for(size_t i = 0; i < certificateRevocationListSize; i++) {
-        err = mbedtls_x509_crl_parse(&ci->certificateRevocationList,
-                                     certificateRevocationList[i].data,
-                                     certificateRevocationList[i].length);
-        if(err)
-            goto error;
-    }
-
-    return UA_STATUSCODE_GOOD;
-error:
-    certificateVerification_deleteMembers(cv);
-    return UA_STATUSCODE_BADINTERNALERROR;
-}
-
-#ifdef __linux__ /* Linux only so far */
-
-UA_StatusCode
-UA_CertificateVerification_CertFolders(UA_CertificateVerification *cv,
-                                       const char *trustListFolder,
-                                       const char *issuerListFolder,
-                                       const char *revocationListFolder) {
-    CertInfo *ci = (CertInfo*)UA_malloc(sizeof(CertInfo));
-    if(!ci)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    memset(ci, 0, sizeof(CertInfo));
-    mbedtls_x509_crt_init(&ci->certificateTrustList);
-    mbedtls_x509_crl_init(&ci->certificateRevocationList);
-    mbedtls_x509_crt_init(&ci->certificateIssuerList);
-
-    /* Only set the folder paths. They will be reloaded during runtime.
-     * TODO: Add a more efficient reloading of only the changes */
-    ci->trustListFolder = UA_STRING_ALLOC(trustListFolder);
-    ci->issuerListFolder = UA_STRING_ALLOC(issuerListFolder);
-    ci->revocationListFolder = UA_STRING_ALLOC(revocationListFolder);
-
-    reloadCertificates(ci);
-
-    cv->context = (void*)ci;
-    cv->verifyCertificate = certificateVerification_verify;
-    cv->deleteMembers = certificateVerification_deleteMembers;
-    cv->verifyApplicationURI = certificateVerification_verifyApplicationURI;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-#endif
diff --git a/ext/open62541/plugins/ua_pubsub_ethernet.c b/ext/open62541/plugins/ua_pubsub_ethernet.c
deleted file mode 100644
index 15e71be..0000000
--- a/ext/open62541/plugins/ua_pubsub_ethernet.c
+++ /dev/null
@@ -1,447 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *   Copyright 2018 (c) Kontron Europe GmbH (Author: Rudolf Hoyler)
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_ethernet.h>
-#include <open62541/util.h>
-
-#include <linux/if_packet.h>
-#include <netinet/ether.h>
-
-#ifndef ETHERTYPE_UADP
-#define ETHERTYPE_UADP 0xb62c
-#endif
-
-/* Ethernet network layer specific internal data */
-typedef struct {
-    int ifindex;
-    UA_UInt16 vid;
-    UA_Byte prio;
-    UA_Byte ifAddress[ETH_ALEN];
-    UA_Byte targetAddress[ETH_ALEN];
-} UA_PubSubChannelDataEthernet;
-
-/*
- * OPC-UA specification Part 14:
- *
- * "The target is a MAC address, an IP address or a registered name like a
- *  hostname. The format of a MAC address is six groups of hexadecimal digits,
- *  separated by hyphens (e.g. 01-23-45-67-89-ab). A system may also accept
- *  hostnames and/or IP addresses if it provides means to resolve it to a MAC
- *  address (e.g. DNS and Reverse-ARP)."
- *
- * We do not support currently IP addresses or hostnames.
- */
-static UA_StatusCode
-UA_parseHardwareAddress(UA_String* target, UA_Byte* destinationMac) {
-    size_t curr = 0, idx = 0;
-    for(; idx < ETH_ALEN; idx++) {
-        UA_UInt32 value;
-        size_t progress =
-            UA_readNumberWithBase(&target->data[curr],
-                                  target->length - curr, &value, 16);
-        if(progress == 0 || value > (long)0xff)
-            return UA_STATUSCODE_BADINTERNALERROR;
-
-        destinationMac[idx] = (UA_Byte) value;
-
-        curr += progress;
-        if(curr == target->length)
-            break;
-
-        if(target->data[curr] != '-')
-            return UA_STATUSCODE_BADINTERNALERROR;
-
-        curr++; /* skip '-' */
-    }
-
-    if(idx != (ETH_ALEN-1))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Open communication socket based on the connectionConfig.
- *
- * @return ref to created channel, NULL on error
- */
-static UA_PubSubChannel *
-UA_PubSubChannelEthernet_open(const UA_PubSubConnectionConfig *connectionConfig) {
-
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                "Open PubSub ethernet connection.");
-
-    /* allocate and init memory for the ethernet specific internal data */
-    UA_PubSubChannelDataEthernet* channelDataEthernet =
-            (UA_PubSubChannelDataEthernet*) UA_calloc(1, sizeof(*channelDataEthernet));
-    if(!channelDataEthernet) {
-        UA_LOG_ERROR (UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub Connection creation failed. Out of memory.");
-        return NULL;
-    }
-
-    /* handle specified network address */
-    UA_NetworkAddressUrlDataType *address;
-    if(UA_Variant_hasScalarType(&connectionConfig->address,
-                                 &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE])) {
-        address = (UA_NetworkAddressUrlDataType *) connectionConfig->address.data;
-    } else {
-        UA_LOG_ERROR (UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub Connection creation failed. Invalid Address.");
-        UA_free(channelDataEthernet);
-        return NULL;
-    }
-    UA_LOG_DEBUG(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Specified Interface Name = %.*s",
-         (int) address->networkInterface.length, address->networkInterface.data);
-    UA_LOG_DEBUG(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Specified Network Url = %.*s",
-         (int)address->url.length, address->url.data);
-
-    UA_String target;
-    /* encode the URL and store information in internal structure */
-    if(UA_parseEndpointUrlEthernet(&address->url, &target, &channelDataEthernet->vid,
-                                   &channelDataEthernet->prio)) {
-        UA_LOG_ERROR (UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub Connection creation failed. Invalid Address URL.");
-        UA_free(channelDataEthernet);
-        return NULL;
-    }
-
-    /* Get a valid MAC address from target definition */
-    if(UA_parseHardwareAddress(&target, channelDataEthernet->targetAddress) != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Invalid destination MAC address.");
-        UA_free(channelDataEthernet);
-        return NULL;
-    }
-
-    /* generate a new Pub/Sub channel and open a related socket */
-    UA_PubSubChannel *newChannel = (UA_PubSubChannel*)UA_calloc(1, sizeof(UA_PubSubChannel));
-    if(!newChannel) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Out of memory.");
-        UA_free(channelDataEthernet);
-        return NULL;
-    }
-
-    /* Open a packet socket */
-    int sockFd = UA_socket(PF_PACKET, SOCK_RAW, 0);
-    if(sockFd < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub connection creation failed. Cannot create socket.");
-        UA_free(channelDataEthernet);
-        UA_free(newChannel);
-        return NULL;
-    }
-    newChannel->sockfd = sockFd;
-
-    /* allow the socket to be reused */
-    int opt = 1;
-    if(UA_setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub connection creation failed. Cannot set socket reuse.");
-        UA_close(sockFd);
-        UA_free(channelDataEthernet);
-        UA_free(newChannel);
-        return NULL;
-    }
-
-    /* get interface index */
-    struct ifreq ifreq;
-    memset(&ifreq, 0, sizeof(struct ifreq));
-    strncpy(ifreq.ifr_name, (char*)address->networkInterface.data,
-            UA_MIN(address->networkInterface.length, sizeof(ifreq.ifr_name)-1));
-
-    if(ioctl(sockFd, SIOCGIFINDEX, &ifreq) < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-           "PubSub connection creation failed. Cannot get interface index.");
-        UA_close(sockFd);
-        UA_free(channelDataEthernet);
-        UA_free(newChannel);
-        return NULL;
-    }
-    channelDataEthernet->ifindex = ifreq.ifr_ifindex;
-
-    /* determine own MAC address (source address for send) */
-    if(ioctl(sockFd, SIOCGIFHWADDR, &ifreq) < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub connection creation failed. Cannot determine own MAC address.");
-        UA_close(sockFd);
-        UA_free(channelDataEthernet);
-        UA_free(newChannel);
-        return NULL;
-    }
-    memcpy(channelDataEthernet->ifAddress, &ifreq.ifr_hwaddr.sa_data, ETH_ALEN);
-
-    /* bind the socket to interface and ethertype */
-    struct sockaddr_ll sll = { 0 };
-    sll.sll_family = AF_PACKET;
-    sll.sll_ifindex = channelDataEthernet->ifindex;
-    sll.sll_protocol = htons(ETHERTYPE_UADP);
-
-    if(UA_bind(sockFd, (struct sockaddr*)&sll, sizeof(sll)) < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub connection creation failed. Cannot bind socket.");
-        UA_close(sockFd);
-        UA_free(channelDataEthernet);
-        UA_free(newChannel);
-        return NULL;
-    }
-
-    newChannel->handle = channelDataEthernet;
-    newChannel->state = UA_PUBSUB_CHANNEL_PUB;
-
-    return newChannel;
-}
-
-static UA_Boolean
-is_multicast_address(const UA_Byte *address) {
-    /* check if it is a unicast address */
-    if((address[0] & 1) == 0) {
-        return UA_FALSE;
-    }
-
-    /* and exclude broadcast addresses */
-    for(size_t i = 0; i < ETH_ALEN; i++) {
-        if(address[i] != 0xff)
-            return UA_TRUE;
-    }
-
-    /* reaching this point, we know it has to be a broadcast address */
-    return UA_FALSE;
-}
-
-/**
- * Subscribe to a given address.
- *
- * @return UA_STATUSCODE_GOOD on success
- */
-static UA_StatusCode
-UA_PubSubChannelEthernet_regist(UA_PubSubChannel *channel,
-                                UA_ExtensionObject *transportSettings,
-                                void (*notUsedHere)(UA_ByteString *encodedBuffer, UA_ByteString *topic)) {
-    UA_PubSubChannelDataEthernet *channelDataEthernet =
-        (UA_PubSubChannelDataEthernet *) channel->handle;
-
-    if(!is_multicast_address(channelDataEthernet->targetAddress))
-        return UA_STATUSCODE_GOOD;
-
-    struct packet_mreq mreq;
-    mreq.mr_ifindex = channelDataEthernet->ifindex;
-    mreq.mr_type = PACKET_MR_MULTICAST;
-    mreq.mr_alen = ETH_ALEN;
-    memcpy(mreq.mr_address, channelDataEthernet->targetAddress, ETH_ALEN);
-
-    if(UA_setsockopt(channel->sockfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, (char*) &mreq, sizeof(mreq)) < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed. %s", strerror(errno));
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Remove current subscription.
- *
- * @return UA_STATUSCODE_GOOD on success
- */
-static UA_StatusCode
-UA_PubSubChannelEthernet_unregist(UA_PubSubChannel *channel,
-                                  UA_ExtensionObject *transportSettings) {
-    UA_PubSubChannelDataEthernet *channelDataEthernet =
-        (UA_PubSubChannelDataEthernet *) channel->handle;
-
-    if(!is_multicast_address(channelDataEthernet->targetAddress)) {
-        return UA_STATUSCODE_GOOD;
-    }
-
-    struct packet_mreq mreq;
-    mreq.mr_ifindex = channelDataEthernet->ifindex;
-    mreq.mr_type = PACKET_MR_MULTICAST;
-    mreq.mr_alen = ETH_ALEN;
-    memcpy(mreq.mr_address, channelDataEthernet->targetAddress, ETH_ALEN);
-
-    if(UA_setsockopt(channel->sockfd, SOL_PACKET, PACKET_DROP_MEMBERSHIP, (char*) &mreq, sizeof(mreq) < 0)) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Send messages to the connection defined address
- *
- * @return UA_STATUSCODE_GOOD if success
- */
-static UA_StatusCode
-UA_PubSubChannelEthernet_send(UA_PubSubChannel *channel,
-                              UA_ExtensionObject *transportSettings,
-                              const UA_ByteString *buf) {
-    UA_PubSubChannelDataEthernet *channelDataEthernet =
-        (UA_PubSubChannelDataEthernet *) channel->handle;
-
-    /* Allocate a buffer for the ethernet data which contains the ethernet
-     * header (without VLAN tag), the VLAN tag and the OPC-UA/Ethernet data. */
-    char *bufSend, *ptrCur;
-    size_t lenBuf;
-    struct ether_header* ethHdr;
-
-    lenBuf = sizeof(*ethHdr) + 4 + buf->length;
-    bufSend = (char*) UA_malloc(lenBuf);
-    ethHdr = (struct ether_header*) bufSend;
-
-    /* Set (own) source MAC address */
-    memcpy(ethHdr->ether_shost, channelDataEthernet->ifAddress, ETH_ALEN);
-
-    /* Set destination MAC address */
-    memcpy(ethHdr->ether_dhost, channelDataEthernet->targetAddress, ETH_ALEN);
-
-    /* Set ethertype */
-    /* Either VLAN or Ethernet */
-    ptrCur = bufSend + sizeof(*ethHdr);
-    if(channelDataEthernet->vid == 0) {
-        ethHdr->ether_type = htons(ETHERTYPE_UADP);
-        lenBuf -= 4;  /* no VLAN tag */
-    } else {
-        ethHdr->ether_type = htons(ETHERTYPE_VLAN);
-        /* set VLAN ID */
-        UA_UInt16 vlanTag;
-        vlanTag = (UA_UInt16) (channelDataEthernet->vid + (channelDataEthernet->prio << 13));
-        *((UA_UInt16 *) ptrCur) = htons(vlanTag);
-        ptrCur += sizeof(UA_UInt16);
-        /* set Ethernet */
-        *((UA_UInt16 *) ptrCur) = htons(ETHERTYPE_UADP);
-        ptrCur += sizeof(UA_UInt16);
-    }
-
-    /* copy payload of ethernet message */
-    memcpy(ptrCur, buf->data, buf->length);
-
-    ssize_t rc;
-    rc = UA_send(channel->sockfd, bufSend, lenBuf, 0);
-    if(rc  < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-            "PubSub connection send failed. Send message failed.");
-        UA_free(bufSend);
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    UA_free(bufSend);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Receive messages.
- *
- * @param timeout in usec -> not used
- * @return
- */
-static UA_StatusCode
-UA_PubSubChannelEthernet_receive(UA_PubSubChannel *channel, UA_ByteString *message,
-                                 UA_ExtensionObject *transportSettings, UA_UInt32 timeout) {
-    UA_PubSubChannelDataEthernet *channelDataEthernet =
-        (UA_PubSubChannelDataEthernet *) channel->handle;
-
-    struct ether_header eth_hdr;
-    struct msghdr msg;
-    struct iovec iov[2];
-
-    iov[0].iov_base = &eth_hdr;
-    iov[0].iov_len = sizeof(eth_hdr);
-    iov[1].iov_base = message->data;
-    iov[1].iov_len = message->length;
-    msg.msg_namelen = 0;
-    msg.msg_iov = iov;
-    msg.msg_iovlen = 2;
-    msg.msg_controllen = 0;
-
-    /* Sleep in a select call if a timeout was set */
-    if(timeout > 0) {
-        fd_set fdset;
-        FD_ZERO(&fdset);
-        UA_fd_set(channel->sockfd, &fdset);
-        struct timeval tmptv = {(long int)(timeout / 1000000),
-                                (long int)(timeout % 1000000)};
-        int resultsize = UA_select(channel->sockfd+1, &fdset, NULL, NULL, &tmptv);
-        if(resultsize == 0) {
-            message->length = 0;
-            return UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-        }
-        if(resultsize == -1) {
-            message->length = 0;
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-    }
-
-    /* Read the current packet on the socket */
-    ssize_t dataLen = recvmsg(channel->sockfd, &msg, 0);
-    if(dataLen < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub connection receive failed. Receive message failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    if((size_t)dataLen < sizeof(eth_hdr)) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub connection receive failed. Packet too small.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    if(dataLen == 0)
-        return UA_STATUSCODE_GOODNODATA;
-
-    /* Make sure we match our target */
-    if(memcmp(eth_hdr.ether_dhost, channelDataEthernet->targetAddress, ETH_ALEN) != 0)
-        return UA_STATUSCODE_GOODNODATA;
-
-    /* Set the message length */
-    message->length = (size_t)dataLen - sizeof(eth_hdr);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Close channel and free the channel data.
- *
- * @return UA_STATUSCODE_GOOD if success
- */
-static UA_StatusCode
-UA_PubSubChannelEthernet_close(UA_PubSubChannel *channel) {
-    UA_close(channel->sockfd);
-    UA_free(channel->handle);
-    UA_free(channel);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Generate a new channel. based on the given configuration.
- *
- * @param connectionConfig connection configuration
- * @return  ref to created channel, NULL on error
- */
-static UA_PubSubChannel *
-TransportLayerEthernet_addChannel(UA_PubSubConnectionConfig *connectionConfig) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "PubSub channel requested");
-    UA_PubSubChannel * pubSubChannel = UA_PubSubChannelEthernet_open(connectionConfig);
-    if(pubSubChannel) {
-        pubSubChannel->regist = UA_PubSubChannelEthernet_regist;
-        pubSubChannel->unregist = UA_PubSubChannelEthernet_unregist;
-        pubSubChannel->send = UA_PubSubChannelEthernet_send;
-        pubSubChannel->receive = UA_PubSubChannelEthernet_receive;
-        pubSubChannel->close = UA_PubSubChannelEthernet_close;
-        pubSubChannel->connectionConfig = connectionConfig;
-    }
-    return pubSubChannel;
-}
-
-UA_PubSubTransportLayer
-UA_PubSubTransportLayerEthernet() {
-    UA_PubSubTransportLayer pubSubTransportLayer;
-    pubSubTransportLayer.transportProfileUri =
-        UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp");
-    pubSubTransportLayer.createPubSubChannel = &TransportLayerEthernet_addChannel;
-    return pubSubTransportLayer;
-}
diff --git a/ext/open62541/plugins/ua_pubsub_udp.c b/ext/open62541/plugins/ua_pubsub_udp.c
deleted file mode 100644
index a4f6226..0000000
--- a/ext/open62541/plugins/ua_pubsub_udp.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright 2018 (c) Jose Cabral, fortiss GmbH
- */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/util.h>
-
-// UDP multicast network layer specific internal data
-typedef struct {
-    int ai_family;                        //Protocol family for socket.  IPv4/IPv6
-    struct sockaddr_storage *ai_addr;     //https://msdn.microsoft.com/de-de/library/windows/desktop/ms740496(v=vs.85).aspx
-    UA_UInt32 messageTTL;
-    UA_Boolean enableLoopback;
-    UA_Boolean enableReuse;
-} UA_PubSubChannelDataUDPMC;
-
-/**
- * Open communication socket based on the connectionConfig. Protocol specific parameters are
- * provided within the connectionConfig as KeyValuePair.
- * Currently supported options: "ttl" , "loopback", "reuse"
- *
- * @return ref to created channel, NULL on error
- */
-static UA_PubSubChannel *
-UA_PubSubChannelUDPMC_open(const UA_PubSubConnectionConfig *connectionConfig) {
-    UA_initialize_architecture_network();
-
-    UA_NetworkAddressUrlDataType address;
-    if(UA_Variant_hasScalarType(&connectionConfig->address, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE])){
-        address = *(UA_NetworkAddressUrlDataType *)connectionConfig->address.data;
-    } else {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation failed. Invalid Address.");
-        return NULL;
-    }
-    //allocate and init memory for the UDP multicast specific internal data
-    UA_PubSubChannelDataUDPMC * channelDataUDPMC =
-            (UA_PubSubChannelDataUDPMC *) UA_calloc(1, (sizeof(UA_PubSubChannelDataUDPMC)));
-    if(!channelDataUDPMC){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation failed. Out of memory.");
-        return NULL;
-    }
-    //set default values
-    UA_PubSubChannelDataUDPMC defaultValues = {0, NULL, 255, UA_TRUE, UA_TRUE};
-    memcpy(channelDataUDPMC, &defaultValues, sizeof(UA_PubSubChannelDataUDPMC));
-    //iterate over the given KeyValuePair paramters
-    UA_String ttlParam = UA_STRING("ttl"), loopbackParam = UA_STRING("loopback"), reuseParam = UA_STRING("reuse");
-    for(size_t i = 0; i < connectionConfig->connectionPropertiesSize; i++){
-        if(UA_String_equal(&connectionConfig->connectionProperties[i].key.name, &ttlParam)){
-            if(UA_Variant_hasScalarType(&connectionConfig->connectionProperties[i].value, &UA_TYPES[UA_TYPES_UINT32])){
-                channelDataUDPMC->messageTTL = *(UA_UInt32 *) connectionConfig->connectionProperties[i].value.data;
-            }
-        } else if(UA_String_equal(&connectionConfig->connectionProperties[i].key.name, &loopbackParam)){
-            if(UA_Variant_hasScalarType(&connectionConfig->connectionProperties[i].value, &UA_TYPES[UA_TYPES_BOOLEAN])){
-                channelDataUDPMC->enableLoopback = *(UA_Boolean *) connectionConfig->connectionProperties[i].value.data;
-            }
-        } else if(UA_String_equal(&connectionConfig->connectionProperties[i].key.name, &reuseParam)){
-            if(UA_Variant_hasScalarType(&connectionConfig->connectionProperties[i].value, &UA_TYPES[UA_TYPES_BOOLEAN])){
-                channelDataUDPMC->enableReuse = *(UA_Boolean *) connectionConfig->connectionProperties[i].value.data;
-            }
-        } else {
-            UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation. Unknown connection parameter.");
-        }
-    }
-
-    UA_PubSubChannel *newChannel = (UA_PubSubChannel *) UA_calloc(1, sizeof(UA_PubSubChannel));
-    if(!newChannel){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation failed. Out of memory.");
-        UA_free(channelDataUDPMC);
-        return NULL;
-    }
-    struct addrinfo hints, *rp, *requestResult = NULL;
-    memset(&hints, 0, sizeof hints);
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_DGRAM;
-    hints.ai_flags = 0;
-    hints.ai_protocol = 0;
-
-    UA_String hostname, path;
-    UA_UInt16 networkPort;
-    if(UA_parseEndpointUrl(&address.url, &hostname, &networkPort, &path) != UA_STATUSCODE_GOOD){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Invalid URL.");
-        UA_free(channelDataUDPMC);
-        UA_free(newChannel);
-        return NULL;
-    }
-    if(hostname.length > 512) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. URL maximum length is 512.");
-        UA_free(channelDataUDPMC);
-        UA_free(newChannel);
-        return NULL;
-    }
-
-    UA_STACKARRAY(char, addressAsChar, sizeof(char) * hostname.length +1);
-    memcpy(addressAsChar, hostname.data, hostname.length);
-    addressAsChar[hostname.length] = 0;
-    char port[6];
-    sprintf(port, "%u", networkPort);
-
-    if(UA_getaddrinfo(addressAsChar, port, &hints, &requestResult) != 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Internal error.");
-        UA_free(channelDataUDPMC);
-        UA_free(newChannel);
-        return NULL;
-    }
-
-    //check if the ip address is a multicast address
-    if(requestResult->ai_family == PF_INET){
-        struct in_addr imr_interface;
-        UA_inet_pton(AF_INET, addressAsChar, &imr_interface);
-        if((UA_ntohl(imr_interface.s_addr) & 0xF0000000) != 0xE0000000){
-            UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                           "PubSub Connection creation failed. No multicast address.");
-        }
-    } else {
-        //TODO check if ipv6 addrr is multicast address.
-    }
-
-    for(rp = requestResult; rp != NULL; rp = rp->ai_next){
-        newChannel->sockfd = UA_socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
-        if(newChannel->sockfd != UA_INVALID_SOCKET){
-            break; /*success*/
-        }
-    }
-    if(!rp){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Internal error.");
-        UA_freeaddrinfo(requestResult);
-        UA_free(channelDataUDPMC);
-        UA_free(newChannel);
-        return NULL;
-    }
-    channelDataUDPMC->ai_family = rp->ai_family;
-    channelDataUDPMC->ai_addr = (struct sockaddr_storage *) UA_calloc(1, sizeof(struct sockaddr_storage));
-    if(!channelDataUDPMC->ai_addr){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Out of memory.");
-        UA_close(newChannel->sockfd);
-        UA_freeaddrinfo(requestResult);
-        UA_free(channelDataUDPMC);
-        UA_free(newChannel);
-        return NULL;
-    }
-    memcpy(channelDataUDPMC->ai_addr, rp->ai_addr, sizeof(*rp->ai_addr));
-    //link channel and internal channel data
-    newChannel->handle = channelDataUDPMC;
-
-    //Set loop back data to your host
-#if UA_IPV6
-    if(UA_setsockopt(newChannel->sockfd,
-                     requestResult->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP,
-                     requestResult->ai_family == PF_INET6 ? IPV6_MULTICAST_LOOP : IP_MULTICAST_LOOP,
-                     (const char *)&channelDataUDPMC->enableLoopback, sizeof (channelDataUDPMC->enableLoopback))
-#else
-    if(UA_setsockopt(newChannel->sockfd,
-                     IPPROTO_IP,
-                     IP_MULTICAST_LOOP,
-                     (const char *)&channelDataUDPMC->enableLoopback, sizeof (channelDataUDPMC->enableLoopback))
-#endif
-                      < 0) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Loopback setup failed.");
-        UA_close(newChannel->sockfd);
-        UA_freeaddrinfo(requestResult);
-        UA_free(channelDataUDPMC);
-        UA_free(newChannel);
-        return NULL;
-    }
-
-    //Set Time to live (TTL). Value of 1 prevent forward beyond the local network.
-#if UA_IPV6
-    if(UA_setsockopt(newChannel->sockfd,
-                     requestResult->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP,
-                     requestResult->ai_family == PF_INET6 ? IPV6_MULTICAST_HOPS : IP_MULTICAST_TTL,
-                     (const char *)&channelDataUDPMC->messageTTL, sizeof(channelDataUDPMC->messageTTL))
-#else
-    if(UA_setsockopt(newChannel->sockfd,
-                     IPPROTO_IP,
-                     IP_MULTICAST_TTL,
-                     (const char *)&channelDataUDPMC->messageTTL, sizeof(channelDataUDPMC->messageTTL))
-#endif
-
-                      < 0) {
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation problem. Time to live setup failed.");
-    }
-
-    //Set reuse address -> enables sharing of the same listening address on different sockets.
-    if(channelDataUDPMC->enableReuse){
-        int enableReuse = 1;
-        if(UA_setsockopt(newChannel->sockfd,
-                      SOL_SOCKET, SO_REUSEADDR,
-                      (const char*)&enableReuse, sizeof(enableReuse)) < 0){
-            UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                           "PubSub Connection creation problem. Reuse address setup failed.");
-        }
-    }
-
-    //Set the physical interface for outgoing traffic
-    if(address.networkInterface.length > 0){
-        UA_STACKARRAY(char, interfaceAsChar, sizeof(char) * address.networkInterface.length + 1);
-        memcpy(interfaceAsChar, address.networkInterface.data, address.networkInterface.length);
-        interfaceAsChar[address.networkInterface.length] = 0;
-        enum{
-            IPv4,
-#if UA_IPV6
-            IPv6,
-#endif
-            INVALID
-        } ipVersion;
-        union {
-            struct ip_mreq ipv4;
-#if UA_IPV6
-            struct ipv6_mreq ipv6;
-#endif
-        } group;
-        if(UA_inet_pton(AF_INET, interfaceAsChar, &group.ipv4.imr_interface)){
-            ipVersion = IPv4;
-#if UA_IPV6
-        } else if (UA_inet_pton(AF_INET6, interfaceAsChar, &group.ipv6.ipv6mr_multiaddr)){
-            group.ipv6.ipv6mr_interface = UA_if_nametoindex(interfaceAsChar);
-            ipVersion = IPv6;
-#endif
-        } else {
-            ipVersion = INVALID;
-        }
-        if(ipVersion == INVALID ||
-#if UA_IPV6
-                UA_setsockopt(newChannel->sockfd,
-                           requestResult->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP,
-                           requestResult->ai_family == PF_INET6 ? IPV6_MULTICAST_IF : IP_MULTICAST_IF,
-                           ipVersion == IPv6 ? (const void *) &group.ipv6.ipv6mr_interface : &group.ipv4.imr_interface,
-                           ipVersion == IPv6 ? sizeof(group.ipv6.ipv6mr_interface) : sizeof(struct in_addr))
-#else
-                UA_setsockopt(newChannel->sockfd,
-                           IPPROTO_IP,
-                           IP_MULTICAST_IF,
-                           &group.ipv4.imr_interface,
-                           sizeof(struct in_addr))
-#endif
-                                                         < 0) {
-            UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                           "PubSub Connection creation problem. Interface selection failed.");
-        };
-    }
-    UA_freeaddrinfo(requestResult);
-    newChannel->state = UA_PUBSUB_CHANNEL_PUB;
-    return newChannel;
-}
-
-/**
- * Subscribe to a given address.
- *
- * @return UA_STATUSCODE_GOOD on success
- */
-static UA_StatusCode
-UA_PubSubChannelUDPMC_regist(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettings,
-        void (*notUsedHere)(UA_ByteString *encodedBuffer, UA_ByteString *topic)) {
-    if(!(channel->state == UA_PUBSUB_CHANNEL_PUB || channel->state == UA_PUBSUB_CHANNEL_RDY)){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    UA_PubSubChannelDataUDPMC * connectionConfig = (UA_PubSubChannelDataUDPMC *) channel->handle;
-    if(connectionConfig->ai_family == PF_INET){//IPv4 handling
-        struct sockaddr_in addr;
-        memcpy(&addr, connectionConfig->ai_addr, sizeof(struct sockaddr_in));
-        addr.sin_addr.s_addr = INADDR_ANY;
-        if (UA_bind(channel->sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0){
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed.");
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-        struct ip_mreq groupV4;
-        memcpy(&groupV4.imr_multiaddr, &((const struct sockaddr_in *)connectionConfig->ai_addr)->sin_addr, sizeof(struct ip_mreq));
-        groupV4.imr_interface.s_addr = UA_htonl(INADDR_ANY);
-        //multihomed hosts can join several groups on different IF, INADDR_ANY -> kernel decides
-
-        if(UA_setsockopt(channel->sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &groupV4, sizeof(groupV4)) != 0) {
-            UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                           "PubSub Connection not on multicast");
-        }
-#if UA_IPV6
-    } else if (connectionConfig->ai_family == PF_INET6) {//IPv6 handling
-        //TODO implement regist for IPv6
-#endif
-    } else {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Remove current subscription.
- *
- * @return UA_STATUSCODE_GOOD on success
- */
-static UA_StatusCode
-UA_PubSubChannelUDPMC_unregist(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettings) {
-    if(!(channel->state == UA_PUBSUB_CHANNEL_PUB_SUB || channel->state == UA_PUBSUB_CHANNEL_SUB)){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection unregist failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    UA_PubSubChannelDataUDPMC * connectionConfig = (UA_PubSubChannelDataUDPMC *) channel->handle;
-    if(connectionConfig->ai_family == PF_INET){//IPv4 handling
-        struct ip_mreq groupV4;
-        memcpy(&groupV4.imr_multiaddr, &((const struct sockaddr_in *)connectionConfig->ai_addr)->sin_addr, sizeof(struct ip_mreq));
-        groupV4.imr_interface.s_addr = UA_htonl(INADDR_ANY);
-
-        if(UA_setsockopt(channel->sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *) &groupV4, sizeof(groupV4)) != 0){
-            UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection unregist failed.");
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-#if UA_IPV6
-    } else if (connectionConfig->ai_family == PF_INET6) {//IPv6 handling
-        //TODO implement unregist for IPv6
-#endif
-    } else {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection unregist failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Send messages to the connection defined address
- *
- * @return UA_STATUSCODE_GOOD if success
- */
-static UA_StatusCode
-UA_PubSubChannelUDPMC_send(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettigns, const UA_ByteString *buf) {
-    UA_PubSubChannelDataUDPMC *channelConfigUDPMC = (UA_PubSubChannelDataUDPMC *) channel->handle;
-    if(!(channel->state == UA_PUBSUB_CHANNEL_PUB || channel->state == UA_PUBSUB_CHANNEL_PUB_SUB)){
-        UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection sending failed. Invalid state.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    //TODO evalute: chunk messages or check against MTU?
-    long nWritten = 0;
-    while (nWritten < (long)buf->length) {
-        long n = (long)UA_sendto(channel->sockfd, buf->data, buf->length, 0,
-                        (struct sockaddr *) channelConfigUDPMC->ai_addr, sizeof(struct sockaddr_storage));
-        if(n == -1L) {
-            UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection sending failed.");
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-        nWritten += n;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Receive messages. The regist function should be called before.
- *
- * @param timeout in usec | on windows platforms are only multiples of 1000usec possible
- * @return
- */
-static UA_StatusCode
-UA_PubSubChannelUDPMC_receive(UA_PubSubChannel *channel, UA_ByteString *message, UA_ExtensionObject *transportSettigns, UA_UInt32 timeout){
-    if(!(channel->state == UA_PUBSUB_CHANNEL_PUB || channel->state == UA_PUBSUB_CHANNEL_PUB_SUB)) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection receive failed. Invalid state.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    UA_PubSubChannelDataUDPMC *channelConfigUDPMC = (UA_PubSubChannelDataUDPMC *) channel->handle;
-
-    if(timeout > 0) {
-        fd_set fdset;
-        FD_ZERO(&fdset);
-        UA_fd_set(channel->sockfd, &fdset);
-        struct timeval tmptv = {(long int)(timeout / 1000000),
-                                (long int)(timeout % 1000000)};
-        int resultsize = UA_select(channel->sockfd+1, &fdset, NULL,
-                                NULL, &tmptv);
-        if(resultsize == 0) {
-            message->length = 0;
-            return UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-        }
-        if (resultsize == -1) {
-            message->length = 0;
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-    }
-
-    if(channelConfigUDPMC->ai_family == PF_INET){
-        ssize_t messageLength;
-        messageLength = UA_recvfrom(channel->sockfd, message->data, message->length, 0, NULL, NULL);
-        if(messageLength > 0){
-            message->length = (size_t) messageLength;
-        } else {
-            message->length = 0;
-        }
-#if UA_IPV6
-    } else {
-        //TODO implement recieve for IPv6
-#endif
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Close channel and free the channel data.
- *
- * @return UA_STATUSCODE_GOOD if success
- */
-static UA_StatusCode
-UA_PubSubChannelUDPMC_close(UA_PubSubChannel *channel) {
-    if(UA_close(channel->sockfd) != 0){
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection delete failed.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    UA_deinitialize_architecture_network();
-    //cleanup the internal NetworkLayer data
-    UA_PubSubChannelDataUDPMC *networkLayerData = (UA_PubSubChannelDataUDPMC *) channel->handle;
-    UA_free(networkLayerData->ai_addr);
-    UA_free(networkLayerData);
-    UA_free(channel);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Generate a new channel. based on the given configuration.
- *
- * @param connectionConfig connection configuration
- * @return  ref to created channel, NULL on error
- */
-static UA_PubSubChannel *
-TransportLayerUDPMC_addChannel(UA_PubSubConnectionConfig *connectionConfig) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "PubSub channel requested");
-    UA_PubSubChannel * pubSubChannel = UA_PubSubChannelUDPMC_open(connectionConfig);
-    if(pubSubChannel){
-        pubSubChannel->regist = UA_PubSubChannelUDPMC_regist;
-        pubSubChannel->unregist = UA_PubSubChannelUDPMC_unregist;
-        pubSubChannel->send = UA_PubSubChannelUDPMC_send;
-        pubSubChannel->receive = UA_PubSubChannelUDPMC_receive;
-        pubSubChannel->close = UA_PubSubChannelUDPMC_close;
-        pubSubChannel->connectionConfig = connectionConfig;
-    }
-    return pubSubChannel;
-}
-
-//UDPMC channel factory
-UA_PubSubTransportLayer
-UA_PubSubTransportLayerUDPMP() {
-    UA_PubSubTransportLayer pubSubTransportLayer;
-    pubSubTransportLayer.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    pubSubTransportLayer.createPubSubChannel = &TransportLayerUDPMC_addChannel;
-    return pubSubTransportLayer;
-}
diff --git a/ext/open62541/sonar-project.properties b/ext/open62541/sonar-project.properties
deleted file mode 100644
index b4c0fb3..0000000
--- a/ext/open62541/sonar-project.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-sonar.projectKey=open62541-main
-sonar.projectName=open62541
-sonar.projectVersion=0.4
-
-sonar.log.level=INFO
-
-sonar.exclusions=deps/**/*,build/open62541.c,build/open62541.h,CMakeFiles/**/*,tools/**/*,tests/**/*,examples/**/*
-
-
-# =====================================================
-#   Meta-data for the project
-# =====================================================
-
-sonar.links.homepage=https://github.com/open62541/open62541
-sonar.links.ci=https://travis-ci.org/open62541/open62541
-sonar.links.scm=https://github.com/open62541/open62541
-sonar.links.issue=https://github.com/open62541/open62541/issues
-
-
-# =====================================================
-#   Properties that will be shared amongst all modules
-# =====================================================
-
-# SQ standard properties
-sonar.sources=.
-
-# Properties specific to the C/C++ analyzer:
-sonar.cfamily.build-wrapper-output=bw-output
-sonar.cfamily.gcov.reportsPath=.
diff --git a/ext/open62541/src/client/ua_client.c b/ext/open62541/src/client/ua_client.c
deleted file mode 100644
index 2ce6597..0000000
--- a/ext/open62541/src/client/ua_client.c
+++ /dev/null
@@ -1,559 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015 (c) hfaham
- *    Copyright 2015-2017 (c) Florian Palm
- *    Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2015 (c) Holger Jeromin
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016 (c) TorbenD
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lykurg
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2018 (c) Kalycito Infotech Private Limited
- */
-
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_client_internal.h"
-#include "ua_connection_internal.h"
-#include "ua_types_encoding_binary.h"
-
-#define STATUS_CODE_BAD_POINTER 0x01
-
-/********************/
-/* Client Lifecycle */
-/********************/
-
-static void
-UA_Client_init(UA_Client* client) {
-    memset(client, 0, sizeof(UA_Client));
-    UA_SecureChannel_init(&client->channel);
-    if(client->config.stateCallback)
-        client->config.stateCallback(client, client->state);
-    /* Catch error during async connection */
-    client->connectStatus = UA_STATUSCODE_GOOD;
-
-    UA_Timer_init(&client->timer);
-    UA_WorkQueue_init(&client->workQueue);
-}
-
-UA_Client *
-UA_Client_new() {
-    UA_Client *client = (UA_Client*)UA_malloc(sizeof(UA_Client));
-    if(!client)
-        return NULL;
-    UA_Client_init(client);
-    return client;
-}
-
-static void
-UA_ClientConfig_deleteMembers(UA_ClientConfig *config) {
-    UA_ApplicationDescription_deleteMembers(&config->clientDescription);
-
-    UA_ExtensionObject_deleteMembers(&config->userIdentityToken);
-    UA_String_deleteMembers(&config->securityPolicyUri);
-
-    UA_EndpointDescription_deleteMembers(&config->endpoint);
-    UA_UserTokenPolicy_deleteMembers(&config->userTokenPolicy);
-
-    if(config->certificateVerification.deleteMembers)
-        config->certificateVerification.deleteMembers(&config->certificateVerification);
-
-    /* Delete the SecurityPolicies */
-    if(config->securityPolicies == 0)
-        return;
-    for(size_t i = 0; i < config->securityPoliciesSize; i++)
-        config->securityPolicies[i].deleteMembers(&config->securityPolicies[i]);
-    UA_free(config->securityPolicies);
-    config->securityPolicies = 0;
-}
-
-static void
-UA_Client_deleteMembers(UA_Client *client) {
-    UA_Client_disconnect(client);
-    /* Commented as UA_SecureChannel_deleteMembers already done
-     * in UA_Client_disconnect function */
-    //UA_SecureChannel_deleteMembersCleanup(&client->channel);
-    if (client->connection.free)
-        client->connection.free(&client->connection);
-    UA_Connection_deleteMembers(&client->connection);
-    UA_NodeId_deleteMembers(&client->authenticationToken);
-    UA_String_deleteMembers(&client->endpointUrl);
-
-    /* Delete the async service calls */
-    UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN);
-
-    /* Delete the subscriptions */
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_Client_Subscriptions_clean(client);
-#endif
-
-    /* Delete the timed work */
-    UA_Timer_deleteMembers(&client->timer);
-
-    /* Clean up the work queue */
-    UA_WorkQueue_cleanup(&client->workQueue);
-
-    UA_ClientConfig_deleteMembers(&client->config);
-}
-
-void
-UA_Client_reset(UA_Client* client) {
-    UA_Client_deleteMembers(client);
-    UA_Client_init(client);
-}
-
-void
-UA_Client_delete(UA_Client* client) {
-    UA_Client_deleteMembers(client);
-    UA_free(client);
-}
-
-UA_ClientState
-UA_Client_getState(UA_Client *client) {
-    return client->state;
-}
-
-UA_ClientConfig *
-UA_Client_getConfig(UA_Client *client) {
-    if(!client)
-        return NULL;
-    return &client->config;
-}
-
-/****************/
-/* Raw Services */
-/****************/
-
-/* For synchronous service calls. Execute async responses with a callback. When
- * the response with the correct requestId turns up, return it via the
- * SyncResponseDescription pointer. */
-typedef struct {
-    UA_Client *client;
-    UA_Boolean received;
-    UA_UInt32 requestId;
-    void *response;
-    const UA_DataType *responseType;
-} SyncResponseDescription;
-
-/* For both synchronous and asynchronous service calls */
-static UA_StatusCode
-sendSymmetricServiceRequest(UA_Client *client, const void *request,
-                            const UA_DataType *requestType, UA_UInt32 *requestId) {
-    /* Make sure we have a valid session */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    /* FIXME: this is just a dirty workaround. We need to rework some of the sync and async processing
-     * FIXME: in the client. Currently a lot of stuff is semi broken and in dire need of cleaning up.*/
-    /*UA_StatusCode retval = openSecureChannel(client, true);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;*/
-
-    /* Adjusting the request header. The const attribute is violated, but we
-     * only touch the following members: */
-    UA_RequestHeader *rr = (UA_RequestHeader*)(uintptr_t)request;
-    rr->authenticationToken = client->authenticationToken; /* cleaned up at the end */
-    rr->timestamp = UA_DateTime_now();
-    rr->requestHandle = ++client->requestHandle;
-
-    /* Send the request */
-    UA_UInt32 rqId = ++client->requestId;
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Sending a request of type %i", requestType->typeId.identifier.numeric);
-
-    if (client->channel.nextSecurityToken.tokenId != 0) // Change to the new security token if the secure channel has been renewed.
-        UA_SecureChannel_revolveTokens(&client->channel);
-    retval = UA_SecureChannel_sendSymmetricMessage(&client->channel, rqId, UA_MESSAGETYPE_MSG,
-                                                   rr, requestType);
-    UA_NodeId_init(&rr->authenticationToken); /* Do not return the token to the user */
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    *requestId = rqId;
-    return UA_STATUSCODE_GOOD;
-}
-
-static const UA_NodeId
-serviceFaultId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTBINARY}};
-
-/* Look for the async callback in the linked list, execute and delete it */
-static UA_StatusCode
-processAsyncResponse(UA_Client *client, UA_UInt32 requestId, const UA_NodeId *responseTypeId,
-                     const UA_ByteString *responseMessage, size_t *offset) {
-    /* Find the callback */
-    AsyncServiceCall *ac;
-    LIST_FOREACH(ac, &client->asyncServiceCalls, pointers) {
-        if(ac->requestId == requestId)
-            break;
-    }
-    if(!ac)
-        return UA_STATUSCODE_BADREQUESTHEADERINVALID;
-
-    /* Allocate the response */
-    UA_STACKARRAY(UA_Byte, responseBuf, ac->responseType->memSize);
-    void *response = (void*)(uintptr_t)&responseBuf[0]; /* workaround aliasing rules */
-
-    /* Verify the type of the response */
-    const UA_DataType *responseType = ac->responseType;
-    const UA_NodeId expectedNodeId = UA_NODEID_NUMERIC(0, ac->responseType->binaryEncodingId);
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(!UA_NodeId_equal(responseTypeId, &expectedNodeId)) {
-        UA_init(response, ac->responseType);
-        if(UA_NodeId_equal(responseTypeId, &serviceFaultId)) {
-            /* Decode as a ServiceFault, i.e. only the response header */
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "Received a ServiceFault response");
-            responseType = &UA_TYPES[UA_TYPES_SERVICEFAULT];
-        } else {
-            /* Close the connection */
-            UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Reply contains the wrong service response");
-            retval = UA_STATUSCODE_BADCOMMUNICATIONERROR;
-            goto process;
-        }
-    }
-
-    /* Decode the response */
-    retval = UA_decodeBinary(responseMessage, offset, response, responseType, client->config.customDataTypes);
-
- process:
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Could not decode the response with id %u due to %s",
-                    requestId, UA_StatusCode_name(retval));
-        ((UA_ResponseHeader*)response)->serviceResult = retval;
-    } else if(((UA_ResponseHeader*)response)->serviceResult != UA_STATUSCODE_GOOD) {
-        /* Decode as a ServiceFault, i.e. only the response header */
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "The ServiceResult has the StatusCode %s",
-                    UA_StatusCode_name(((UA_ResponseHeader*)response)->serviceResult));
-    }
-
-    /* Call the callback */
-    if(ac->callback)
-        ac->callback(client, ac->userdata, requestId, response);
-    UA_deleteMembers(response, ac->responseType);
-
-    /* Remove the callback */
-    LIST_REMOVE(ac, pointers);
-    UA_free(ac);
-    return retval;
-}
-
-/* Processes the received service response. Either with an async callback or by
- * decoding the message and returning it "upwards" in the
- * SyncResponseDescription. */
-static void
-processServiceResponse(void *application, UA_SecureChannel *channel,
-                       UA_MessageType messageType, UA_UInt32 requestId,
-                       const UA_ByteString *message) {
-    SyncResponseDescription *rd = (SyncResponseDescription*)application;
-
-    /* Must be OPN or MSG */
-    if(messageType != UA_MESSAGETYPE_OPN &&
-       messageType != UA_MESSAGETYPE_MSG) {
-        UA_LOG_TRACE_CHANNEL(&rd->client->config.logger, channel,
-                             "Invalid message type");
-        return;
-    }
-
-    /* Forward declaration for the goto */
-    UA_NodeId expectedNodeId = UA_NODEID_NULL;
-
-    /* Decode the data type identifier of the response */
-    size_t offset = 0;
-    UA_NodeId responseId;
-    UA_StatusCode retval = UA_NodeId_decodeBinary(message, &offset, &responseId);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto finish;
-
-    /* Got an asynchronous response. Don't expected a synchronous response
-     * (responseType NULL) or the id does not match. */
-    if(!rd->responseType || requestId != rd->requestId) {
-        retval = processAsyncResponse(rd->client, requestId, &responseId, message, &offset);
-        goto finish;
-    }
-
-    /* Got the synchronous response */
-    rd->received = true;
-
-    /* Check that the response type matches */
-    expectedNodeId = UA_NODEID_NUMERIC(0, rd->responseType->binaryEncodingId);
-    if(!UA_NodeId_equal(&responseId, &expectedNodeId)) {
-        if(UA_NodeId_equal(&responseId, &serviceFaultId)) {
-            UA_init(rd->response, rd->responseType);
-            retval = UA_decodeBinary(message, &offset, rd->response,
-                                     &UA_TYPES[UA_TYPES_SERVICEFAULT],
-                                     rd->client->config.customDataTypes);
-            if(retval != UA_STATUSCODE_GOOD)
-                ((UA_ResponseHeader*)rd->response)->serviceResult = retval;
-            UA_LOG_INFO(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "Received a ServiceFault response with StatusCode %s",
-                        UA_StatusCode_name(((UA_ResponseHeader*)rd->response)->serviceResult));
-        } else {
-            /* Close the connection */
-            UA_LOG_ERROR(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Reply contains the wrong service response");
-            retval = UA_STATUSCODE_BADCOMMUNICATIONERROR;
-        }
-        goto finish;
-    }
-
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-    UA_LOG_DEBUG(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Decode a message of type %s", rd->responseType->typeName);
-#else
-    UA_LOG_DEBUG(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Decode a message of type %u", responseId.identifier.numeric);
-#endif
-
-    /* Decode the response */
-    retval = UA_decodeBinary(message, &offset, rd->response, rd->responseType,
-                             rd->client->config.customDataTypes);
-
-finish:
-    UA_NodeId_deleteMembers(&responseId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        if(retval == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED)
-            retval = UA_STATUSCODE_BADRESPONSETOOLARGE;
-        UA_LOG_INFO(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Error receiving the response with status code %s",
-                    UA_StatusCode_name(retval));
-
-        if(rd->response) {
-            UA_ResponseHeader *respHeader = (UA_ResponseHeader*)rd->response;
-            respHeader->serviceResult = retval;
-        }
-    }
-}
-
-/* Forward complete chunks directly to the securechannel */
-static UA_StatusCode
-client_processChunk(void *application, UA_Connection *connection, UA_ByteString *chunk) {
-    SyncResponseDescription *rd = (SyncResponseDescription*)application;
-    UA_StatusCode retval = UA_SecureChannel_decryptAddChunk(&rd->client->channel, chunk, true);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    return UA_SecureChannel_persistIncompleteMessages(&rd->client->channel);
-}
-
-/* Receive and process messages until a synchronous message arrives or the
- * timout finishes */
-UA_StatusCode
-receiveServiceResponse(UA_Client *client, void *response, const UA_DataType *responseType,
-                       UA_DateTime maxDate, const UA_UInt32 *synchronousRequestId) {
-    /* Prepare the response and the structure we give into processServiceResponse */
-    SyncResponseDescription rd = { client, false, 0, response, responseType };
-
-    /* Return upon receiving the synchronized response. All other responses are
-     * processed with a callback "in the background". */
-    if(synchronousRequestId)
-        rd.requestId = *synchronousRequestId;
-
-    UA_StatusCode retval;
-    do {
-        UA_DateTime now = UA_DateTime_nowMonotonic();
-
-        /* >= avoid timeout to be set to 0 */
-        if(now >= maxDate)
-            return UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-        /* round always to upper value to avoid timeout to be set to 0
-         * if(maxDate - now) < (UA_DATETIME_MSEC/2) */
-        UA_UInt32 timeout = (UA_UInt32)(((maxDate - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC);
-
-        retval = UA_Connection_receiveChunksBlocking(&client->connection, &rd, client_processChunk, timeout);
-        UA_SecureChannel_processCompleteMessages(&client->channel, &rd, processServiceResponse);
-
-        if(retval != UA_STATUSCODE_GOOD && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) {
-            if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED)
-                setClientState(client, UA_CLIENTSTATE_DISCONNECTED);
-            UA_Client_disconnect(client);
-            break;
-        }
-    } while(!rd.received);
-    return retval;
-}
-
-void
-__UA_Client_Service(UA_Client *client, const void *request,
-                    const UA_DataType *requestType, void *response,
-                    const UA_DataType *responseType) {
-    UA_init(response, responseType);
-    UA_ResponseHeader *respHeader = (UA_ResponseHeader*)response;
-
-    /* Send the request */
-    UA_UInt32 requestId;
-    UA_StatusCode retval = sendSymmetricServiceRequest(client, request, requestType, &requestId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        if(retval == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED)
-            respHeader->serviceResult = UA_STATUSCODE_BADREQUESTTOOLARGE;
-        else
-            respHeader->serviceResult = retval;
-        UA_Client_disconnect(client);
-        return;
-    }
-
-    /* Retrieve the response */
-    UA_DateTime maxDate = UA_DateTime_nowMonotonic() +
-        (client->config.timeout * UA_DATETIME_MSEC);
-    retval = receiveServiceResponse(client, response, responseType, maxDate, &requestId);
-    if(retval == UA_STATUSCODE_GOODNONCRITICALTIMEOUT) {
-        /* In synchronous service, if we have don't have a reply we need to close the connection */
-        UA_Client_disconnect(client);
-        retval = UA_STATUSCODE_BADCONNECTIONCLOSED;
-    }
-    if(retval != UA_STATUSCODE_GOOD)
-        respHeader->serviceResult = retval;
-}
-
-UA_StatusCode
-receiveServiceResponseAsync(UA_Client *client, void *response,
-                             const UA_DataType *responseType) {
-    SyncResponseDescription rd = { client, false, 0, response, responseType };
-
-    UA_StatusCode retval = UA_Connection_receiveChunksNonBlocking(
-            &client->connection, &rd, client_processChunk);
-    UA_SecureChannel_processCompleteMessages(&client->channel, &rd, processServiceResponse);
-    /*let client run when non critical timeout*/
-    if(retval != UA_STATUSCODE_GOOD
-            && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) {
-        if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) {
-            setClientState(client, UA_CLIENTSTATE_DISCONNECTED);
-        }
-        UA_Client_disconnect(client);
-    }
-    return retval;
-}
-
-UA_StatusCode
-receivePacketAsync(UA_Client *client) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if (UA_Client_getState(client) == UA_CLIENTSTATE_DISCONNECTED ||
-            UA_Client_getState(client) == UA_CLIENTSTATE_WAITING_FOR_ACK) {
-        retval = UA_Connection_receiveChunksNonBlocking(&client->connection, client, processACKResponseAsync);
-    }
-    else if(UA_Client_getState(client) == UA_CLIENTSTATE_CONNECTED) {
-        retval = UA_Connection_receiveChunksNonBlocking(&client->connection, client, processOPNResponseAsync);
-    }
-    if(retval != UA_STATUSCODE_GOOD && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) {
-        if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED)
-            setClientState(client, UA_CLIENTSTATE_DISCONNECTED);
-        UA_Client_disconnect(client);
-    }
-    return retval;
-}
-
-void
-UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac,
-                              UA_StatusCode statusCode) {
-    /* Create an empty response with the statuscode */
-    UA_STACKARRAY(UA_Byte, responseBuf, ac->responseType->memSize);
-    void *resp = (void*)(uintptr_t)&responseBuf[0]; /* workaround aliasing rules */
-    UA_init(resp, ac->responseType);
-    ((UA_ResponseHeader*)resp)->serviceResult = statusCode;
-
-    if(ac->callback)
-        ac->callback(client, ac->userdata, ac->requestId, resp);
-
-    /* Clean up the response. Users might move data into it. For whatever reasons. */
-    UA_deleteMembers(resp, ac->responseType);
-}
-
-void UA_Client_AsyncService_removeAll(UA_Client *client, UA_StatusCode statusCode) {
-    AsyncServiceCall *ac, *ac_tmp;
-    LIST_FOREACH_SAFE(ac, &client->asyncServiceCalls, pointers, ac_tmp) {
-        LIST_REMOVE(ac, pointers);
-        UA_Client_AsyncService_cancel(client, ac, statusCode);
-        UA_free(ac);
-    }
-}
-
-UA_StatusCode
-__UA_Client_AsyncServiceEx(UA_Client *client, const void *request,
-                           const UA_DataType *requestType,
-                           UA_ClientAsyncServiceCallback callback,
-                           const UA_DataType *responseType,
-                           void *userdata, UA_UInt32 *requestId,
-                           UA_UInt32 timeout) {
-    /* Prepare the entry for the linked list */
-    AsyncServiceCall *ac = (AsyncServiceCall*)UA_malloc(sizeof(AsyncServiceCall));
-    if(!ac)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    ac->callback = callback;
-    ac->responseType = responseType;
-    ac->userdata = userdata;
-    ac->timeout = timeout;
-
-    /* Call the service and set the requestId */
-    UA_StatusCode retval = sendSymmetricServiceRequest(client, request, requestType, &ac->requestId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(ac);
-        return retval;
-    }
-
-    ac->start = UA_DateTime_nowMonotonic();
-
-    /* Store the entry for async processing */
-    LIST_INSERT_HEAD(&client->asyncServiceCalls, ac, pointers);
-    if(requestId)
-        *requestId = ac->requestId;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-__UA_Client_AsyncService(UA_Client *client, const void *request,
-                         const UA_DataType *requestType,
-                         UA_ClientAsyncServiceCallback callback,
-                         const UA_DataType *responseType,
-                         void *userdata, UA_UInt32 *requestId) {
-    return __UA_Client_AsyncServiceEx(client, request, requestType, callback,
-                                      responseType, userdata, requestId,
-                                      client->config.timeout);
-}
-
-
-UA_StatusCode
-UA_Client_sendAsyncRequest(UA_Client *client, const void *request,
-                           const UA_DataType *requestType,
-                           UA_ClientAsyncServiceCallback callback,
-                           const UA_DataType *responseType, void *userdata,
-                           UA_UInt32 *requestId) {
-    if (UA_Client_getState(client) < UA_CLIENTSTATE_SECURECHANNEL) {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-				"Client must be connected to send high-level requests");
-		return UA_STATUSCODE_BADSERVERNOTCONNECTED;
-    }
-    return __UA_Client_AsyncService(client, request, requestType, callback,
-                                    responseType, userdata, requestId);
-}
-
-UA_StatusCode UA_EXPORT
-UA_Client_addTimedCallback(UA_Client *client, UA_ClientCallback callback,
-                           void *data, UA_DateTime date, UA_UInt64 *callbackId) {
-    return UA_Timer_addTimedCallback(&client->timer, (UA_ApplicationCallback) callback,
-                                     client, data, date, callbackId);
-}
-
-UA_StatusCode
-UA_Client_addRepeatedCallback(UA_Client *client, UA_ClientCallback callback,
-                              void *data, UA_Double interval_ms, UA_UInt64 *callbackId) {
-    return UA_Timer_addRepeatedCallback(&client->timer, (UA_ApplicationCallback) callback,
-                                        client, data, interval_ms, callbackId);
-}
-
-UA_StatusCode
-UA_Client_changeRepeatedCallbackInterval(UA_Client *client, UA_UInt64 callbackId,
-                                         UA_Double interval_ms) {
-    return UA_Timer_changeRepeatedCallbackInterval(&client->timer, callbackId,
-                                                   interval_ms);
-}
-
-void
-UA_Client_removeCallback(UA_Client *client, UA_UInt64 callbackId) {
-    UA_Timer_removeCallback(&client->timer, callbackId);
-}
diff --git a/ext/open62541/src/client/ua_client_connect.c b/ext/open62541/src/client/ua_client_connect.c
deleted file mode 100644
index 4a11a83..0000000
--- a/ext/open62541/src/client/ua_client_connect.c
+++ /dev/null
@@ -1,1122 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2017-2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Kalycito Infotech Private Limited
- */
-
-#include <open62541/transport_generated.h>
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/transport_generated_handling.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_client_internal.h"
-
-/* Size are refered in bytes */
-#define UA_MINMESSAGESIZE                8192
-#define UA_SESSION_LOCALNONCELENGTH      32
-#define MAX_DATA_SIZE                    4096
-
- /********************/
- /* Set client state */
- /********************/
-void
-setClientState(UA_Client *client, UA_ClientState state) {
-    if(client->state != state) {
-        client->state = state;
-        if(client->config.stateCallback)
-            client->config.stateCallback(client, client->state);
-    }
-}
-
-/***********************/
-/* Open the Connection */
-/***********************/
-
-#define UA_BITMASK_MESSAGETYPE 0x00ffffffu
-#define UA_BITMASK_CHUNKTYPE 0xff000000u
-
-static UA_StatusCode
-processACKResponse(void *application, UA_Connection *connection, UA_ByteString *chunk) {
-    UA_Client *client = (UA_Client*)application;
-
-    /* Decode the message */
-    size_t offset = 0;
-    UA_StatusCode retval;
-    UA_TcpMessageHeader messageHeader;
-    UA_TcpAcknowledgeMessage ackMessage;
-    retval = UA_TcpMessageHeader_decodeBinary(chunk, &offset, &messageHeader);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Decoding ACK message failed");
-        return retval;
-    }
-
-    // check if we got an error response from the server
-    UA_MessageType messageType = (UA_MessageType)
-        (messageHeader.messageTypeAndChunkType & UA_BITMASK_MESSAGETYPE);
-    UA_ChunkType chunkType = (UA_ChunkType)
-        (messageHeader.messageTypeAndChunkType & UA_BITMASK_CHUNKTYPE);
-    if (messageType == UA_MESSAGETYPE_ERR) {
-        // Header + ErrorMessage (error + reasonLength_field + length)
-        UA_StatusCode error = *(UA_StatusCode*)(&chunk->data[offset]);
-        UA_UInt32 len = *((UA_UInt32*)&chunk->data[offset + 4]);
-        UA_Byte *data = (UA_Byte*)&chunk->data[offset + 4+4];
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                    "Received ERR response. %s - %.*s", UA_StatusCode_name(error), len, data);
-        return error;
-    }
-    if (chunkType != UA_CHUNKTYPE_FINAL) {
-        return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-    }
-
-    /* Decode the ACK message */
-    retval = UA_TcpAcknowledgeMessage_decodeBinary(chunk, &offset, &ackMessage);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Decoding ACK message failed");
-        return retval;
-    }
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Received ACK message");
-
-    /* Process the ACK message */
-    return UA_Connection_processHELACK(connection, &client->config.localConnectionConfig,
-                                       (const UA_ConnectionConfig*)&ackMessage);
-}
-
-static UA_StatusCode
-HelAckHandshake(UA_Client *client, const UA_String endpointUrl) {
-    /* Get a buffer */
-    UA_ByteString message;
-    UA_Connection *conn = &client->connection;
-    UA_StatusCode retval = conn->getSendBuffer(conn, UA_MINMESSAGESIZE, &message);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Prepare the HEL message and encode at offset 8 */
-    UA_TcpHelloMessage hello;
-    /* just reference to avoid copy */
-    hello.endpointUrl = endpointUrl;
-    memcpy(&hello, &client->config.localConnectionConfig,
-           sizeof(UA_ConnectionConfig)); /* same struct layout */
-
-    UA_Byte *bufPos = &message.data[8]; /* skip the header */
-    const UA_Byte *bufEnd = &message.data[message.length];
-    retval = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos, bufEnd);
-    /* avoid deleting reference */
-    hello.endpointUrl = UA_STRING_NULL;
-    UA_TcpHelloMessage_deleteMembers(&hello);
-    if(retval != UA_STATUSCODE_GOOD) {
-        conn->releaseSendBuffer(conn, &message);
-        return retval;
-    }
-
-    /* Encode the message header at offset 0 */
-    UA_TcpMessageHeader messageHeader;
-    messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL;
-    messageHeader.messageSize = (UA_UInt32)((uintptr_t)bufPos - (uintptr_t)message.data);
-    bufPos = message.data;
-    retval = UA_TcpMessageHeader_encodeBinary(&messageHeader, &bufPos, bufEnd);
-    if(retval != UA_STATUSCODE_GOOD) {
-        conn->releaseSendBuffer(conn, &message);
-        return retval;
-    }
-
-    /* Send the HEL message */
-    message.length = messageHeader.messageSize;
-    retval = conn->send(conn, &message);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Sending HEL failed");
-        return retval;
-    }
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                 "Sent HEL message");
-
-    /* Loop until we have a complete chunk */
-    retval = UA_Connection_receiveChunksBlocking(conn, client, processACKResponse,
-                                                 client->config.timeout);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Receiving ACK message failed with %s", UA_StatusCode_name(retval));
-        if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED)
-            client->state = UA_CLIENTSTATE_DISCONNECTED;
-        UA_Client_disconnect(client);
-    }
-    return retval;
-}
-
-UA_SecurityPolicy *
-getSecurityPolicy(UA_Client *client, UA_String policyUri) {
-    for(size_t i = 0; i < client->config.securityPoliciesSize; i++) {
-        if(UA_String_equal(&policyUri, &client->config.securityPolicies[i].policyUri))
-            return &client->config.securityPolicies[i];
-    }
-    return NULL;
-}
-
-static void
-processDecodedOPNResponse(UA_Client *client, UA_OpenSecureChannelResponse *response,
-                          UA_Boolean renew) {
-    /* Replace the token */
-    if(renew)
-        client->channel.nextSecurityToken = response->securityToken;
-    else
-        client->channel.securityToken = response->securityToken;
-
-    /* Replace the nonce */
-    UA_ByteString_deleteMembers(&client->channel.remoteNonce);
-    client->channel.remoteNonce = response->serverNonce;
-    UA_ByteString_init(&response->serverNonce);
-
-    if(client->channel.state == UA_SECURECHANNELSTATE_OPEN)
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "SecureChannel renewed");
-    else
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Opened SecureChannel with SecurityPolicy %.*s",
-                    (int)client->channel.securityPolicy->policyUri.length,
-                    client->channel.securityPolicy->policyUri.data);
-
-    /* Response.securityToken.revisedLifetime is UInt32 we need to cast it to
-     * DateTime=Int64 we take 75% of lifetime to start renewing as described in
-     * standard */
-    client->channel.state = UA_SECURECHANNELSTATE_OPEN;
-    client->nextChannelRenewal = UA_DateTime_nowMonotonic() + (UA_DateTime)
-        (client->channel.securityToken.revisedLifetime * (UA_Double)UA_DATETIME_MSEC * 0.75);
-}
-
-UA_StatusCode
-openSecureChannel(UA_Client *client, UA_Boolean renew) {
-    /* Check if sc is still valid */
-    if(renew && client->nextChannelRenewal > UA_DateTime_nowMonotonic())
-        return UA_STATUSCODE_GOOD;
-
-    UA_Connection *conn = &client->connection;
-    if(conn->state != UA_CONNECTION_ESTABLISHED)
-        return UA_STATUSCODE_BADSERVERNOTCONNECTED;
-
-    /* Prepare the OpenSecureChannelRequest */
-    UA_OpenSecureChannelRequest opnSecRq;
-    UA_OpenSecureChannelRequest_init(&opnSecRq);
-    opnSecRq.requestHeader.timestamp = UA_DateTime_now();
-    opnSecRq.requestHeader.authenticationToken = client->authenticationToken;
-    if(renew) {
-        opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_RENEW;
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                     "Requesting to renew the SecureChannel");
-    } else {
-        opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_ISSUE;
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                     "Requesting to open a SecureChannel");
-    }
-
-    /* Set the securityMode to input securityMode from client data */
-    opnSecRq.securityMode = client->channel.securityMode;
-
-    opnSecRq.clientNonce = client->channel.localNonce;
-    opnSecRq.requestedLifetime = client->config.secureChannelLifeTime;
-
-    /* Send the OPN message */
-    UA_UInt32 requestId = ++client->requestId;
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&client->channel, requestId, &opnSecRq,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                     "Sending OPN message failed with error %s", UA_StatusCode_name(retval));
-        UA_Client_disconnect(client);
-        return retval;
-    }
-
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "OPN message sent");
-
-    /* Increase nextChannelRenewal to avoid that we re-start renewal when
-     * publish responses are received before the OPN response arrives. */
-    client->nextChannelRenewal = UA_DateTime_nowMonotonic() +
-        (2 * ((UA_DateTime)client->config.timeout * UA_DATETIME_MSEC));
-
-    /* Receive / decrypt / decode the OPN response. Process async services in
-     * the background until the OPN response arrives. */
-    UA_OpenSecureChannelResponse response;
-    retval = receiveServiceResponse(client, &response,
-                                    &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE],
-                                    UA_DateTime_nowMonotonic() +
-                                    ((UA_DateTime)client->config.timeout * UA_DATETIME_MSEC),
-                                    &requestId);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                     "Receiving service response failed with error %s", UA_StatusCode_name(retval));
-        UA_Client_disconnect(client);
-        return retval;
-    }
-
-    processDecodedOPNResponse(client, &response, renew);
-    UA_OpenSecureChannelResponse_deleteMembers(&response);
-    return retval;
-}
-
-/* Function to verify the signature corresponds to ClientNonce
- * using the local certificate */
-static UA_StatusCode
-checkClientSignature(const UA_SecureChannel *channel,
-                     const UA_CreateSessionResponse *response) {
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-
-    if(!channel->securityPolicy)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    const UA_SecurityPolicy *sp = channel->securityPolicy;
-    const UA_ByteString *lc = &sp->localCertificate;
-
-    size_t dataToVerifySize = lc->length + channel->localNonce.length;
-    UA_ByteString dataToVerify = UA_BYTESTRING_NULL;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&dataToVerify, dataToVerifySize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    memcpy(dataToVerify.data, lc->data, lc->length);
-    memcpy(dataToVerify.data + lc->length,
-           channel->localNonce.data, channel->localNonce.length);
-
-    retval = sp->certificateSigningAlgorithm.
-        verify(sp, channel->channelContext, &dataToVerify,
-               &response->serverSignature.signature);
-    UA_ByteString_deleteMembers(&dataToVerify);
-    return retval;
-}
-
-/* Function to create a signature using remote certificate and nonce */
-#ifdef UA_ENABLE_ENCRYPTION
-UA_StatusCode
-signActivateSessionRequest(UA_SecureChannel *channel,
-                           UA_ActivateSessionRequest *request) {
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-
-    const UA_SecurityPolicy *sp = channel->securityPolicy;
-    UA_SignatureData *sd = &request->clientSignature;
-
-    /* Prepare the signature */
-    size_t signatureSize = sp->certificateSigningAlgorithm.
-        getLocalSignatureSize(sp, channel->channelContext);
-    UA_StatusCode retval = UA_String_copy(&sp->certificateSigningAlgorithm.uri,
-                                          &sd->algorithm);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_ByteString_allocBuffer(&sd->signature, signatureSize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Allocate a temporary buffer */
-    size_t dataToSignSize = channel->remoteCertificate.length + channel->remoteNonce.length;
-    if(dataToSignSize > MAX_DATA_SIZE)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_ByteString dataToSign;
-    retval = UA_ByteString_allocBuffer(&dataToSign, dataToSignSize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval; /* sd->signature is cleaned up with the response */
-
-    /* Sign the signature */
-    memcpy(dataToSign.data, channel->remoteCertificate.data,
-           channel->remoteCertificate.length);
-    memcpy(dataToSign.data + channel->remoteCertificate.length,
-           channel->remoteNonce.data, channel->remoteNonce.length);
-    retval = sp->certificateSigningAlgorithm.sign(sp, channel->channelContext,
-                                                  &dataToSign, &sd->signature);
-
-    /* Clean up */
-    UA_ByteString_deleteMembers(&dataToSign);
-    return retval;
-}
-
-UA_StatusCode
-encryptUserIdentityToken(UA_Client *client, const UA_String *userTokenSecurityPolicy,
-                         UA_ExtensionObject *userIdentityToken) {
-    UA_IssuedIdentityToken *iit = NULL;
-    UA_UserNameIdentityToken *unit = NULL;
-    UA_ByteString *tokenData;
-    if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]) {
-        iit = (UA_IssuedIdentityToken*)userIdentityToken->content.decoded.data;
-        tokenData = &iit->tokenData;
-    } else if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) {
-        unit = (UA_UserNameIdentityToken*)userIdentityToken->content.decoded.data;
-        tokenData = &unit->password;
-    } else {
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* No encryption */
-    const UA_String none = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
-    if(userTokenSecurityPolicy->length == 0 ||
-       UA_String_equal(userTokenSecurityPolicy, &none)) {
-        return UA_STATUSCODE_GOOD;
-    }
-
-    UA_SecurityPolicy *sp = getSecurityPolicy(client, *userTokenSecurityPolicy);
-    if(!sp) {
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not find the required SecurityPolicy for the UserToken");
-        return UA_STATUSCODE_BADSECURITYPOLICYREJECTED;
-    }
-
-    /* Create a temp channel context */
-
-    void *channelContext;
-    UA_StatusCode retval = sp->channelModule.
-        newContext(sp, &client->config.endpoint.serverCertificate, &channelContext);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                       "Could not instantiate the SecurityPolicy for the UserToken");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    
-    /* Compute the encrypted length (at least one byte padding) */
-    size_t plainTextBlockSize = sp->asymmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemotePlainTextBlockSize(sp, channelContext);
-    UA_UInt32 length = (UA_UInt32)(tokenData->length + client->channel.remoteNonce.length);
-    UA_UInt32 totalLength = length + 4; /* Including the length field */
-    size_t blocks = totalLength / plainTextBlockSize;
-    if(totalLength  % plainTextBlockSize != 0)
-        blocks++;
-    size_t overHead =
-        UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(sp, channelContext,
-                                                                      blocks * plainTextBlockSize);
-
-    /* Allocate memory for encryption overhead */
-    UA_ByteString encrypted;
-    retval = UA_ByteString_allocBuffer(&encrypted, (blocks * plainTextBlockSize) + overHead);
-    if(retval != UA_STATUSCODE_GOOD) {
-        sp->channelModule.deleteContext(channelContext);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    UA_Byte *pos = encrypted.data;
-    const UA_Byte *end = &encrypted.data[encrypted.length];
-    UA_UInt32_encodeBinary(&length, &pos, end);
-    memcpy(pos, tokenData->data, tokenData->length);
-    memcpy(&pos[tokenData->length], client->channel.remoteNonce.data,
-           client->channel.remoteNonce.length);
-
-    /* Add padding
-     *
-     * 7.36.2.2 Legacy Encrypted Token Secret Format: A Client should not add any
-     * padding after the secret. If a Client adds padding then all bytes shall
-     * be zero. A Server shall check for padding added by Clients and ensure
-     * that all padding bytes are zeros. */
-    size_t paddedLength = plainTextBlockSize * blocks;
-    for(size_t i = totalLength; i < paddedLength; i++)
-        encrypted.data[i] = 0;
-    encrypted.length = paddedLength;
-
-    retval = sp->asymmetricModule.cryptoModule.encryptionAlgorithm.encrypt(sp, channelContext,
-                                                                           &encrypted);
-    encrypted.length = (blocks * plainTextBlockSize) + overHead;
-
-    if(iit) {
-        retval |= UA_String_copy(&sp->asymmetricModule.cryptoModule.encryptionAlgorithm.uri,
-                                 &iit->encryptionAlgorithm);
-    } else {
-        retval |= UA_String_copy(&sp->asymmetricModule.cryptoModule.encryptionAlgorithm.uri,
-                                 &unit->encryptionAlgorithm);
-    }
-
-    UA_ByteString_deleteMembers(tokenData);
-    *tokenData = encrypted;
-
-    /* Delete the temp channel context */
-    sp->channelModule.deleteContext(channelContext);
-
-    return retval;
-}
-#endif
-
-static UA_StatusCode
-activateSession(UA_Client *client) {
-    UA_ActivateSessionRequest request;
-    UA_ActivateSessionRequest_init(&request);
-    request.requestHeader.requestHandle = ++client->requestHandle;
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 600000;
-    UA_StatusCode retval =
-        UA_ExtensionObject_copy(&client->config.userIdentityToken, &request.userIdentityToken);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* If not token is set, use anonymous */
-    if(request.userIdentityToken.encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) {
-        UA_AnonymousIdentityToken *t = UA_AnonymousIdentityToken_new();
-        if(!t) {
-            UA_ActivateSessionRequest_deleteMembers(&request);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        request.userIdentityToken.content.decoded.data = t;
-        request.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN];
-        request.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED;
-    }
-
-    /* Set the policy-Id from the endpoint. Every IdentityToken starts with a
-     * string. */
-    retval = UA_String_copy(&client->config.userTokenPolicy.policyId,
-                            (UA_String*)request.userIdentityToken.content.decoded.data);
-
-#ifdef UA_ENABLE_ENCRYPTION
-    /* Encrypt the UserIdentityToken */
-    const UA_String *userTokenPolicy = &client->channel.securityPolicy->policyUri;
-    if(client->config.userTokenPolicy.securityPolicyUri.length > 0)
-        userTokenPolicy = &client->config.userTokenPolicy.securityPolicyUri;
-    retval |= encryptUserIdentityToken(client, userTokenPolicy, &request.userIdentityToken);
-
-    /* This function call is to prepare a client signature */
-    retval |= signActivateSessionRequest(&client->channel, &request);
-#endif
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ActivateSessionRequest_deleteMembers(&request);
-        return retval;
-    }
-
-    UA_ActivateSessionResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]);
-
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "ActivateSession failed with error code %s",
-                     UA_StatusCode_name(response.responseHeader.serviceResult));
-    }
-
-    retval = response.responseHeader.serviceResult;
-    UA_ActivateSessionRequest_deleteMembers(&request);
-    UA_ActivateSessionResponse_deleteMembers(&response);
-    return retval;
-}
-
-/* Gets a list of endpoints. Memory is allocated for endpointDescription array */
-UA_StatusCode
-UA_Client_getEndpointsInternal(UA_Client *client, const UA_String endpointUrl,
-                               size_t *endpointDescriptionsSize,
-                               UA_EndpointDescription **endpointDescriptions) {
-    UA_GetEndpointsRequest request;
-    UA_GetEndpointsRequest_init(&request);
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    // assume the endpointurl outlives the service call
-    request.endpointUrl = endpointUrl;
-
-    UA_GetEndpointsResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]);
-
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_StatusCode retval = response.responseHeader.serviceResult;
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "GetEndpointRequest failed with error code %s",
-                     UA_StatusCode_name(retval));
-        UA_GetEndpointsResponse_deleteMembers(&response);
-        return retval;
-    }
-    *endpointDescriptions = response.endpoints;
-    *endpointDescriptionsSize = response.endpointsSize;
-    response.endpoints = NULL;
-    response.endpointsSize = 0;
-    UA_GetEndpointsResponse_deleteMembers(&response);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-selectEndpoint(UA_Client *client, const UA_String endpointUrl) {
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_StatusCode retval =
-        UA_Client_getEndpointsInternal(client, endpointUrl,
-                                       &endpointArraySize, &endpointArray);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_Boolean endpointFound = false;
-    UA_Boolean tokenFound = false;
-    UA_String binaryTransport = UA_STRING("http://opcfoundation.org/UA-Profile/"
-                                          "Transport/uatcp-uasc-uabinary");
-
-    UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Found %lu endpoints", (long unsigned)endpointArraySize);
-    for(size_t i = 0; i < endpointArraySize; ++i) {
-        UA_EndpointDescription* endpoint = &endpointArray[i];
-        /* Match Binary TransportProfile?
-         * Note: Siemens returns empty ProfileUrl, we will accept it as binary */
-        if(endpoint->transportProfileUri.length != 0 &&
-           !UA_String_equal(&endpoint->transportProfileUri, &binaryTransport))
-            continue;
-
-        /* Valid SecurityMode? */
-        if(endpoint->securityMode < 1 || endpoint->securityMode > 3) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: invalid security mode", (long unsigned)i);
-            continue;
-        }
-
-        /* Selected SecurityMode? */
-        if(client->config.securityMode > 0 &&
-           client->config.securityMode != endpoint->securityMode) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: security mode doesn't match", (long unsigned)i);
-            continue;
-        }
-
-        /* Matching SecurityPolicy? */
-        if(client->config.securityPolicyUri.length > 0 &&
-           !UA_String_equal(&client->config.securityPolicyUri,
-                            &endpoint->securityPolicyUri)) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: security policy doesn't match", (long unsigned)i);
-            continue;
-        }
-
-        /* SecurityPolicy available? */
-        if(!getSecurityPolicy(client, endpoint->securityPolicyUri)) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: security policy not available", (long unsigned)i);
-            continue;
-        }
-
-        endpointFound = true;
-
-        /* Select a matching UserTokenPolicy inside the endpoint */
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Endpoint %lu has %lu user token policies", (long unsigned)i, (long unsigned)endpoint->userIdentityTokensSize);
-        for(size_t j = 0; j < endpoint->userIdentityTokensSize; ++j) {
-            UA_UserTokenPolicy* userToken = &endpoint->userIdentityTokens[j];
-
-            /* Usertokens also have a security policy... */
-            if (userToken->securityPolicyUri.length > 0 &&
-                !getSecurityPolicy(client, userToken->securityPolicyUri)) {
-                UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu in endpoint %lu: security policy '%.*s' not available",
-                (long unsigned)j, (long unsigned)i,
-                (int)userToken->securityPolicyUri.length, userToken->securityPolicyUri.data);
-                continue;
-            }
-
-            if(userToken->tokenType > 3) {
-                UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu in endpoint %lu: invalid token type", (long unsigned)j, (long unsigned)i);
-                continue;
-            }
-
-            /* Does the token type match the client configuration? */
-            if (userToken->tokenType == UA_USERTOKENTYPE_ANONYMOUS &&
-                client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN] &&
-                client->config.userIdentityToken.content.decoded.type != NULL) {
-                UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (anonymous) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i);
-                continue;
-            }
-            if (userToken->tokenType == UA_USERTOKENTYPE_USERNAME &&
-                client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) {
-                UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (username) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i);
-                continue;
-            }
-            if (userToken->tokenType == UA_USERTOKENTYPE_CERTIFICATE &&
-                client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]) {
-                UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (certificate) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i);
-                continue;
-            }
-            if (userToken->tokenType == UA_USERTOKENTYPE_ISSUEDTOKEN &&
-                client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]) {
-                UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (token) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i);
-                continue;
-            }
-
-            /* Endpoint with matching UserTokenPolicy found. Copy to the configuration. */
-            tokenFound = true;
-            UA_EndpointDescription_deleteMembers(&client->config.endpoint);
-            UA_EndpointDescription temp = *endpoint;
-            temp.userIdentityTokensSize = 0;
-            temp.userIdentityTokens = NULL;
-            UA_UserTokenPolicy_deleteMembers(&client->config.userTokenPolicy);
-
-            retval = UA_EndpointDescription_copy(&temp, &client->config.endpoint);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Copying endpoint description failed with error code %s",
-                    UA_StatusCode_name(retval));
-                break;
-            }
-
-            retval = UA_UserTokenPolicy_copy(userToken, &client->config.userTokenPolicy);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Copying user token policy failed with error code %s",
-                    UA_StatusCode_name(retval));
-                break;
-            }
-
-#if UA_LOGLEVEL <= 300
-            const char *securityModeNames[3] = {"None", "Sign", "SignAndEncrypt"};
-            const char *userTokenTypeNames[4] = {"Anonymous", "UserName",
-                                                 "Certificate", "IssuedToken"};
-            UA_String *securityPolicyUri = &userToken->securityPolicyUri;
-            if(securityPolicyUri->length == 0)
-                securityPolicyUri = &endpoint->securityPolicyUri;
-
-            /* Log the selected endpoint */
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "Selected Endpoint %.*s with SecurityMode %s and SecurityPolicy %.*s",
-                        (int)endpoint->endpointUrl.length, endpoint->endpointUrl.data,
-                        securityModeNames[endpoint->securityMode - 1],
-                        (int)endpoint->securityPolicyUri.length,
-                        endpoint->securityPolicyUri.data);
-
-            /* Log the selected UserTokenPolicy */
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "Selected UserTokenPolicy %.*s with UserTokenType %s and SecurityPolicy %.*s",
-                        (int)userToken->policyId.length, userToken->policyId.data,
-                        userTokenTypeNames[userToken->tokenType],
-                        (int)securityPolicyUri->length, securityPolicyUri->data);
-#endif
-            break;
-        }
-
-        if(tokenFound)
-            break;
-    }
-
-    UA_Array_delete(endpointArray, endpointArraySize,
-                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    if(!endpointFound) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "No suitable endpoint found");
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    } else if(!tokenFound) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "No suitable UserTokenPolicy found for the possible endpoints");
-        retval = UA_STATUSCODE_BADINTERNALERROR;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-createSession(UA_Client *client) {
-    UA_CreateSessionRequest request;
-    UA_CreateSessionRequest_init(&request);
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-        if(client->channel.localNonce.length != UA_SESSION_LOCALNONCELENGTH) {
-           UA_ByteString_deleteMembers(&client->channel.localNonce);
-            retval = UA_ByteString_allocBuffer(&client->channel.localNonce,
-                                               UA_SESSION_LOCALNONCELENGTH);
-            if(retval != UA_STATUSCODE_GOOD)
-               return retval;
-        }
-
-        retval = client->channel.securityPolicy->symmetricModule.
-                 generateNonce(client->channel.securityPolicy, &client->channel.localNonce);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    UA_ByteString_copy(&client->channel.localNonce, &request.clientNonce);
-    request.requestedSessionTimeout = client->config.requestedSessionTimeout;
-    request.maxResponseMessageSize = UA_INT32_MAX;
-    UA_String_copy(&client->config.endpoint.endpointUrl, &request.endpointUrl);
-
-    UA_ApplicationDescription_copy(&client->config.clientDescription,
-                                   &request.clientDescription);
-
-    if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-        UA_ByteString_copy(&client->channel.securityPolicy->localCertificate,
-                           &request.clientCertificate);
-    }
-
-    UA_CreateSessionResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]);
-
-    if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD) {
-        /* Verify the encrypted response */
-        if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-           client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-
-            if(!UA_ByteString_equal(&response.serverCertificate,
-                                    &client->channel.remoteCertificate)) {
-                retval = UA_STATUSCODE_BADCERTIFICATEINVALID;
-                goto cleanup;
-            }
-
-            /* Verify the client signature */
-            retval = checkClientSignature(&client->channel, &response);
-            if(retval != UA_STATUSCODE_GOOD)
-                goto cleanup;
-        }
-
-        /* Copy nonce and and authenticationtoken */
-        UA_ByteString_deleteMembers(&client->channel.remoteNonce);
-        retval |= UA_ByteString_copy(&response.serverNonce, &client->channel.remoteNonce);
-
-        UA_NodeId_deleteMembers(&client->authenticationToken);
-        retval |= UA_NodeId_copy(&response.authenticationToken, &client->authenticationToken);
-    }
-
-    retval |= response.responseHeader.serviceResult;
-
- cleanup:
-    UA_CreateSessionRequest_deleteMembers(&request);
-    UA_CreateSessionResponse_deleteMembers(&response);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_connectTCPSecureChannel(UA_Client *client, const UA_String endpointUrl) {
-    if(client->state >= UA_CLIENTSTATE_CONNECTED)
-        return UA_STATUSCODE_GOOD;
-
-    UA_ChannelSecurityToken_init(&client->channel.securityToken);
-    client->channel.state = UA_SECURECHANNELSTATE_FRESH;
-    client->channel.sendSequenceNumber = 0;
-    client->requestId = 0;
-
-    /* Set the channel SecurityMode */
-    client->channel.securityMode = client->config.endpoint.securityMode;
-    if(client->channel.securityMode == UA_MESSAGESECURITYMODE_INVALID)
-        client->channel.securityMode = UA_MESSAGESECURITYMODE_NONE;
-
-    /* Initialized the SecureChannel */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Initialize the SecurityPolicy context");
-    if(!client->channel.securityPolicy) {
-        /* Set the channel SecurityPolicy to #None if no endpoint is selected */
-        UA_String sps = client->config.endpoint.securityPolicyUri;
-        if(sps.length == 0) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "SecurityPolicy not specified -> use default #None");
-            sps = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
-        }
-
-        UA_SecurityPolicy *sp = getSecurityPolicy(client, sps);
-        if(!sp) {
-            UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Failed to find the required security policy");
-            retval = UA_STATUSCODE_BADINTERNALERROR;
-            goto cleanup;
-        }
-        
-        
-        retval = UA_SecureChannel_setSecurityPolicy(&client->channel, sp,
-                                                    &client->config.endpoint.serverCertificate);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "Failed to set the security policy");
-            goto cleanup;
-        }
-    }
-
-    /* Open a TCP connection */
-    client->connection = client->config.connectionFunc(client->config.localConnectionConfig,
-                                                       endpointUrl, client->config.timeout,
-                                                       &client->config.logger);
-    if(client->connection.state != UA_CONNECTION_OPENING) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Opening the TCP socket failed");
-        retval = UA_STATUSCODE_BADCONNECTIONCLOSED;
-        goto cleanup;
-    }
-
-    UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                "TCP connection established");
-
-    /* Perform the HEL/ACK handshake */
-    client->connection.config = client->config.localConnectionConfig;
-    retval = HelAckHandshake(client, endpointUrl);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "HEL/ACK handshake failed");
-        goto cleanup;
-    }
-    setClientState(client, UA_CLIENTSTATE_CONNECTED);
-
-    /* Open a SecureChannel. */
-    retval = UA_SecureChannel_generateLocalNonce(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Generating a local nonce failed");
-        goto cleanup;
-    }
-    client->channel.connection = &client->connection;
-    retval = openSecureChannel(client, false);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Opening a secure channel failed");
-        goto cleanup;
-    }
-    retval = UA_SecureChannel_generateNewKeys(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Generating new keys failed");
-        return retval;
-    }
-    setClientState(client, UA_CLIENTSTATE_SECURECHANNEL);
-
-    return retval;
-
-cleanup:
-    UA_Client_disconnect(client);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_connectSession(UA_Client *client) {
-    if(client->state < UA_CLIENTSTATE_SECURECHANNEL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Delete async service. TODO: Move this from connect to the disconnect/cleanup phase */
-    UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN);
-
-    // TODO: actually, reactivate an existing session is working, but currently
-    // republish is not implemented This option is disabled until we have a good
-    // implementation of the subscription recovery.
-
-#ifdef UA_SESSION_RECOVERY
-    /* Try to activate an existing Session for this SecureChannel */
-    if((!UA_NodeId_equal(&client->authenticationToken, &UA_NODEID_NULL)) && (createNewSession)) {
-        UA_StatusCode res = activateSession(client);
-        if(res != UA_STATUSCODE_BADSESSIONIDINVALID) {
-            if(res == UA_STATUSCODE_GOOD) {
-                setClientState(client, UA_CLIENTSTATE_SESSION_RENEWED);
-            } else {
-                UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                             "Could not activate the Session with StatusCode %s",
-                             UA_StatusCode_name(retval));
-                UA_Client_disconnect(client);
-            }
-            return res;
-        }
-    }
-#endif /* UA_SESSION_RECOVERY */
-
-    /* Could not recover an old session. Remove authenticationToken */
-    UA_NodeId_deleteMembers(&client->authenticationToken);
-
-    /* Create a session */
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Create a new session");
-    UA_StatusCode retval = createSession(client);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Could not open a Session with StatusCode %s",
-                     UA_StatusCode_name(retval));
-        UA_Client_disconnect(client);
-        return retval;
-    }
-    
-    /* A new session has been created. We need to clean up the subscriptions */
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_Client_Subscriptions_clean(client);
-    client->currentlyOutStandingPublishRequests = 0;
-#endif
-
-    /* Activate the session */
-    retval = activateSession(client);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Could not activate the Session with StatusCode %s",
-                     UA_StatusCode_name(retval));
-        UA_Client_disconnect(client);
-        return retval;
-    }
-    setClientState(client, UA_CLIENTSTATE_SESSION);
-    return retval;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-/* The local ApplicationURI has to match the certificates of the
- * SecurityPolicies */
-static void
-verifyClientApplicationURI(const UA_Client *client) {
-#if UA_LOGLEVEL <= 400
-    for(size_t i = 0; i < client->config.securityPoliciesSize; i++) {
-        UA_SecurityPolicy *sp = &client->config.securityPolicies[i];
-        if(!sp->certificateVerification)
-            continue;
-        UA_StatusCode retval =
-            sp->certificateVerification->
-            verifyApplicationURI(sp->certificateVerification->context,
-                                 &sp->localCertificate,
-                                 &client->config.clientDescription.applicationUri);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                           "The configured ApplicationURI does not match the URI "
-                           "specified in the certificate for the SecurityPolicy %.*s",
-                           (int)sp->policyUri.length, sp->policyUri.data);
-        }
-    }
-#endif
-}
-#endif
-
-UA_StatusCode
-UA_Client_connectInternal(UA_Client *client, const UA_String endpointUrl) {
-    if(client->state >= UA_CLIENTSTATE_CONNECTED)
-        return UA_STATUSCODE_GOOD;
-
-    UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                "Connecting to endpoint %.*s", (int)endpointUrl.length,
-                endpointUrl.data);
-
-#ifdef UA_ENABLE_ENCRYPTION
-    verifyClientApplicationURI(client);
-#endif
-
-    /* Get endpoints only if the description has not been touched (memset to zero) */
-    UA_Byte test = 0;
-    UA_Byte *pos = (UA_Byte*)&client->config.endpoint;
-    for(size_t i = 0; i < sizeof(UA_EndpointDescription); i++)
-        test = test | pos[i];
-    pos = (UA_Byte*)&client->config.userTokenPolicy;
-    for(size_t i = 0; i < sizeof(UA_UserTokenPolicy); i++)
-        test = test | pos[i];
-    UA_Boolean getEndpoints = (test == 0);
-
-    /* Connect up to the SecureChannel */
-    UA_StatusCode retval = UA_Client_connectTCPSecureChannel(client, endpointUrl);
-    if (retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Couldn't connect the client to a TCP secure channel");
-        goto cleanup;
-    }
-    
-    /* Get and select endpoints if required */
-    if(getEndpoints) {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Endpoint and UserTokenPolicy unconfigured, perform GetEndpoints");
-        retval = selectEndpoint(client, endpointUrl);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-
-        /* Reconnect with a new SecureChannel if the current one does not match
-         * the selected endpoint */
-        if(!UA_String_equal(&client->config.endpoint.securityPolicyUri,
-                            &client->channel.securityPolicy->policyUri)) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "Disconnect to switch to a different SecurityPolicy");
-            UA_Client_disconnect(client);
-            return UA_Client_connectInternal(client, endpointUrl);
-        }
-    }
-
-    retval = UA_Client_connectSession(client);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    return retval;
-
-cleanup:
-    UA_Client_disconnect(client);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_connect(UA_Client *client, const char *endpointUrl) {
-    return UA_Client_connectInternal(client, UA_STRING((char*)(uintptr_t)endpointUrl));
-}
-
-UA_StatusCode
-UA_Client_connect_noSession(UA_Client *client, const char *endpointUrl) {
-    return UA_Client_connectTCPSecureChannel(client, UA_STRING((char*)(uintptr_t)endpointUrl));
-}
-
-UA_StatusCode
-UA_Client_connect_username(UA_Client *client, const char *endpointUrl,
-                           const char *username, const char *password) {
-    UA_UserNameIdentityToken* identityToken = UA_UserNameIdentityToken_new();
-    if(!identityToken)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    identityToken->userName = UA_STRING_ALLOC(username);
-    identityToken->password = UA_STRING_ALLOC(password);
-    UA_ExtensionObject_deleteMembers(&client->config.userIdentityToken);
-    client->config.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED;
-    client->config.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN];
-    client->config.userIdentityToken.content.decoded.data = identityToken;
-    return UA_Client_connect(client, endpointUrl);
-}
-
-/************************/
-/* Close the Connection */
-/************************/
-
-static void
-sendCloseSession(UA_Client *client) {
-    UA_CloseSessionRequest request;
-    UA_CloseSessionRequest_init(&request);
-
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    request.deleteSubscriptions = true;
-    UA_CloseSessionResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]);
-    UA_CloseSessionRequest_deleteMembers(&request);
-    UA_CloseSessionResponse_deleteMembers(&response);
-}
-
-static void
-sendCloseSecureChannel(UA_Client *client) {
-    UA_SecureChannel *channel = &client->channel;
-    UA_CloseSecureChannelRequest request;
-    UA_CloseSecureChannelRequest_init(&request);
-    request.requestHeader.requestHandle = ++client->requestHandle;
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    request.requestHeader.authenticationToken = client->authenticationToken;
-    UA_SecureChannel_sendSymmetricMessage(channel, ++client->requestId,
-                                          UA_MESSAGETYPE_CLO, &request,
-                                          &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]);
-    UA_CloseSecureChannelRequest_deleteMembers(&request);
-    UA_SecureChannel_close(&client->channel);
-    UA_SecureChannel_deleteMembers(&client->channel);
-}
-
-UA_StatusCode
-UA_Client_disconnect(UA_Client *client) {
-    /* Is a session established? */
-    if(client->state >= UA_CLIENTSTATE_SESSION) {
-        client->state = UA_CLIENTSTATE_SECURECHANNEL;
-        sendCloseSession(client);
-    }
-    UA_NodeId_deleteMembers(&client->authenticationToken);
-    client->requestHandle = 0;
-
-    /* Is a secure channel established? */
-    if(client->state >= UA_CLIENTSTATE_SECURECHANNEL) {
-        client->state = UA_CLIENTSTATE_CONNECTED;
-        sendCloseSecureChannel(client);
-    }
-
-    /* Close the TCP connection */
-    if(client->connection.state != UA_CONNECTION_CLOSED
-            && client->connection.state != UA_CONNECTION_OPENING)
-        /* UA_ClientConnectionTCP_init sets initial state to opening */
-        if(client->connection.close != NULL)
-            client->connection.close(&client->connection);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    // TODO REMOVE WHEN UA_SESSION_RECOVERY IS READY
-    /* We need to clean up the subscriptions */
-    UA_Client_Subscriptions_clean(client);
-#endif
-
-    UA_SecureChannel_deleteMembers(&client->channel);
-
-    setClientState(client, UA_CLIENTSTATE_DISCONNECTED);
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/src/client/ua_client_connect_async.c b/ext/open62541/src/client/ua_client_connect_async.c
deleted file mode 100644
index 28156ee..0000000
--- a/ext/open62541/src/client/ua_client_connect_async.c
+++ /dev/null
@@ -1,731 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/transport_generated.h>
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/transport_generated_handling.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_client_internal.h"
-
-#define UA_MINMESSAGESIZE                8192
-#define UA_SESSION_LOCALNONCELENGTH      32
-#define MAX_DATA_SIZE 4096
-
-/* Asynchronous client connection
- * To prepare an async connection, UA_Client_connectAsync() is called, which does not connect the
- * client directly. UA_Client_run_iterate() takes care of actually connecting the client:
- * if client is disconnected:
- *      send hello msg and set the client state to be WAITING_FOR_ACK
- *      (see UA_Client_connect_iterate())
- * if client is waiting for the ACK:
- *      call the non-blocking receiving function and register processACKResponseAsync() as its callback
- *      (see receivePacketAsync())
- * if ACK is processed (callback called):
- *      processACKResponseAsync() calls openSecureChannelAsync() at the end, which prepares the request
- *      to open secure channel and the client is connected
- * if client is connected:
- *      call the non-blocking receiving function and register processOPNResponse() as its callback
- *      (see receivePacketAsync())
- * if OPN-request processed (callback called)
- *      send session request, where the session response is put into a normal AsyncServiceCall, and when
- *      called, request to activate session is sent, where its response is again put into an AsyncServiceCall
- * in the very last step responseActivateSession():
- *      the user defined callback that is passed into UA_Client_connectAsync() is called and the
- *      async connection finalized.
- * */
-
-/***********************/
-/* Open the Connection */
-/***********************/
-static UA_StatusCode
-openSecureChannelAsync(UA_Client *client/*, UA_Boolean renew*/);
-
-static UA_StatusCode
-requestSession(UA_Client *client, UA_UInt32 *requestId);
-
-static UA_StatusCode
-requestGetEndpoints(UA_Client *client, UA_UInt32 *requestId);
-
-/*receives hello ack, opens secure channel*/
-UA_StatusCode
-processACKResponseAsync(void *application, UA_Connection *connection,
-                         UA_ByteString *chunk) {
-    UA_Client *client = (UA_Client*)application;
-
-    /* Decode the message */
-    size_t offset = 0;
-    UA_TcpMessageHeader messageHeader;
-    UA_TcpAcknowledgeMessage ackMessage;
-    client->connectStatus = UA_TcpMessageHeader_decodeBinary (chunk, &offset,
-                                                              &messageHeader);
-    client->connectStatus |= UA_TcpAcknowledgeMessage_decodeBinary(
-            chunk, &offset, &ackMessage);
-    if (client->connectStatus != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Decoding ACK message failed");
-        return client->connectStatus;
-    }
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Received ACK message");
-
-    client->connectStatus =
-        UA_Connection_processHELACK(connection, &client->config.localConnectionConfig,
-                                    (const UA_ConnectionConfig*)&ackMessage);
-    if(client->connectStatus != UA_STATUSCODE_GOOD)
-        return client->connectStatus;
-
-    client->state = UA_CLIENTSTATE_CONNECTED;
-
-    /* Open a SecureChannel. TODO: Select with endpoint  */
-    client->channel.connection = &client->connection;
-    client->connectStatus = openSecureChannelAsync(client/*, false*/);
-    return client->connectStatus;
-}
-
-static UA_StatusCode
-sendHELMessage(UA_Client *client) {
-    /* Get a buffer */
-    UA_ByteString message;
-    UA_Connection *conn = &client->connection;
-    UA_StatusCode retval = conn->getSendBuffer(conn, UA_MINMESSAGESIZE, &message);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Prepare the HEL message and encode at offset 8 */
-    UA_TcpHelloMessage hello;
-    UA_String_copy(&client->endpointUrl, &hello.endpointUrl); /* must be less than 4096 bytes */
-    memcpy(&hello, &client->config.localConnectionConfig,
-           sizeof(UA_ConnectionConfig)); /* same struct layout */
-
-    UA_Byte *bufPos = &message.data[8]; /* skip the header */
-    const UA_Byte *bufEnd = &message.data[message.length];
-    client->connectStatus = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos, bufEnd);
-    UA_TcpHelloMessage_deleteMembers (&hello);
-
-    /* Encode the message header at offset 0 */
-    UA_TcpMessageHeader messageHeader;
-    messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL;
-    messageHeader.messageSize = (UA_UInt32) ((uintptr_t)bufPos - (uintptr_t)message.data);
-    bufPos = message.data;
-    retval = UA_TcpMessageHeader_encodeBinary(&messageHeader, &bufPos, bufEnd);
-    if(retval != UA_STATUSCODE_GOOD) {
-        conn->releaseSendBuffer(conn, &message);
-        return retval;
-    }
-
-    /* Send the HEL message */
-    message.length = messageHeader.messageSize;
-    retval = conn->send (conn, &message);
-
-    if(retval == UA_STATUSCODE_GOOD) {
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Sent HEL message");
-    } else {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Sending HEL failed");
-    }
-    return retval;
-}
-
-static void
-processDecodedOPNResponseAsync(void *application, UA_SecureChannel *channel,
-                                UA_MessageType messageType,
-                                UA_UInt32 requestId,
-                                const UA_ByteString *message) {
-    /* Does the request id match? */
-    UA_Client *client = (UA_Client*)application;
-    if(requestId != client->requestId) {
-        UA_Client_disconnect(client);
-        return;
-    }
-
-    /* Is the content of the expected type? */
-    size_t offset = 0;
-    UA_NodeId responseId;
-    UA_NodeId expectedId = UA_NODEID_NUMERIC(
-            0, UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE].binaryEncodingId);
-    UA_StatusCode retval = UA_NodeId_decodeBinary(message, &offset,
-                                                  &responseId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_disconnect(client);
-        return;
-    }
-    if(!UA_NodeId_equal(&responseId, &expectedId)) {
-        UA_NodeId_deleteMembers(&responseId);
-        UA_Client_disconnect(client);
-        return;
-    }
-    UA_NodeId_deleteMembers (&responseId);
-
-    /* Decode the response */
-    UA_OpenSecureChannelResponse response;
-    retval = UA_OpenSecureChannelResponse_decodeBinary(message, &offset,
-                                                       &response);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Client_disconnect(client);
-        return;
-    }
-
-    /* Response.securityToken.revisedLifetime is UInt32 we need to cast it to
-     * DateTime=Int64 we take 75% of lifetime to start renewing as described in
-     * standard */
-    client->nextChannelRenewal = UA_DateTime_nowMonotonic()
-            + (UA_DateTime) (response.securityToken.revisedLifetime
-                    * (UA_Double) UA_DATETIME_MSEC * 0.75);
-
-    /* Replace the token and nonce */
-    UA_ChannelSecurityToken_deleteMembers(&client->channel.securityToken);
-    UA_ByteString_deleteMembers(&client->channel.remoteNonce);
-    client->channel.securityToken = response.securityToken;
-    client->channel.remoteNonce = response.serverNonce;
-    UA_ResponseHeader_deleteMembers(&response.responseHeader); /* the other members were moved */
-    if(client->channel.state == UA_SECURECHANNELSTATE_OPEN)
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "SecureChannel renewed");
-    else
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "SecureChannel opened");
-    client->channel.state = UA_SECURECHANNELSTATE_OPEN;
-
-    if(client->state < UA_CLIENTSTATE_SECURECHANNEL)
-        setClientState(client, UA_CLIENTSTATE_SECURECHANNEL);
-}
-
-UA_StatusCode
-processOPNResponseAsync(void *application, UA_Connection *connection,
-                        UA_ByteString *chunk) {
-    UA_Client *client = (UA_Client*) application;
-    UA_StatusCode retval = UA_SecureChannel_decryptAddChunk(&client->channel, chunk, true);
-    client->connectStatus = retval;
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-    UA_SecureChannel_processCompleteMessages(&client->channel, client, processDecodedOPNResponseAsync);
-    
-    if(client->state < UA_CLIENTSTATE_SECURECHANNEL) {
-        retval = UA_STATUSCODE_BADSECURECHANNELCLOSED;
-        goto error;
-    }
-
-    retval = UA_SecureChannel_persistIncompleteMessages(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    retval = UA_SecureChannel_generateNewKeys(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    /* Following requests and responses */
-    UA_UInt32 reqId;
-    if(client->endpointsHandshake)
-        retval = requestGetEndpoints (client, &reqId);
-    else
-        retval = requestSession (client, &reqId);
-
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    return retval;
-
-error:
-    UA_Client_disconnect(client);
-
-    return retval;
-}
-
-/* OPN messges to renew the channel are sent asynchronous */
-static UA_StatusCode
-openSecureChannelAsync(UA_Client *client/*, UA_Boolean renew*/) {
-    /* Check if sc is still valid */
-    /*if(renew && client->nextChannelRenewal - UA_DateTime_nowMonotonic () > 0)
-        return UA_STATUSCODE_GOOD;*/
-
-    UA_Connection *conn = &client->connection;
-    if(conn->state != UA_CONNECTION_ESTABLISHED)
-        return UA_STATUSCODE_BADSERVERNOTCONNECTED;
-
-    /* Prepare the OpenSecureChannelRequest */
-    UA_OpenSecureChannelRequest opnSecRq;
-    UA_OpenSecureChannelRequest_init(&opnSecRq);
-    opnSecRq.requestHeader.timestamp = UA_DateTime_now();
-    opnSecRq.requestHeader.authenticationToken = client->authenticationToken;
-    /*if(renew) {
-        opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_RENEW;
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                     "Requesting to renew the SecureChannel");
-    } else {*/
-        opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_ISSUE;
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                     "Requesting to open a SecureChannel");
-    //}
-    opnSecRq.securityMode = client->channel.securityMode;
-
-    opnSecRq.clientNonce = client->channel.localNonce;
-    opnSecRq.requestedLifetime = client->config.secureChannelLifeTime;
-
-    /* Prepare the entry for the linked list */
-    UA_UInt32 requestId = ++client->requestId;
-    /*AsyncServiceCall *ac = NULL;
-    if(renew) {
-        ac = (AsyncServiceCall*)UA_malloc(sizeof(AsyncServiceCall));
-        if (!ac)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        ac->callback =
-                (UA_ClientAsyncServiceCallback) processDecodedOPNResponseAsync;
-        ac->responseType = &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE];
-        ac->requestId = requestId;
-        ac->userdata = NULL;
-    }*/
-
-    /* Send the OPN message */
-    UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage (
-            &client->channel, requestId, &opnSecRq,
-            &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]);
-    client->connectStatus = retval;
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        client->connectStatus = retval;
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                      "Sending OPN message failed with error %s",
-                      UA_StatusCode_name(retval));
-        UA_Client_disconnect(client);
-        //if(renew)
-        //    UA_free(ac);
-        return retval;
-    }
-
-    UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                 "OPN message sent");
-
-    /* Store the entry for async processing and return */
-    /*if(renew) {
-        LIST_INSERT_HEAD(&client->asyncServiceCalls, ac, pointers);
-        return retval;
-    }*/
-    return retval;
-}
-
-static void
-responseActivateSession(UA_Client *client, void *userdata, UA_UInt32 requestId,
-                        void *response) {
-    UA_ActivateSessionResponse *activateResponse =
-            (UA_ActivateSessionResponse *) response;
-    if(activateResponse->responseHeader.serviceResult) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "ActivateSession failed with error code %s",
-                     UA_StatusCode_name(activateResponse->responseHeader.serviceResult));
-    }
-    client->connection.state = UA_CONNECTION_ESTABLISHED;
-    setClientState(client, UA_CLIENTSTATE_SESSION);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* A new session has been created. We need to clean up the subscriptions */
-    UA_Client_Subscriptions_clean(client);
-#endif
-
-     /* Call onConnect (client_async.c) callback */
-    if(client->asyncConnectCall.callback)
-        client->asyncConnectCall.callback(client, client->asyncConnectCall.userdata,
-                                          requestId + 1,
-                                          &activateResponse->responseHeader.serviceResult);
-}
-
-static UA_StatusCode
-requestActivateSession (UA_Client *client, UA_UInt32 *requestId) {
-    UA_ActivateSessionRequest request;
-    UA_ActivateSessionRequest_init(&request);
-    request.requestHeader.requestHandle = ++client->requestHandle;
-    request.requestHeader.timestamp = UA_DateTime_now ();
-    request.requestHeader.timeoutHint = 600000;
-    UA_StatusCode retval =
-        UA_ExtensionObject_copy(&client->config.userIdentityToken, &request.userIdentityToken);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* If not token is set, use anonymous */
-    if(request.userIdentityToken.encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) {
-        UA_AnonymousIdentityToken *t = UA_AnonymousIdentityToken_new();
-        if(!t) {
-            UA_ActivateSessionRequest_deleteMembers(&request);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        request.userIdentityToken.content.decoded.data = t;
-        request.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN];
-        request.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED;
-    }
-
-    /* Set the policy-Id from the endpoint. Every IdentityToken starts with a
-     * string. */
-    retval = UA_String_copy(&client->config.userTokenPolicy.policyId,
-                            (UA_String*)request.userIdentityToken.content.decoded.data);
-
-#ifdef UA_ENABLE_ENCRYPTION
-    /* Encrypt the UserIdentityToken */
-    const UA_String *userTokenPolicy = &client->channel.securityPolicy->policyUri;
-    if(client->config.userTokenPolicy.securityPolicyUri.length > 0)
-        userTokenPolicy = &client->config.userTokenPolicy.securityPolicyUri;
-    retval |= encryptUserIdentityToken(client, userTokenPolicy, &request.userIdentityToken);
-
-    /* This function call is to prepare a client signature */
-    retval |= signActivateSessionRequest(&client->channel, &request);
-#endif
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ActivateSessionRequest_deleteMembers(&request);
-        client->connectStatus = retval;
-        return retval;
-    }
-
-    retval = UA_Client_sendAsyncRequest (
-            client, &request, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST],
-            (UA_ClientAsyncServiceCallback) responseActivateSession,
-            &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], NULL, requestId);
-
-    UA_ActivateSessionRequest_deleteMembers(&request);
-    client->connectStatus = retval;
-    return retval;
-}
-
-/* Combination of UA_Client_getEndpointsInternal and getEndpoints */
-static void
-responseGetEndpoints(UA_Client *client, void *userdata, UA_UInt32 requestId,
-                     void *response) {
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_GetEndpointsResponse* resp;
-    resp = (UA_GetEndpointsResponse*)response;
-
-    if (resp->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        client->connectStatus = resp->responseHeader.serviceResult;
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "GetEndpointRequest failed with error code %s",
-                     UA_StatusCode_name (client->connectStatus));
-        UA_GetEndpointsResponse_deleteMembers(resp);
-        return;
-    }
-    endpointArray = resp->endpoints;
-    endpointArraySize = resp->endpointsSize;
-    resp->endpoints = NULL;
-    resp->endpointsSize = 0;
-
-    UA_Boolean endpointFound = false;
-    UA_Boolean tokenFound = false;
-    UA_String securityNone = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
-    UA_String binaryTransport = UA_STRING("http://opcfoundation.org/UA-Profile/"
-                                          "Transport/uatcp-uasc-uabinary");
-
-    // TODO: compare endpoint information with client->endpointUri
-    for(size_t i = 0; i < endpointArraySize; ++i) {
-        UA_EndpointDescription* endpoint = &endpointArray[i];
-        /* look out for binary transport endpoints */
-        /* Note: Siemens returns empty ProfileUrl, we will accept it as binary */
-        if(endpoint->transportProfileUri.length != 0
-                && !UA_String_equal (&endpoint->transportProfileUri,
-                                     &binaryTransport))
-            continue;
-
-        /* Look for an endpoint corresponding to the client security policy */
-        if(!UA_String_equal(&endpoint->securityPolicyUri, &client->channel.securityPolicy->policyUri))
-            continue;
-
-        endpointFound = true;
-
-        /* Look for a user token policy with an anonymous token */
-        for(size_t j = 0; j < endpoint->userIdentityTokensSize; ++j) {
-            UA_UserTokenPolicy* userToken = &endpoint->userIdentityTokens[j];
-
-            /* Usertokens also have a security policy... */
-            if(userToken->securityPolicyUri.length > 0 &&
-               !UA_String_equal(&userToken->securityPolicyUri, &securityNone))
-                continue;
-
-            /* Does the token type match the client configuration? */
-            if((userToken->tokenType == UA_USERTOKENTYPE_ANONYMOUS &&
-                client->config.userIdentityToken.content.decoded.type !=
-                &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN] &&
-                client->config.userIdentityToken.content.decoded.type != NULL) ||
-               (userToken->tokenType == UA_USERTOKENTYPE_USERNAME &&
-                client->config.userIdentityToken.content.decoded.type !=
-                &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) ||
-               (userToken->tokenType == UA_USERTOKENTYPE_CERTIFICATE &&
-                client->config.userIdentityToken.content.decoded.type !=
-                &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]) ||
-               (userToken->tokenType == UA_USERTOKENTYPE_ISSUEDTOKEN &&
-                client->config.userIdentityToken.content.decoded.type !=
-                &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]))
-                continue;
-
-            /* Endpoint with matching usertokenpolicy found */
-            tokenFound = true;
-            UA_EndpointDescription_deleteMembers(&client->config.endpoint);
-            UA_EndpointDescription_copy(endpoint, &client->config.endpoint);
-            UA_UserTokenPolicy_deleteMembers(&client->config.userTokenPolicy);
-            UA_UserTokenPolicy_copy(userToken, &client->config.userTokenPolicy);
-            break;
-        }
-    }
-
-    UA_Array_delete(endpointArray, endpointArraySize,
-                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-
-    if(!endpointFound) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "No suitable endpoint found");
-        client->connectStatus = UA_STATUSCODE_BADINTERNALERROR;
-    } else if(!tokenFound) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "No suitable UserTokenPolicy found for the possible endpoints");
-        client->connectStatus = UA_STATUSCODE_BADINTERNALERROR;
-    }
-    requestSession(client, &requestId);
-}
-
-static UA_StatusCode
-requestGetEndpoints(UA_Client *client, UA_UInt32 *requestId) {
-    UA_GetEndpointsRequest request;
-    UA_GetEndpointsRequest_init(&request);
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    /* assume the endpointurl outlives the service call */
-    UA_String_copy(&client->endpointUrl, &request.endpointUrl);
-
-    client->connectStatus = UA_Client_sendAsyncRequest(
-            client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST],
-            (UA_ClientAsyncServiceCallback) responseGetEndpoints,
-            &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], NULL, requestId);
-    UA_GetEndpointsRequest_deleteMembers(&request);
-    return client->connectStatus;
-
-}
-
-static void
-responseSessionCallback(UA_Client *client, void *userdata, UA_UInt32 requestId,
-                        void *response) {
-    UA_CreateSessionResponse *sessionResponse =
-            (UA_CreateSessionResponse *)response;
-    UA_NodeId_copy(&sessionResponse->authenticationToken,
-                   &client->authenticationToken);
-    requestActivateSession(client, &requestId);
-}
-
-static UA_StatusCode
-requestSession(UA_Client *client, UA_UInt32 *requestId) {
-    UA_CreateSessionRequest request;
-    UA_CreateSessionRequest_init(&request);
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-        if(client->channel.localNonce.length != UA_SESSION_LOCALNONCELENGTH) {
-           UA_ByteString_deleteMembers(&client->channel.localNonce);
-            retval = UA_ByteString_allocBuffer(&client->channel.localNonce,
-                                               UA_SESSION_LOCALNONCELENGTH);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-        }
-
-        retval = client->channel.securityPolicy->symmetricModule.
-                 generateNonce(client->channel.securityPolicy, &client->channel.localNonce);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    request.requestHeader.requestHandle = ++client->requestHandle;
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    UA_ByteString_copy(&client->channel.localNonce, &request.clientNonce);
-    request.requestedSessionTimeout = client->config.requestedSessionTimeout;
-    request.maxResponseMessageSize = UA_INT32_MAX;
-    UA_String_copy(&client->config.endpoint.endpointUrl, &request.endpointUrl);
-
-    UA_ApplicationDescription_copy(&client->config.clientDescription,
-                                   &request.clientDescription);
-
-    retval = UA_Client_sendAsyncRequest (
-            client, &request, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST],
-            (UA_ClientAsyncServiceCallback) responseSessionCallback,
-            &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], NULL, requestId);
-    UA_CreateSessionRequest_deleteMembers(&request);
-    client->connectStatus = retval;
-    return client->connectStatus;
-}
-
-UA_StatusCode
-UA_Client_connect_iterate(UA_Client *client) {
-    UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Client connect iterate");
-    if (client->connection.state == UA_CONNECTION_ESTABLISHED){
-        if(client->state < UA_CLIENTSTATE_WAITING_FOR_ACK) {
-            client->connectStatus = sendHELMessage(client);
-            if(client->connectStatus == UA_STATUSCODE_GOOD) {
-                setClientState(client, UA_CLIENTSTATE_WAITING_FOR_ACK);
-            } else {
-                client->connection.close(&client->connection);
-                client->connection.free(&client->connection);
-            }
-            return client->connectStatus;
-        }
-    }
-
-    /* If server is not connected */
-    if(client->connection.state == UA_CONNECTION_CLOSED) {
-        client->connectStatus = UA_STATUSCODE_BADCONNECTIONCLOSED;
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "No connection to server.");
-    }
-
-    if(client->connectStatus != UA_STATUSCODE_GOOD) {
-        client->connection.close(&client->connection);
-        client->connection.free(&client->connection);
-    }
-
-    return client->connectStatus;
-}
-
-UA_StatusCode
-UA_Client_connect_async(UA_Client *client, const char *endpointUrl,
-                        UA_ClientAsyncServiceCallback callback,
-                        void *userdata) {
-    UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Client internal async");
-
-    if(client->state >= UA_CLIENTSTATE_WAITING_FOR_ACK)
-        return UA_STATUSCODE_GOOD;
-
-    UA_ChannelSecurityToken_init(&client->channel.securityToken);
-    client->channel.state = UA_SECURECHANNELSTATE_FRESH;
-    client->endpointsHandshake = true;
-    client->channel.sendSequenceNumber = 0;
-    client->requestId = 0;
-
-    UA_String_deleteMembers(&client->endpointUrl);
-    client->endpointUrl = UA_STRING_ALLOC(endpointUrl);
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    client->connection =
-        client->config.initConnectionFunc(client->config.localConnectionConfig,
-                                          client->endpointUrl,
-                                          client->config.timeout, &client->config.logger);
-    if(client->connection.state != UA_CONNECTION_OPENING) {
-        UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Could not init async connection");
-        retval = UA_STATUSCODE_BADCONNECTIONCLOSED;
-        goto cleanup;
-    }
-
-    /* Set the channel SecurityMode if not done so far */
-    if(client->channel.securityMode == UA_MESSAGESECURITYMODE_INVALID)
-        client->channel.securityMode = UA_MESSAGESECURITYMODE_NONE;
-
-    /* Set the channel SecurityPolicy if not done so far */
-    if(!client->channel.securityPolicy) {
-        UA_SecurityPolicy *sp =
-            getSecurityPolicy(client, UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"));
-        if(!sp) {
-            retval = UA_STATUSCODE_BADINTERNALERROR;
-            goto cleanup;
-        }
-        UA_ByteString remoteCertificate = UA_BYTESTRING_NULL;
-        retval = UA_SecureChannel_setSecurityPolicy(&client->channel, sp,
-                                                    &remoteCertificate);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-    }
-
-    client->asyncConnectCall.callback = callback;
-    client->asyncConnectCall.userdata = userdata;
-
-    if(!client->connection.connectCallbackID) {
-        UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Adding async connection callback");
-        retval = UA_Client_addRepeatedCallback(
-                     client, client->config.pollConnectionFunc, &client->connection, 100.0,
-                     &client->connection.connectCallbackID);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-    }
-
-    retval = UA_SecureChannel_generateLocalNonce(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Delete async service. TODO: Move this from connect to the disconnect/cleanup phase */
-    UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    client->currentlyOutStandingPublishRequests = 0;
-#endif
-
-    UA_NodeId_deleteMembers(&client->authenticationToken);
-
-    /* Generate new local and remote key */
-    retval = UA_SecureChannel_generateNewKeys(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    return retval;
-
- cleanup:
-    UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                 "Failure during async connect");
-    UA_Client_disconnect(client);
-    return retval;
-}
-
-/* Async disconnection */
-static void
-sendCloseSecureChannelAsync(UA_Client *client, void *userdata,
-                             UA_UInt32 requestId, void *response) {
-    UA_NodeId_deleteMembers (&client->authenticationToken);
-    client->requestHandle = 0;
-
-    UA_SecureChannel *channel = &client->channel;
-    UA_CloseSecureChannelRequest request;
-    UA_CloseSecureChannelRequest_init(&request);
-    request.requestHeader.requestHandle = ++client->requestHandle;
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    request.requestHeader.authenticationToken = client->authenticationToken;
-    UA_SecureChannel_sendSymmetricMessage(
-            channel, ++client->requestId, UA_MESSAGETYPE_CLO, &request,
-            &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]);
-    UA_SecureChannel_close(&client->channel);
-    UA_SecureChannel_deleteMembers(&client->channel);
-}
-
-static void
-sendCloseSessionAsync(UA_Client *client, UA_UInt32 *requestId) {
-    UA_CloseSessionRequest request;
-    UA_CloseSessionRequest_init(&request);
-
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    request.deleteSubscriptions = true;
-
-    UA_Client_sendAsyncRequest(
-            client, &request, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST],
-            (UA_ClientAsyncServiceCallback) sendCloseSecureChannelAsync,
-            &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], NULL, requestId);
-
-}
-
-UA_StatusCode
-UA_Client_disconnect_async(UA_Client *client, UA_UInt32 *requestId) {
-    /* Is a session established? */
-    if (client->state == UA_CLIENTSTATE_SESSION) {
-        client->state = UA_CLIENTSTATE_SESSION_DISCONNECTED;
-        sendCloseSessionAsync(client, requestId);
-    }
-
-    /* Close the TCP connection
-     * shutdown and close (in tcp.c) are already async*/
-    if (client->state >= UA_CLIENTSTATE_CONNECTED)
-        client->connection.close(&client->connection);
-    else
-        UA_Client_removeRepeatedCallback(client, client->connection.connectCallbackID);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-// TODO REMOVE WHEN UA_SESSION_RECOVERY IS READY
-    /* We need to clean up the subscriptions */
-    UA_Client_Subscriptions_clean(client);
-#endif
-
-    setClientState(client, UA_CLIENTSTATE_DISCONNECTED);
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/src/client/ua_client_discovery.c b/ext/open62541/src/client/ua_client_discovery.c
deleted file mode 100644
index 2136a75..0000000
--- a/ext/open62541/src/client/ua_client_discovery.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include "ua_client_internal.h"
-
-UA_StatusCode
-UA_Client_getEndpoints(UA_Client *client, const char *serverUrl,
-                       size_t* endpointDescriptionsSize,
-                       UA_EndpointDescription** endpointDescriptions) {
-    UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
-    /* Client is already connected to a different server */
-    if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl,
-                            client->config.endpoint.endpointUrl.length) != 0) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_StatusCode retval;
-    const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl);
-    if(!connected) {
-        retval = UA_Client_connectTCPSecureChannel(client, url);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-    retval = UA_Client_getEndpointsInternal(client, url, endpointDescriptionsSize,
-                                            endpointDescriptions);
-
-    if(!connected)
-        UA_Client_disconnect(client);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_findServers(UA_Client *client, const char *serverUrl,
-                      size_t serverUrisSize, UA_String *serverUris,
-                      size_t localeIdsSize, UA_String *localeIds,
-                      size_t *registeredServersSize,
-                      UA_ApplicationDescription **registeredServers) {
-    UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
-    /* Client is already connected to a different server */
-    if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl,
-                            client->config.endpoint.endpointUrl.length) != 0) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_StatusCode retval;
-    const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl);
-    if(!connected) {
-        retval = UA_Client_connectTCPSecureChannel(client, url);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* Prepare the request */
-    UA_FindServersRequest request;
-    UA_FindServersRequest_init(&request);
-    request.serverUrisSize = serverUrisSize;
-    request.serverUris = serverUris;
-    request.localeIdsSize = localeIdsSize;
-    request.localeIds = localeIds;
-
-    /* Send the request */
-    UA_FindServersResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]);
-
-    /* Process the response */
-    retval = response.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        *registeredServersSize = response.serversSize;
-        *registeredServers = response.servers;
-        response.serversSize = 0;
-        response.servers = NULL;
-    } else {
-        *registeredServersSize = 0;
-        *registeredServers = NULL;
-    }
-
-    /* Clean up */
-    UA_FindServersResponse_deleteMembers(&response);
-    if(!connected)
-        UA_Client_disconnect(client);
-    return retval;
-}
-
-#ifdef UA_ENABLE_DISCOVERY
-
-UA_StatusCode
-UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl,
-                               UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn,
-                               size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
-                               size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) {
-    UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
-    /* Client is already connected to a different server */
-    if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl,
-                            client->config.endpoint.endpointUrl.length) != 0) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_StatusCode retval;
-    const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl);
-    if(!connected) {
-        retval = UA_Client_connectTCPSecureChannel(client, url);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* Prepare the request */
-    UA_FindServersOnNetworkRequest request;
-    UA_FindServersOnNetworkRequest_init(&request);
-    request.startingRecordId = startingRecordId;
-    request.maxRecordsToReturn = maxRecordsToReturn;
-    request.serverCapabilityFilterSize = serverCapabilityFilterSize;
-    request.serverCapabilityFilter = serverCapabilityFilter;
-
-    /* Send the request */
-    UA_FindServersOnNetworkResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]);
-
-    /* Process the response */
-    retval = response.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        *serverOnNetworkSize = response.serversSize;
-        *serverOnNetwork = response.servers;
-        response.serversSize = 0;
-        response.servers = NULL;
-    } else {
-        *serverOnNetworkSize = 0;
-        *serverOnNetwork = NULL;
-    }
-
-    /* Clean up */
-    UA_FindServersOnNetworkResponse_deleteMembers(&response);
-    if(!connected)
-        UA_Client_disconnect(client);
-    return retval;
-}
-
-#endif
diff --git a/ext/open62541/src/client/ua_client_highlevel.c b/ext/open62541/src/client/ua_client_highlevel.c
deleted file mode 100644
index f605f7b..0000000
--- a/ext/open62541/src/client/ua_client_highlevel.c
+++ /dev/null
@@ -1,947 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Florian Palm
- *    Copyright 2016 (c) Chris Iatrou
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Fabian Arndt
- *    Copyright 2018 (c) Peter Rustler, basyskom GmbH
- */
-
-#include <open62541/client_highlevel.h>
-#include <open62541/client_highlevel_async.h>
-
-#include "ua_client_internal.h"
-
-UA_StatusCode
-UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri,
-                            UA_UInt16 *namespaceIndex) {
-    UA_ReadRequest request;
-    UA_ReadRequest_init(&request);
-    UA_ReadValueId id;
-    UA_ReadValueId_init(&id);
-    id.attributeId = UA_ATTRIBUTEID_VALUE;
-    id.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY);
-    request.nodesToRead = &id;
-    request.nodesToReadSize = 1;
-
-    UA_ReadResponse response = UA_Client_Service_read(client, request);
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        retval = response.responseHeader.serviceResult;
-    else if(response.resultsSize != 1 || !response.results[0].hasValue)
-        retval = UA_STATUSCODE_BADNODEATTRIBUTESINVALID;
-    else if(response.results[0].value.type != &UA_TYPES[UA_TYPES_STRING])
-        retval = UA_STATUSCODE_BADTYPEMISMATCH;
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ReadResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    retval = UA_STATUSCODE_BADNOTFOUND;
-    UA_String *ns = (UA_String *)response.results[0].value.data;
-    for(size_t i = 0; i < response.results[0].value.arrayLength; ++i) {
-        if(UA_String_equal(namespaceUri, &ns[i])) {
-            *namespaceIndex = (UA_UInt16)i;
-            retval = UA_STATUSCODE_GOOD;
-            break;
-        }
-    }
-
-    UA_ReadResponse_deleteMembers(&response);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId,
-                               UA_NodeIteratorCallback callback, void *handle) {
-    UA_BrowseRequest bReq;
-    UA_BrowseRequest_init(&bReq);
-    bReq.requestedMaxReferencesPerNode = 0;
-    bReq.nodesToBrowse = UA_BrowseDescription_new();
-    bReq.nodesToBrowseSize = 1;
-    UA_NodeId_copy(&parentNodeId, &bReq.nodesToBrowse[0].nodeId);
-    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; //return everything
-    bReq.nodesToBrowse[0].browseDirection = UA_BROWSEDIRECTION_BOTH;
-
-    UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);
-
-    UA_StatusCode retval = bResp.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        for(size_t i = 0; i < bResp.resultsSize; ++i) {
-            for(size_t j = 0; j < bResp.results[i].referencesSize; ++j) {
-                UA_ReferenceDescription *ref = &bResp.results[i].references[j];
-                retval |= callback(ref->nodeId.nodeId, !ref->isForward,
-                                   ref->referenceTypeId, handle);
-            }
-        }
-    }
-
-    UA_BrowseRequest_deleteMembers(&bReq);
-    UA_BrowseResponse_deleteMembers(&bResp);
-    return retval;
-}
-
-/*******************/
-/* Node Management */
-/*******************/
-
-UA_StatusCode
-UA_Client_addReference(UA_Client *client, const UA_NodeId sourceNodeId,
-                       const UA_NodeId referenceTypeId, UA_Boolean isForward,
-                       const UA_String targetServerUri,
-                       const UA_ExpandedNodeId targetNodeId,
-                       UA_NodeClass targetNodeClass) {
-    UA_AddReferencesItem item;
-    UA_AddReferencesItem_init(&item);
-    item.sourceNodeId = sourceNodeId;
-    item.referenceTypeId = referenceTypeId;
-    item.isForward = isForward;
-    item.targetServerUri = targetServerUri;
-    item.targetNodeId = targetNodeId;
-    item.targetNodeClass = targetNodeClass;
-    UA_AddReferencesRequest request;
-    UA_AddReferencesRequest_init(&request);
-    request.referencesToAdd = &item;
-    request.referencesToAddSize = 1;
-    UA_AddReferencesResponse response = UA_Client_Service_addReferences(client, request);
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_AddReferencesResponse_deleteMembers(&response);
-        return retval;
-    }
-    if(response.resultsSize != 1) {
-        UA_AddReferencesResponse_deleteMembers(&response);
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    retval = response.results[0];
-    UA_AddReferencesResponse_deleteMembers(&response);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_deleteReference(UA_Client *client, const UA_NodeId sourceNodeId,
-                          const UA_NodeId referenceTypeId, UA_Boolean isForward,
-                          const UA_ExpandedNodeId targetNodeId,
-                          UA_Boolean deleteBidirectional) {
-    UA_DeleteReferencesItem item;
-    UA_DeleteReferencesItem_init(&item);
-    item.sourceNodeId = sourceNodeId;
-    item.referenceTypeId = referenceTypeId;
-    item.isForward = isForward;
-    item.targetNodeId = targetNodeId;
-    item.deleteBidirectional = deleteBidirectional;
-    UA_DeleteReferencesRequest request;
-    UA_DeleteReferencesRequest_init(&request);
-    request.referencesToDelete = &item;
-    request.referencesToDeleteSize = 1;
-    UA_DeleteReferencesResponse response = UA_Client_Service_deleteReferences(client, request);
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_DeleteReferencesResponse_deleteMembers(&response);
-        return retval;
-    }
-    if(response.resultsSize != 1) {
-        UA_DeleteReferencesResponse_deleteMembers(&response);
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    retval = response.results[0];
-    UA_DeleteReferencesResponse_deleteMembers(&response);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_deleteNode(UA_Client *client, const UA_NodeId nodeId,
-                     UA_Boolean deleteTargetReferences) {
-    UA_DeleteNodesItem item;
-    UA_DeleteNodesItem_init(&item);
-    item.nodeId = nodeId;
-    item.deleteTargetReferences = deleteTargetReferences;
-    UA_DeleteNodesRequest request;
-    UA_DeleteNodesRequest_init(&request);
-    request.nodesToDelete = &item;
-    request.nodesToDeleteSize = 1;
-    UA_DeleteNodesResponse response = UA_Client_Service_deleteNodes(client, request);
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_DeleteNodesResponse_deleteMembers(&response);
-        return retval;
-    }
-    if(response.resultsSize != 1) {
-        UA_DeleteNodesResponse_deleteMembers(&response);
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    retval = response.results[0];
-    UA_DeleteNodesResponse_deleteMembers(&response);
-    return retval;
-}
-
-UA_StatusCode
-__UA_Client_addNode(UA_Client *client, const UA_NodeClass nodeClass,
-                    const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
-                    const UA_NodeId referenceTypeId, const UA_QualifiedName browseName,
-                    const UA_NodeId typeDefinition, const UA_NodeAttributes *attr,
-                    const UA_DataType *attributeType, UA_NodeId *outNewNodeId) {
-    UA_AddNodesRequest request;
-    UA_AddNodesRequest_init(&request);
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.parentNodeId.nodeId = parentNodeId;
-    item.referenceTypeId = referenceTypeId;
-    item.requestedNewNodeId.nodeId = requestedNewNodeId;
-    item.browseName = browseName;
-    item.nodeClass = nodeClass;
-    item.typeDefinition.nodeId = typeDefinition;
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.type = attributeType;
-    item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; // hack. is not written into.
-    request.nodesToAdd = &item;
-    request.nodesToAddSize = 1;
-    UA_AddNodesResponse response = UA_Client_Service_addNodes(client, request);
-
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_AddNodesResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    if(response.resultsSize != 1) {
-        UA_AddNodesResponse_deleteMembers(&response);
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    /* Move the id of the created node */
-    retval = response.results[0].statusCode;
-    if(retval == UA_STATUSCODE_GOOD && outNewNodeId) {
-        *outNewNodeId = response.results[0].addedNodeId;
-        UA_NodeId_init(&response.results[0].addedNodeId);
-    }
-
-    UA_AddNodesResponse_deleteMembers(&response);
-    return retval;
-}
-
-/********/
-/* Call */
-/********/
-
-#ifdef UA_ENABLE_METHODCALLS
-
-UA_StatusCode
-UA_Client_call(UA_Client *client, const UA_NodeId objectId,
-               const UA_NodeId methodId, size_t inputSize,
-               const UA_Variant *input, size_t *outputSize,
-               UA_Variant **output) {
-    /* Set up the request */
-    UA_CallRequest request;
-    UA_CallRequest_init(&request);
-    UA_CallMethodRequest item;
-    UA_CallMethodRequest_init(&item);
-    item.methodId = methodId;
-    item.objectId = objectId;
-    item.inputArguments = (UA_Variant *)(void*)(uintptr_t)input; // cast const...
-    item.inputArgumentsSize = inputSize;
-    request.methodsToCall = &item;
-    request.methodsToCallSize = 1;
-
-    /* Call the service */
-    UA_CallResponse response = UA_Client_Service_call(client, request);
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        if(response.resultsSize == 1)
-            retval = response.results[0].statusCode;
-        else
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_CallResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    /* Move the output arguments */
-    if(output != NULL && outputSize != NULL) {
-        *output = response.results[0].outputArguments;
-        *outputSize = response.results[0].outputArgumentsSize;
-        response.results[0].outputArguments = NULL;
-        response.results[0].outputArgumentsSize = 0;
-    }
-    UA_CallResponse_deleteMembers(&response);
-    return retval;
-}
-
-#endif
-
-/********************/
-/* Write Attributes */
-/********************/
-
-UA_StatusCode
-__UA_Client_writeAttribute(UA_Client *client, const UA_NodeId *nodeId,
-                           UA_AttributeId attributeId, const void *in,
-                           const UA_DataType *inDataType) {
-    if(!in)
-      return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    wValue.nodeId = *nodeId;
-    wValue.attributeId = attributeId;
-    if(attributeId == UA_ATTRIBUTEID_VALUE)
-        wValue.value.value = *(const UA_Variant*)in;
-    else
-        /* hack. is never written into. */
-        UA_Variant_setScalar(&wValue.value.value, (void*)(uintptr_t)in, inDataType);
-    wValue.value.hasValue = true;
-    UA_WriteRequest wReq;
-    UA_WriteRequest_init(&wReq);
-    wReq.nodesToWrite = &wValue;
-    wReq.nodesToWriteSize = 1;
-
-    UA_WriteResponse wResp = UA_Client_Service_write(client, wReq);
-
-    UA_StatusCode retval = wResp.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        if(wResp.resultsSize == 1)
-            retval = wResp.results[0];
-        else
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    UA_WriteResponse_deleteMembers(&wResp);
-    return retval;
-}
-
-UA_StatusCode
-UA_Client_writeArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                        size_t newArrayDimensionsSize,
-                                        const UA_UInt32 *newArrayDimensions) {
-    if(!newArrayDimensions)
-      return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    wValue.nodeId = nodeId;
-    wValue.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
-    UA_Variant_setArray(&wValue.value.value, (void*)(uintptr_t)newArrayDimensions,
-                        newArrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]);
-    wValue.value.hasValue = true;
-    UA_WriteRequest wReq;
-    UA_WriteRequest_init(&wReq);
-    wReq.nodesToWrite = &wValue;
-    wReq.nodesToWriteSize = 1;
-
-    UA_WriteResponse wResp = UA_Client_Service_write(client, wReq);
-
-    UA_StatusCode retval = wResp.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        if(wResp.resultsSize == 1)
-            retval = wResp.results[0];
-        else
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    UA_WriteResponse_deleteMembers(&wResp);
-    return retval;
-}
-
-/*******************/
-/* Read Attributes */
-/*******************/
-
-UA_StatusCode
-__UA_Client_readAttribute(UA_Client *client, const UA_NodeId *nodeId,
-                          UA_AttributeId attributeId, void *out,
-                          const UA_DataType *outDataType) {
-    UA_ReadValueId item;
-    UA_ReadValueId_init(&item);
-    item.nodeId = *nodeId;
-    item.attributeId = attributeId;
-    UA_ReadRequest request;
-    UA_ReadRequest_init(&request);
-    request.nodesToRead = &item;
-    request.nodesToReadSize = 1;
-    UA_ReadResponse response = UA_Client_Service_read(client, request);
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval == UA_STATUSCODE_GOOD) {
-        if(response.resultsSize == 1)
-            retval = response.results[0].status;
-        else
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ReadResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    /* Set the StatusCode */
-    UA_DataValue *res = response.results;
-    if(res->hasStatus)
-        retval = res->status;
-
-    /* Return early of no value is given */
-    if(!res->hasValue) {
-        if(retval == UA_STATUSCODE_GOOD)
-            retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-        UA_ReadResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    /* Copy value into out */
-    if(attributeId == UA_ATTRIBUTEID_VALUE) {
-        memcpy(out, &res->value, sizeof(UA_Variant));
-        UA_Variant_init(&res->value);
-    } else if(attributeId == UA_ATTRIBUTEID_NODECLASS) {
-        memcpy(out, (UA_NodeClass*)res->value.data, sizeof(UA_NodeClass));
-    } else if(UA_Variant_isScalar(&res->value) &&
-              res->value.type == outDataType) {
-        memcpy(out, res->value.data, res->value.type->memSize);
-        UA_free(res->value.data);
-        res->value.data = NULL;
-    } else {
-        retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    UA_ReadResponse_deleteMembers(&response);
-    return retval;
-}
-
-static UA_StatusCode
-processReadArrayDimensionsResult(UA_ReadResponse *response,
-                                 UA_UInt32 **outArrayDimensions,
-                                 size_t *outArrayDimensionsSize) {
-    UA_StatusCode retval = response->responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    if(response->resultsSize != 1)
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-
-    retval = response->results[0].status;
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_DataValue *res = &response->results[0];
-    if(!res->hasValue ||
-       UA_Variant_isScalar(&res->value) ||
-       res->value.type != &UA_TYPES[UA_TYPES_UINT32])
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-
-    /* Move results */
-    *outArrayDimensions = (UA_UInt32*)res->value.data;
-    *outArrayDimensionsSize = res->value.arrayLength;
-    res->value.data = NULL;
-    res->value.arrayLength = 0;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Client_readArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId,
-                                       size_t *outArrayDimensionsSize,
-                                       UA_UInt32 **outArrayDimensions) {
-    UA_ReadValueId item;
-    UA_ReadValueId_init(&item);
-    item.nodeId = nodeId;
-    item.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
-    UA_ReadRequest request;
-    UA_ReadRequest_init(&request);
-    request.nodesToRead = &item;
-    request.nodesToReadSize = 1;
-
-    UA_ReadResponse response = UA_Client_Service_read(client, request);
-    UA_StatusCode retval = processReadArrayDimensionsResult(&response, outArrayDimensions,
-                                                            outArrayDimensionsSize);
-    UA_ReadResponse_deleteMembers(&response);
-    return retval;
-}
-
-/*********************/
-/* Historical Access */
-/*********************/
-#ifdef UA_ENABLE_HISTORIZING
-static UA_HistoryReadResponse
-__UA_Client_HistoryRead(UA_Client *client, const UA_NodeId *nodeId,
-                        UA_ExtensionObject* details, UA_String indexRange,
-                        UA_TimestampsToReturn timestampsToReturn,
-                        UA_ByteString continuationPoint, UA_Boolean releaseConti) {
-
-    UA_HistoryReadValueId item;
-    UA_HistoryReadValueId_init(&item);
-
-    item.nodeId = *nodeId;
-    item.indexRange = indexRange;
-    item.continuationPoint = continuationPoint;
-    item.dataEncoding = UA_QUALIFIEDNAME(0, "Default Binary");
-
-    UA_HistoryReadRequest request;
-    UA_HistoryReadRequest_init(&request);
-
-    request.nodesToRead = &item;
-    request.nodesToReadSize = 1;
-    request.timestampsToReturn = timestampsToReturn; // Defaults to Source
-    request.releaseContinuationPoints = releaseConti; // No values are returned, if true
-
-    /* Build ReadDetails */
-    request.historyReadDetails = *details;
-
-    return UA_Client_Service_historyRead(client, request);
-}
-
-static UA_StatusCode
-__UA_Client_HistoryRead_service(UA_Client *client, const UA_NodeId *nodeId,
-                                   const UA_HistoricalIteratorCallback callback,
-                                   UA_ExtensionObject *details, UA_String indexRange,
-                                   UA_TimestampsToReturn timestampsToReturn,
-                                   void *callbackContext) {
-
-    UA_ByteString continuationPoint = UA_BYTESTRING_NULL;
-    UA_Boolean continuationAvail = false;
-    UA_Boolean fetchMore = false;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    do {
-        /* We release the continuation point, if no more data is requested by the user */
-        UA_Boolean cleanup = !fetchMore && continuationAvail;
-        UA_HistoryReadResponse response =
-            __UA_Client_HistoryRead(client, nodeId, details, indexRange, timestampsToReturn, continuationPoint, cleanup);
-
-        if (cleanup) {
-            retval = response.responseHeader.serviceResult;
-cleanup:    UA_HistoryReadResponse_deleteMembers(&response);
-            UA_ByteString_deleteMembers(&continuationPoint);
-            return retval;
-        }
-
-        retval = response.responseHeader.serviceResult;
-        if (retval == UA_STATUSCODE_GOOD) {
-            if (response.resultsSize == 1)
-                retval = response.results[0].statusCode;
-            else
-                retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-        }
-        if (retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-
-        UA_HistoryReadResult *res = response.results;
-
-        /* Clear old and check / store new continuation point */
-        UA_ByteString_deleteMembers(&continuationPoint);
-        UA_ByteString_copy(&res->continuationPoint, &continuationPoint);
-        continuationAvail = !UA_ByteString_equal(&continuationPoint, &UA_BYTESTRING_NULL);
-
-        /* Client callback with possibility to request further values */
-        fetchMore = callback(client, nodeId, continuationAvail, &res->historyData, callbackContext);
-
-        /* Regular cleanup */
-        UA_HistoryReadResponse_deleteMembers(&response);
-    } while (continuationAvail);
-
-    return retval;
-}
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-UA_StatusCode
-UA_Client_HistoryRead_events(UA_Client *client, const UA_NodeId *nodeId,
-                                const UA_HistoricalIteratorCallback callback,
-                                UA_DateTime startTime, UA_DateTime endTime,
-                                UA_String indexRange, const UA_EventFilter filter, UA_UInt32 numValuesPerNode,
-                                UA_TimestampsToReturn timestampsToReturn, void *callbackContext) {
-
-    UA_ReadEventDetails details;
-    UA_ReadEventDetails_init(&details);
-    details.filter = filter;
-
-    // At least two of the following parameters must be set
-    details.numValuesPerNode = numValuesPerNode; // 0 = return all / max server is capable of
-    details.startTime = startTime;
-    details.endTime = endTime;
-
-    UA_ExtensionObject detailsExtensionObject;
-    UA_ExtensionObject_init(&detailsExtensionObject);
-    detailsExtensionObject.content.decoded.type = &UA_TYPES[UA_TYPES_READEVENTDETAILS];
-    detailsExtensionObject.content.decoded.data = &details;
-    detailsExtensionObject.encoding = UA_EXTENSIONOBJECT_DECODED;
-
-    return __UA_Client_HistoryRead_service(client, nodeId, callback, &detailsExtensionObject,
-                                              indexRange, timestampsToReturn, callbackContext);
-}
-#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING
-
-static UA_StatusCode
-__UA_Client_HistoryRead_service_rawMod(UA_Client *client, const UA_NodeId *nodeId,
-                                          const UA_HistoricalIteratorCallback callback,
-                                          UA_DateTime startTime,UA_DateTime endTime,
-                                          UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode,
-                                          UA_Boolean readModified, UA_TimestampsToReturn timestampsToReturn,
-                                          void *callbackContext) {
-
-    UA_ReadRawModifiedDetails details;
-    UA_ReadRawModifiedDetails_init(&details);
-    details.isReadModified = readModified; // Return only modified values
-    details.returnBounds = returnBounds;   // Return values pre / post given range
-
-    // At least two of the following parameters must be set
-    details.numValuesPerNode = numValuesPerNode;   // 0 = return all / max server is capable of
-    details.startTime = startTime;
-    details.endTime = endTime;
-
-    UA_ExtensionObject detailsExtensionObject;
-    UA_ExtensionObject_init(&detailsExtensionObject);
-    detailsExtensionObject.content.decoded.type = &UA_TYPES[UA_TYPES_READRAWMODIFIEDDETAILS];
-    detailsExtensionObject.content.decoded.data = &details;
-    detailsExtensionObject.encoding = UA_EXTENSIONOBJECT_DECODED;
-
-    return __UA_Client_HistoryRead_service(client, nodeId, callback,
-                                              &detailsExtensionObject, indexRange,
-                                              timestampsToReturn, callbackContext);
-}
-
-UA_StatusCode
-UA_Client_HistoryRead_raw(UA_Client *client, const UA_NodeId *nodeId,
-                             const UA_HistoricalIteratorCallback callback,
-                             UA_DateTime startTime, UA_DateTime endTime,
-                             UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode,
-                             UA_TimestampsToReturn timestampsToReturn, void *callbackContext) {
-
-    return __UA_Client_HistoryRead_service_rawMod(client, nodeId, callback, startTime, endTime, indexRange, returnBounds,
-                                                     numValuesPerNode, false, timestampsToReturn, callbackContext);
-}
-
-#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING
-UA_StatusCode
-UA_Client_HistoryRead_modified(UA_Client *client, const UA_NodeId *nodeId,
-                                  const UA_HistoricalIteratorCallback callback,
-                                  UA_DateTime startTime, UA_DateTime endTime,
-                                  UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 maxItems,
-                                  UA_TimestampsToReturn timestampsToReturn, void *callbackContext) {
-
-    return __UA_Client_HistoryRead_service_rawMod(client, nodeId, callback, startTime, endTime, indexRange, returnBounds,
-                                                     maxItems, true, timestampsToReturn, callbackContext);
-}
-#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING
-
-static UA_HistoryUpdateResponse
-__UA_Client_HistoryUpdate(UA_Client *client,
-                          void *details,
-                          size_t typeId)
-{
-    UA_HistoryUpdateRequest request;
-    UA_HistoryUpdateRequest_init(&request);
-
-    UA_ExtensionObject extension;
-    UA_ExtensionObject_init(&extension);
-    request.historyUpdateDetailsSize = 1;
-    request.historyUpdateDetails = &extension;
-
-    extension.encoding = UA_EXTENSIONOBJECT_DECODED;
-    extension.content.decoded.type = &UA_TYPES[typeId];
-    extension.content.decoded.data = details;
-
-    UA_HistoryUpdateResponse response;
-    response = UA_Client_Service_historyUpdate(client, request);
-    //UA_HistoryUpdateRequest_deleteMembers(&request);
-    return response;
-}
-
-static UA_StatusCode
-__UA_Client_HistoryUpdate_updateData(UA_Client *client,
-                          const UA_NodeId *nodeId,
-                          UA_PerformUpdateType type,
-                          UA_DataValue *value)
-{
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-    UA_UpdateDataDetails details;
-    UA_UpdateDataDetails_init(&details);
-
-    details.performInsertReplace = type;
-    details.updateValuesSize = 1;
-    details.updateValues = value;
-    UA_NodeId_copy(nodeId, &details.nodeId);
-
-    UA_HistoryUpdateResponse response;
-    response = __UA_Client_HistoryUpdate(client, &details, UA_TYPES_UPDATEDATADETAILS);
-    if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        ret = response.responseHeader.serviceResult;
-        goto cleanup;
-    }
-    if (response.resultsSize != 1 || response.results[0].operationResultsSize != 1) {
-        ret = UA_STATUSCODE_BADUNEXPECTEDERROR;
-        goto cleanup;
-    }
-    if (response.results[0].statusCode != UA_STATUSCODE_GOOD) {
-        ret = response.results[0].statusCode;
-        goto cleanup;
-    }
-    ret = response.results[0].operationResults[0];
-cleanup:
-    UA_HistoryUpdateResponse_deleteMembers(&response);
-    UA_NodeId_deleteMembers(&details.nodeId);
-    return ret;
-}
-
-UA_StatusCode
-UA_Client_HistoryUpdate_insert(UA_Client *client,
-                               const UA_NodeId *nodeId,
-                               UA_DataValue *value)
-{
-    return __UA_Client_HistoryUpdate_updateData(client,
-                                                nodeId,
-                                                UA_PERFORMUPDATETYPE_INSERT,
-                                                value);
-}
-
-UA_StatusCode
-UA_Client_HistoryUpdate_replace(UA_Client *client,
-                                const UA_NodeId *nodeId,
-                                UA_DataValue *value)
-{
-    return __UA_Client_HistoryUpdate_updateData(client,
-                                                nodeId,
-                                                UA_PERFORMUPDATETYPE_REPLACE,
-                                                value);
-}
-
-UA_StatusCode
-UA_Client_HistoryUpdate_update(UA_Client *client,
-                               const UA_NodeId *nodeId,
-                               UA_DataValue *value)
-{
-    return __UA_Client_HistoryUpdate_updateData(client,
-                                                nodeId,
-                                                UA_PERFORMUPDATETYPE_UPDATE,
-                                                value);
-}
-
-UA_StatusCode
-UA_Client_HistoryUpdate_deleteRaw(UA_Client *client,
-                                  const UA_NodeId *nodeId,
-                                  UA_DateTime startTimestamp,
-                                  UA_DateTime endTimestamp)
-{
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-
-    UA_DeleteRawModifiedDetails details;
-    UA_DeleteRawModifiedDetails_init(&details);
-
-    details.isDeleteModified = false;
-    details.startTime = startTimestamp;
-    details.endTime = endTimestamp;
-    UA_NodeId_copy(nodeId, &details.nodeId);
-
-    UA_HistoryUpdateResponse response;
-    response = __UA_Client_HistoryUpdate(client, &details, UA_TYPES_DELETERAWMODIFIEDDETAILS);
-    if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        ret = response.responseHeader.serviceResult;
-        goto cleanup;
-    }
-    if (response.resultsSize != 1) {
-        ret = UA_STATUSCODE_BADUNEXPECTEDERROR;
-        goto cleanup;
-    }
-
-    ret = response.results[0].statusCode;
-
-cleanup:
-    UA_HistoryUpdateResponse_deleteMembers(&response);
-    UA_NodeId_deleteMembers(&details.nodeId);
-    return ret;
-}
-#endif // UA_ENABLE_HISTORIZING
-
-/* Async Functions */
-
-static
-void ValueAttributeRead(UA_Client *client, void *userdata,
-                        UA_UInt32 requestId, void *response) {
-    if(!response)
-        return;
-
-    /* Find the callback for the response */
-    CustomCallback *cc;
-    LIST_FOREACH(cc, &client->customCallbacks, pointers) {
-        if(cc->callbackId == requestId)
-            break;
-    }
-    if(!cc)
-        return;
-
-    UA_ReadResponse *rr = (UA_ReadResponse *) response;
-    UA_DataValue *res = rr->results;
-    UA_Boolean done = false;
-    if(rr->resultsSize == 1 && res != NULL && res->hasValue) {
-        if(cc->attributeId == UA_ATTRIBUTEID_VALUE) {
-            /* Call directly with the variant */
-            cc->callback(client, userdata, requestId, &res->value);
-            done = true;
-        } else if(UA_Variant_isScalar(&res->value) &&
-                  res->value.type == cc->outDataType) {
-            /* Unpack the value */
-            UA_STACKARRAY(UA_Byte, value, cc->outDataType->memSize);
-            memcpy(&value, res->value.data, cc->outDataType->memSize);
-            cc->callback(client, userdata, requestId, &value);
-            done = true;
-        }
-    }
-
-    /* Could not process, delete the callback anyway */
-    if(!done)
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Cannot process the response to the async read "
-                    "request %u", requestId);
-
-    LIST_REMOVE(cc, pointers);
-    UA_free(cc);
-}
-
-/*Read Attributes*/
-UA_StatusCode __UA_Client_readAttribute_async(UA_Client *client,
-        const UA_NodeId *nodeId, UA_AttributeId attributeId,
-        const UA_DataType *outDataType, UA_ClientAsyncServiceCallback callback,
-        void *userdata, UA_UInt32 *reqId) {
-    UA_ReadValueId item;
-    UA_ReadValueId_init(&item);
-    item.nodeId = *nodeId;
-    item.attributeId = attributeId;
-    UA_ReadRequest request;
-    UA_ReadRequest_init(&request);
-    request.nodesToRead = &item;
-    request.nodesToReadSize = 1;
-
-    __UA_Client_AsyncService(client, &request, &UA_TYPES[UA_TYPES_READREQUEST],
-                             ValueAttributeRead, &UA_TYPES[UA_TYPES_READRESPONSE],
-                             userdata, reqId);
-
-    CustomCallback *cc = (CustomCallback*) UA_malloc(sizeof(CustomCallback));
-    if (!cc)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    cc->callback = callback;
-    cc->callbackId = *reqId;
-
-    cc->attributeId = attributeId;
-    cc->outDataType = outDataType;
-
-    LIST_INSERT_HEAD(&client->customCallbacks, cc, pointers);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/*Write Attributes*/
-UA_StatusCode __UA_Client_writeAttribute_async(UA_Client *client,
-        const UA_NodeId *nodeId, UA_AttributeId attributeId, const void *in,
-        const UA_DataType *inDataType, UA_ClientAsyncServiceCallback callback,
-        void *userdata, UA_UInt32 *reqId) {
-    if (!in)
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    wValue.nodeId = *nodeId;
-    wValue.attributeId = attributeId;
-    if (attributeId == UA_ATTRIBUTEID_VALUE)
-        wValue.value.value = *(const UA_Variant*) in;
-    else
-        /* hack. is never written into. */
-        UA_Variant_setScalar(&wValue.value.value, (void*) (uintptr_t) in,
-                inDataType);
-    wValue.value.hasValue = true;
-    UA_WriteRequest wReq;
-    UA_WriteRequest_init(&wReq);
-    wReq.nodesToWrite = &wValue;
-    wReq.nodesToWriteSize = 1;
-
-    return __UA_Client_AsyncService(client, &wReq,
-            &UA_TYPES[UA_TYPES_WRITEREQUEST], callback,
-            &UA_TYPES[UA_TYPES_WRITERESPONSE], userdata, reqId);
-}
-
-/*Node Management*/
-
-UA_StatusCode UA_EXPORT
-__UA_Client_addNode_async(UA_Client *client, const UA_NodeClass nodeClass,
-        const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
-        const UA_NodeId referenceTypeId, const UA_QualifiedName browseName,
-        const UA_NodeId typeDefinition, const UA_NodeAttributes *attr,
-        const UA_DataType *attributeType, UA_NodeId *outNewNodeId,
-        UA_ClientAsyncServiceCallback callback, void *userdata,
-        UA_UInt32 *reqId) {
-    UA_AddNodesRequest request;
-    UA_AddNodesRequest_init(&request);
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.parentNodeId.nodeId = parentNodeId;
-    item.referenceTypeId = referenceTypeId;
-    item.requestedNewNodeId.nodeId = requestedNewNodeId;
-    item.browseName = browseName;
-    item.nodeClass = nodeClass;
-    item.typeDefinition.nodeId = typeDefinition;
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.type = attributeType;
-    item.nodeAttributes.content.decoded.data = (void*) (uintptr_t) attr; // hack. is not written into.
-    request.nodesToAdd = &item;
-    request.nodesToAddSize = 1;
-
-    return __UA_Client_AsyncService(client, &request,
-            &UA_TYPES[UA_TYPES_ADDNODESREQUEST], callback,
-            &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], userdata, reqId);
-
-}
-
-/* Misc Highlevel Functions */
-#ifdef UA_ENABLE_METHODCALLS
-UA_StatusCode __UA_Client_call_async(UA_Client *client,
-        const UA_NodeId objectId, const UA_NodeId methodId, size_t inputSize,
-        const UA_Variant *input, UA_ClientAsyncServiceCallback callback,
-        void *userdata, UA_UInt32 *reqId) {
-
-    UA_CallRequest request;
-    UA_CallRequest_init(&request);
-    UA_CallMethodRequest item;
-    UA_CallMethodRequest_init(&item);
-    item.methodId = methodId;
-    item.objectId = objectId;
-    item.inputArguments = (UA_Variant *) (void*) (uintptr_t) input; // cast const...
-    item.inputArgumentsSize = inputSize;
-    request.methodsToCall = &item;
-    request.methodsToCallSize = 1;
-
-    return __UA_Client_AsyncService(client, &request,
-            &UA_TYPES[UA_TYPES_CALLREQUEST], callback,
-            &UA_TYPES[UA_TYPES_CALLRESPONSE], userdata, reqId);
-}
-#endif
-
-UA_StatusCode __UA_Client_translateBrowsePathsToNodeIds_async(UA_Client *client,
-        char *paths[], UA_UInt32 ids[], size_t pathSize,
-        UA_ClientAsyncServiceCallback callback, void *userdata,
-        UA_UInt32 *reqId) {
-
-    UA_BrowsePath browsePath;
-    UA_BrowsePath_init(&browsePath);
-    browsePath.startingNode = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    browsePath.relativePath.elements = (UA_RelativePathElement*) UA_Array_new(
-            pathSize, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]);
-    if (!browsePath.relativePath.elements)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    browsePath.relativePath.elementsSize = pathSize;
-
-    UA_TranslateBrowsePathsToNodeIdsRequest request;
-    UA_TranslateBrowsePathsToNodeIdsRequest_init(&request);
-    request.browsePaths = &browsePath;
-    request.browsePathsSize = 1;
-
-    UA_StatusCode retval = __UA_Client_AsyncService(client, &request,
-            &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], callback,
-            &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], userdata,
-            reqId);
-    if (retval != UA_STATUSCODE_GOOD) {
-        UA_Array_delete(browsePath.relativePath.elements,
-                browsePath.relativePath.elementsSize,
-                &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]);
-        return retval;
-    }
-    UA_BrowsePath_deleteMembers(&browsePath);
-    return retval;
-}
diff --git a/ext/open62541/src/client/ua_client_internal.h b/ext/open62541/src/client/ua_client_internal.h
deleted file mode 100644
index ff3acb8..0000000
--- a/ext/open62541/src/client/ua_client_internal.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#ifndef UA_CLIENT_INTERNAL_H_
-#define UA_CLIENT_INTERNAL_H_
-
-#define UA_INTERNAL
-#include <open62541/client.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/client_subscriptions.h>
-
-#include "open62541_queue.h"
-#include "ua_securechannel.h"
-#include "ua_timer.h"
-#include "ua_workqueue.h"
-
-_UA_BEGIN_DECLS
-
-/**************************/
-/* Subscriptions Handling */
-/**************************/
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-typedef struct UA_Client_NotificationsAckNumber {
-    LIST_ENTRY(UA_Client_NotificationsAckNumber) listEntry;
-    UA_SubscriptionAcknowledgement subAck;
-} UA_Client_NotificationsAckNumber;
-
-typedef struct UA_Client_MonitoredItem {
-    LIST_ENTRY(UA_Client_MonitoredItem) listEntry;
-    UA_UInt32 monitoredItemId;
-    UA_UInt32 clientHandle;
-    void *context;
-    UA_Client_DeleteMonitoredItemCallback deleteCallback;
-    union {
-        UA_Client_DataChangeNotificationCallback dataChangeCallback;
-        UA_Client_EventNotificationCallback eventCallback;
-    } handler;
-    UA_Boolean isEventMonitoredItem; /* Otherwise a DataChange MoniitoredItem */
-} UA_Client_MonitoredItem;
-
-typedef struct UA_Client_Subscription {
-    LIST_ENTRY(UA_Client_Subscription) listEntry;
-    UA_UInt32 subscriptionId;
-    void *context;
-    UA_Double publishingInterval;
-    UA_UInt32 maxKeepAliveCount;
-    UA_Client_StatusChangeNotificationCallback statusChangeCallback;
-    UA_Client_DeleteSubscriptionCallback deleteCallback;
-    UA_UInt32 sequenceNumber;
-    UA_DateTime lastActivity;
-    LIST_HEAD(UA_ListOfClientMonitoredItems, UA_Client_MonitoredItem) monitoredItems;
-} UA_Client_Subscription;
-
-void
-UA_Client_Subscriptions_clean(UA_Client *client);
-
-void
-UA_Client_MonitoredItem_remove(UA_Client *client, UA_Client_Subscription *sub,
-                               UA_Client_MonitoredItem *mon);
-
-void
-UA_Client_Subscriptions_processPublishResponse(UA_Client *client,
-                                               UA_PublishRequest *request,
-                                               UA_PublishResponse *response);
-
-UA_StatusCode
-UA_Client_preparePublishRequest(UA_Client *client, UA_PublishRequest *request);
-
-UA_StatusCode
-UA_Client_Subscriptions_backgroundPublish(UA_Client *client);
-
-void
-UA_Client_Subscriptions_backgroundPublishInactivityCheck(UA_Client *client);
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-
-/**************/
-/* Encryption */
-/**************/
-
-UA_StatusCode
-signActivateSessionRequest(UA_SecureChannel *channel,
-                           UA_ActivateSessionRequest *request);
-/**********/
-/* Client */
-/**********/
-
-typedef struct AsyncServiceCall {
-    LIST_ENTRY(AsyncServiceCall) pointers;
-    UA_UInt32 requestId;
-    UA_ClientAsyncServiceCallback callback;
-    const UA_DataType *responseType;
-    void *userdata;
-    UA_DateTime start;
-    UA_UInt32 timeout;
-    void *responsedata;
-} AsyncServiceCall;
-
-void UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac,
-                                   UA_StatusCode statusCode);
-
-void UA_Client_AsyncService_removeAll(UA_Client *client, UA_StatusCode statusCode);
-
-typedef struct CustomCallback {
-    LIST_ENTRY(CustomCallback)
-    pointers;
-    //to find the correct callback
-    UA_UInt32 callbackId;
-
-    UA_ClientAsyncServiceCallback callback;
-
-    UA_AttributeId attributeId;
-    const UA_DataType *outDataType;
-} CustomCallback;
-
-struct UA_Client {
-    /* State */
-    UA_ClientState state;
-
-    UA_ClientConfig config;
-    UA_Timer timer;
-    UA_StatusCode connectStatus;
-
-    /* Connection */
-    UA_Connection connection;
-
-    /* SecureChannel */
-    UA_SecureChannel channel;
-    UA_UInt32 requestId;
-    UA_DateTime nextChannelRenewal;
-
-    /* Session */
-    UA_NodeId authenticationToken;
-    UA_UInt32 requestHandle;
-
-    UA_Boolean endpointsHandshake;
-    UA_String endpointUrl; /* Only for the async connect */
-
-    /* Async Service */
-    AsyncServiceCall asyncConnectCall;
-    LIST_HEAD(ListOfAsyncServiceCall, AsyncServiceCall) asyncServiceCalls;
-    /*When using highlevel functions these are the callbacks that can be accessed by the user*/
-    LIST_HEAD(ListOfCustomCallback, CustomCallback) customCallbacks;
-
-    /* Work queue */
-    UA_WorkQueue workQueue;
-
-    /* Subscriptions */
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_UInt32 monitoredItemHandles;
-    LIST_HEAD(, UA_Client_NotificationsAckNumber) pendingNotificationsAcks;
-    LIST_HEAD(, UA_Client_Subscription) subscriptions;
-    UA_UInt16 currentlyOutStandingPublishRequests;
-#endif
-
-    /* Connectivity check */
-    UA_DateTime lastConnectivityCheck;
-    UA_Boolean pendingConnectivityCheck;
-};
-
-void
-setClientState(UA_Client *client, UA_ClientState state);
-
-/* The endpointUrl must be set in the configuration. If the complete
- * endpointdescription is not set, a GetEndpoints is performed. */
-UA_StatusCode
-UA_Client_connectInternal(UA_Client *client, const UA_String endpointUrl);
-
-UA_StatusCode
-UA_Client_connectTCPSecureChannel(UA_Client *client, const UA_String endpointUrl);
-
-UA_StatusCode
-UA_Client_connectSession(UA_Client *client);
-
-UA_StatusCode
-UA_Client_getEndpointsInternal(UA_Client *client, const UA_String endpointUrl,
-                               size_t *endpointDescriptionsSize,
-                               UA_EndpointDescription **endpointDescriptions);
-
-/* Receive and process messages until a synchronous message arrives or the
- * timout finishes */
-UA_StatusCode
-receivePacketAsync(UA_Client *client);
-
-UA_StatusCode
-processACKResponseAsync(void *application, UA_Connection *connection,
-                        UA_ByteString *chunk);
-
-UA_StatusCode
-processOPNResponseAsync(void *application, UA_Connection *connection,
-                        UA_ByteString *chunk);
-
-UA_StatusCode
-openSecureChannel(UA_Client *client, UA_Boolean renew);
-
-UA_StatusCode
-receiveServiceResponse(UA_Client *client, void *response,
-                       const UA_DataType *responseType, UA_DateTime maxDate,
-                       const UA_UInt32 *synchronousRequestId);
-
-UA_StatusCode
-receiveServiceResponseAsync(UA_Client *client, void *response,
-                             const UA_DataType *responseType);
-
-UA_StatusCode
-UA_Client_connect_iterate (UA_Client *client);
-
-void
-setUserIdentityPolicyId(const UA_EndpointDescription *endpoint,
-                        const UA_DataType *tokenType,
-                        UA_String *policyId, UA_String *securityPolicyUri);
-
-UA_SecurityPolicy *
-getSecurityPolicy(UA_Client *client, UA_String policyUri);
-
-UA_StatusCode
-encryptUserIdentityToken(UA_Client *client, const UA_String *userTokenSecurityPolicy,
-                         UA_ExtensionObject *userIdentityToken);
-
-_UA_END_DECLS
-
-#endif /* UA_CLIENT_INTERNAL_H_ */
diff --git a/ext/open62541/src/client/ua_client_subscriptions.c b/ext/open62541/src/client/ua_client_subscriptions.c
deleted file mode 100644
index c43b34d..0000000
--- a/ext/open62541/src/client/ua_client_subscriptions.c
+++ /dev/null
@@ -1,846 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016 (c) Sten Grüner
- *    Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2017 (c) Frank Meerkötter
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include <open62541/client_highlevel.h>
-#include <open62541/client_highlevel_async.h>
-
-#include "ua_client_internal.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */
-
-/*****************/
-/* Subscriptions */
-/*****************/
-
-UA_CreateSubscriptionResponse UA_EXPORT
-UA_Client_Subscriptions_create(UA_Client *client,
-                               const UA_CreateSubscriptionRequest request,
-                               void *subscriptionContext,
-                               UA_Client_StatusChangeNotificationCallback statusChangeCallback,
-                               UA_Client_DeleteSubscriptionCallback deleteCallback) {
-    UA_CreateSubscriptionResponse response;
-    UA_CreateSubscriptionResponse_init(&response);
-    
-    /* Allocate the internal representation */
-    UA_Client_Subscription *newSub = (UA_Client_Subscription*)
-        UA_malloc(sizeof(UA_Client_Subscription));
-    if(!newSub) {
-        response.responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return response;
-    }
-
-    /* Send the request as a synchronous service call */
-    __UA_Client_Service(client,
-                        &request, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]);
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_free(newSub);
-        return response;
-    }
-
-    /* Prepare the internal representation */
-    newSub->context = subscriptionContext;
-    newSub->subscriptionId = response.subscriptionId;
-    newSub->sequenceNumber = 0;
-    newSub->lastActivity = UA_DateTime_nowMonotonic();
-    newSub->statusChangeCallback = statusChangeCallback;
-    newSub->deleteCallback = deleteCallback;
-    newSub->publishingInterval = response.revisedPublishingInterval;
-    newSub->maxKeepAliveCount = response.revisedMaxKeepAliveCount;
-    LIST_INIT(&newSub->monitoredItems);
-    LIST_INSERT_HEAD(&client->subscriptions, newSub, listEntry);
-
-    return response;
-}
-
-static UA_Client_Subscription *
-findSubscription(const UA_Client *client, UA_UInt32 subscriptionId) {
-    UA_Client_Subscription *sub = NULL;
-    LIST_FOREACH(sub, &client->subscriptions, listEntry) {
-        if(sub->subscriptionId == subscriptionId)
-            break;
-    }
-    return sub;
-}
-
-UA_ModifySubscriptionResponse UA_EXPORT
-UA_Client_Subscriptions_modify(UA_Client *client, const UA_ModifySubscriptionRequest request) {
-    UA_ModifySubscriptionResponse response;
-    UA_ModifySubscriptionResponse_init(&response);
-
-    /* Find the internal representation */
-    UA_Client_Subscription *sub = findSubscription(client, request.subscriptionId);
-    if(!sub) {
-        response.responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return response;
-    }
-    
-    /* Call the service */
-    __UA_Client_Service(client,
-                        &request, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]);
-
-    /* Adjust the internal representation */
-    sub->publishingInterval = response.revisedPublishingInterval;
-    sub->maxKeepAliveCount = response.revisedMaxKeepAliveCount;
-    return response;
-}
-
-static void
-UA_Client_Subscription_deleteInternal(UA_Client *client, UA_Client_Subscription *sub) {
-    /* Remove the MonitoredItems */
-    UA_Client_MonitoredItem *mon, *mon_tmp;
-    LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, mon_tmp)
-        UA_Client_MonitoredItem_remove(client, sub, mon);
-
-    /* Call the delete callback */
-    if(sub->deleteCallback)
-        sub->deleteCallback(client, sub->subscriptionId, sub->context);
-
-    /* Remove */
-    LIST_REMOVE(sub, listEntry);
-    UA_free(sub);
-}
-
-UA_DeleteSubscriptionsResponse UA_EXPORT
-UA_Client_Subscriptions_delete(UA_Client *client, const UA_DeleteSubscriptionsRequest request) {
-    UA_STACKARRAY(UA_Client_Subscription*, subs, request.subscriptionIdsSize);
-    memset(subs, 0, sizeof(void*) * request.subscriptionIdsSize);
-
-    /* temporary remove the subscriptions from the list */
-    for(size_t i = 0; i < request.subscriptionIdsSize; i++) {
-        subs[i] = findSubscription(client, request.subscriptionIds[i]);
-        if (subs[i])
-            LIST_REMOVE(subs[i], listEntry);
-    }
-
-    /* Send the request */
-    UA_DeleteSubscriptionsResponse response;
-    __UA_Client_Service(client,
-                        &request, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]);
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    if(request.subscriptionIdsSize != response.resultsSize) {
-        response.responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        goto cleanup;
-    }
-
-    /* Loop over the removed subscriptions and remove internally */
-    for(size_t i = 0; i < request.subscriptionIdsSize; i++) {
-        if(response.results[i] != UA_STATUSCODE_GOOD &&
-           response.results[i] != UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID) {
-            /* Something was wrong, reinsert the subscription in the list */
-            if (subs[i])
-                LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry);
-            continue;
-        }
-
-        if(!subs[i]) {
-            UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                        "No internal representation of subscription %u",
-                        request.subscriptionIds[i]);
-            continue;
-        }
-        
-        LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry);
-        UA_Client_Subscription_deleteInternal(client, subs[i]);
-    }
-
-    return response;
-
-cleanup:
-    for(size_t i = 0; i < request.subscriptionIdsSize; i++) {
-        if (subs[i]) {
-            LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry);
-        }
-    }
-    return response;
-}
-
-UA_StatusCode UA_EXPORT
-UA_Client_Subscriptions_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId) {
-    UA_DeleteSubscriptionsRequest request;
-    UA_DeleteSubscriptionsRequest_init(&request);
-    request.subscriptionIds = &subscriptionId;
-    request.subscriptionIdsSize = 1;
-    
-    UA_DeleteSubscriptionsResponse response =
-        UA_Client_Subscriptions_delete(client, request);
-
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_DeleteSubscriptionsResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    if(response.resultsSize != 1) {
-        UA_DeleteSubscriptionsResponse_deleteMembers(&response);
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    retval = response.results[0];
-    UA_DeleteSubscriptionsResponse_deleteMembers(&response);
-    return retval;
-}
-
-/******************/
-/* MonitoredItems */
-/******************/
-
-void
-UA_Client_MonitoredItem_remove(UA_Client *client, UA_Client_Subscription *sub,
-                               UA_Client_MonitoredItem *mon) {
-    // NOLINTNEXTLINE
-    LIST_REMOVE(mon, listEntry);
-    if(mon->deleteCallback)
-        mon->deleteCallback(client, sub->subscriptionId, sub->context,
-                            mon->monitoredItemId, mon->context);
-    UA_free(mon);
-}
-
-static void
-__UA_Client_MonitoredItems_create(UA_Client *client,
-                                  const UA_CreateMonitoredItemsRequest *request,
-                                  void **contexts, void **handlingCallbacks,
-                                  UA_Client_DeleteMonitoredItemCallback *deleteCallbacks,
-                                  UA_CreateMonitoredItemsResponse *response) {
-    UA_CreateMonitoredItemsResponse_init(response);
-
-    if (!request->itemsToCreateSize) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        return;
-    }
-
-    /* Fix clang warning */
-    size_t itemsToCreateSize = request->itemsToCreateSize;
-    UA_Client_Subscription *sub = NULL;
-    
-    /* Allocate the memory for internal representations */
-    UA_STACKARRAY(UA_Client_MonitoredItem*, mis, itemsToCreateSize);
-    memset(mis, 0, sizeof(void*) * itemsToCreateSize);
-    for(size_t i = 0; i < itemsToCreateSize; i++) {
-        mis[i] = (UA_Client_MonitoredItem*)UA_malloc(sizeof(UA_Client_MonitoredItem));
-        if(!mis[i]) {
-            response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-            goto cleanup;
-        }
-    }
-
-    /* Get the subscription */
-    sub = findSubscription(client, request->subscriptionId);
-    if(!sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        goto cleanup;
-    }
-
-    /* Set the clientHandle */
-    for(size_t i = 0; i < itemsToCreateSize; i++)
-        request->itemsToCreate[i].requestedParameters.clientHandle = ++(client->monitoredItemHandles);
-
-    /* Call the service */
-    __UA_Client_Service(client, request, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST],
-                        response, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]);
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    if(response->resultsSize != itemsToCreateSize) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        goto cleanup;
-    }
-
-    /* Add internally */
-    for(size_t i = 0; i < itemsToCreateSize; i++) {
-        if(response->results[i].statusCode != UA_STATUSCODE_GOOD) {
-            if (deleteCallbacks[i])
-                deleteCallbacks[i](client, sub->subscriptionId, sub->context, 0, contexts[i]);
-            UA_free(mis[i]);
-            mis[i] = NULL;
-            continue;
-        }
-            
-        UA_Client_MonitoredItem *newMon = mis[i];
-        newMon->clientHandle = request->itemsToCreate[i].requestedParameters.clientHandle;
-        newMon->monitoredItemId = response->results[i].monitoredItemId;
-        newMon->context = contexts[i];
-        newMon->deleteCallback = deleteCallbacks[i];
-        newMon->handler.dataChangeCallback =
-            (UA_Client_DataChangeNotificationCallback)(uintptr_t)handlingCallbacks[i];
-        newMon->isEventMonitoredItem =
-            (request->itemsToCreate[i].itemToMonitor.attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER);
-        LIST_INSERT_HEAD(&sub->monitoredItems, newMon, listEntry);
-
-        UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "Subscription %u | Added a MonitoredItem with handle %u",
-                     sub->subscriptionId, newMon->clientHandle);
-    }
-
-    return;
-
- cleanup:
-    for(size_t i = 0; i < itemsToCreateSize; i++) {
-        if (deleteCallbacks[i]) {
-            if (sub)
-                deleteCallbacks[i](client, sub->subscriptionId, sub->context, 0, contexts[i]);
-            else
-                deleteCallbacks[i](client, 0, NULL, 0, contexts[i]);
-        }
-        if(mis[i])
-            UA_free(mis[i]);
-    }
-}
-
-UA_CreateMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_createDataChanges(UA_Client *client,
-            const UA_CreateMonitoredItemsRequest request, void **contexts,
-            UA_Client_DataChangeNotificationCallback *callbacks,
-            UA_Client_DeleteMonitoredItemCallback *deleteCallbacks) {
-    UA_CreateMonitoredItemsResponse response;
-    __UA_Client_MonitoredItems_create(client, &request, contexts,
-                (void**)(uintptr_t)callbacks, deleteCallbacks, &response);
-    return response;
-}
-
-UA_MonitoredItemCreateResult UA_EXPORT
-UA_Client_MonitoredItems_createDataChange(UA_Client *client, UA_UInt32 subscriptionId,
-          UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item,
-          void *context, UA_Client_DataChangeNotificationCallback callback,
-          UA_Client_DeleteMonitoredItemCallback deleteCallback) {
-    UA_CreateMonitoredItemsRequest request;
-    UA_CreateMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.timestampsToReturn = timestampsToReturn;
-    request.itemsToCreate = (UA_MonitoredItemCreateRequest*)(uintptr_t)&item;
-    request.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse response = 
-       UA_Client_MonitoredItems_createDataChanges(client, request, &context,
-                                                   &callback, &deleteCallback);
-    UA_MonitoredItemCreateResult result;
-    UA_MonitoredItemCreateResult_init(&result);
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        result.statusCode = response.responseHeader.serviceResult;
-
-    if(result.statusCode == UA_STATUSCODE_GOOD &&
-       response.resultsSize != 1)
-        result.statusCode = UA_STATUSCODE_BADINTERNALERROR;
-    
-    if(result.statusCode == UA_STATUSCODE_GOOD)
-       UA_MonitoredItemCreateResult_copy(&response.results[0] , &result);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&response);
-    return result;
-}
-
-UA_CreateMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_createEvents(UA_Client *client,
-            const UA_CreateMonitoredItemsRequest request, void **contexts,
-            UA_Client_EventNotificationCallback *callback,
-            UA_Client_DeleteMonitoredItemCallback *deleteCallback) {
-    UA_CreateMonitoredItemsResponse response;
-    __UA_Client_MonitoredItems_create(client, &request, contexts,
-                (void**)(uintptr_t)callback, deleteCallback, &response);
-    return response;
-}
-
-UA_MonitoredItemCreateResult UA_EXPORT
-UA_Client_MonitoredItems_createEvent(UA_Client *client, UA_UInt32 subscriptionId,
-          UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item,
-          void *context, UA_Client_EventNotificationCallback callback,
-          UA_Client_DeleteMonitoredItemCallback deleteCallback) {
-    UA_CreateMonitoredItemsRequest request;
-    UA_CreateMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.timestampsToReturn = timestampsToReturn;
-    request.itemsToCreate = (UA_MonitoredItemCreateRequest*)(uintptr_t)&item;
-    request.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse response = 
-       UA_Client_MonitoredItems_createEvents(client, request, &context,
-                                             &callback, &deleteCallback);
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    UA_MonitoredItemCreateResult result;
-    UA_MonitoredItemCreateResult_init(&result);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_CreateMonitoredItemsResponse_deleteMembers(&response);
-        result.statusCode = retval;
-        return result;
-    }
-    UA_MonitoredItemCreateResult_copy(response.results , &result);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&response);
-    return result;
-}
-
-UA_DeleteMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_delete(UA_Client *client, const UA_DeleteMonitoredItemsRequest request) {
-    /* Send the request */
-    UA_DeleteMonitoredItemsResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]);
-    if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        return response;
-
-    UA_Client_Subscription *sub = findSubscription(client, request.subscriptionId);
-    if(!sub) {
-        UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                    "No internal representation of subscription %u",
-                    request.subscriptionId);
-        return response;
-    }
-
-    /* Loop over deleted MonitoredItems */
-    for(size_t i = 0; i < response.resultsSize; i++) {
-        if(response.results[i] != UA_STATUSCODE_GOOD &&
-           response.results[i] != UA_STATUSCODE_BADMONITOREDITEMIDINVALID) {
-            continue;
-        }
-
-#ifndef __clang_analyzer__
-        /* Delete the internal representation */
-        UA_Client_MonitoredItem *mon;
-        LIST_FOREACH(mon, &sub->monitoredItems, listEntry) {
-            // NOLINTNEXTLINE
-            if (mon->monitoredItemId == request.monitoredItemIds[i]) {
-                UA_Client_MonitoredItem_remove(client, sub, mon);
-                break;
-            }
-        }
-#endif
-    }
-
-    return response;
-}
-
-UA_StatusCode UA_EXPORT
-UA_Client_MonitoredItems_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId, UA_UInt32 monitoredItemId) {
-    UA_DeleteMonitoredItemsRequest request;
-    UA_DeleteMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.monitoredItemIds = &monitoredItemId;
-    request.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse response =
-        UA_Client_MonitoredItems_delete(client, request);
-
-    UA_StatusCode retval = response.responseHeader.serviceResult;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_DeleteMonitoredItemsResponse_deleteMembers(&response);
-        return retval;
-    }
-
-    if(response.resultsSize != 1) {
-        UA_DeleteMonitoredItemsResponse_deleteMembers(&response);
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    retval = response.results[0];
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&response);
-    return retval;
-}
-
-UA_ModifyMonitoredItemsResponse UA_EXPORT
-UA_Client_MonitoredItems_modify(UA_Client *client,
-                                const UA_ModifyMonitoredItemsRequest request) {
-    UA_ModifyMonitoredItemsResponse response;
-
-    UA_Client_Subscription *sub = 0;
-    LIST_FOREACH(sub, &client->subscriptions, listEntry) {
-        if (sub->subscriptionId == request.subscriptionId)
-            break;
-    }
-
-    if (!sub) {
-        UA_ModifyMonitoredItemsResponse_init(&response);
-        response.responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return response;
-    }
-
-    UA_ModifyMonitoredItemsRequest modifiedRequest;
-    UA_ModifyMonitoredItemsRequest_copy(&request, &modifiedRequest);
-
-    for (size_t i = 0; i < modifiedRequest.itemsToModifySize; ++i) {
-        UA_Client_MonitoredItem *mon = 0;
-        LIST_FOREACH(mon, &sub->monitoredItems, listEntry) {
-            if(mon->monitoredItemId == modifiedRequest.itemsToModify[i].monitoredItemId) {
-                modifiedRequest.itemsToModify[i].requestedParameters.clientHandle = mon->clientHandle;
-                break;
-            }
-        }
-    }
-
-    __UA_Client_Service(client,
-                        &modifiedRequest, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]);
-
-    UA_ModifyMonitoredItemsRequest_deleteMembers(&modifiedRequest);
-    return response;
-}
-
-/*************************************/
-/* Async Processing of Notifications */
-/*************************************/
-
-/* Assume the request is already initialized */
-UA_StatusCode
-UA_Client_preparePublishRequest(UA_Client *client, UA_PublishRequest *request) {
-    /* Count acks */
-    UA_Client_NotificationsAckNumber *ack;
-    LIST_FOREACH(ack, &client->pendingNotificationsAcks, listEntry)
-        ++request->subscriptionAcknowledgementsSize;
-
-    /* Create the array. Returns a sentinel pointer if the length is zero. */
-    request->subscriptionAcknowledgements = (UA_SubscriptionAcknowledgement*)
-        UA_Array_new(request->subscriptionAcknowledgementsSize,
-                     &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]);
-    if(!request->subscriptionAcknowledgements) {
-        request->subscriptionAcknowledgementsSize = 0;
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    size_t i = 0;
-    UA_Client_NotificationsAckNumber *ack_tmp;
-    LIST_FOREACH_SAFE(ack, &client->pendingNotificationsAcks, listEntry, ack_tmp) {
-        request->subscriptionAcknowledgements[i].sequenceNumber = ack->subAck.sequenceNumber;
-        request->subscriptionAcknowledgements[i].subscriptionId = ack->subAck.subscriptionId;
-        ++i;
-        LIST_REMOVE(ack, listEntry);
-        UA_free(ack);
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* According to OPC Unified Architecture, Part 4 5.13.1.1 i) */
-/* The value 0 is never used for the sequence number         */
-static UA_UInt32
-UA_Client_Subscriptions_nextSequenceNumber(UA_UInt32 sequenceNumber) {
-    UA_UInt32 nextSequenceNumber = sequenceNumber + 1;
-    if(nextSequenceNumber == 0)
-        nextSequenceNumber = 1;
-    return nextSequenceNumber;
-}
-
-static void
-processDataChangeNotification(UA_Client *client, UA_Client_Subscription *sub,
-                              UA_DataChangeNotification *dataChangeNotification) {
-    for(size_t j = 0; j < dataChangeNotification->monitoredItemsSize; ++j) {
-        UA_MonitoredItemNotification *min = &dataChangeNotification->monitoredItems[j];
-
-        /* Find the MonitoredItem */
-        UA_Client_MonitoredItem *mon;
-        LIST_FOREACH(mon, &sub->monitoredItems, listEntry) {
-            if(mon->clientHandle == min->clientHandle)
-                break;
-        }
-
-        if(!mon) {
-            UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Could not process a notification with clienthandle %u on subscription %u",
-                         min->clientHandle, sub->subscriptionId);
-            continue;
-        }
-
-        if(mon->isEventMonitoredItem) {
-            UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "MonitoredItem is configured for Events. But received a "
-                         "DataChangeNotification.");
-            continue;
-        }
-
-        mon->handler.dataChangeCallback(client, sub->subscriptionId, sub->context,
-                                        mon->monitoredItemId, mon->context,
-                                        &min->value);
-    }
-}
-
-static void
-processEventNotification(UA_Client *client, UA_Client_Subscription *sub,
-                         UA_EventNotificationList *eventNotificationList) {
-    for(size_t j = 0; j < eventNotificationList->eventsSize; ++j) {
-        UA_EventFieldList *eventFieldList = &eventNotificationList->events[j];
-
-        /* Find the MonitoredItem */
-        UA_Client_MonitoredItem *mon;
-        LIST_FOREACH(mon, &sub->monitoredItems, listEntry) {
-            if(mon->clientHandle == eventFieldList->clientHandle)
-                break;
-        }
-
-        if(!mon) {
-            UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Could not process a notification with clienthandle %u on subscription %u",
-                         eventFieldList->clientHandle, sub->subscriptionId);
-            continue;
-        }
-
-        if(!mon->isEventMonitoredItem) {
-            UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "MonitoredItem is configured for DataChanges. But received a "
-                         "EventNotification.");
-            continue;
-        }
-
-        mon->handler.eventCallback(client, sub->subscriptionId, sub->context,
-                                   mon->monitoredItemId, mon->context,
-                                   eventFieldList->eventFieldsSize,
-                                   eventFieldList->eventFields);
-    }
-}
-
-static void
-processNotificationMessage(UA_Client *client, UA_Client_Subscription *sub,
-                           UA_ExtensionObject *msg) {
-    if(msg->encoding != UA_EXTENSIONOBJECT_DECODED)
-        return;
-
-    /* Handle DataChangeNotification */
-    if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]) {
-        UA_DataChangeNotification *dataChangeNotification =
-            (UA_DataChangeNotification *)msg->content.decoded.data;
-        processDataChangeNotification(client, sub, dataChangeNotification);
-        return;
-    }
-
-    /* Handle EventNotification */
-    if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]) {
-        UA_EventNotificationList *eventNotificationList =
-            (UA_EventNotificationList *)msg->content.decoded.data;
-        processEventNotification(client, sub, eventNotificationList);
-        return;
-    }
-
-    /* Handle StatusChangeNotification */
-    if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]) {
-        if(sub->statusChangeCallback) {
-            sub->statusChangeCallback(client, sub->subscriptionId, sub->context,
-                                      (UA_StatusChangeNotification*)msg->content.decoded.data);
-        } else {
-            UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                           "Dropped a StatusChangeNotification since no callback is registered");
-        }
-        return;
-    }
-
-    UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                   "Unknown notification message type");
-}
-
-void
-UA_Client_Subscriptions_processPublishResponse(UA_Client *client, UA_PublishRequest *request,
-                                               UA_PublishResponse *response) {
-    UA_NotificationMessage *msg = &response->notificationMessage;
-
-    client->currentlyOutStandingPublishRequests--;
-
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS) {
-        if(client->config.outStandingPublishRequests > 1) {
-            client->config.outStandingPublishRequests--;
-            UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                          "Too many publishrequest, reduce outStandingPublishRequests to %d",
-                           client->config.outStandingPublishRequests);
-        } else {
-            UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Too many publishrequest when outStandingPublishRequests = 1");
-            UA_Client_Subscriptions_deleteSingle(client, response->subscriptionId);
-        }
-        return;
-    }
-
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSHUTDOWN)
-        return;
-
-    if(!LIST_FIRST(&client->subscriptions)) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION;
-        return;
-    }
-
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSESSIONCLOSED) {
-        if(client->state >= UA_CLIENTSTATE_SESSION) {
-            UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                           "Received Publish Response with code %s",
-                            UA_StatusCode_name(response->responseHeader.serviceResult));
-            UA_Client_Subscription* sub = findSubscription(client, response->subscriptionId);
-            if (sub != NULL)
-              UA_Client_Subscription_deleteInternal(client, sub);
-        }
-        return;
-    }
-
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSESSIONIDINVALID) {
-        UA_Client_disconnect(client); /* TODO: This should be handled before the process callback */
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                       "Received BadSessionIdInvalid");
-        return;
-    }
-
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTIMEOUT) {
-        if (client->config.inactivityCallback)
-            client->config.inactivityCallback(client);
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                       "Received Timeout for Publish Response");
-        return;
-    }
-
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                       "Received Publish Response with code %s",
-                       UA_StatusCode_name(response->responseHeader.serviceResult));
-        return;
-    }
-
-    UA_Client_Subscription *sub = findSubscription(client, response->subscriptionId);
-    if(!sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                       "Received Publish Response for a non-existant subscription");
-        return;
-    }
-
-    sub->lastActivity = UA_DateTime_nowMonotonic();
-
-    /* Detect missing message - OPC Unified Architecture, Part 4 5.13.1.1 e) */
-    if(UA_Client_Subscriptions_nextSequenceNumber(sub->sequenceNumber) != msg->sequenceNumber) {
-        UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Invalid subscription sequence number: expected %u but got %u",
-                     UA_Client_Subscriptions_nextSequenceNumber(sub->sequenceNumber),
-                     msg->sequenceNumber);
-        /* This is an error. But we do not abort the connection. Some server
-         * SDKs misbehave from time to time and send out-of-order sequence
-         * numbers. (Probably some multi-threading synchronization issue.) */
-        /* UA_Client_disconnect(client);
-           return; */
-    }
-    /* According to f), a keep-alive message contains no notifications and has the sequence number
-     * of the next NotificationMessage that is to be sent => More than one consecutive keep-alive
-     * message or a NotificationMessage following a keep-alive message will share the same sequence
-     * number. */
-    if (msg->notificationDataSize)
-        sub->sequenceNumber = msg->sequenceNumber;
-
-    /* Process the notification messages */
-    for(size_t k = 0; k < msg->notificationDataSize; ++k)
-        processNotificationMessage(client, sub, &msg->notificationData[k]);
-
-    /* Add to the list of pending acks */
-    for(size_t i = 0; i < response->availableSequenceNumbersSize; i++) {
-        if(response->availableSequenceNumbers[i] != msg->sequenceNumber)
-            continue;
-        UA_Client_NotificationsAckNumber *tmpAck = (UA_Client_NotificationsAckNumber*)
-            UA_malloc(sizeof(UA_Client_NotificationsAckNumber));
-        if(!tmpAck) {
-            UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                           "Not enough memory to store the acknowledgement for a publish "
-                           "message on subscription %u", sub->subscriptionId);
-            break;
-        }   
-        tmpAck->subAck.sequenceNumber = msg->sequenceNumber;
-        tmpAck->subAck.subscriptionId = sub->subscriptionId;
-        LIST_INSERT_HEAD(&client->pendingNotificationsAcks, tmpAck, listEntry);
-        break;
-    } 
-}
-
-static void
-processPublishResponseAsync(UA_Client *client, void *userdata, UA_UInt32 requestId,
-                            void *response) {
-    UA_PublishRequest *req = (UA_PublishRequest*)userdata;
-    UA_PublishResponse *res = (UA_PublishResponse*)response;
-
-    /* Process the response */
-    UA_Client_Subscriptions_processPublishResponse(client, req, res);
-
-    /* Delete the cached request */
-    UA_PublishRequest_delete(req);
-
-    /* Fill up the outstanding publish requests */
-    UA_Client_Subscriptions_backgroundPublish(client);
-}
-
-void
-UA_Client_Subscriptions_clean(UA_Client *client) {
-    UA_Client_NotificationsAckNumber *n, *tmp;
-    LIST_FOREACH_SAFE(n, &client->pendingNotificationsAcks, listEntry, tmp) {
-        LIST_REMOVE(n, listEntry);
-        UA_free(n);
-    }
-
-    UA_Client_Subscription *sub, *tmps;
-    LIST_FOREACH_SAFE(sub, &client->subscriptions, listEntry, tmps)
-        UA_Client_Subscription_deleteInternal(client, sub); /* force local removal */
-
-    client->monitoredItemHandles = 0;
-}
-
-void
-UA_Client_Subscriptions_backgroundPublishInactivityCheck(UA_Client *client) {
-    if(client->state < UA_CLIENTSTATE_SESSION)
-        return;
-
-    /* Is the lack of responses the client's fault? */
-    if(client->currentlyOutStandingPublishRequests == 0)
-        return;
-
-    UA_Client_Subscription *sub;
-    LIST_FOREACH(sub, &client->subscriptions, listEntry) {
-        UA_DateTime maxSilence = (UA_DateTime)
-            ((sub->publishingInterval * sub->maxKeepAliveCount) +
-             client->config.timeout) * UA_DATETIME_MSEC;
-        if(maxSilence + sub->lastActivity < UA_DateTime_nowMonotonic()) {
-            /* Reset activity */
-            sub->lastActivity = UA_DateTime_nowMonotonic();
-
-            if(client->config.subscriptionInactivityCallback)
-                client->config.subscriptionInactivityCallback(client, sub->subscriptionId,
-                                                              sub->context);
-            UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                         "Inactivity for Subscription %u.", sub->subscriptionId);
-        }
-    }
-}
-
-UA_StatusCode
-UA_Client_Subscriptions_backgroundPublish(UA_Client *client) {
-    if(client->state < UA_CLIENTSTATE_SESSION)
-        return UA_STATUSCODE_BADSERVERNOTCONNECTED;
-
-    /* The session must have at least one subscription */
-    if(!LIST_FIRST(&client->subscriptions))
-        return UA_STATUSCODE_GOOD;
-
-    while(client->currentlyOutStandingPublishRequests < client->config.outStandingPublishRequests) {
-        UA_PublishRequest *request = UA_PublishRequest_new();
-        if (!request)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-
-        request->requestHeader.timeoutHint=60000;
-        UA_StatusCode retval = UA_Client_preparePublishRequest(client, request);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_PublishRequest_delete(request);
-            return retval;
-        }
-    
-        UA_UInt32 requestId;
-        client->currentlyOutStandingPublishRequests++;
-
-        /* Disable the timeout, it is treat in UA_Client_Subscriptions_backgroundPublishInactivityCheck */
-        retval = __UA_Client_AsyncServiceEx(client, request, &UA_TYPES[UA_TYPES_PUBLISHREQUEST],
-                                            processPublishResponseAsync,
-                                            &UA_TYPES[UA_TYPES_PUBLISHRESPONSE],
-                                            (void*)request, &requestId, 0);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_PublishRequest_delete(request);
-            return retval;
-        }
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
diff --git a/ext/open62541/src/client/ua_client_worker.c b/ext/open62541/src/client/ua_client_worker.c
deleted file mode 100644
index eedc388..0000000
--- a/ext/open62541/src/client/ua_client_worker.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "ua_client_internal.h"
-
-static void
-asyncServiceTimeoutCheck(UA_Client *client) {
-    UA_DateTime now = UA_DateTime_nowMonotonic();
-
-    /* Timeout occurs, remove the callback */
-    AsyncServiceCall *ac, *ac_tmp;
-    LIST_FOREACH_SAFE(ac, &client->asyncServiceCalls, pointers, ac_tmp) {
-        if(!ac->timeout)
-           continue;
-
-        if(ac->start + (UA_DateTime)(ac->timeout * UA_DATETIME_MSEC) <= now) {
-            LIST_REMOVE(ac, pointers);
-            UA_Client_AsyncService_cancel(client, ac, UA_STATUSCODE_BADTIMEOUT);
-            UA_free(ac);
-        }
-    }
-}
-
-static void
-backgroundConnectivityCallback(UA_Client *client, void *userdata,
-                               UA_UInt32 requestId, const UA_ReadResponse *response) {
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTIMEOUT) {
-        if (client->config.inactivityCallback)
-            client->config.inactivityCallback(client);
-    }
-    client->pendingConnectivityCheck = false;
-    client->lastConnectivityCheck = UA_DateTime_nowMonotonic();
-}
-
-static UA_StatusCode
-UA_Client_backgroundConnectivity(UA_Client *client) {
-    if(!client->config.connectivityCheckInterval)
-        return UA_STATUSCODE_GOOD;
-
-    if (client->pendingConnectivityCheck)
-        return UA_STATUSCODE_GOOD;
-
-    UA_DateTime now = UA_DateTime_nowMonotonic();
-    UA_DateTime nextDate = client->lastConnectivityCheck + (UA_DateTime)(client->config.connectivityCheckInterval * UA_DATETIME_MSEC);
-
-    if(now <= nextDate)
-        return UA_STATUSCODE_GOOD;
-
-    UA_ReadRequest request;
-    UA_ReadRequest_init(&request);
-
-    UA_ReadValueId rvid;
-    UA_ReadValueId_init(&rvid);
-    rvid.attributeId = UA_ATTRIBUTEID_VALUE;
-    rvid.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-
-    request.nodesToRead = &rvid;
-    request.nodesToReadSize = 1;
-
-    UA_StatusCode retval = __UA_Client_AsyncService(client, &request, &UA_TYPES[UA_TYPES_READREQUEST],
-                                                    (UA_ClientAsyncServiceCallback)backgroundConnectivityCallback,
-                                                    &UA_TYPES[UA_TYPES_READRESPONSE], NULL, NULL);
-
-    client->pendingConnectivityCheck = true;
-
-    return retval;
-}
-
-/**
- * Main Client Loop
- * ----------------
- * Start: Spin up the workers and the network layer
- * Iterate: Process repeated callbacks and events in the network layer.
- *          This part can be driven from an external main-loop in an
- *          event-driven single-threaded architecture.
- * Stop: Stop workers, finish all callbacks, stop the network layer,
- *       clean up */
-
-static void
-clientExecuteRepeatedCallback(UA_Client *client, UA_ApplicationCallback cb,
-                              void *callbackApplication, void *data) {
-    cb(callbackApplication, data);
-    /* TODO: Use workers in the client
-     * UA_WorkQueue_enqueue(&client->workQueue, cb, callbackApplication, data); */
-}
-
-UA_StatusCode UA_Client_run_iterate(UA_Client *client, UA_UInt16 timeout) {
-// TODO connectivity check & timeout features for the async implementation (timeout == 0)
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_StatusCode retvalPublish = UA_Client_Subscriptions_backgroundPublish(client);
-    if(client->state >= UA_CLIENTSTATE_SESSION && retvalPublish != UA_STATUSCODE_GOOD)
-        return retvalPublish;
-#endif
-    /* Make sure we have an open channel */
-
-    /************************************************************/
-    /* FIXME: This is a dirty workaround */
-    if(client->state >= UA_CLIENTSTATE_SECURECHANNEL)
-        retval = openSecureChannel(client, true);
-    /* FIXME: Will most likely break somewhere in the future */
-    /************************************************************/
-
-    if(timeout) {
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        retval = UA_Client_backgroundConnectivity(client);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        UA_DateTime maxDate = UA_DateTime_nowMonotonic() + (timeout * UA_DATETIME_MSEC);
-        retval = receiveServiceResponse(client, NULL, NULL, maxDate, NULL);
-        if(retval == UA_STATUSCODE_GOODNONCRITICALTIMEOUT)
-            retval = UA_STATUSCODE_GOOD;
-    } else {
-        UA_DateTime now = UA_DateTime_nowMonotonic();
-        UA_Timer_process(&client->timer, now,
-                         (UA_TimerExecutionCallback)clientExecuteRepeatedCallback, client);
-
-        UA_ClientState cs = UA_Client_getState(client);
-        retval = UA_Client_connect_iterate(client);
-
-        /* Connection failed, drop the rest */
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-        if((cs == UA_CLIENTSTATE_SECURECHANNEL) || (cs == UA_CLIENTSTATE_SESSION)) {
-            /* Check for new data */
-            retval = receiveServiceResponseAsync(client, NULL, NULL);
-        } else {
-            retval = receivePacketAsync(client);
-        }
-    }
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-        /* The inactivity check must be done after receiveServiceResponse*/
-        UA_Client_Subscriptions_backgroundPublishInactivityCheck(client);
-#endif
-        asyncServiceTimeoutCheck(client);
-
-#if UA_MULTITHREADING < 200
-        /* Process delayed callbacks when all callbacks and network events are
-         * done */
-        UA_WorkQueue_manuallyProcessDelayed(&client->workQueue);
-#endif
-    return retval;
-}
diff --git a/ext/open62541/src/pubsub/ua_pubsub.c b/ext/open62541/src/pubsub/ua_pubsub.c
deleted file mode 100644
index fbcd0b6..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub.c
+++ /dev/null
@@ -1,2188 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright (c) 2019 Fraunhofer IOSB (Author: Julius Pfrommer)
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-#include "server/ua_server_internal.h"
-
-#ifdef UA_ENABLE_PUBSUB /* conditional compilation */
-
-#include "ua_pubsub.h"
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-#include "ua_pubsub_ns0.h"
-#endif
-
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-#include "ua_types_encoding_binary.h"
-#endif
-
-#define UA_MAX_STACKBUF 512 /* Max size of network messages on the stack */
-#define UA_MAX_SIZENAME 64  /* Max size of Qualified Name of Subscribed Variable */
-
-/* Forward declaration */
-static void
-UA_WriterGroup_deleteMembers(UA_Server *server, UA_WriterGroup *writerGroup);
-static void
-UA_DataSetField_deleteMembers(UA_DataSetField *field);
-/* To direct the DataSetMessage to the desired DataSetReader by checking the
- * WriterGroupId and DataSetWriterId parameters */
-static UA_DataSetReader *
-checkReaderIdentifier(UA_Server *server, UA_NetworkMessage *pMsg, UA_DataSetReader *tmpReader);
-
-/**********************************************/
-/*               Connection                   */
-/**********************************************/
-
-UA_StatusCode
-UA_PubSubConnectionConfig_copy(const UA_PubSubConnectionConfig *src,
-                               UA_PubSubConnectionConfig *dst) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    memcpy(dst, src, sizeof(UA_PubSubConnectionConfig));
-    retVal |= UA_String_copy(&src->name, &dst->name);
-    retVal |= UA_Variant_copy(&src->address, &dst->address);
-    retVal |= UA_String_copy(&src->transportProfileUri, &dst->transportProfileUri);
-    retVal |= UA_Variant_copy(&src->connectionTransportSettings, &dst->connectionTransportSettings);
-    if(src->connectionPropertiesSize > 0){
-        dst->connectionProperties = (UA_KeyValuePair *)
-            UA_calloc(src->connectionPropertiesSize, sizeof(UA_KeyValuePair));
-        if(!dst->connectionProperties){
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        for(size_t i = 0; i < src->connectionPropertiesSize; i++){
-            retVal |= UA_QualifiedName_copy(&src->connectionProperties[i].key,
-                                            &dst->connectionProperties[i].key);
-            retVal |= UA_Variant_copy(&src->connectionProperties[i].value,
-                                      &dst->connectionProperties[i].value);
-        }
-    }
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_getPubSubConnectionConfig(UA_Server *server, const UA_NodeId connection,
-                                    UA_PubSubConnectionConfig *config) {
-    if(!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_PubSubConnection *currentPubSubConnection =
-        UA_PubSubConnection_findConnectionbyId(server, connection);
-    if(!currentPubSubConnection)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_PubSubConnectionConfig tmpPubSubConnectionConfig;
-    //deep copy of the actual config
-    UA_PubSubConnectionConfig_copy(currentPubSubConnection->config, &tmpPubSubConnectionConfig);
-    *config = tmpPubSubConnectionConfig;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_PubSubConnection *
-UA_PubSubConnection_findConnectionbyId(UA_Server *server, UA_NodeId connectionIdentifier) {
-    for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){
-        if(UA_NodeId_equal(&connectionIdentifier, &server->pubSubManager.connections[i].identifier)){
-            return &server->pubSubManager.connections[i];
-        }
-    }
-    return NULL;
-}
-
-void
-UA_PubSubConnectionConfig_deleteMembers(UA_PubSubConnectionConfig *connectionConfig) {
-    UA_String_deleteMembers(&connectionConfig->name);
-    UA_String_deleteMembers(&connectionConfig->transportProfileUri);
-    UA_Variant_deleteMembers(&connectionConfig->connectionTransportSettings);
-    UA_Variant_deleteMembers(&connectionConfig->address);
-    for(size_t i = 0; i < connectionConfig->connectionPropertiesSize; i++){
-        UA_QualifiedName_deleteMembers(&connectionConfig->connectionProperties[i].key);
-        UA_Variant_deleteMembers(&connectionConfig->connectionProperties[i].value);
-    }
-    UA_free(connectionConfig->connectionProperties);
-}
-
-void
-UA_PubSubConnection_deleteMembers(UA_Server *server, UA_PubSubConnection *connection) {
-    //delete connection config
-    UA_PubSubConnectionConfig_deleteMembers(connection->config);
-    //remove contained WriterGroups
-    UA_WriterGroup *writerGroup, *tmpWriterGroup;
-    LIST_FOREACH_SAFE(writerGroup, &connection->writerGroups, listEntry, tmpWriterGroup){
-        UA_Server_removeWriterGroup(server, writerGroup->identifier);
-    }
-    /* remove contained ReaderGroups */
-    UA_ReaderGroup *readerGroups, *tmpReaderGroup;
-    LIST_FOREACH_SAFE(readerGroups, &connection->readerGroups, listEntry, tmpReaderGroup){
-      UA_Server_removeReaderGroup(server, readerGroups->identifier);
-    }
-
-    UA_NodeId_deleteMembers(&connection->identifier);
-    if(connection->channel){
-        connection->channel->close(connection->channel);
-    }
-    UA_free(connection->config);
-}
-
-/**
- * Regist connection given by connectionIdentifier
- *
- * @param server
- * @param connectionIdentifier
- */
-UA_StatusCode
-UA_PubSubConnection_regist(UA_Server *server, UA_NodeId *connectionIdentifier) {
-    UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, *connectionIdentifier);
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(connection == NULL) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-    retval = connection->channel->regist(connection->channel, NULL, NULL);
-    if (retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, "register channel failed: 0x%x!", retval);
-    }
-    return retval;
-}
-
-UA_StatusCode
-UA_Server_addWriterGroup(UA_Server *server, const UA_NodeId connection,
-                         const UA_WriterGroupConfig *writerGroupConfig,
-                         UA_NodeId *writerGroupIdentifier) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(!writerGroupConfig)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    //search the connection by the given connectionIdentifier
-    UA_PubSubConnection *currentConnectionContext =
-        UA_PubSubConnection_findConnectionbyId(server, connection);
-    if(!currentConnectionContext)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    //allocate memory for new WriterGroup
-    UA_WriterGroup *newWriterGroup = (UA_WriterGroup *) UA_calloc(1, sizeof(UA_WriterGroup));
-    if(!newWriterGroup)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    newWriterGroup->linkedConnection = currentConnectionContext->identifier;
-    UA_PubSubManager_generateUniqueNodeId(server, &newWriterGroup->identifier);
-    if(writerGroupIdentifier){
-        UA_NodeId_copy(&newWriterGroup->identifier, writerGroupIdentifier);
-    }
-
-    //deep copy of the config
-    UA_WriterGroupConfig tmpWriterGroupConfig;
-    retVal |= UA_WriterGroupConfig_copy(writerGroupConfig, &tmpWriterGroupConfig);
-
-    if(!tmpWriterGroupConfig.messageSettings.content.decoded.type) {
-        UA_UadpWriterGroupMessageDataType *wgm = UA_UadpWriterGroupMessageDataType_new();
-        tmpWriterGroupConfig.messageSettings.content.decoded.data = wgm;
-        tmpWriterGroupConfig.messageSettings.content.decoded.type =
-            &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-        tmpWriterGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
-    }
-
-    newWriterGroup->config = tmpWriterGroupConfig;
-    retVal |= UA_WriterGroup_addPublishCallback(server, newWriterGroup);
-    LIST_INSERT_HEAD(&currentConnectionContext->writerGroups, newWriterGroup, listEntry);
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    addWriterGroupRepresentation(server, newWriterGroup);
-#endif
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_removeWriterGroup(UA_Server *server, const UA_NodeId writerGroup){
-    UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup);
-    if(!wg)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_PubSubConnection *connection =
-        UA_PubSubConnection_findConnectionbyId(server, wg->linkedConnection);
-    if(!connection)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    //unregister the publish callback
-    UA_PubSubManager_removeRepeatedPubSubCallback(server, wg->publishCallbackId);
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    removeGroupRepresentation(server, wg);
-#endif
-
-    UA_WriterGroup_deleteMembers(server, wg);
-    LIST_REMOVE(wg, listEntry);
-    UA_free(wg);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**********************************************/
-/*               ReaderGroup                  */
-/**********************************************/
-
-/**
- * Add ReaderGroup to connection.
- *
- * @param server
- * @param connectionIdentifier
- * @param readerGroupConfiguration
- * @param readerGroupIdentifier
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_addReaderGroup(UA_Server *server, UA_NodeId connectionIdentifier,
-                                   const UA_ReaderGroupConfig *readerGroupConfig,
-                                   UA_NodeId *readerGroupIdentifier) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_ReaderGroupConfig tmpReaderGroupConfig;
-
-    /* Check for valid readergroup configuration */
-    if(!readerGroupConfig) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    /* Search the connection by the given connectionIdentifier */
-    UA_PubSubConnection *currentConnectionContext = UA_PubSubConnection_findConnectionbyId(server, connectionIdentifier);
-    if(!currentConnectionContext) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* Allocate memory for new reader group */
-    UA_ReaderGroup *newGroup = (UA_ReaderGroup *)UA_calloc(1, sizeof(UA_ReaderGroup));
-    if(!newGroup) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    /* Generate nodeid for the readergroup identifier */
-    newGroup->linkedConnection = currentConnectionContext->identifier;
-    UA_PubSubManager_generateUniqueNodeId(server, &newGroup->identifier);
-    if(readerGroupIdentifier) {
-        UA_NodeId_copy(&newGroup->identifier, readerGroupIdentifier);
-    }
-
-    /* Deep copy of the config */
-    retval |= UA_ReaderGroupConfig_copy(readerGroupConfig, &tmpReaderGroupConfig);
-    newGroup->config = tmpReaderGroupConfig;
-    retval |= UA_ReaderGroup_addSubscribeCallback(server, newGroup);
-    LIST_INSERT_HEAD(&currentConnectionContext->readerGroups, newGroup, listEntry);
-    currentConnectionContext->readerGroupsSize++;
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    addReaderGroupRepresentation(server, newGroup);
-#endif
-
-    return retval;
-}
-
-/**
- * Remove ReaderGroup from connection and delete contained readers.
- *
- * @param server
- * @param groupIdentifier
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_removeReaderGroup(UA_Server *server, UA_NodeId groupIdentifier) {
-    UA_ReaderGroup* readerGroup = UA_ReaderGroup_findRGbyId(server, groupIdentifier);
-    if(readerGroup == NULL) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* Search the connection to which the given readergroup is connected to */
-    UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection);
-    if(connection == NULL) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* Unregister subscribe callback */
-    UA_PubSubManager_removeRepeatedPubSubCallback(server, readerGroup->subscribeCallbackId);
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    /* To Do:RemoveGroupRepresentation(server, &readerGroup->identifier) */
-#endif
-
-    /* UA_Server_ReaderGroup_delete also removes itself from the list */
-    UA_Server_ReaderGroup_delete(server, readerGroup);
-    /* Remove readerGroup from Connection */
-    LIST_REMOVE(readerGroup, listEntry);
-    UA_free(readerGroup);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * To Do:
- * Update ReaderGroup configuration.
- *
- * @param server
- * @param readerGroupIdentifier
- * @param readerGroupConfiguration
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_ReaderGroup_updateConfig(UA_Server *server, UA_NodeId readerGroupIdentifier,
-                                  const UA_ReaderGroupConfig *config) {
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-/**
- * Get ReaderGroup configuration.
- *
- * @param server
- * @param groupIdentifier
- * @param readerGroupConfiguration
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_ReaderGroup_getConfig(UA_Server *server, UA_NodeId readerGroupIdentifier,
-                               UA_ReaderGroupConfig *config) {
-    if(!config) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    /* Identify the readergroup through the readerGroupIdentifier */
-    UA_ReaderGroup *currentReaderGroup = UA_ReaderGroup_findRGbyId(server, readerGroupIdentifier);
-    if(!currentReaderGroup) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    UA_ReaderGroupConfig tmpReaderGroupConfig;
-    /* deep copy of the actual config */
-    UA_ReaderGroupConfig_copy(&currentReaderGroup->config, &tmpReaderGroupConfig);
-    *config = tmpReaderGroupConfig;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* To Do UA_ReaderGroupConfig delete */
-
-/**
- * Delete ReaderGroup.
- *
- * @param server
- * @param groupIdentifier
- */
-void UA_Server_ReaderGroup_delete(UA_Server* server, UA_ReaderGroup *readerGroup) {
-    /* To Do Call UA_ReaderGroupConfig_delete */
-    UA_DataSetReader *dataSetReader, *tmpDataSetReader;
-    LIST_FOREACH_SAFE(dataSetReader, &readerGroup->readers, listEntry, tmpDataSetReader) {
-        UA_DataSetReader_delete(server, dataSetReader);
-    }
-    UA_PubSubConnection* pConn = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection);
-    if(pConn != NULL) {
-        pConn->readerGroupsSize--;
-    }
-
-    /* Delete ReaderGroup and its members */
-    UA_String_deleteMembers(&readerGroup->config.name);
-    UA_NodeId_deleteMembers(&readerGroup->linkedConnection);
-    UA_NodeId_deleteMembers(&readerGroup->identifier);
-}
-
-/**
- * Copy ReaderGroup configuration.
- *
- * @param source
- * @param destination
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_ReaderGroupConfig_copy(const UA_ReaderGroupConfig *src,
-                                UA_ReaderGroupConfig *dst) {
-    UA_String_copy(&src->name, &dst->name);
-    /* Currently simple memcpy only */
-    memcpy(&dst->securityParameters, &src->securityParameters, sizeof(UA_PubSubSecurityParameters));
-    return UA_STATUSCODE_GOOD;
-}
-
-
-static UA_DataSetReader *
-getReaderFromIdentifier(UA_Server *server, UA_NetworkMessage *pMsg, UA_PubSubConnection *pConnection) {
-    if(!pMsg->publisherIdEnabled) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Cannot process DataSetReader without PublisherId");
-        return NULL;
-    }
-
-    UA_ReaderGroup* readerGroup;
-    LIST_FOREACH(readerGroup, &pConnection->readerGroups, listEntry) {
-        UA_DataSetReader *tmpReader;
-        LIST_FOREACH(tmpReader, &readerGroup->readers, listEntry) {
-            switch (pMsg->publisherIdType) {
-            case UA_PUBLISHERDATATYPE_BYTE:
-                if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_BYTE] &&
-                   pMsg->publisherIdType == UA_PUBLISHERDATATYPE_BYTE &&
-                   pMsg->publisherId.publisherIdByte == *(UA_Byte*)tmpReader->config.publisherId.data) {
-                    UA_DataSetReader* processReader = checkReaderIdentifier(server, pMsg, tmpReader);
-                    return processReader;
-                }
-                break;
-            case UA_PUBLISHERDATATYPE_UINT16:
-                if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT16] &&
-                   pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT16 &&
-                   pMsg->publisherId.publisherIdUInt16 == *(UA_UInt16*)tmpReader->config.publisherId.data) {
-                    UA_DataSetReader* processReader = checkReaderIdentifier(server, pMsg, tmpReader);
-                    return processReader;
-                }
-                break;
-            case UA_PUBLISHERDATATYPE_UINT32:
-                if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT32] &&
-                   pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT32 &&
-                   pMsg->publisherId.publisherIdUInt32 == *(UA_UInt32*)tmpReader->config.publisherId.data) {
-                    UA_DataSetReader* processReader = checkReaderIdentifier(server, pMsg, tmpReader);
-                    return processReader;
-                }
-                break;
-            case UA_PUBLISHERDATATYPE_UINT64:
-                if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT64] &&
-                   pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT64 &&
-                   pMsg->publisherId.publisherIdUInt64 == *(UA_UInt64*)tmpReader->config.publisherId.data) {
-                    UA_DataSetReader* processReader = checkReaderIdentifier(server, pMsg, tmpReader);
-                    return processReader;
-                }
-                break;
-            case UA_PUBLISHERDATATYPE_STRING:
-                if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_STRING] &&
-                   pMsg->publisherIdType == UA_PUBLISHERDATATYPE_STRING &&
-                   UA_String_equal(&pMsg->publisherId.publisherIdString, (UA_String*)tmpReader->config.publisherId.data)) {
-                    UA_DataSetReader* processReader = checkReaderIdentifier(server, pMsg, tmpReader);
-                    return processReader;
-                }
-                break;
-            default:
-                return NULL;
-            }
-        }
-    }
-
-    return NULL;
-}
-
-/**
- * Check DataSetReader parameters.
- *
- * @param server
- * @param NetworkMessage
- * @param DataSetReader
- * @return DataSetReader on success
- */
-static UA_DataSetReader *
-checkReaderIdentifier(UA_Server *server, UA_NetworkMessage *pMsg, UA_DataSetReader *tmpReader) {
-    if(!pMsg->groupHeaderEnabled && !pMsg->groupHeader.writerGroupIdEnabled && !pMsg->payloadHeaderEnabled) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Cannot process DataSetReader without WriterGroup"
-                    "and DataSetWriter identifiers");
-        return NULL;
-    }
-    else {
-        if((tmpReader->config.writerGroupId == pMsg->groupHeader.writerGroupId) &&
-           (tmpReader->config.dataSetWriterId == *pMsg->payloadHeader.dataSetPayloadHeader.dataSetWriterIds)) {
-            UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found. Process NetworkMessage");
-            return tmpReader;
-        }
-    }
-
-    return NULL;
-}
-
-/**
- * Process NetworkMessage.
- *
- * @param server
- * @param networkmessage
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage *pMsg,
-                                UA_PubSubConnection *pConnection) {
-    if(!pMsg || !pConnection)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    /* To Do Handle multiple DataSetMessage for one NetworkMessage */
-    /* To Do The condition pMsg->dataSetClassIdEnabled
-     * Here some filtering is possible */
-
-    UA_DataSetReader* dataSetReaderErg = getReaderFromIdentifier(server, pMsg, pConnection);
-
-    /* No Reader with the specified id found */
-    if(!dataSetReaderErg) {
-        return UA_STATUSCODE_BADNOTFOUND; /* TODO: Check the return code */
-    }
-
-    UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId");
-
-    UA_Byte anzDataSets = 1;
-    if(pMsg->payloadHeaderEnabled)
-        anzDataSets = pMsg->payloadHeader.dataSetPayloadHeader.count;
-    for(UA_Byte iterator = 0; iterator < anzDataSets; iterator++) {
-        UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "Process Msg with DataSetReader!");
-        UA_Server_DataSetReader_process(server, dataSetReaderErg, &pMsg->payload.dataSetPayload.dataSetMessages[iterator]);
-    }
-
-    /* To Do Handle when dataSetReader parameters are null for publisherId
-     * and zero for WriterGroupId and DataSetWriterId */
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Find ReaderGroup with its identifier.
- *
- * @param server
- * @param groupIdentifier
- * @return the ReaderGroup or NULL if not found
- */
-UA_ReaderGroup * UA_ReaderGroup_findRGbyId(UA_Server *server, UA_NodeId identifier) {
-    for (size_t iteratorConn = 0; iteratorConn < server->pubSubManager.connectionsSize; iteratorConn++) {
-        UA_ReaderGroup* readerGroup = NULL;
-        LIST_FOREACH(readerGroup, &server->pubSubManager.connections[iteratorConn].readerGroups, listEntry) {
-            if(UA_NodeId_equal(&identifier, &readerGroup->identifier)) {
-                return readerGroup;
-            }
-
-        }
-    }
-    return NULL;
-}
-
-/**
- * Find a DataSetReader with its identifier
- *
- * @param server
- * @param identifier
- * @return the DataSetReader or NULL if not found
- */
-UA_DataSetReader *UA_ReaderGroup_findDSRbyId(UA_Server *server, UA_NodeId identifier) {
-    for (size_t iteratorConn = 0; iteratorConn < server->pubSubManager.connectionsSize; iteratorConn++) {
-        UA_ReaderGroup* readerGroup = NULL;
-        LIST_FOREACH(readerGroup, &server->pubSubManager.connections[iteratorConn].readerGroups, listEntry) {
-            UA_DataSetReader *tmpReader;
-            LIST_FOREACH(tmpReader, &readerGroup->readers, listEntry) {
-                if(UA_NodeId_equal(&tmpReader->identifier, &identifier)) {
-                    return tmpReader;
-                }
-
-            }
-        }
-    }
-    return NULL;
-}
-
-/**********************************************/
-/*               DataSetReader                */
-/**********************************************/
-
-/**
- * Add a DataSetReader to ReaderGroup
- *
- * @param server
- * @param readerGroupIdentifier
- * @param dataSetReaderConfig
- * @param readerIdentifier
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_addDataSetReader(UA_Server *server, UA_NodeId readerGroupIdentifier,
-                                      const UA_DataSetReaderConfig *dataSetReaderConfig,
-                                      UA_NodeId *readerIdentifier) {
-    /* Search the reader group by the given readerGroupIdentifier */
-    UA_ReaderGroup *readerGroup = UA_ReaderGroup_findRGbyId(server, readerGroupIdentifier);
-
-    if(!dataSetReaderConfig) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    if(readerGroup == NULL) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* Allocate memory for new DataSetReader */
-    UA_DataSetReader *newDataSetReader = (UA_DataSetReader *)UA_calloc(1, sizeof(UA_DataSetReader));
-    /* Copy the config into the new dataSetReader */
-    UA_DataSetReaderConfig_copy(dataSetReaderConfig, &newDataSetReader->config);
-    newDataSetReader->linkedReaderGroup = readerGroup->identifier;
-    UA_PubSubManager_generateUniqueNodeId(server, &newDataSetReader->identifier);
-    if(readerIdentifier != NULL) {
-        UA_NodeId_copy(&newDataSetReader->identifier, readerIdentifier);
-    }
-
-    /* Add the new reader to the group */
-    LIST_INSERT_HEAD(&readerGroup->readers, newDataSetReader, listEntry);
-    readerGroup->readersCount++;
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    addDataSetReaderRepresentation(server, newDataSetReader);
-#endif
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Remove a DataSetReader from ReaderGroup
- *
- * @param server
- * @param readerGroupIdentifier
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_removeDataSetReader(UA_Server *server, UA_NodeId readerIdentifier) {
-    /* Remove datasetreader given by the identifier */
-    UA_DataSetReader *dataSetReader = UA_ReaderGroup_findDSRbyId(server, readerIdentifier);
-    if(!dataSetReader) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    removeDataSetReaderRepresentation(server, dataSetReader);
-#endif
-
-    UA_DataSetReader_delete(server, dataSetReader);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Update the config of the DataSetReader.
- *
- * @param server
- * @param dataSetReaderIdentifier
- * @param readerGroupIdentifier
- * @param config
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_DataSetReader_updateConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier, UA_NodeId readerGroupIdentifier,
-                                    const UA_DataSetReaderConfig *config) {
-    if(config == NULL) {
-       return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_DataSetReader *currentDataSetReader =  UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier);
-    UA_ReaderGroup   *currentReaderGroup = UA_ReaderGroup_findRGbyId(server, readerGroupIdentifier);
-    if(!currentDataSetReader) {
-       return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* The update functionality will be extended during the next PubSub batches.
-     * Currently is only a change of the publishing interval possible. */
-    if(currentDataSetReader->config.writerGroupId != config->writerGroupId) {
-       UA_PubSubManager_removeRepeatedPubSubCallback(server, currentReaderGroup->subscribeCallbackId);
-       currentDataSetReader->config.writerGroupId = config->writerGroupId;
-       UA_ReaderGroup_subscribeCallback(server, currentReaderGroup);
-    }
-    else {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "No or unsupported ReaderGroup update.");
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Get the current config of the UA_DataSetReader.
- *
- * @param server
- * @param dataSetReaderIdentifier
- * @param config
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_DataSetReader_getConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier,
-                                 UA_DataSetReaderConfig *config) {
-    if(!config) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_DataSetReader *currentDataSetReader = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier);
-    if(!currentDataSetReader) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    UA_DataSetReaderConfig tmpReaderConfig;
-    /* Deep copy of the actual config */
-    UA_DataSetReaderConfig_copy(&currentDataSetReader->config, &tmpReaderConfig);
-    *config = tmpReaderConfig;
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * This Method is used to initially set the SubscribedDataSet to TargetVariablesType and to create the list of target Variables of a SubscribedDataSetType.
- *
- * @param server
- * @param dataSetReaderIdentifier
- * @param targetVariables
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_Server_DataSetReader_createTargetVariables(UA_Server *server, UA_NodeId dataSetReaderIdentifier, UA_TargetVariablesDataType *targetVariables) {
-    UA_StatusCode retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    UA_DataSetReader* pDS = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier);
-    if(pDS == NULL) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    if(pDS->subscribedDataSetTarget.targetVariablesSize > 0) {
-        UA_TargetVariablesDataType_deleteMembers(&pDS->subscribedDataSetTarget);
-        pDS->subscribedDataSetTarget.targetVariablesSize = 0;
-        pDS->subscribedDataSetTarget.targetVariables = NULL;
-    }
-
-    /* Set subscribed dataset to TargetVariableType */
-    pDS->subscribedDataSetType = UA_PUBSUB_SDS_TARGET;
-    retval = UA_TargetVariablesDataType_copy(targetVariables, &pDS->subscribedDataSetTarget);
-    return retval;
-}
-
-/**
- * Adds Subscribed Variables from the DataSetMetaData for the given DataSet into the given parent node
- * and creates the corresponding data in the targetVariables of the DataSetReader
- *
- * @param server
- * @param parentNode
- * @param dataSetReaderIdentifier
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode UA_Server_DataSetReader_addTargetVariables(UA_Server *server, UA_NodeId *parentNode, UA_NodeId dataSetReaderIdentifier, UA_SubscribedDataSetEnumType sdsType) {
-    if((server == NULL) || (parentNode == NULL)) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_DataSetReader* pDataSetReader = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier);
-    if(pDataSetReader == NULL) {
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_TargetVariablesDataType targetVars;
-    targetVars.targetVariablesSize = pDataSetReader->config.dataSetMetaData.fieldsSize;
-    targetVars.targetVariables = (UA_FieldTargetDataType *)UA_calloc(targetVars.targetVariablesSize, sizeof(UA_FieldTargetDataType));
-    for (size_t iteratorField = 0; iteratorField < pDataSetReader->config.dataSetMetaData.fieldsSize; iteratorField++) {
-        UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-        vAttr.valueRank = pDataSetReader->config.dataSetMetaData.fields[iteratorField].valueRank;
-        if(pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensionsSize > 0) {
-            retval = UA_Array_copy(pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensions, pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensionsSize, (void**)&vAttr.arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]);
-            if(retval == UA_STATUSCODE_GOOD) {
-                vAttr.arrayDimensionsSize = pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensionsSize;
-            }
-
-        }
-
-        vAttr.dataType = pDataSetReader->config.dataSetMetaData.fields[iteratorField].dataType;
-
-        vAttr.accessLevel = UA_ACCESSLEVELMASK_READ;
-        UA_LocalizedText_copy(&pDataSetReader->config.dataSetMetaData.fields[iteratorField].description, &vAttr.description);
-        UA_QualifiedName qn;
-        UA_QualifiedName_init(&qn);
-        char szTmpName[UA_MAX_SIZENAME];
-        if(pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.length > 0) {
-            UA_UInt16 slen = UA_MAX_SIZENAME -1;
-            vAttr.displayName.locale = UA_STRING("en-US");
-            vAttr.displayName.text = pDataSetReader->config.dataSetMetaData.fields[iteratorField].name;
-            if(pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.length < slen) {
-                slen = (UA_UInt16)pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.length;
-                UA_snprintf(szTmpName, sizeof(szTmpName), "%.*s", (int)slen, (const char*)pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.data);
-            }
-
-            szTmpName[slen] = '\0';
-            qn = UA_QUALIFIEDNAME(1, szTmpName);
-        }
-        else {
-            strcpy(szTmpName, "SubscribedVariable");
-            vAttr.displayName = UA_LOCALIZEDTEXT("en-US", szTmpName);
-            qn = UA_QUALIFIEDNAME(1, "SubscribedVariable");
-        }
-
-        /* Add variable to the given parent node */
-        UA_NodeId newNode;
-        retval = UA_Server_addVariableNode(server, UA_NODEID_NULL, *parentNode,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), qn,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newNode);
-        if(retval == UA_STATUSCODE_GOOD) {
-            UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "addVariableNode %s succeeded", szTmpName);
-        }
-        else {
-            UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND, "addVariableNode: error 0x%x", retval);
-        }
-
-        UA_FieldTargetDataType_init(&targetVars.targetVariables[iteratorField]);
-        targetVars.targetVariables[iteratorField].attributeId = UA_ATTRIBUTEID_VALUE;
-        UA_NodeId_copy(&newNode, &targetVars.targetVariables[iteratorField].targetNodeId);
-        UA_NodeId_deleteMembers(&newNode);
-        if(vAttr.arrayDimensionsSize > 0) {
-            UA_Array_delete(vAttr.arrayDimensions, vAttr.arrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]);
-        }
-    }
-
-    if(sdsType == UA_PUBSUB_SDS_TARGET) {
-        retval = UA_Server_DataSetReader_createTargetVariables(server, pDataSetReader->identifier, &targetVars);
-    }
-
-    UA_TargetVariablesDataType_deleteMembers(&targetVars);
-    return retval;
-}
-
-/**
- * Process a NetworkMessage with a DataSetReader.
- *
- * @param server
- * @param dataSetReader
- * @param dataSetMsg
- */
-void UA_Server_DataSetReader_process(UA_Server *server, UA_DataSetReader *dataSetReader, UA_DataSetMessage* dataSetMsg) {
-    if((dataSetReader == NULL) || (dataSetMsg == NULL) || (server == NULL)) {
-        return;
-    }
-
-    if(!dataSetMsg->header.dataSetMessageValid) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetMessage is discarded: message is not valid");
-         /* To Do check ConfigurationVersion*/
-         /*if(dataSetMsg->header.configVersionMajorVersionEnabled)
-         * {
-         * if(dataSetMsg->header.configVersionMajorVersion != dataSetReader->config.dataSetMetaData.configurationVersion.majorVersion)
-         * {
-         * UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetMessage is discarded: ConfigurationVersion MajorVersion does not match");
-         * return;
-         * }
-         } */
-    }
-    else {
-        if(dataSetMsg->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) {
-            if(dataSetMsg->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) {
-                size_t anzFields = dataSetMsg->data.keyFrameData.fieldCount;
-                    if(dataSetReader->config.dataSetMetaData.fieldsSize < anzFields) {
-                    anzFields = dataSetReader->config.dataSetMetaData.fieldsSize;
-                }
-
-                if(dataSetReader->subscribedDataSetTarget.targetVariablesSize < anzFields) {
-                    anzFields = dataSetReader->subscribedDataSetTarget.targetVariablesSize;
-                }
-
-                UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-                for (UA_UInt16 iteratorField = 0; iteratorField < anzFields; iteratorField++) {
-                    if(dataSetMsg->data.keyFrameData.dataSetFields[iteratorField].hasValue) {
-                        if(dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].attributeId == UA_ATTRIBUTEID_VALUE) {
-                            retVal = UA_Server_writeValue(server, dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].targetNodeId, dataSetMsg->data.keyFrameData.dataSetFields[iteratorField].value);
-                            if(retVal != UA_STATUSCODE_GOOD) {
-                                UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Error Write Value KF %u: 0x%x", iteratorField, retVal);
-                            }
-
-                        }
-                        else {
-                            UA_WriteValue writeVal;
-                            UA_WriteValue_init(&writeVal);
-                            writeVal.attributeId = dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].attributeId;
-                            writeVal.indexRange = dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].receiverIndexRange;
-                            writeVal.nodeId = dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].targetNodeId;
-                            UA_DataValue_copy(&dataSetMsg->data.keyFrameData.dataSetFields[iteratorField], &writeVal.value);
-                            retVal = UA_Server_write(server, &writeVal);
-                            if(retVal != UA_STATUSCODE_GOOD) {
-                                UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Error Write KF %u: 0x%x", iteratorField, retVal);
-                            }
-
-                        }
-
-                    }
-
-               }
-
-           }
-
-        }
-
-    }
-}
-
-/**
- * Copy the config of the DataSetReader.
- *
- * @param src
- * @param dst
- * @return UA_STATUSCODE_GOOD on success
- */
-UA_StatusCode
-UA_DataSetReaderConfig_copy(const UA_DataSetReaderConfig *src,
-                                  UA_DataSetReaderConfig *dst) {
-    memset(dst, 0, sizeof(UA_DataSetReaderConfig));
-    UA_StatusCode retVal = UA_String_copy(&src->name, &dst->name);
-    if(retVal != UA_STATUSCODE_GOOD) {
-        return retVal;
-    }
-
-    retVal = UA_Variant_copy(&src->publisherId, &dst->publisherId);
-    if(retVal != UA_STATUSCODE_GOOD) {
-        return retVal;
-    }
-
-    dst->writerGroupId = src->writerGroupId;
-    dst->dataSetWriterId = src->dataSetWriterId;
-    retVal = UA_DataSetMetaDataType_copy(&src->dataSetMetaData, &dst->dataSetMetaData);
-    if(retVal != UA_STATUSCODE_GOOD) {
-        return retVal;
-    }
-
-    dst->dataSetFieldContentMask = src->dataSetFieldContentMask;
-    dst->messageReceiveTimeout = src->messageReceiveTimeout;
-
-    /* Currently memcpy is used to copy the securityParameters */
-    memcpy(&dst->securityParameters, &src->securityParameters, sizeof(UA_PubSubSecurityParameters));
-    retVal = UA_UadpDataSetReaderMessageDataType_copy(&src->messageSettings, &dst->messageSettings);
-    if(retVal != UA_STATUSCODE_GOOD) {
-        return retVal;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * Delete the DataSetReader.
- *
- * @param server
- * @param dataSetReader
- */
-void UA_DataSetReader_delete(UA_Server *server, UA_DataSetReader *dataSetReader) {
-    /* Delete DataSetReader config */
-    UA_String_deleteMembers(&dataSetReader->config.name);
-    UA_Variant_deleteMembers(&dataSetReader->config.publisherId);
-    UA_DataSetMetaDataType_deleteMembers(&dataSetReader->config.dataSetMetaData);
-    UA_UadpDataSetReaderMessageDataType_deleteMembers(&dataSetReader->config.messageSettings);
-    UA_TargetVariablesDataType_deleteMembers(&dataSetReader->subscribedDataSetTarget);
-
-    /* Delete DataSetReader */
-    UA_ReaderGroup* pGroup = UA_ReaderGroup_findRGbyId(server, dataSetReader->linkedReaderGroup);
-    if(pGroup != NULL) {
-        pGroup->readersCount--;
-    }
-
-    UA_NodeId_deleteMembers(&dataSetReader->identifier);
-    UA_NodeId_deleteMembers(&dataSetReader->linkedReaderGroup);
-    /* Remove DataSetReader from group */
-    LIST_REMOVE(dataSetReader, listEntry);
-    /* Free memory allocated for DataSetReader */
-    UA_free(dataSetReader);
-}
-
-/**********************************************/
-/*               PublishedDataSet             */
-/**********************************************/
-UA_StatusCode
-UA_PublishedDataSetConfig_copy(const UA_PublishedDataSetConfig *src,
-                               UA_PublishedDataSetConfig *dst) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    memcpy(dst, src, sizeof(UA_PublishedDataSetConfig));
-    retVal |= UA_String_copy(&src->name, &dst->name);
-    switch(src->publishedDataSetType){
-        case UA_PUBSUB_DATASET_PUBLISHEDITEMS:
-            //no additional items
-            break;
-        case UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE:
-            if(src->config.itemsTemplate.variablesToAddSize > 0){
-                dst->config.itemsTemplate.variablesToAdd = (UA_PublishedVariableDataType *) UA_calloc(
-                        src->config.itemsTemplate.variablesToAddSize, sizeof(UA_PublishedVariableDataType));
-            }
-
-            for(size_t i = 0; i < src->config.itemsTemplate.variablesToAddSize; i++){
-                retVal |= UA_PublishedVariableDataType_copy(&src->config.itemsTemplate.variablesToAdd[i],
-                                                            &dst->config.itemsTemplate.variablesToAdd[i]);
-            }
-            retVal |= UA_DataSetMetaDataType_copy(&src->config.itemsTemplate.metaData,
-                                                  &dst->config.itemsTemplate.metaData);
-            break;
-
-        default:
-            return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_getPublishedDataSetConfig(UA_Server *server, const UA_NodeId pds,
-                                    UA_PublishedDataSetConfig *config){
-    if(!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_PublishedDataSet *currentPublishedDataSet = UA_PublishedDataSet_findPDSbyId(server, pds);
-    if(!currentPublishedDataSet)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_PublishedDataSetConfig tmpPublishedDataSetConfig;
-    //deep copy of the actual config
-    UA_PublishedDataSetConfig_copy(&currentPublishedDataSet->config, &tmpPublishedDataSetConfig);
-    *config = tmpPublishedDataSetConfig;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_PublishedDataSet *
-UA_PublishedDataSet_findPDSbyId(UA_Server *server, UA_NodeId identifier){
-    for(size_t i = 0; i < server->pubSubManager.publishedDataSetsSize; i++){
-        if(UA_NodeId_equal(&server->pubSubManager.publishedDataSets[i].identifier, &identifier)){
-            return &server->pubSubManager.publishedDataSets[i];
-        }
-    }
-    return NULL;
-}
-
-void
-UA_PublishedDataSetConfig_deleteMembers(UA_PublishedDataSetConfig *pdsConfig){
-    //delete pds config
-    UA_String_deleteMembers(&pdsConfig->name);
-    switch (pdsConfig->publishedDataSetType){
-        case UA_PUBSUB_DATASET_PUBLISHEDITEMS:
-            //no additional items
-            break;
-        case UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE:
-            if(pdsConfig->config.itemsTemplate.variablesToAddSize > 0){
-                for(size_t i = 0; i < pdsConfig->config.itemsTemplate.variablesToAddSize; i++){
-                    UA_PublishedVariableDataType_deleteMembers(&pdsConfig->config.itemsTemplate.variablesToAdd[i]);
-                }
-                UA_free(pdsConfig->config.itemsTemplate.variablesToAdd);
-            }
-            UA_DataSetMetaDataType_deleteMembers(&pdsConfig->config.itemsTemplate.metaData);
-            break;
-        default:
-            break;
-    }
-}
-
-void
-UA_PublishedDataSet_deleteMembers(UA_Server *server, UA_PublishedDataSet *publishedDataSet){
-    UA_PublishedDataSetConfig_deleteMembers(&publishedDataSet->config);
-    //delete PDS
-    UA_DataSetMetaDataType_deleteMembers(&publishedDataSet->dataSetMetaData);
-    UA_DataSetField *field, *tmpField;
-    LIST_FOREACH_SAFE(field, &publishedDataSet->fields, listEntry, tmpField) {
-        UA_Server_removeDataSetField(server, field->identifier);
-    }
-    UA_NodeId_deleteMembers(&publishedDataSet->identifier);
-}
-
-UA_DataSetFieldResult
-UA_Server_addDataSetField(UA_Server *server, const UA_NodeId publishedDataSet,
-                          const UA_DataSetFieldConfig *fieldConfig,
-                          UA_NodeId *fieldIdentifier) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_DataSetFieldResult result = {UA_STATUSCODE_BADINVALIDARGUMENT, {0, 0}};
-    if(!fieldConfig)
-        return result;
-
-    UA_PublishedDataSet *currentDataSet = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet);
-    if(currentDataSet == NULL){
-        result.result = UA_STATUSCODE_BADNOTFOUND;
-        return result;
-    }
-
-    if(currentDataSet->config.publishedDataSetType != UA_PUBSUB_DATASET_PUBLISHEDITEMS){
-        result.result = UA_STATUSCODE_BADNOTIMPLEMENTED;
-        return result;
-    }
-
-    UA_DataSetField *newField = (UA_DataSetField *) UA_calloc(1, sizeof(UA_DataSetField));
-    if(!newField){
-        result.result = UA_STATUSCODE_BADINTERNALERROR;
-        return result;
-    }
-
-    UA_DataSetFieldConfig tmpFieldConfig;
-    retVal |= UA_DataSetFieldConfig_copy(fieldConfig, &tmpFieldConfig);
-    newField->config = tmpFieldConfig;
-    UA_PubSubManager_generateUniqueNodeId(server, &newField->identifier);
-    if(fieldIdentifier != NULL){
-        UA_NodeId_copy(&newField->identifier, fieldIdentifier);
-    }
-    newField->publishedDataSet = currentDataSet->identifier;
-    //update major version of parent published data set
-    currentDataSet->dataSetMetaData.configurationVersion.majorVersion = UA_PubSubConfigurationVersionTimeDifference();
-    LIST_INSERT_HEAD(&currentDataSet->fields, newField, listEntry);
-    if(newField->config.field.variable.promotedField)
-        currentDataSet->promotedFieldsCount++;
-    currentDataSet->fieldSize++;
-    result.result = retVal;
-    result.configurationVersion.majorVersion = currentDataSet->dataSetMetaData.configurationVersion.majorVersion;
-    result.configurationVersion.minorVersion = currentDataSet->dataSetMetaData.configurationVersion.minorVersion;
-    return result;
-}
-
-UA_DataSetFieldResult
-UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf) {
-    UA_DataSetField *currentField = UA_DataSetField_findDSFbyId(server, dsf);
-    UA_DataSetFieldResult result = {UA_STATUSCODE_BADNOTFOUND, {0, 0}};
-    if(!currentField)
-        return result;
-
-    UA_PublishedDataSet *parentPublishedDataSet =
-        UA_PublishedDataSet_findPDSbyId(server, currentField->publishedDataSet);
-    if(!parentPublishedDataSet)
-        return result;
-
-    parentPublishedDataSet->fieldSize--;
-    if(currentField->config.field.variable.promotedField)
-        parentPublishedDataSet->promotedFieldsCount--;
-    /* update major version of PublishedDataSet */
-    parentPublishedDataSet->dataSetMetaData.configurationVersion.majorVersion =
-        UA_PubSubConfigurationVersionTimeDifference();
-
-    UA_DataSetField_deleteMembers(currentField);
-    LIST_REMOVE(currentField, listEntry);
-    UA_free(currentField);
-
-    result.result = UA_STATUSCODE_GOOD;
-    result.configurationVersion.majorVersion = parentPublishedDataSet->dataSetMetaData.configurationVersion.majorVersion;
-    result.configurationVersion.minorVersion = parentPublishedDataSet->dataSetMetaData.configurationVersion.minorVersion;
-    return result;
-}
-
-/**********************************************/
-/*               DataSetWriter                */
-/**********************************************/
-
-UA_StatusCode
-UA_DataSetWriterConfig_copy(const UA_DataSetWriterConfig *src,
-                            UA_DataSetWriterConfig *dst){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    memcpy(dst, src, sizeof(UA_DataSetWriterConfig));
-    retVal |= UA_String_copy(&src->name, &dst->name);
-    retVal |= UA_String_copy(&src->dataSetName, &dst->dataSetName);
-    retVal |= UA_ExtensionObject_copy(&src->messageSettings, &dst->messageSettings);
-    dst->dataSetWriterProperties = (UA_KeyValuePair *)
-        UA_calloc(src->dataSetWriterPropertiesSize, sizeof(UA_KeyValuePair));
-    if(!dst->dataSetWriterProperties)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    for(size_t i = 0; i < src->dataSetWriterPropertiesSize; i++){
-        retVal |= UA_KeyValuePair_copy(&src->dataSetWriterProperties[i], &dst->dataSetWriterProperties[i]);
-    }
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_getDataSetWriterConfig(UA_Server *server, const UA_NodeId dsw,
-                                 UA_DataSetWriterConfig *config){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_DataSetWriter *currentDataSetWriter = UA_DataSetWriter_findDSWbyId(server, dsw);
-    if(!currentDataSetWriter)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_DataSetWriterConfig tmpWriterConfig;
-    //deep copy of the actual config
-    retVal |= UA_DataSetWriterConfig_copy(&currentDataSetWriter->config, &tmpWriterConfig);
-    *config = tmpWriterConfig;
-    return retVal;
-}
-
-UA_DataSetWriter *
-UA_DataSetWriter_findDSWbyId(UA_Server *server, UA_NodeId identifier) {
-    for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){
-        UA_WriterGroup *tmpWriterGroup;
-        LIST_FOREACH(tmpWriterGroup, &server->pubSubManager.connections[i].writerGroups, listEntry){
-            UA_DataSetWriter *tmpWriter;
-            LIST_FOREACH(tmpWriter, &tmpWriterGroup->writers, listEntry){
-                if(UA_NodeId_equal(&tmpWriter->identifier, &identifier)){
-                    return tmpWriter;
-                }
-            }
-        }
-    }
-    return NULL;
-}
-
-void
-UA_DataSetWriterConfig_deleteMembers(UA_DataSetWriterConfig *pdsConfig) {
-    UA_String_deleteMembers(&pdsConfig->name);
-    UA_String_deleteMembers(&pdsConfig->dataSetName);
-    for(size_t i = 0; i < pdsConfig->dataSetWriterPropertiesSize; i++){
-        UA_KeyValuePair_deleteMembers(&pdsConfig->dataSetWriterProperties[i]);
-    }
-    UA_free(pdsConfig->dataSetWriterProperties);
-    UA_ExtensionObject_deleteMembers(&pdsConfig->messageSettings);
-}
-
-static void
-UA_DataSetWriter_deleteMembers(UA_Server *server, UA_DataSetWriter *dataSetWriter) {
-    UA_DataSetWriterConfig_deleteMembers(&dataSetWriter->config);
-    //delete DataSetWriter
-    UA_NodeId_deleteMembers(&dataSetWriter->identifier);
-    UA_NodeId_deleteMembers(&dataSetWriter->linkedWriterGroup);
-    UA_NodeId_deleteMembers(&dataSetWriter->connectedDataSet);
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-    //delete lastSamples store
-    for(size_t i = 0; i < dataSetWriter->lastSamplesCount; i++) {
-        UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[i].value);
-    }
-    UA_free(dataSetWriter->lastSamples);
-    dataSetWriter->lastSamples = NULL;
-    dataSetWriter->lastSamplesCount = 0;
-#endif
-}
-
-/**********************************************/
-/*               WriterGroup                  */
-/**********************************************/
-
-UA_StatusCode
-UA_WriterGroupConfig_copy(const UA_WriterGroupConfig *src,
-                          UA_WriterGroupConfig *dst){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    memcpy(dst, src, sizeof(UA_WriterGroupConfig));
-    retVal |= UA_String_copy(&src->name, &dst->name);
-    retVal |= UA_ExtensionObject_copy(&src->transportSettings, &dst->transportSettings);
-    retVal |= UA_ExtensionObject_copy(&src->messageSettings, &dst->messageSettings);
-    dst->groupProperties = (UA_KeyValuePair *) UA_calloc(src->groupPropertiesSize, sizeof(UA_KeyValuePair));
-    if(!dst->groupProperties)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    for(size_t i = 0; i < src->groupPropertiesSize; i++){
-        retVal |= UA_KeyValuePair_copy(&src->groupProperties[i], &dst->groupProperties[i]);
-    }
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_getWriterGroupConfig(UA_Server *server, const UA_NodeId writerGroup,
-                               UA_WriterGroupConfig *config){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_WriterGroup *currentWriterGroup = UA_WriterGroup_findWGbyId(server, writerGroup);
-    if(!currentWriterGroup){
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-    UA_WriterGroupConfig tmpWriterGroupConfig;
-    //deep copy of the actual config
-    retVal |= UA_WriterGroupConfig_copy(&currentWriterGroup->config, &tmpWriterGroupConfig);
-    *config = tmpWriterGroupConfig;
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_updateWriterGroupConfig(UA_Server *server, UA_NodeId writerGroupIdentifier,
-                                  const UA_WriterGroupConfig *config){
-    if(!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_WriterGroup *currentWriterGroup = UA_WriterGroup_findWGbyId(server, writerGroupIdentifier);
-    if(!currentWriterGroup)
-        return UA_STATUSCODE_BADNOTFOUND;
-    //The update functionality will be extended during the next PubSub batches.
-    //Currently is only a change of the publishing interval possible.
-    if(currentWriterGroup->config.maxEncapsulatedDataSetMessageCount != config->maxEncapsulatedDataSetMessageCount){
-        currentWriterGroup->config.maxEncapsulatedDataSetMessageCount = config->maxEncapsulatedDataSetMessageCount;
-        if(currentWriterGroup->config.messageSettings.encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) {
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "MaxEncapsulatedDataSetMessag need enabled 'PayloadHeader' within the message settings.");
-        }
-    }
-    if(currentWriterGroup->config.publishingInterval != config->publishingInterval) {
-        UA_PubSubManager_removeRepeatedPubSubCallback(server, currentWriterGroup->publishCallbackId);
-        currentWriterGroup->config.publishingInterval = config->publishingInterval;
-        UA_WriterGroup_addPublishCallback(server, currentWriterGroup);
-    }
-    if(currentWriterGroup->config.priority != config->priority) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "No or unsupported WriterGroup update.");
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_WriterGroup *
-UA_WriterGroup_findWGbyId(UA_Server *server, UA_NodeId identifier){
-    for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){
-        UA_WriterGroup *tmpWriterGroup;
-        LIST_FOREACH(tmpWriterGroup, &server->pubSubManager.connections[i].writerGroups, listEntry) {
-            if(UA_NodeId_equal(&identifier, &tmpWriterGroup->identifier)){
-                return tmpWriterGroup;
-            }
-        }
-    }
-    return NULL;
-}
-
-void
-UA_WriterGroupConfig_deleteMembers(UA_WriterGroupConfig *writerGroupConfig){
-    //delete writerGroup config
-    UA_String_deleteMembers(&writerGroupConfig->name);
-    UA_ExtensionObject_deleteMembers(&writerGroupConfig->transportSettings);
-    UA_ExtensionObject_deleteMembers(&writerGroupConfig->messageSettings);
-    for(size_t i = 0; i < writerGroupConfig->groupPropertiesSize; i++){
-        UA_KeyValuePair_deleteMembers(&writerGroupConfig->groupProperties[i]);
-    }
-    UA_free(writerGroupConfig->groupProperties);
-}
-
-static void
-UA_WriterGroup_deleteMembers(UA_Server *server, UA_WriterGroup *writerGroup) {
-    UA_WriterGroupConfig_deleteMembers(&writerGroup->config);
-    //delete WriterGroup
-    //delete all writers. Therefore removeDataSetWriter is called from PublishedDataSet
-    UA_DataSetWriter *dataSetWriter, *tmpDataSetWriter;
-    LIST_FOREACH_SAFE(dataSetWriter, &writerGroup->writers, listEntry, tmpDataSetWriter){
-        UA_Server_removeDataSetWriter(server, dataSetWriter->identifier);
-    }
-    UA_NodeId_deleteMembers(&writerGroup->linkedConnection);
-    UA_NodeId_deleteMembers(&writerGroup->identifier);
-}
-
-UA_StatusCode
-UA_Server_addDataSetWriter(UA_Server *server,
-                           const UA_NodeId writerGroup, const UA_NodeId dataSet,
-                           const UA_DataSetWriterConfig *dataSetWriterConfig,
-                           UA_NodeId *writerIdentifier) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(!dataSetWriterConfig)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_PublishedDataSet *currentDataSetContext = UA_PublishedDataSet_findPDSbyId(server, dataSet);
-    if(!currentDataSetContext)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup);
-    if(!wg)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_DataSetWriter *newDataSetWriter = (UA_DataSetWriter *) UA_calloc(1, sizeof(UA_DataSetWriter));
-    if(!newDataSetWriter)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    //copy the config into the new dataSetWriter
-    UA_DataSetWriterConfig tmpDataSetWriterConfig;
-    retVal |= UA_DataSetWriterConfig_copy(dataSetWriterConfig, &tmpDataSetWriterConfig);
-    newDataSetWriter->config = tmpDataSetWriterConfig;
-    //save the current version of the connected PublishedDataSet
-    newDataSetWriter->connectedDataSetVersion = currentDataSetContext->dataSetMetaData.configurationVersion;
-
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-    //initialize the queue for the last values
-    newDataSetWriter->lastSamples = (UA_DataSetWriterSample * )
-        UA_calloc(currentDataSetContext->fieldSize, sizeof(UA_DataSetWriterSample));
-    if(!newDataSetWriter->lastSamples) {
-        UA_DataSetWriterConfig_deleteMembers(&newDataSetWriter->config);
-        UA_free(newDataSetWriter);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    newDataSetWriter->lastSamplesCount = currentDataSetContext->fieldSize;
-#endif
-
-    //connect PublishedDataSet with DataSetWriter
-    newDataSetWriter->connectedDataSet = currentDataSetContext->identifier;
-    newDataSetWriter->linkedWriterGroup = wg->identifier;
-    UA_PubSubManager_generateUniqueNodeId(server, &newDataSetWriter->identifier);
-    if(writerIdentifier != NULL)
-        UA_NodeId_copy(&newDataSetWriter->identifier, writerIdentifier);
-    //add the new writer to the group
-    LIST_INSERT_HEAD(&wg->writers, newDataSetWriter, listEntry);
-    wg->writersCount++;
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    addDataSetWriterRepresentation(server, newDataSetWriter);
-#endif
-    return retVal;
-}
-
-UA_StatusCode
-UA_Server_removeDataSetWriter(UA_Server *server, const UA_NodeId dsw){
-    UA_DataSetWriter *dataSetWriter = UA_DataSetWriter_findDSWbyId(server, dsw);
-    if(!dataSetWriter)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_WriterGroup *linkedWriterGroup = UA_WriterGroup_findWGbyId(server, dataSetWriter->linkedWriterGroup);
-    if(!linkedWriterGroup)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    linkedWriterGroup->writersCount--;
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    removeDataSetWriterRepresentation(server, dataSetWriter);
-#endif
-
-    //remove DataSetWriter from group
-    UA_DataSetWriter_deleteMembers(server, dataSetWriter);
-    LIST_REMOVE(dataSetWriter, listEntry);
-    UA_free(dataSetWriter);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**********************************************/
-/*                DataSetField                */
-/**********************************************/
-
-UA_StatusCode
-UA_DataSetFieldConfig_copy(const UA_DataSetFieldConfig *src, UA_DataSetFieldConfig *dst){
-    memcpy(dst, src, sizeof(UA_DataSetFieldConfig));
-    if(src->dataSetFieldType == UA_PUBSUB_DATASETFIELD_VARIABLE) {
-        UA_String_copy(&src->field.variable.fieldNameAlias, &dst->field.variable.fieldNameAlias);
-        UA_PublishedVariableDataType_copy(&src->field.variable.publishParameters,
-                                          &dst->field.variable.publishParameters);
-    } else {
-        return UA_STATUSCODE_BADNOTSUPPORTED;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Server_getDataSetFieldConfig(UA_Server *server, const UA_NodeId dsf,
-                                UA_DataSetFieldConfig *config) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(!config)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    UA_DataSetField *currentDataSetField = UA_DataSetField_findDSFbyId(server, dsf);
-    if(!currentDataSetField)
-        return UA_STATUSCODE_BADNOTFOUND;
-    UA_DataSetFieldConfig tmpFieldConfig;
-    //deep copy of the actual config
-    retVal |= UA_DataSetFieldConfig_copy(&currentDataSetField->config, &tmpFieldConfig);
-    *config = tmpFieldConfig;
-    return retVal;
-}
-
-UA_DataSetField *
-UA_DataSetField_findDSFbyId(UA_Server *server, UA_NodeId identifier) {
-    for(size_t i = 0; i < server->pubSubManager.publishedDataSetsSize; i++){
-        UA_DataSetField *tmpField;
-        LIST_FOREACH(tmpField, &server->pubSubManager.publishedDataSets[i].fields, listEntry){
-            if(UA_NodeId_equal(&tmpField->identifier, &identifier)){
-                return tmpField;
-            }
-        }
-    }
-    return NULL;
-}
-
-void
-UA_DataSetFieldConfig_deleteMembers(UA_DataSetFieldConfig *dataSetFieldConfig){
-    if(dataSetFieldConfig->dataSetFieldType == UA_PUBSUB_DATASETFIELD_VARIABLE){
-        UA_String_deleteMembers(&dataSetFieldConfig->field.variable.fieldNameAlias);
-        UA_PublishedVariableDataType_deleteMembers(&dataSetFieldConfig->field.variable.publishParameters);
-    }
-}
-
-static void
-UA_DataSetField_deleteMembers(UA_DataSetField *field) {
-    UA_DataSetFieldConfig_deleteMembers(&field->config);
-    //delete DataSetField
-    UA_NodeId_deleteMembers(&field->identifier);
-    UA_NodeId_deleteMembers(&field->publishedDataSet);
-    UA_FieldMetaData_deleteMembers(&field->fieldMetaData);
-}
-
-/*********************************************************/
-/*               PublishValues handling                  */
-/*********************************************************/
-
-/**
- * Compare two variants. Internally used for value change detection.
- *
- * @return true if the value has changed
- */
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-static UA_Boolean
-valueChangedVariant(UA_Variant *oldValue, UA_Variant *newValue){
-    if(! (oldValue && newValue))
-        return false;
-
-    UA_ByteString *oldValueEncoding = UA_ByteString_new(), *newValueEncoding = UA_ByteString_new();
-    size_t oldValueEncodingSize, newValueEncodingSize;
-    oldValueEncodingSize = UA_calcSizeBinary(oldValue, &UA_TYPES[UA_TYPES_VARIANT]);
-    newValueEncodingSize = UA_calcSizeBinary(newValue, &UA_TYPES[UA_TYPES_VARIANT]);
-    if((oldValueEncodingSize == 0) || (newValueEncodingSize == 0))
-        return false;
-
-    if(oldValueEncodingSize != newValueEncodingSize)
-        return true;
-
-    if(UA_ByteString_allocBuffer(oldValueEncoding, oldValueEncodingSize) != UA_STATUSCODE_GOOD)
-        return false;
-
-    if(UA_ByteString_allocBuffer(newValueEncoding, newValueEncodingSize) != UA_STATUSCODE_GOOD)
-        return false;
-
-    UA_Byte *bufPosOldValue = oldValueEncoding->data;
-    const UA_Byte *bufEndOldValue = &oldValueEncoding->data[oldValueEncoding->length];
-    UA_Byte *bufPosNewValue = newValueEncoding->data;
-    const UA_Byte *bufEndNewValue = &newValueEncoding->data[newValueEncoding->length];
-    if(UA_encodeBinary(oldValue, &UA_TYPES[UA_TYPES_VARIANT],
-                       &bufPosOldValue, &bufEndOldValue, NULL, NULL) != UA_STATUSCODE_GOOD){
-        return false;
-    }
-    if(UA_encodeBinary(newValue, &UA_TYPES[UA_TYPES_VARIANT],
-                       &bufPosNewValue, &bufEndNewValue, NULL, NULL) != UA_STATUSCODE_GOOD){
-        return false;
-    }
-    oldValueEncoding->length = (uintptr_t)bufPosOldValue - (uintptr_t)oldValueEncoding->data;
-    newValueEncoding->length = (uintptr_t)bufPosNewValue - (uintptr_t)newValueEncoding->data;
-    UA_Boolean compareResult = !UA_ByteString_equal(oldValueEncoding, newValueEncoding);
-    UA_ByteString_delete(oldValueEncoding);
-    UA_ByteString_delete(newValueEncoding);
-    return compareResult;
-}
-#endif
-
-/**
- * Obtain the latest value for a specific DataSetField. This method is currently
- * called inside the DataSetMessage generation process.
- */
-static void
-UA_PubSubDataSetField_sampleValue(UA_Server *server, UA_DataSetField *field,
-                                  UA_DataValue *value) {
-    /* Read the value */
-    UA_ReadValueId rvid;
-    UA_ReadValueId_init(&rvid);
-    rvid.nodeId = field->config.field.variable.publishParameters.publishedVariable;
-    rvid.attributeId = field->config.field.variable.publishParameters.attributeId;
-    rvid.indexRange = field->config.field.variable.publishParameters.indexRange;
-    *value = UA_Server_read(server, &rvid, UA_TIMESTAMPSTORETURN_BOTH);
-}
-
-static UA_StatusCode
-UA_PubSubDataSetWriter_generateKeyFrameMessage(UA_Server *server, UA_DataSetMessage *dataSetMessage,
-                                               UA_DataSetWriter *dataSetWriter) {
-    UA_PublishedDataSet *currentDataSet =
-        UA_PublishedDataSet_findPDSbyId(server, dataSetWriter->connectedDataSet);
-    if(!currentDataSet)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    /* Prepare DataSetMessageContent */
-    dataSetMessage->header.dataSetMessageValid = true;
-    dataSetMessage->header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    dataSetMessage->data.keyFrameData.fieldCount = currentDataSet->fieldSize;
-    dataSetMessage->data.keyFrameData.dataSetFields = (UA_DataValue *)
-            UA_Array_new(currentDataSet->fieldSize, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    if(!dataSetMessage->data.keyFrameData.dataSetFields)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-#ifdef UA_ENABLE_JSON_ENCODING
-    /* json: insert fieldnames used as json keys */
-       dataSetMessage->data.keyFrameData.fieldNames =
-               (UA_String *)UA_Array_new(currentDataSet->fieldSize, &UA_TYPES[UA_TYPES_STRING]);
-       if(!dataSetMessage->data.keyFrameData.fieldNames)
-           return UA_STATUSCODE_BADOUTOFMEMORY;
-#endif
-
-    /* Loop over the fields */
-    size_t counter = 0;
-    UA_DataSetField *dsf;
-    LIST_FOREACH(dsf, &currentDataSet->fields, listEntry) {
-
-#ifdef UA_ENABLE_JSON_ENCODING
-        /* json: store the fieldNameAlias*/
-        UA_String_copy(&dsf->config.field.variable.fieldNameAlias,
-              &dataSetMessage->data.keyFrameData.fieldNames[counter]);
-#endif
-
-        /* Sample the value */
-        UA_DataValue *dfv = &dataSetMessage->data.keyFrameData.dataSetFields[counter];
-        UA_PubSubDataSetField_sampleValue(server, dsf, dfv);
-
-        /* Deactivate statuscode? */
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_STATUSCODE) == 0)
-            dfv->hasStatus = false;
-
-        /* Deactivate timestamps */
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask &
-            (u64)UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP) == 0)
-            dfv->hasSourceTimestamp = false;
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask &
-            (u64)UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS) == 0)
-            dfv->hasSourcePicoseconds = false;
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask &
-            (u64)UA_DATASETFIELDCONTENTMASK_SERVERTIMESTAMP) == 0)
-            dfv->hasServerTimestamp = false;
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask &
-            (u64)UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS) == 0)
-            dfv->hasServerPicoseconds = false;
-
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-        /* Update lastValue store */
-        UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[counter].value);
-        UA_DataValue_copy(dfv, &dataSetWriter->lastSamples[counter].value);
-#endif
-
-        counter++;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-static UA_StatusCode
-UA_PubSubDataSetWriter_generateDeltaFrameMessage(UA_Server *server,
-                                                 UA_DataSetMessage *dataSetMessage,
-                                                 UA_DataSetWriter *dataSetWriter) {
-    UA_PublishedDataSet *currentDataSet =
-        UA_PublishedDataSet_findPDSbyId(server, dataSetWriter->connectedDataSet);
-    if(!currentDataSet)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    /* Prepare DataSetMessageContent */
-    memset(dataSetMessage, 0, sizeof(UA_DataSetMessage));
-    dataSetMessage->header.dataSetMessageValid = true;
-    dataSetMessage->header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-
-    UA_DataSetField *dsf;
-    size_t counter = 0;
-    LIST_FOREACH(dsf, &currentDataSet->fields, listEntry) {
-        /* Sample the value */
-        UA_DataValue value;
-        UA_DataValue_init(&value);
-        UA_PubSubDataSetField_sampleValue(server, dsf, &value);
-
-        /* Check if the value has changed */
-        if(valueChangedVariant(&dataSetWriter->lastSamples[counter].value.value, &value.value)) {
-            /* increase fieldCount for current delta message */
-            dataSetMessage->data.deltaFrameData.fieldCount++;
-            dataSetWriter->lastSamples[counter].valueChanged = true;
-
-            /* Update last stored sample */
-            UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[counter].value);
-            dataSetWriter->lastSamples[counter].value = value;
-        } else {
-            UA_DataValue_deleteMembers(&value);
-            dataSetWriter->lastSamples[counter].valueChanged = false;
-        }
-
-        counter++;
-    }
-
-    /* Allocate DeltaFrameFields */
-    UA_DataSetMessage_DeltaFrameField *deltaFields = (UA_DataSetMessage_DeltaFrameField *)
-            UA_calloc(dataSetMessage->data.deltaFrameData.fieldCount, sizeof(UA_DataSetMessage_DeltaFrameField));
-    if(!deltaFields)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    dataSetMessage->data.deltaFrameData.deltaFrameFields = deltaFields;
-    size_t currentDeltaField = 0;
-    for(size_t i = 0; i < currentDataSet->fieldSize; i++) {
-        if(!dataSetWriter->lastSamples[i].valueChanged)
-            continue;
-
-        UA_DataSetMessage_DeltaFrameField *dff = &deltaFields[currentDeltaField];
-
-        dff->fieldIndex = (UA_UInt16) i;
-        UA_DataValue_copy(&dataSetWriter->lastSamples[i].value, &dff->fieldValue);
-        dataSetWriter->lastSamples[i].valueChanged = false;
-
-        /* Deactivate statuscode? */
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_STATUSCODE) == 0)
-            dff->fieldValue.hasStatus = false;
-
-        /* Deactivate timestamps? */
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP) == 0)
-            dff->fieldValue.hasSourceTimestamp = false;
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS) == 0)
-            dff->fieldValue.hasServerPicoseconds = false;
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SERVERTIMESTAMP) == 0)
-            dff->fieldValue.hasServerTimestamp = false;
-        if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS) == 0)
-            dff->fieldValue.hasServerPicoseconds = false;
-
-        currentDeltaField++;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-/**
- * Generate a DataSetMessage for the given writer.
- *
- * @param dataSetWriter ptr to corresponding writer
- * @return ptr to generated DataSetMessage
- */
-static UA_StatusCode
-UA_DataSetWriter_generateDataSetMessage(UA_Server *server, UA_DataSetMessage *dataSetMessage,
-                                        UA_DataSetWriter *dataSetWriter) {
-    UA_PublishedDataSet *currentDataSet =
-        UA_PublishedDataSet_findPDSbyId(server, dataSetWriter->connectedDataSet);
-    if(!currentDataSet)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    /* Reset the message */
-    memset(dataSetMessage, 0, sizeof(UA_DataSetMessage));
-
-    /* store messageType to switch between json or uadp (default) */
-    UA_UInt16 messageType = UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE;
-    UA_JsonDataSetWriterMessageDataType *jsonDataSetWriterMessageDataType = NULL;
-
-    /* The configuration Flags are included
-     * inside the std. defined UA_UadpDataSetWriterMessageDataType */
-    UA_UadpDataSetWriterMessageDataType defaultUadpConfiguration;
-    UA_UadpDataSetWriterMessageDataType *dataSetWriterMessageDataType = NULL;
-    if((dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED ||
-        dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) &&
-       (dataSetWriter->config.messageSettings.content.decoded.type ==
-        &UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE])) {
-        dataSetWriterMessageDataType = (UA_UadpDataSetWriterMessageDataType *)
-            dataSetWriter->config.messageSettings.content.decoded.data;
-
-        /* type is UADP */
-        messageType = UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE;
-    } else if((dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED ||
-               dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) &&
-              (dataSetWriter->config.messageSettings.content.decoded.type ==
-               &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE])) {
-        jsonDataSetWriterMessageDataType = (UA_JsonDataSetWriterMessageDataType *)
-            dataSetWriter->config.messageSettings.content.decoded.data;
-
-        /* type is JSON */
-        messageType = UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE;
-    } else {
-        /* create default flag configuration if no
-         * UadpDataSetWriterMessageDataType was passed in */
-        memset(&defaultUadpConfiguration, 0, sizeof(UA_UadpDataSetWriterMessageDataType));
-        defaultUadpConfiguration.dataSetMessageContentMask = (UA_UadpDataSetMessageContentMask)
-            ((u64)UA_UADPDATASETMESSAGECONTENTMASK_TIMESTAMP | (u64)UA_UADPDATASETMESSAGECONTENTMASK_MAJORVERSION |
-             (u64)UA_UADPDATASETMESSAGECONTENTMASK_MINORVERSION);
-        dataSetWriterMessageDataType = &defaultUadpConfiguration;
-    }
-
-    /* Sanity-test the configuration */
-    if(dataSetWriterMessageDataType &&
-       (dataSetWriterMessageDataType->networkMessageNumber != 0 ||
-        dataSetWriterMessageDataType->dataSetOffset != 0 ||
-        dataSetWriterMessageDataType->configuredSize != 0)) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Static DSM configuration not supported. Using defaults");
-        dataSetWriterMessageDataType->networkMessageNumber = 0;
-        dataSetWriterMessageDataType->dataSetOffset = 0;
-        dataSetWriterMessageDataType->configuredSize = 0;
-    }
-
-    /* The field encoding depends on the flags inside the writer config.
-     * TODO: This can be moved to the encoding layer. */
-    if(dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_RAWDATA
-) {
-        dataSetMessage->header.fieldEncoding = UA_FIELDENCODING_RAWDATA;
-    } else if((u64)dataSetWriter->config.dataSetFieldContentMask &
-              ((u64)UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP | (u64)UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS |
-               (u64)UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS | (u64)UA_DATASETFIELDCONTENTMASK_STATUSCODE)) {
-        dataSetMessage->header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    } else {
-        dataSetMessage->header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    }
-
-    if(messageType == UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE) {
-        /* Std: 'The DataSetMessageContentMask defines the flags for the content of the DataSetMessage header.' */
-        if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_UADPDATASETMESSAGECONTENTMASK_MAJORVERSION) {
-            dataSetMessage->header.configVersionMajorVersionEnabled = true;
-            dataSetMessage->header.configVersionMajorVersion =
-                currentDataSet->dataSetMetaData.configurationVersion.majorVersion;
-        }
-        if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_UADPDATASETMESSAGECONTENTMASK_MINORVERSION) {
-            dataSetMessage->header.configVersionMinorVersionEnabled = true;
-            dataSetMessage->header.configVersionMinorVersion =
-                currentDataSet->dataSetMetaData.configurationVersion.minorVersion;
-        }
-
-        if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_UADPDATASETMESSAGECONTENTMASK_SEQUENCENUMBER) {
-            dataSetMessage->header.dataSetMessageSequenceNrEnabled = true;
-            dataSetMessage->header.dataSetMessageSequenceNr =
-                dataSetWriter->actualDataSetMessageSequenceCount;
-        }
-
-        if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_UADPDATASETMESSAGECONTENTMASK_TIMESTAMP) {
-            dataSetMessage->header.timestampEnabled = true;
-            dataSetMessage->header.timestamp = UA_DateTime_now();
-        }
-        /* TODO: Picoseconds resolution not supported atm */
-        if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_UADPDATASETMESSAGECONTENTMASK_PICOSECONDS) {
-            dataSetMessage->header.picoSecondsIncluded = false;
-        }
-
-        /* TODO: Statuscode not supported yet */
-        if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_UADPDATASETMESSAGECONTENTMASK_STATUS) {
-            dataSetMessage->header.statusEnabled = false;
-        }
-    } else if(messageType == UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE) {
-        if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_JSONDATASETMESSAGECONTENTMASK_METADATAVERSION) {
-            dataSetMessage->header.configVersionMajorVersionEnabled = true;
-            dataSetMessage->header.configVersionMajorVersion =
-                currentDataSet->dataSetMetaData.configurationVersion.majorVersion;
-        }
-        if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_JSONDATASETMESSAGECONTENTMASK_METADATAVERSION) {
-            dataSetMessage->header.configVersionMinorVersionEnabled = true;
-            dataSetMessage->header.configVersionMinorVersion =
-                currentDataSet->dataSetMetaData.configurationVersion.minorVersion;
-        }
-
-        if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_JSONDATASETMESSAGECONTENTMASK_SEQUENCENUMBER) {
-            dataSetMessage->header.dataSetMessageSequenceNrEnabled = true;
-            dataSetMessage->header.dataSetMessageSequenceNr =
-                dataSetWriter->actualDataSetMessageSequenceCount;
-        }
-
-        if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_JSONDATASETMESSAGECONTENTMASK_TIMESTAMP) {
-            dataSetMessage->header.timestampEnabled = true;
-            dataSetMessage->header.timestamp = UA_DateTime_now();
-        }
-
-        /* TODO: Statuscode not supported yet */
-        if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask &
-           (u64)UA_JSONDATASETMESSAGECONTENTMASK_STATUS) {
-            dataSetMessage->header.statusEnabled = false;
-        }
-    }
-
-    /* Set the sequence count. Automatically rolls over to zero */
-    dataSetWriter->actualDataSetMessageSequenceCount++;
-
-    /* JSON does not differ between deltaframes and keyframes, only keyframes are currently used. */
-    if(messageType != UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE){
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-    /* Check if the PublishedDataSet version has changed -> if yes flush the lastValue store and send a KeyFrame */
-    if(dataSetWriter->connectedDataSetVersion.majorVersion != currentDataSet->dataSetMetaData.configurationVersion.majorVersion ||
-       dataSetWriter->connectedDataSetVersion.minorVersion != currentDataSet->dataSetMetaData.configurationVersion.minorVersion) {
-        /* Remove old samples */
-        for(size_t i = 0; i < dataSetWriter->lastSamplesCount; i++)
-            UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[i].value);
-
-        /* Realloc pds dependent memory */
-        dataSetWriter->lastSamplesCount = currentDataSet->fieldSize;
-        UA_DataSetWriterSample *newSamplesArray = (UA_DataSetWriterSample * )
-            UA_realloc(dataSetWriter->lastSamples, sizeof(UA_DataSetWriterSample) * dataSetWriter->lastSamplesCount);
-        if(!newSamplesArray)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        dataSetWriter->lastSamples = newSamplesArray;
-        memset(dataSetWriter->lastSamples, 0, sizeof(UA_DataSetWriterSample) * dataSetWriter->lastSamplesCount);
-
-        dataSetWriter->connectedDataSetVersion = currentDataSet->dataSetMetaData.configurationVersion;
-        UA_PubSubDataSetWriter_generateKeyFrameMessage(server, dataSetMessage, dataSetWriter);
-        dataSetWriter->deltaFrameCounter = 0;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* The standard defines: if a PDS contains only one fields no delta messages
-     * should be generated because they need more memory than a keyframe with 1
-     * field. */
-    if(currentDataSet->fieldSize > 1 && dataSetWriter->deltaFrameCounter > 0 &&
-       dataSetWriter->deltaFrameCounter <= dataSetWriter->config.keyFrameCount) {
-        UA_PubSubDataSetWriter_generateDeltaFrameMessage(server, dataSetMessage, dataSetWriter);
-        dataSetWriter->deltaFrameCounter++;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    dataSetWriter->deltaFrameCounter = 1;
-#endif
-    }
-
-    UA_PubSubDataSetWriter_generateKeyFrameMessage(server, dataSetMessage, dataSetWriter);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-sendNetworkMessageJson(UA_PubSubConnection *connection, UA_DataSetMessage *dsm,
-                   UA_UInt16 *writerIds, UA_Byte dsmCount, UA_ExtensionObject *transportSettings) {
-   UA_StatusCode retval = UA_STATUSCODE_BADNOTSUPPORTED;
-#ifdef UA_ENABLE_JSON_ENCODING
-    UA_NetworkMessage nm;
-    memset(&nm, 0, sizeof(UA_NetworkMessage));
-    nm.version = 1;
-    nm.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    nm.payloadHeaderEnabled = true;
-
-    nm.payloadHeader.dataSetPayloadHeader.count = dsmCount;
-    nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = writerIds;
-    nm.payload.dataSetPayload.dataSetMessages = dsm;
-
-    /* Allocate the buffer. Allocate on the stack if the buffer is small. */
-    UA_ByteString buf;
-    size_t msgSize = UA_NetworkMessage_calcSizeJson(&nm, NULL, 0, NULL, 0, true);
-    size_t stackSize = 1;
-    if(msgSize <= UA_MAX_STACKBUF)
-        stackSize = msgSize;
-    UA_STACKARRAY(UA_Byte, stackBuf, stackSize);
-    buf.data = stackBuf;
-    buf.length = msgSize;
-    if(msgSize > UA_MAX_STACKBUF) {
-        retval = UA_ByteString_allocBuffer(&buf, msgSize);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* Encode the message */
-    UA_Byte *bufPos = buf.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &buf.data[buf.length];
-    retval = UA_NetworkMessage_encodeJson(&nm, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-    if(retval != UA_STATUSCODE_GOOD) {
-        if(msgSize > UA_MAX_STACKBUF)
-            UA_ByteString_deleteMembers(&buf);
-        return retval;
-    }
-
-    /* Send the prepared messages */
-    retval = connection->channel->send(connection->channel, transportSettings, &buf);
-    if(msgSize > UA_MAX_STACKBUF)
-        UA_ByteString_deleteMembers(&buf);
-#endif
-    return retval;
-}
-
-static UA_StatusCode
-sendNetworkMessage(UA_PubSubConnection *connection, UA_WriterGroup *wg,
-                   UA_DataSetMessage *dsm, UA_UInt16 *writerIds, UA_Byte dsmCount,
-                   UA_ExtensionObject *messageSettings,
-                   UA_ExtensionObject *transportSettings) {
-
-    if(messageSettings->content.decoded.type !=
-       &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE])
-        return UA_STATUSCODE_BADINTERNALERROR;
-    UA_UadpWriterGroupMessageDataType *wgm = (UA_UadpWriterGroupMessageDataType*)
-        messageSettings->content.decoded.data;
-
-    UA_NetworkMessage nm;
-    memset(&nm, 0, sizeof(UA_NetworkMessage));
-
-    nm.publisherIdEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID) != 0;
-    nm.groupHeaderEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER) != 0;
-    nm.groupHeader.writerGroupIdEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID) != 0;
-    nm.groupHeader.groupVersionEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPVERSION) != 0;
-    nm.groupHeader.networkMessageNumberEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_NETWORKMESSAGENUMBER) != 0;
-    nm.groupHeader.sequenceNumberEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_SEQUENCENUMBER) != 0;
-    nm.payloadHeaderEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER) != 0;
-    nm.timestampEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_TIMESTAMP) != 0;
-    nm.picosecondsEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PICOSECONDS) != 0;
-    nm.dataSetClassIdEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_DATASETCLASSID) != 0;
-    nm.promotedFieldsEnabled =
-        ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PROMOTEDFIELDS) != 0;
-
-    nm.version = 1;
-    nm.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    if(connection->config->publisherIdType == UA_PUBSUB_PUBLISHERID_NUMERIC) {
-        nm.publisherIdType = UA_PUBLISHERDATATYPE_UINT16;
-        nm.publisherId.publisherIdUInt32 = connection->config->publisherId.numeric;
-    } else if(connection->config->publisherIdType == UA_PUBSUB_PUBLISHERID_STRING){
-        nm.publisherIdType = UA_PUBLISHERDATATYPE_STRING;
-        nm.publisherId.publisherIdString = connection->config->publisherId.string;
-    }
-
-    /* Compute the length of the dsm separately for the header */
-    UA_STACKARRAY(UA_UInt16, dsmLengths, dsmCount);
-    for(UA_Byte i = 0; i < dsmCount; i++)
-        dsmLengths[i] = (UA_UInt16)UA_DataSetMessage_calcSizeBinary(&dsm[i]);
-
-    nm.payloadHeader.dataSetPayloadHeader.count = dsmCount;
-    nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = writerIds;
-    nm.groupHeader.writerGroupId = wg->config.writerGroupId;
-    nm.groupHeader.networkMessageNumber = 1;
-    nm.payload.dataSetPayload.sizes = dsmLengths;
-    nm.payload.dataSetPayload.dataSetMessages = dsm;
-
-    /* Allocate the buffer. Allocate on the stack if the buffer is small. */
-    UA_ByteString buf;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&nm);
-    size_t stackSize = 1;
-    if(msgSize <= UA_MAX_STACKBUF)
-        stackSize = msgSize;
-    UA_STACKARRAY(UA_Byte, stackBuf, stackSize);
-    buf.data = stackBuf;
-    buf.length = msgSize;
-    UA_StatusCode retval;
-    if(msgSize > UA_MAX_STACKBUF) {
-        retval = UA_ByteString_allocBuffer(&buf, msgSize);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* Encode the message */
-    UA_Byte *bufPos = buf.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &buf.data[buf.length];
-    retval = UA_NetworkMessage_encodeBinary(&nm, &bufPos, bufEnd);
-    if(retval != UA_STATUSCODE_GOOD) {
-        if(msgSize > UA_MAX_STACKBUF)
-            UA_ByteString_deleteMembers(&buf);
-        return retval;
-    }
-
-    /* Send the prepared messages */
-    retval = connection->channel->send(connection->channel, transportSettings, &buf);
-    if(msgSize > UA_MAX_STACKBUF)
-        UA_ByteString_deleteMembers(&buf);
-    return retval;
-}
-
-/* This callback triggers the collection and publish of NetworkMessages and the
- * contained DataSetMessages. */
-void
-UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
-    UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "Publish Callback");
-
-    if(!writerGroup) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Publish failed. WriterGroup not found");
-        return;
-    }
-
-    /* Nothing to do? */
-    if(writerGroup->writersCount <= 0)
-        return;
-
-    /* Binary or Json encoding?  */
-    if(writerGroup->config.encodingMimeType != UA_PUBSUB_ENCODING_UADP &&
-       writerGroup->config.encodingMimeType != UA_PUBSUB_ENCODING_JSON) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Publish failed: Unknown encoding type.");
-        return;
-    }
-
-    /* Find the connection associated with the writer */
-    UA_PubSubConnection *connection =
-        UA_PubSubConnection_findConnectionbyId(server, writerGroup->linkedConnection);
-    if(!connection) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Publish failed. PubSubConnection invalid.");
-        return;
-    }
-
-    /* How many DSM can be sent in one NM? */
-    UA_Byte maxDSM = (UA_Byte)writerGroup->config.maxEncapsulatedDataSetMessageCount;
-    if(writerGroup->config.maxEncapsulatedDataSetMessageCount > UA_BYTE_MAX)
-        maxDSM = UA_BYTE_MAX;
-    /* If the maxEncapsulatedDataSetMessageCount is set to 0->1 */
-    if(maxDSM == 0)
-        maxDSM = 1;
-
-    /* It is possible to put several DataSetMessages into one NetworkMessage.
-     * But only if they do not contain promoted fields. NM with only DSM are
-     * sent out right away. The others are kept in a buffer for "batching". */
-    size_t dsmCount = 0;
-    UA_DataSetWriter *dsw;
-    UA_STACKARRAY(UA_UInt16, dsWriterIds, writerGroup->writersCount);
-    UA_STACKARRAY(UA_DataSetMessage, dsmStore, writerGroup->writersCount);
-    LIST_FOREACH(dsw, &writerGroup->writers, listEntry) {
-        /* Find the dataset */
-        UA_PublishedDataSet *pds =
-            UA_PublishedDataSet_findPDSbyId(server, dsw->connectedDataSet);
-        if(!pds) {
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "PubSub Publish: PublishedDataSet not found");
-            continue;
-        }
-
-        /* Generate the DSM */
-        UA_StatusCode res =
-            UA_DataSetWriter_generateDataSetMessage(server, &dsmStore[dsmCount], dsw);
-        if(res != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "PubSub Publish: DataSetMessage creation failed");
-            continue;
-        }
-
-        /* Send right away if there is only this DSM in a NM. If promoted fields
-         * are contained in the PublishedDataSet, then this DSM must go into a
-         * dedicated NM as well. */
-        if(pds->promotedFieldsCount > 0 || maxDSM == 1) {
-            if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_UADP){
-                res = sendNetworkMessage(connection, writerGroup, &dsmStore[dsmCount],
-                                         &dsw->config.dataSetWriterId, 1,
-                                         &writerGroup->config.messageSettings,
-                                         &writerGroup->config.transportSettings);
-            }else if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_JSON){
-                res = sendNetworkMessageJson(connection, &dsmStore[dsmCount],
-                        &dsw->config.dataSetWriterId, 1, &writerGroup->config.transportSettings);
-            }
-           if(res != UA_STATUSCODE_GOOD)
-                UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                               "PubSub Publish: Could not send a NetworkMessage");
-            UA_DataSetMessage_free(&dsmStore[dsmCount]);
-            continue;
-        }
-
-        dsWriterIds[dsmCount] = dsw->config.dataSetWriterId;
-        dsmCount++;
-    }
-
-    /* Send the NetworkMessages with batched DataSetMessages */
-    size_t nmCount = (dsmCount / maxDSM) + ((dsmCount % maxDSM) == 0 ? 0 : 1);
-    for(UA_UInt32 i = 0; i < nmCount; i++) {
-        UA_Byte nmDsmCount = maxDSM;
-        if(i == nmCount - 1  && (dsmCount % maxDSM))
-            nmDsmCount = (UA_Byte)dsmCount % maxDSM;
-
-        UA_StatusCode res3 = UA_STATUSCODE_GOOD;
-        if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_UADP){
-            res3 = sendNetworkMessage(connection, writerGroup, &dsmStore[i * maxDSM],
-                                      &dsWriterIds[i * maxDSM], nmDsmCount,
-                                      &writerGroup->config.messageSettings,
-                                      &writerGroup->config.transportSettings);
-        }else if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_JSON){
-            res3 = sendNetworkMessageJson(connection, &dsmStore[i * maxDSM],
-                    &dsWriterIds[i * maxDSM], nmDsmCount, &writerGroup->config.transportSettings);
-        }
-        if(res3 != UA_STATUSCODE_GOOD)
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "PubSub Publish: Sending a NetworkMessage failed");
-    }
-
-    /* Clean up DSM */
-    for(size_t i = 0; i < dsmCount; i++)
-        UA_DataSetMessage_free(&dsmStore[i]);
-}
-
-/* Add new publishCallback. The first execution is triggered directly after
- * creation. */
-UA_StatusCode
-UA_WriterGroup_addPublishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
-    UA_StatusCode retval =
-            UA_PubSubManager_addRepeatedCallback(server,
-                                                 (UA_ServerCallback) UA_WriterGroup_publishCallback,
-                                                 writerGroup, writerGroup->config.publishingInterval,
-                                                 &writerGroup->publishCallbackId);
-    if(retval == UA_STATUSCODE_GOOD)
-        writerGroup->publishCallbackIsRegistered = true;
-
-    /* Run once after creation */
-    UA_WriterGroup_publishCallback(server, writerGroup);
-    return retval;
-}
-
-/* This callback triggers the collection and reception of NetworkMessages and the
- * contained DataSetMessages. */
-void UA_ReaderGroup_subscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup) {
-    UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection);
-    UA_ByteString buffer;
-    if(UA_ByteString_allocBuffer(&buffer, 512) != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Message buffer alloc failed!");
-        return;
-    }
-
-    connection->channel->receive(connection->channel, &buffer, NULL, 300000);
-    if(buffer.length > 0) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "Message received:");
-        UA_NetworkMessage currentNetworkMessage;
-        memset(&currentNetworkMessage, 0, sizeof(UA_NetworkMessage));
-        size_t currentPosition = 0;
-        UA_NetworkMessage_decodeBinary(&buffer, &currentPosition, &currentNetworkMessage);
-        UA_Server_processNetworkMessage(server, &currentNetworkMessage, connection);
-        UA_NetworkMessage_deleteMembers(&currentNetworkMessage);
-    }
-
-    UA_ByteString_deleteMembers(&buffer);
-}
-
-/* Add new subscribeCallback. The first execution is triggered directly after
- * creation. */
-UA_StatusCode
-UA_ReaderGroup_addSubscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    retval |= UA_PubSubManager_addRepeatedCallback(server, (UA_ServerCallback) UA_ReaderGroup_subscribeCallback,
-                                                   readerGroup, 5,
-                                                   &readerGroup->subscribeCallbackId);
-
-    if(retval == UA_STATUSCODE_GOOD) {
-        readerGroup->subscribeCallbackIsRegistered = true;
-    }
-
-    /* Run once after creation */
-    UA_ReaderGroup_subscribeCallback(server, readerGroup);
-    return retval;
-}
-
-#endif /* UA_ENABLE_PUBSUB */
diff --git a/ext/open62541/src/pubsub/ua_pubsub.h b/ext/open62541/src/pubsub/ua_pubsub.h
deleted file mode 100644
index a752eff..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-#ifndef UA_PUBSUB_H_
-#define UA_PUBSUB_H_
-
-#include <open62541/plugin/pubsub.h>
-#include <open62541/server.h>
-#include <open62541/server_pubsub.h>
-
-#include "open62541_queue.h"
-#include "ua_pubsub_networkmessage.h"
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_PUBSUB /* conditional compilation */
-
-/* forward declarations */
-struct UA_WriterGroup;
-typedef struct UA_WriterGroup UA_WriterGroup;
-
-/* Declaration for ReaderGroup */
-struct UA_ReaderGroup;
-typedef struct UA_ReaderGroup UA_ReaderGroup;
-
-/* The configuration structs (public part of PubSub entities) are defined in include/ua_plugin_pubsub.h */
-
-/**********************************************/
-/*            PublishedDataSet                */
-/**********************************************/
-typedef struct{
-    UA_PublishedDataSetConfig config;
-    UA_DataSetMetaDataType dataSetMetaData;
-    LIST_HEAD(UA_ListOfDataSetField, UA_DataSetField) fields;
-    UA_NodeId identifier;
-    UA_UInt16 fieldSize;
-    UA_UInt16 promotedFieldsCount;
-} UA_PublishedDataSet;
-
-UA_StatusCode
-UA_PublishedDataSetConfig_copy(const UA_PublishedDataSetConfig *src, UA_PublishedDataSetConfig *dst);
-UA_PublishedDataSet *
-UA_PublishedDataSet_findPDSbyId(UA_Server *server, UA_NodeId identifier);
-void
-UA_PublishedDataSet_deleteMembers(UA_Server *server, UA_PublishedDataSet *publishedDataSet);
-
-/**********************************************/
-/*               Connection                   */
-/**********************************************/
-//the connection config (public part of connection) object is defined in include/ua_plugin_pubsub.h
-typedef struct{
-    UA_PubSubConnectionConfig *config;
-    //internal fields
-    UA_PubSubChannel *channel;
-    UA_NodeId identifier;
-    LIST_HEAD(UA_ListOfWriterGroup, UA_WriterGroup) writerGroups;
-    LIST_HEAD(UA_ListOfPubSubReaderGroup, UA_ReaderGroup) readerGroups;
-    size_t readerGroupsSize;
-} UA_PubSubConnection;
-
-UA_StatusCode
-UA_PubSubConnectionConfig_copy(const UA_PubSubConnectionConfig *src, UA_PubSubConnectionConfig *dst);
-UA_PubSubConnection *
-UA_PubSubConnection_findConnectionbyId(UA_Server *server, UA_NodeId connectionIdentifier);
-void
-UA_PubSubConnectionConfig_deleteMembers(UA_PubSubConnectionConfig *connectionConfig);
-void
-UA_PubSubConnection_deleteMembers(UA_Server *server, UA_PubSubConnection *connection);
-/* Register channel for given connectionIdentifier */
-UA_StatusCode
-UA_PubSubConnection_regist(UA_Server *server, UA_NodeId *connectionIdentifier);
-
-/**********************************************/
-/*              DataSetWriter                 */
-/**********************************************/
-
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-typedef struct UA_DataSetWriterSample{
-    UA_Boolean valueChanged;
-    UA_DataValue value;
-} UA_DataSetWriterSample;
-#endif
-
-typedef struct UA_DataSetWriter{
-    UA_DataSetWriterConfig config;
-    //internal fields
-    LIST_ENTRY(UA_DataSetWriter) listEntry;
-    UA_NodeId identifier;
-    UA_NodeId linkedWriterGroup;
-    UA_NodeId connectedDataSet;
-    UA_ConfigurationVersionDataType connectedDataSetVersion;
-#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES
-    UA_UInt16 deltaFrameCounter;            //actual count of sent deltaFrames
-    size_t lastSamplesCount;
-    UA_DataSetWriterSample *lastSamples;
-#endif
-    UA_UInt16 actualDataSetMessageSequenceCount;
-} UA_DataSetWriter;
-
-UA_StatusCode
-UA_DataSetWriterConfig_copy(const UA_DataSetWriterConfig *src, UA_DataSetWriterConfig *dst);
-UA_DataSetWriter *
-UA_DataSetWriter_findDSWbyId(UA_Server *server, UA_NodeId identifier);
-
-/**********************************************/
-/*               WriterGroup                  */
-/**********************************************/
-
-struct UA_WriterGroup{
-    UA_WriterGroupConfig config;
-    //internal fields
-    LIST_ENTRY(UA_WriterGroup) listEntry;
-    UA_NodeId identifier;
-    UA_NodeId linkedConnection;
-    LIST_HEAD(UA_ListOfDataSetWriter, UA_DataSetWriter) writers;
-    UA_UInt32 writersCount;
-    UA_UInt64 publishCallbackId;
-    UA_Boolean publishCallbackIsRegistered;
-};
-
-UA_StatusCode
-UA_WriterGroupConfig_copy(const UA_WriterGroupConfig *src, UA_WriterGroupConfig *dst);
-UA_WriterGroup *
-UA_WriterGroup_findWGbyId(UA_Server *server, UA_NodeId identifier);
-
-/**********************************************/
-/*               DataSetField                 */
-/**********************************************/
-
-typedef struct UA_DataSetField{
-    UA_DataSetFieldConfig config;
-    //internal fields
-    LIST_ENTRY(UA_DataSetField) listEntry;
-    UA_NodeId identifier;
-    UA_NodeId publishedDataSet;             //ref to parent pds
-    UA_FieldMetaData fieldMetaData;
-    UA_UInt64 sampleCallbackId;
-    UA_Boolean sampleCallbackIsRegistered;
-} UA_DataSetField;
-
-UA_StatusCode
-UA_DataSetFieldConfig_copy(const UA_DataSetFieldConfig *src, UA_DataSetFieldConfig *dst);
-UA_DataSetField *
-UA_DataSetField_findDSFbyId(UA_Server *server, UA_NodeId identifier);
-
-/**********************************************/
-/*               DataSetReader                */
-/**********************************************/
-
-/* SubscribedDataSetDataType Definition */
-typedef enum {
-    UA_PUBSUB_SDS_TARGET,
-    UA_PUBSUB_SDS_MIRROR
-}UA_SubscribedDataSetEnumType;
-
-/* DataSetReader Type definition */
-typedef struct UA_DataSetReader {
-    UA_DataSetReaderConfig config;
-    /* implementation defined fields */
-    UA_NodeId identifier;
-    UA_NodeId linkedReaderGroup;
-    LIST_ENTRY(UA_DataSetReader) listEntry;
-    UA_SubscribedDataSetEnumType subscribedDataSetType;
-    UA_TargetVariablesDataType subscribedDataSetTarget;
-    /* To Do UA_SubscribedDataSetMirrorDataType subscribedDataSetMirror */
-}UA_DataSetReader;
-
-/* Delete DataSetReader */
-void UA_DataSetReader_delete(UA_Server *server, UA_DataSetReader *dataSetReader);
-
-/* Process Network Message using DataSetReader */
-void UA_Server_DataSetReader_process(UA_Server *server, UA_DataSetReader *dataSetReader, UA_DataSetMessage* dataSetMsg);
-
-/* Copy the configuration of DataSetReader */
-UA_StatusCode UA_DataSetReaderConfig_copy(const UA_DataSetReaderConfig *src, UA_DataSetReaderConfig *dst);
-
-/* Add TargetVariables */
-UA_StatusCode
-UA_Server_DataSetReader_addTargetVariables(UA_Server* server, UA_NodeId* parentNode, UA_NodeId dataSetReaderIdentifier, UA_SubscribedDataSetEnumType sdsType);
-
-/**********************************************/
-/*                ReaderGroup                 */
-/**********************************************/
-/* ReaderGroup Type Definition*/
-
-struct UA_ReaderGroup {
-    UA_ReaderGroupConfig config;
-    UA_NodeId identifier;
-    UA_NodeId linkedConnection;
-    LIST_ENTRY(UA_ReaderGroup) listEntry;
-    LIST_HEAD(UA_ListOfPubSubDataSetReader, UA_DataSetReader) readers;
-    /* for simplified information access */
-    UA_UInt32 readersCount;
-    UA_UInt64 subscribeCallbackId;
-    UA_Boolean subscribeCallbackIsRegistered;
-};
-
-/* Delete ReaderGroup */
-void UA_Server_ReaderGroup_delete(UA_Server *server, UA_ReaderGroup *readerGroup);
-
-/* Copy configuration of ReaderGroup */
-UA_StatusCode
-UA_ReaderGroupConfig_copy(const UA_ReaderGroupConfig *src, UA_ReaderGroupConfig *dst);
-
-/* Process Network Message */
-UA_StatusCode
-UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage* pMsg, UA_PubSubConnection *pConnection);
-
-/* Prototypes for internal util functions - some functions maybe removed later
- *(currently moved from public to internal)*/
-UA_ReaderGroup *UA_ReaderGroup_findRGbyId(UA_Server *server, UA_NodeId identifier);
-UA_DataSetReader *UA_ReaderGroup_findDSRbyId(UA_Server *server, UA_NodeId identifier);
-
-/*********************************************************/
-/*               PublishValues handling                  */
-/*********************************************************/
-
-UA_StatusCode
-UA_WriterGroup_addPublishCallback(UA_Server *server, UA_WriterGroup *writerGroup);
-void
-UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup);
-
-/*********************************************************/
-/*               SubscribeValues handling                */
-/*********************************************************/
-
-UA_StatusCode
-UA_ReaderGroup_addSubscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup);
-void
-UA_ReaderGroup_subscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup);
-
-#endif /* UA_ENABLE_PUBSUB */
-
-_UA_END_DECLS
-
-#endif /* UA_PUBSUB_H_ */
diff --git a/ext/open62541/src/pubsub/ua_pubsub_manager.c b/ext/open62541/src/pubsub/ua_pubsub_manager.c
deleted file mode 100644
index 7e1eaf2..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_manager.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright (c) 2018 Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include "server/ua_server_internal.h"
-#include "ua_pubsub_ns0.h"
-
-#ifdef UA_ENABLE_PUBSUB /* conditional compilation */
-
-#define UA_DATETIMESTAMP_2000 125911584000000000
-
-UA_StatusCode
-UA_Server_addPubSubConnection(UA_Server *server,
-                              const UA_PubSubConnectionConfig *connectionConfig,
-                              UA_NodeId *connectionIdentifier) {
-    /* Find the matching UA_PubSubTransportLayers */
-    UA_PubSubTransportLayer *tl = NULL;
-    for(size_t i = 0; i < server->config.pubsubTransportLayersSize; i++) {
-        if(connectionConfig &&
-           UA_String_equal(&server->config.pubsubTransportLayers[i].transportProfileUri,
-                           &connectionConfig->transportProfileUri)) {
-            tl = &server->config.pubsubTransportLayers[i];
-        }
-    }
-    if(!tl) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Requested transport layer not found.");
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* Create a copy of the connection config */
-    UA_PubSubConnectionConfig *tmpConnectionConfig = (UA_PubSubConnectionConfig *)
-        UA_calloc(1, sizeof(UA_PubSubConnectionConfig));
-    if(!tmpConnectionConfig){
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Out of Memory.");
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    UA_StatusCode retval = UA_PubSubConnectionConfig_copy(connectionConfig, tmpConnectionConfig);
-    if(retval != UA_STATUSCODE_GOOD){
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Could not copy the config.");
-        return retval;
-    }
-
-    /* Create new connection and add to UA_PubSubManager */
-    UA_PubSubConnection *newConnectionsField = (UA_PubSubConnection *)
-        UA_realloc(server->pubSubManager.connections,
-                   sizeof(UA_PubSubConnection) * (server->pubSubManager.connectionsSize + 1));
-    if(!newConnectionsField) {
-        UA_PubSubConnectionConfig_deleteMembers(tmpConnectionConfig);
-        UA_free(tmpConnectionConfig);
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Out of Memory.");
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    server->pubSubManager.connections = newConnectionsField;
-    server->pubSubManager.connectionsSize++;
-
-    UA_PubSubConnection *newConnection =
-        &server->pubSubManager.connections[server->pubSubManager.connectionsSize-1];
-
-    /* Initialize the new connection */
-    memset(newConnection, 0, sizeof(UA_PubSubConnection));
-    LIST_INIT(&newConnection->writerGroups);
-    //workaround - fixing issue with queue.h and realloc.
-    for(size_t n = 0; n < server->pubSubManager.connectionsSize; n++){
-        if(server->pubSubManager.connections[n].writerGroups.lh_first){
-            server->pubSubManager.connections[n].writerGroups.lh_first->listEntry.le_prev = &server->pubSubManager.connections[n].writerGroups.lh_first;
-        }
-    }
-    newConnection->config = tmpConnectionConfig;
-
-    /* Open the channel */
-    newConnection->channel = tl->createPubSubChannel(newConnection->config);
-    if(!newConnection->channel) {
-        UA_PubSubConnection_deleteMembers(server, newConnection);
-        server->pubSubManager.connectionsSize--;
-        /* Keep the realloced (longer) array if entries remain */
-        if(server->pubSubManager.connectionsSize == 0) {
-            UA_free(server->pubSubManager.connections);
-            server->pubSubManager.connections = NULL;
-        }
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PubSub Connection creation failed. Transport layer creation problem.");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_PubSubManager_generateUniqueNodeId(server, &newConnection->identifier);
-
-    if(connectionIdentifier)
-        UA_NodeId_copy(&newConnection->identifier, connectionIdentifier);
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    addPubSubConnectionRepresentation(server, newConnection);
-#endif
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Server_removePubSubConnection(UA_Server *server, const UA_NodeId connection) {
-    //search the identified Connection and store the Connection index
-    size_t connectionIndex;
-    UA_PubSubConnection *currentConnection = NULL;
-    for(connectionIndex = 0; connectionIndex < server->pubSubManager.connectionsSize; connectionIndex++){
-        if(UA_NodeId_equal(&connection, &server->pubSubManager.connections[connectionIndex].identifier)){
-            currentConnection = &server->pubSubManager.connections[connectionIndex];
-            break;
-        }
-    }
-    if(!currentConnection)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    removePubSubConnectionRepresentation(server, currentConnection);
-#endif
-    UA_PubSubConnection_deleteMembers(server, currentConnection);
-    server->pubSubManager.connectionsSize--;
-    //remove the connection from the pubSubManager, move the last connection
-    //into the allocated memory of the deleted connection
-    if(server->pubSubManager.connectionsSize != connectionIndex){
-        memcpy(&server->pubSubManager.connections[connectionIndex],
-               &server->pubSubManager.connections[server->pubSubManager.connectionsSize],
-               sizeof(UA_PubSubConnection));
-    }
-
-    if(server->pubSubManager.connectionsSize <= 0){
-        UA_free(server->pubSubManager.connections);
-        server->pubSubManager.connections = NULL;
-    } else {
-        server->pubSubManager.connections = (UA_PubSubConnection *)
-                UA_realloc(server->pubSubManager.connections, sizeof(UA_PubSubConnection) * server->pubSubManager.connectionsSize);
-        if(!server->pubSubManager.connections){
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-        //workaround - fixing issue with queue.h and realloc.
-        for(size_t n = 0; n < server->pubSubManager.connectionsSize; n++){
-            if(server->pubSubManager.connections[n].writerGroups.lh_first){
-                server->pubSubManager.connections[n].writerGroups.lh_first->listEntry.le_prev = &server->pubSubManager.connections[n].writerGroups.lh_first;
-            }
-        }
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_AddPublishedDataSetResult
-UA_Server_addPublishedDataSet(UA_Server *server, const UA_PublishedDataSetConfig *publishedDataSetConfig,
-                              UA_NodeId *pdsIdentifier) {
-    UA_AddPublishedDataSetResult result = {UA_STATUSCODE_BADINVALIDARGUMENT, 0, NULL, {0, 0}};
-    if(!publishedDataSetConfig){
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PublishedDataSet creation failed. No config passed in.");
-        return result;
-    }
-    if(publishedDataSetConfig->publishedDataSetType != UA_PUBSUB_DATASET_PUBLISHEDITEMS){
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PublishedDataSet creation failed. Unsupported PublishedDataSet type.");
-        return result;
-    }
-    //deep copy the given connection config
-    UA_PublishedDataSetConfig tmpPublishedDataSetConfig;
-    memset(&tmpPublishedDataSetConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    if(UA_PublishedDataSetConfig_copy(publishedDataSetConfig, &tmpPublishedDataSetConfig) != UA_STATUSCODE_GOOD){
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PublishedDataSet creation failed. Configuration copy failed.");
-        result.addResult = UA_STATUSCODE_BADINTERNALERROR;
-        return result;
-    }
-    //create new PDS and add to UA_PubSubManager
-    UA_PublishedDataSet *newPubSubDataSetField = (UA_PublishedDataSet *)
-            UA_realloc(server->pubSubManager.publishedDataSets,
-                       sizeof(UA_PublishedDataSet) * (server->pubSubManager.publishedDataSetsSize + 1));
-    if(!newPubSubDataSetField) {
-        UA_PublishedDataSetConfig_deleteMembers(&tmpPublishedDataSetConfig);
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "PublishedDataSet creation failed. Out of Memory.");
-        result.addResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return result;
-    }
-    server->pubSubManager.publishedDataSets = newPubSubDataSetField;
-    UA_PublishedDataSet *newPubSubDataSet = &server->pubSubManager.publishedDataSets[(server->pubSubManager.publishedDataSetsSize)];
-    memset(newPubSubDataSet, 0, sizeof(UA_PublishedDataSet));
-    LIST_INIT(&newPubSubDataSet->fields);
-    //workaround - fixing issue with queue.h and realloc.
-    for(size_t n = 0; n < server->pubSubManager.publishedDataSetsSize; n++){
-        if(server->pubSubManager.publishedDataSets[n].fields.lh_first){
-            server->pubSubManager.publishedDataSets[n].fields.lh_first->listEntry.le_prev = &server->pubSubManager.publishedDataSets[n].fields.lh_first;
-        }
-    }
-    newPubSubDataSet->config = tmpPublishedDataSetConfig;
-    if(tmpPublishedDataSetConfig.publishedDataSetType == UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE){
-        //parse template config and add fields (later PubSub batch)
-    }
-    //generate unique nodeId
-    UA_PubSubManager_generateUniqueNodeId(server, &newPubSubDataSet->identifier);
-    if(pdsIdentifier != NULL){
-        UA_NodeId_copy(&newPubSubDataSet->identifier, pdsIdentifier);
-    }
-    server->pubSubManager.publishedDataSetsSize++;
-    result.addResult = UA_STATUSCODE_GOOD;
-    result.fieldAddResults = NULL;
-    result.fieldAddResultsSize = 0;
-    result.configurationVersion.majorVersion = UA_PubSubConfigurationVersionTimeDifference();
-    result.configurationVersion.minorVersion = UA_PubSubConfigurationVersionTimeDifference();
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    addPublishedDataItemsRepresentation(server, newPubSubDataSet);
-#endif
-    return result;
-}
-
-UA_StatusCode
-UA_Server_removePublishedDataSet(UA_Server *server, const UA_NodeId pds) {
-    //search the identified PublishedDataSet and store the PDS index
-    UA_PublishedDataSet *publishedDataSet = NULL;
-    size_t publishedDataSetIndex;
-    for(publishedDataSetIndex = 0; publishedDataSetIndex < server->pubSubManager.publishedDataSetsSize; publishedDataSetIndex++){
-        if(UA_NodeId_equal(&server->pubSubManager.publishedDataSets[publishedDataSetIndex].identifier, &pds)){
-            publishedDataSet = &server->pubSubManager.publishedDataSets[publishedDataSetIndex];
-            break;
-        }
-    }
-    if(!publishedDataSet){
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-    //search for referenced writers -> delete this writers. (Standard: writer must be connected with PDS)
-    for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){
-        UA_WriterGroup *writerGroup;
-        LIST_FOREACH(writerGroup, &server->pubSubManager.connections[i].writerGroups, listEntry){
-            UA_DataSetWriter *currentWriter, *tmpWriterGroup;
-            LIST_FOREACH_SAFE(currentWriter, &writerGroup->writers, listEntry, tmpWriterGroup){
-                if(UA_NodeId_equal(&currentWriter->connectedDataSet, &publishedDataSet->identifier)){
-                    UA_Server_removeDataSetWriter(server, currentWriter->identifier);
-                }
-            }
-        }
-    }
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    removePublishedDataSetRepresentation(server, publishedDataSet);
-#endif
-    UA_PublishedDataSet_deleteMembers(server, publishedDataSet);
-    server->pubSubManager.publishedDataSetsSize--;
-    //copy the last PDS to the removed PDS inside the allocated memory block
-    if(server->pubSubManager.publishedDataSetsSize != publishedDataSetIndex){
-        memcpy(&server->pubSubManager.publishedDataSets[publishedDataSetIndex],
-               &server->pubSubManager.publishedDataSets[server->pubSubManager.publishedDataSetsSize],
-               sizeof(UA_PublishedDataSet));
-    }
-    if(server->pubSubManager.publishedDataSetsSize <= 0){
-        UA_free(server->pubSubManager.publishedDataSets);
-        server->pubSubManager.publishedDataSets = NULL;
-    } else {
-        server->pubSubManager.publishedDataSets = (UA_PublishedDataSet *)
-                UA_realloc(server->pubSubManager.publishedDataSets, sizeof(UA_PublishedDataSet) * server->pubSubManager.publishedDataSetsSize);
-        if(!server->pubSubManager.publishedDataSets){
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-        //workaround - fixing issue with queue.h and realloc.
-        for(size_t n = 0; n < server->pubSubManager.publishedDataSetsSize; n++){
-            if(server->pubSubManager.publishedDataSets[n].fields.lh_first){
-                server->pubSubManager.publishedDataSets[n].fields.lh_first->listEntry.le_prev = &server->pubSubManager.publishedDataSets[n].fields.lh_first;
-            }
-        }
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Calculate the time difference between current time and UTC (00:00) on January
- * 1, 2000. */
-UA_UInt32
-UA_PubSubConfigurationVersionTimeDifference() {
-    UA_UInt32 timeDiffSince2000 = (UA_UInt32) (UA_DateTime_now() - UA_DATETIMESTAMP_2000);
-    return timeDiffSince2000;
-}
-
-/* Generate a new unique NodeId. This NodeId will be used for the information
- * model representation of PubSub entities. */
-void
-UA_PubSubManager_generateUniqueNodeId(UA_Server *server, UA_NodeId *nodeId) {
-    UA_NodeId newNodeId = UA_NODEID_NUMERIC(0, 0);
-    UA_Node *newNode = UA_Nodestore_newNode(server->nsCtx, UA_NODECLASS_OBJECT);
-    UA_Nodestore_insertNode(server->nsCtx, newNode, &newNodeId);
-    UA_NodeId_copy(&newNodeId, nodeId);
-}
-
-/* Delete the current PubSub configuration including all nested members. This
- * action also delete the configured PubSub transport Layers. */
-void
-UA_PubSubManager_delete(UA_Server *server, UA_PubSubManager *pubSubManager) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "PubSub cleanup was called.");
-    //free the currently configured transport layers
-    UA_free(server->config.pubsubTransportLayers);
-    server->config.pubsubTransportLayersSize = 0;
-
-    //remove Connections and WriterGroups
-    while(pubSubManager->connectionsSize > 0){
-        UA_Server_removePubSubConnection(server, pubSubManager->connections[pubSubManager->connectionsSize-1].identifier);
-    }
-    while(pubSubManager->publishedDataSetsSize > 0){
-        UA_Server_removePublishedDataSet(server, pubSubManager->publishedDataSets[pubSubManager->publishedDataSetsSize-1].identifier);
-    }
-}
-
-/***********************************/
-/*      PubSub Jobs abstraction    */
-/***********************************/
-
-#ifndef UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING
-
-/* If UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_INTERRUPT is enabled, a custom callback
- * management must be linked to the application */
-
-UA_StatusCode
-UA_PubSubManager_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback,
-                                     void *data, UA_Double interval_ms, UA_UInt64 *callbackId) {
-    return UA_Timer_addRepeatedCallback(&server->timer, (UA_ApplicationCallback)callback,
-                                        server, data, interval_ms, callbackId);
-}
-
-UA_StatusCode
-UA_PubSubManager_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId,
-                                                UA_Double interval_ms) {
-    return UA_Timer_changeRepeatedCallbackInterval(&server->timer, callbackId, interval_ms);
-}
-
-void
-UA_PubSubManager_removeRepeatedPubSubCallback(UA_Server *server, UA_UInt64 callbackId) {
-    UA_Timer_removeCallback(&server->timer, callbackId);
-}
-
-#endif /* UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING */
-
-#endif /* UA_ENABLE_PUBSUB */
diff --git a/ext/open62541/src/pubsub/ua_pubsub_manager.h b/ext/open62541/src/pubsub/ua_pubsub_manager.h
deleted file mode 100644
index e690f9b..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_manager.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#ifndef UA_PUBSUB_MANAGER_H_
-#define UA_PUBSUB_MANAGER_H_
-
-#include <open62541/server_pubsub.h>
-
-#include "ua_pubsub.h"
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_PUBSUB /* conditional compilation */
-
-typedef struct UA_PubSubManager{
-    //Connections and PublishedDataSets can exist alone (own lifecycle) -> top level components
-    size_t connectionsSize;
-    UA_PubSubConnection *connections;
-    size_t publishedDataSetsSize;
-    UA_PublishedDataSet *publishedDataSets;
-} UA_PubSubManager;
-
-void
-UA_PubSubManager_delete(UA_Server *server, UA_PubSubManager *pubSubManager);
-
-void
-UA_PubSubManager_generateUniqueNodeId(UA_Server *server, UA_NodeId *nodeId);
-
-UA_UInt32
-UA_PubSubConfigurationVersionTimeDifference(void);
-
-/***********************************/
-/*      PubSub Jobs abstraction    */
-/***********************************/
-UA_StatusCode
-UA_PubSubManager_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback,
-                                     void *data, UA_Double interval_ms, UA_UInt64 *callbackId);
-UA_StatusCode
-UA_PubSubManager_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId,
-                                                UA_Double interval_ms);
-void
-UA_PubSubManager_removeRepeatedPubSubCallback(UA_Server *server, UA_UInt64 callbackId);
-
-#endif /* UA_ENABLE_PUBSUB */
-
-_UA_END_DECLS
-
-#endif /* UA_PUBSUB_MANAGER_H_ */
diff --git a/ext/open62541/src/pubsub/ua_pubsub_networkmessage.c b/ext/open62541/src/pubsub/ua_pubsub_networkmessage.c
deleted file mode 100644
index f9f9878..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_networkmessage.c
+++ /dev/null
@@ -1,1284 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff)
- */
-
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/types_generated_handling.h>
-
-#ifdef UA_ENABLE_PUBSUB /* conditional compilation */
-
-#include "ua_pubsub_networkmessage.h"
-
-const UA_Byte NM_VERSION_MASK = 15;
-const UA_Byte NM_PUBLISHER_ID_ENABLED_MASK = 16;
-const UA_Byte NM_GROUP_HEADER_ENABLED_MASK = 32;
-const UA_Byte NM_PAYLOAD_HEADER_ENABLED_MASK = 64;
-const UA_Byte NM_EXTENDEDFLAGS1_ENABLED_MASK = 128;
-const UA_Byte NM_PUBLISHER_ID_MASK = 7;
-const UA_Byte NM_DATASET_CLASSID_ENABLED_MASK = 8;
-const UA_Byte NM_SECURITY_ENABLED_MASK = 16;
-const UA_Byte NM_TIMESTAMP_ENABLED_MASK = 32;
-const UA_Byte NM_PICOSECONDS_ENABLED_MASK = 64;
-const UA_Byte NM_EXTENDEDFLAGS2_ENABLED_MASK = 128;
-const UA_Byte NM_NETWORK_MSG_TYPE_MASK = 28;
-const UA_Byte NM_CHUNK_MESSAGE_MASK = 1;
-const UA_Byte NM_PROMOTEDFIELDS_ENABLED_MASK = 2;
-const UA_Byte GROUP_HEADER_WRITER_GROUPID_ENABLED = 1;
-const UA_Byte GROUP_HEADER_GROUP_VERSION_ENABLED = 2;
-const UA_Byte GROUP_HEADER_NM_NUMBER_ENABLED = 4;
-const UA_Byte GROUP_HEADER_SEQUENCE_NUMBER_ENABLED = 8;
-const UA_Byte SECURITY_HEADER_NM_SIGNED = 1;
-const UA_Byte SECURITY_HEADER_NM_ENCRYPTED = 2;
-const UA_Byte SECURITY_HEADER_SEC_FOOTER_ENABLED = 4;
-const UA_Byte SECURITY_HEADER_FORCE_KEY_RESET = 8;
-const UA_Byte DS_MESSAGEHEADER_DS_MSG_VALID = 1;
-const UA_Byte DS_MESSAGEHEADER_FIELD_ENCODING_MASK = 6;
-const UA_Byte DS_MESSAGEHEADER_SEQ_NR_ENABLED_MASK = 8;
-const UA_Byte DS_MESSAGEHEADER_STATUS_ENABLED_MASK = 16;
-const UA_Byte DS_MESSAGEHEADER_CONFIGMAJORVERSION_ENABLED_MASK = 32;
-const UA_Byte DS_MESSAGEHEADER_CONFIGMINORVERSION_ENABLED_MASK = 64;
-const UA_Byte DS_MESSAGEHEADER_FLAGS2_ENABLED_MASK = 128;
-const UA_Byte DS_MESSAGEHEADER_DS_MESSAGE_TYPE_MASK = 15;
-const UA_Byte DS_MESSAGEHEADER_TIMESTAMP_ENABLED_MASK = 16;
-const UA_Byte DS_MESSAGEHEADER_PICOSECONDS_INCLUDED_MASK = 32;
-const UA_Byte NM_SHIFT_LEN = 2;
-const UA_Byte DS_MH_SHIFT_LEN = 1;
-
-static UA_Boolean UA_NetworkMessage_ExtendedFlags1Enabled(const UA_NetworkMessage* src);
-static UA_Boolean UA_NetworkMessage_ExtendedFlags2Enabled(const UA_NetworkMessage* src);
-static UA_Boolean UA_DataSetMessageHeader_DataSetFlags2Enabled(const UA_DataSetMessageHeader* src);
-
-UA_StatusCode
-UA_NetworkMessage_encodeBinary(const UA_NetworkMessage* src, UA_Byte **bufPos,
-                               const UA_Byte *bufEnd) {
-    /* UADPVersion + UADP Flags */
-    UA_Byte v = src->version;
-    if(src->publisherIdEnabled)
-        v |= NM_PUBLISHER_ID_ENABLED_MASK;
-
-    if(src->groupHeaderEnabled)
-        v |= NM_GROUP_HEADER_ENABLED_MASK;
-
-    if(src->payloadHeaderEnabled)
-        v |= NM_PAYLOAD_HEADER_ENABLED_MASK;
-
-    if(UA_NetworkMessage_ExtendedFlags1Enabled(src))
-        v |= NM_EXTENDEDFLAGS1_ENABLED_MASK;
-
-    UA_StatusCode rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    // ExtendedFlags1
-    if(UA_NetworkMessage_ExtendedFlags1Enabled(src)) {
-        v = (UA_Byte)src->publisherIdType;
-
-        if(src->dataSetClassIdEnabled)
-            v |= NM_DATASET_CLASSID_ENABLED_MASK;
-
-        if(src->securityEnabled)
-            v |= NM_SECURITY_ENABLED_MASK;
-
-        if(src->timestampEnabled)
-            v |= NM_TIMESTAMP_ENABLED_MASK;
-
-        if(src->picosecondsEnabled)
-            v |= NM_PICOSECONDS_ENABLED_MASK;
-
-        if(UA_NetworkMessage_ExtendedFlags2Enabled(src))
-            v |= NM_EXTENDEDFLAGS2_ENABLED_MASK;
-
-        rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // ExtendedFlags2
-        if(UA_NetworkMessage_ExtendedFlags2Enabled(src)) { 
-            v = (UA_Byte)src->networkMessageType;
-            // shift left 2 bit
-            v = (UA_Byte) (v << NM_SHIFT_LEN);
-
-            if(src->chunkMessage)
-                v |= NM_CHUNK_MESSAGE_MASK;
-
-            if(src->promotedFieldsEnabled)
-                v |= NM_PROMOTEDFIELDS_ENABLED_MASK;
-
-            rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // PublisherId
-    if(src->publisherIdEnabled) {
-        switch (src->publisherIdType) {
-        case UA_PUBLISHERDATATYPE_BYTE:
-            rv = UA_Byte_encodeBinary(&(src->publisherId.publisherIdByte), bufPos, bufEnd);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT16:
-            rv = UA_UInt16_encodeBinary(&(src->publisherId.publisherIdUInt16), bufPos, bufEnd);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT32:
-            rv = UA_UInt32_encodeBinary(&(src->publisherId.publisherIdUInt32), bufPos, bufEnd);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT64:
-            rv = UA_UInt64_encodeBinary(&(src->publisherId.publisherIdUInt64), bufPos, bufEnd);
-            break;
-
-        case UA_PUBLISHERDATATYPE_STRING:
-            rv = UA_String_encodeBinary(&(src->publisherId.publisherIdString), bufPos, bufEnd);
-            break;
-
-        default:
-            rv = UA_STATUSCODE_BADINTERNALERROR;
-            break;
-        }
-    
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // DataSetClassId
-    if(src->dataSetClassIdEnabled) {
-        rv = UA_Guid_encodeBinary(&(src->dataSetClassId), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // Group Header
-    if(src->groupHeaderEnabled) {
-        v = 0;
-
-        if(src->groupHeader.writerGroupIdEnabled)
-            v |= GROUP_HEADER_WRITER_GROUPID_ENABLED;
-
-        if(src->groupHeader.groupVersionEnabled)
-            v |= GROUP_HEADER_GROUP_VERSION_ENABLED;
-
-        if(src->groupHeader.networkMessageNumberEnabled)
-            v |= GROUP_HEADER_NM_NUMBER_ENABLED;
-
-        if(src->groupHeader.sequenceNumberEnabled)
-            v |= GROUP_HEADER_SEQUENCE_NUMBER_ENABLED;
-
-        rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        if(src->groupHeader.writerGroupIdEnabled) {
-            rv = UA_UInt16_encodeBinary(&(src->groupHeader.writerGroupId), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(src->groupHeader.groupVersionEnabled) { 
-            rv = UA_UInt32_encodeBinary(&(src->groupHeader.groupVersion), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(src->groupHeader.networkMessageNumberEnabled) {
-            rv = UA_UInt16_encodeBinary(&(src->groupHeader.networkMessageNumber), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(src->groupHeader.sequenceNumberEnabled) {
-            rv = UA_UInt16_encodeBinary(&(src->groupHeader.sequenceNumber), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // Payload-Header
-    if(src->payloadHeaderEnabled) {
-        if(src->networkMessageType != UA_NETWORKMESSAGE_DATASET)
-            return UA_STATUSCODE_BADNOTIMPLEMENTED;
-            
-        rv = UA_Byte_encodeBinary(&(src->payloadHeader.dataSetPayloadHeader.count), bufPos, bufEnd);
-
-        if(src->payloadHeader.dataSetPayloadHeader.dataSetWriterIds == NULL)
-            return UA_STATUSCODE_BADENCODINGERROR;
-            
-        for(UA_Byte i = 0; i < src->payloadHeader.dataSetPayloadHeader.count; i++) {
-            rv = UA_UInt16_encodeBinary(&(src->payloadHeader.dataSetPayloadHeader.dataSetWriterIds[i]),
-                                        bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // Timestamp
-    if(src->timestampEnabled)
-        rv = UA_DateTime_encodeBinary(&(src->timestamp), bufPos, bufEnd);
-
-    // Picoseconds
-    if(src->picosecondsEnabled)
-        rv = UA_UInt16_encodeBinary(&(src->picoseconds), bufPos, bufEnd);
-
-    // PromotedFields
-    if(src->promotedFieldsEnabled) {
-        /* Size (calculate & encode) */
-        UA_UInt16 pfSize = 0;
-        for(UA_UInt16 i = 0; i < src->promotedFieldsSize; i++)
-            pfSize = (UA_UInt16) (pfSize + UA_Variant_calcSizeBinary(&src->promotedFields[i]));
-        rv |= UA_UInt16_encodeBinary(&pfSize, bufPos, bufEnd);
-
-        for (UA_UInt16 i = 0; i < src->promotedFieldsSize; i++)
-            rv |= UA_Variant_encodeBinary(&(src->promotedFields[i]), bufPos, bufEnd);
-    }
-
-    // SecurityHeader
-    if(src->securityEnabled) {
-        // SecurityFlags
-        v = 0;
-        if(src->securityHeader.networkMessageSigned)
-            v |= SECURITY_HEADER_NM_SIGNED;
-
-        if(src->securityHeader.networkMessageEncrypted)
-            v |= SECURITY_HEADER_NM_ENCRYPTED;
-
-        if(src->securityHeader.securityFooterEnabled)
-            v |= SECURITY_HEADER_SEC_FOOTER_ENABLED;
-
-        if(src->securityHeader.forceKeyReset)
-            v |= SECURITY_HEADER_FORCE_KEY_RESET;
-
-        rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // SecurityTokenId
-        rv = UA_UInt32_encodeBinary(&src->securityHeader.securityTokenId, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // NonceLength
-        rv = UA_Byte_encodeBinary(&src->securityHeader.nonceLength, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // MessageNonce
-        for (UA_Byte i = 0; i < src->securityHeader.nonceLength; i++) {
-            rv = UA_Byte_encodeBinary(&(src->securityHeader.messageNonce.data[i]), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        // SecurityFooterSize
-        if(src->securityHeader.securityFooterEnabled) {
-            rv = UA_UInt16_encodeBinary(&src->securityHeader.securityFooterSize, bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // Payload
-    if(src->networkMessageType != UA_NETWORKMESSAGE_DATASET)
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-        
-    UA_Byte count = 1;
-
-    if(src->payloadHeaderEnabled) {
-        count = src->payloadHeader.dataSetPayloadHeader.count;
-        if(count > 1) {
-            for (UA_Byte i = 0; i < count; i++) {
-                // initially calculate the size, if not specified
-                UA_UInt16 sz = 0;
-                if((src->payload.dataSetPayload.sizes != NULL) &&
-                   (src->payload.dataSetPayload.sizes[i] != 0)) {
-                    sz = src->payload.dataSetPayload.sizes[i];
-                } else {
-                    sz = (UA_UInt16)UA_DataSetMessage_calcSizeBinary(&src->payload.dataSetPayload.dataSetMessages[i]);
-                }
-
-                rv = UA_UInt16_encodeBinary(&sz, bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-    }
-
-    for(UA_Byte i = 0; i < count; i++) {
-        rv = UA_DataSetMessage_encodeBinary(&(src->payload.dataSetPayload.dataSetMessages[i]), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    if(src->securityEnabled) {
-        // SecurityFooter
-        if(src->securityHeader.securityFooterEnabled) {
-            for(UA_Byte i = 0; i < src->securityHeader.securityFooterSize; i++) {
-                rv = UA_Byte_encodeBinary(&(src->securityFooter.data[i]), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-
-        // Signature
-        if(src->securityHeader.networkMessageSigned) {
-            rv = UA_ByteString_encodeBinary(&(src->signature), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-UA_NetworkMessage_decodeBinaryInternal(const UA_ByteString *src, size_t *offset,
-                                       UA_NetworkMessage* dst) {
-    memset(dst, 0, sizeof(UA_NetworkMessage));
-    UA_Byte v = 0;
-    UA_StatusCode rv = UA_Byte_decodeBinary(src, offset, &v);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    dst->version = v & NM_VERSION_MASK;
-    
-    if((v & NM_PUBLISHER_ID_ENABLED_MASK) != 0)
-        dst->publisherIdEnabled = true;
-
-    if((v & NM_GROUP_HEADER_ENABLED_MASK) != 0)
-        dst->groupHeaderEnabled = true;
-
-    if((v & NM_PAYLOAD_HEADER_ENABLED_MASK) != 0)
-        dst->payloadHeaderEnabled = true;
-    
-    if((v & NM_EXTENDEDFLAGS1_ENABLED_MASK) != 0) {
-        v = 0;
-        rv = UA_Byte_decodeBinary(src, offset, &v);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        dst->publisherIdType = (UA_PublisherIdDatatype)(v & NM_PUBLISHER_ID_MASK);
-        if((v & NM_DATASET_CLASSID_ENABLED_MASK) != 0)
-            dst->dataSetClassIdEnabled = true;
-
-        if((v & NM_SECURITY_ENABLED_MASK) != 0)
-            dst->securityEnabled = true;
-
-        if((v & NM_TIMESTAMP_ENABLED_MASK) != 0)
-            dst->timestampEnabled = true;
-
-        if((v & NM_PICOSECONDS_ENABLED_MASK) != 0)
-            dst->picosecondsEnabled = true;
-
-        if((v & NM_EXTENDEDFLAGS2_ENABLED_MASK) != 0) {
-            v = 0;
-            rv = UA_Byte_decodeBinary(src, offset, &v);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-
-            if((v & NM_CHUNK_MESSAGE_MASK) != 0)
-                dst->chunkMessage = true;
-
-            if((v & NM_PROMOTEDFIELDS_ENABLED_MASK) != 0)
-                dst->promotedFieldsEnabled = true;
-
-            v = v & NM_NETWORK_MSG_TYPE_MASK;
-            v = (UA_Byte) (v >> NM_SHIFT_LEN);
-            dst->networkMessageType = (UA_NetworkMessageType)v;
-        }
-    }
-
-    if(dst->publisherIdEnabled) {
-        switch (dst->publisherIdType) {
-        case UA_PUBLISHERDATATYPE_BYTE:
-            rv = UA_Byte_decodeBinary(src, offset, &(dst->publisherId.publisherIdByte));
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT16:
-            rv = UA_UInt16_decodeBinary(src, offset, &(dst->publisherId.publisherIdUInt16));
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT32:
-            rv = UA_UInt32_decodeBinary(src, offset, &(dst->publisherId.publisherIdUInt32));
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT64:
-            rv = UA_UInt64_decodeBinary(src, offset, &(dst->publisherId.publisherIdUInt64));
-            break;
-
-        case UA_PUBLISHERDATATYPE_STRING:
-            rv = UA_String_decodeBinary(src, offset, &(dst->publisherId.publisherIdString));
-            break;
-
-        default:
-            rv = UA_STATUSCODE_BADINTERNALERROR;
-            break;
-        }
-
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    if(dst->dataSetClassIdEnabled) {
-        rv = UA_Guid_decodeBinary(src, offset, &(dst->dataSetClassId));
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // GroupHeader
-    if(dst->groupHeaderEnabled) { 
-        v = 0;
-        rv = UA_Byte_decodeBinary(src, offset, &v);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        if((v & GROUP_HEADER_WRITER_GROUPID_ENABLED) != 0)
-            dst->groupHeader.writerGroupIdEnabled = true;
-
-        if((v & GROUP_HEADER_GROUP_VERSION_ENABLED) != 0)
-            dst->groupHeader.groupVersionEnabled = true;
-
-        if((v & GROUP_HEADER_NM_NUMBER_ENABLED) != 0)
-            dst->groupHeader.networkMessageNumberEnabled = true;
-
-        if((v & GROUP_HEADER_SEQUENCE_NUMBER_ENABLED) != 0)
-            dst->groupHeader.sequenceNumberEnabled = true;
-
-        if(dst->groupHeader.writerGroupIdEnabled) {
-            rv = UA_UInt16_decodeBinary(src, offset, &dst->groupHeader.writerGroupId);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(dst->groupHeader.groupVersionEnabled) {
-            rv = UA_UInt32_decodeBinary(src, offset, &dst->groupHeader.groupVersion);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(dst->groupHeader.networkMessageNumberEnabled) {
-            rv = UA_UInt16_decodeBinary(src, offset, &dst->groupHeader.networkMessageNumber);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(dst->groupHeader.sequenceNumberEnabled) {
-            rv = UA_UInt16_decodeBinary(src, offset, &dst->groupHeader.sequenceNumber);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // Payload-Header
-    if(dst->payloadHeaderEnabled) {
-        if(dst->networkMessageType != UA_NETWORKMESSAGE_DATASET)
-            return UA_STATUSCODE_BADNOTIMPLEMENTED;
-
-        rv = UA_Byte_decodeBinary(src, offset, &dst->payloadHeader.dataSetPayloadHeader.count);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        dst->payloadHeader.dataSetPayloadHeader.dataSetWriterIds =
-            (UA_UInt16 *)UA_Array_new(dst->payloadHeader.dataSetPayloadHeader.count,
-                                      &UA_TYPES[UA_TYPES_UINT16]);
-        for (UA_Byte i = 0; i < dst->payloadHeader.dataSetPayloadHeader.count; i++) {
-            rv = UA_UInt16_decodeBinary(src, offset,
-                                        &dst->payloadHeader.dataSetPayloadHeader.dataSetWriterIds[i]);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // Timestamp
-    if(dst->timestampEnabled) {
-        rv = UA_DateTime_decodeBinary(src, offset, &(dst->timestamp));
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // Picoseconds
-    if(dst->picosecondsEnabled) {
-        rv = UA_UInt16_decodeBinary(src, offset, &(dst->picoseconds));
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // PromotedFields 
-    if(dst->promotedFieldsEnabled) {
-        // Size
-        UA_UInt16 promotedFieldsSize = 0;
-        rv = UA_UInt16_decodeBinary(src, offset, &promotedFieldsSize);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // promotedFieldsSize: here size in Byte, not the number of objects!
-        if(promotedFieldsSize > 0) {
-            // store offset, later compared with promotedFieldsSize 
-            size_t offsetEnd = (*offset) + promotedFieldsSize;
-
-            unsigned int counter = 0;
-            do {
-                if(counter == 0) {
-                    dst->promotedFields = (UA_Variant*)UA_malloc(UA_TYPES[UA_TYPES_VARIANT].memSize);
-                    // set promotedFieldsSize to the number of objects
-                    dst->promotedFieldsSize = (UA_UInt16) (counter + 1);
-                } else {
-                    dst->promotedFields = (UA_Variant*)
-                        UA_realloc(dst->promotedFields,
-                                   UA_TYPES[UA_TYPES_VARIANT].memSize * (counter + 1));
-                    // set promotedFieldsSize to the number of objects
-                    dst->promotedFieldsSize = (UA_UInt16) (counter + 1);
-                }
-
-                UA_Variant_init(&dst->promotedFields[counter]);
-                rv = UA_Variant_decodeBinary(src, offset, &dst->promotedFields[counter]);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-                counter++;
-            } while ((*offset) < offsetEnd);
-        }
-    }
-
-    // SecurityHeader
-    if(dst->securityEnabled) {
-        // SecurityFlags
-        v = 0;
-        rv = UA_Byte_decodeBinary(src, offset, &v);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        if((v & SECURITY_HEADER_NM_SIGNED) != 0)
-            dst->securityHeader.networkMessageSigned = true;
-
-        if((v & SECURITY_HEADER_NM_ENCRYPTED) != 0)
-            dst->securityHeader.networkMessageEncrypted = true;
-
-        if((v & SECURITY_HEADER_SEC_FOOTER_ENABLED) != 0)
-            dst->securityHeader.securityFooterEnabled = true;
-
-        if((v & SECURITY_HEADER_FORCE_KEY_RESET) != 0)
-            dst->securityHeader.forceKeyReset = true;
-
-        // SecurityTokenId
-        rv = UA_UInt32_decodeBinary(src, offset, &dst->securityHeader.securityTokenId);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // NonceLength
-        rv = UA_Byte_decodeBinary(src, offset, &dst->securityHeader.nonceLength);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        // MessageNonce
-        if(dst->securityHeader.nonceLength > 0) {
-            rv = UA_ByteString_allocBuffer(&dst->securityHeader.messageNonce,
-                                           dst->securityHeader.nonceLength);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-
-            for (UA_Byte i = 0; i < dst->securityHeader.nonceLength; i++) {
-                rv = UA_Byte_decodeBinary(src, offset, &(dst->securityHeader.messageNonce.data[i]));
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-
-        // SecurityFooterSize
-        if(dst->securityHeader.securityFooterEnabled) {
-            rv = UA_UInt16_decodeBinary(src, offset, &dst->securityHeader.securityFooterSize);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    // Payload
-    if(dst->networkMessageType != UA_NETWORKMESSAGE_DATASET)
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-
-    UA_Byte count = 1;
-    if(dst->payloadHeaderEnabled) {
-        count = dst->payloadHeader.dataSetPayloadHeader.count;
-        if(count > 1) {
-            dst->payload.dataSetPayload.sizes = (UA_UInt16 *)UA_Array_new(count, &UA_TYPES[UA_TYPES_UINT16]);
-            for (UA_Byte i = 0; i < count; i++) {
-                rv = UA_UInt16_decodeBinary(src, offset, &(dst->payload.dataSetPayload.sizes[i]));
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-    }
-
-    dst->payload.dataSetPayload.dataSetMessages = (UA_DataSetMessage*)
-        UA_calloc(count, sizeof(UA_DataSetMessage));
-    for(UA_Byte i = 0; i < count; i++) {
-        rv = UA_DataSetMessage_decodeBinary(src, offset, &(dst->payload.dataSetPayload.dataSetMessages[i]));
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    if(dst->securityEnabled) {
-        // SecurityFooter
-        if(dst->securityHeader.securityFooterEnabled && (dst->securityHeader.securityFooterSize > 0)) {
-            rv = UA_ByteString_allocBuffer(&dst->securityFooter, dst->securityHeader.securityFooterSize);
-            if (rv != UA_STATUSCODE_GOOD)
-                return rv;
-
-            for (UA_Byte i = 0; i < dst->securityHeader.securityFooterSize; i++) {
-                rv = UA_Byte_decodeBinary(src, offset, &(dst->securityFooter.data[i]));
-                if (rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-
-        // Signature
-        if(dst->securityHeader.networkMessageSigned) {
-            rv = UA_ByteString_decodeBinary(src, offset, &(dst->signature));
-            if (rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_NetworkMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NetworkMessage* dst) {
-    UA_StatusCode retval = UA_NetworkMessage_decodeBinaryInternal(src, offset, dst);
-
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_NetworkMessage_deleteMembers(dst);
-
-    return retval;
-}
-
-size_t UA_NetworkMessage_calcSizeBinary(const UA_NetworkMessage* p) {
-    size_t retval = 0;
-    UA_Byte byte;
-    size_t size = UA_Byte_calcSizeBinary(&byte); // UADPVersion + UADPFlags
-    if(UA_NetworkMessage_ExtendedFlags1Enabled(p)) {
-        size += UA_Byte_calcSizeBinary(&byte);
-        if(UA_NetworkMessage_ExtendedFlags2Enabled(p))
-            size += UA_Byte_calcSizeBinary(&byte);
-    }
-
-    if(p->publisherIdEnabled) {
-        switch (p->publisherIdType) {
-        case UA_PUBLISHERDATATYPE_BYTE:
-            size += UA_Byte_calcSizeBinary(&p->publisherId.publisherIdByte);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT16:
-            size += UA_UInt16_calcSizeBinary(&p->publisherId.publisherIdUInt16);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT32:
-            size += UA_UInt32_calcSizeBinary(&p->publisherId.publisherIdUInt32);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT64:
-            size += UA_UInt64_calcSizeBinary(&p->publisherId.publisherIdUInt64);
-            break;
-
-        case UA_PUBLISHERDATATYPE_STRING:
-            size += UA_String_calcSizeBinary(&p->publisherId.publisherIdString);
-            break;
-        }
-    }
-
-    if(p->dataSetClassIdEnabled)
-        size += UA_Guid_calcSizeBinary(&p->dataSetClassId);
-
-    // Group Header 
-    if(p->groupHeaderEnabled) {
-        size += UA_Byte_calcSizeBinary(&byte);
-
-        if(p->groupHeader.writerGroupIdEnabled)
-            size += UA_UInt16_calcSizeBinary(&p->groupHeader.writerGroupId);
-
-        if(p->groupHeader.groupVersionEnabled)
-            size += UA_UInt32_calcSizeBinary(&p->groupHeader.groupVersion);
-
-        if(p->groupHeader.networkMessageNumberEnabled)
-            size += UA_UInt16_calcSizeBinary(&p->groupHeader.networkMessageNumber);
-
-        if(p->groupHeader.sequenceNumberEnabled)
-            size += UA_UInt16_calcSizeBinary(&p->groupHeader.sequenceNumber);
-    }
-
-    // Payload Header
-    if(p->payloadHeaderEnabled) {
-        if(p->networkMessageType == UA_NETWORKMESSAGE_DATASET) {
-            size += UA_Byte_calcSizeBinary(&p->payloadHeader.dataSetPayloadHeader.count);
-            if(p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds != NULL) {
-                size += UA_UInt16_calcSizeBinary(&p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0]) *
-                    p->payloadHeader.dataSetPayloadHeader.count;
-            } else {
-                return 0; /* no dataSetWriterIds given! */
-            }
-        } else {
-            // not implemented
-        }
-    }
-
-    if(p->timestampEnabled)
-        size += UA_DateTime_calcSizeBinary(&p->timestamp);
-
-    if(p->picosecondsEnabled)
-        size += UA_UInt16_calcSizeBinary(&p->picoseconds);
-
-    if(p->promotedFieldsEnabled) { 
-        size += UA_UInt16_calcSizeBinary(&p->promotedFieldsSize);
-        for (UA_UInt16 i = 0; i < p->promotedFieldsSize; i++)
-            size += UA_Variant_calcSizeBinary(&p->promotedFields[i]);
-    }
-
-    if(p->securityEnabled) {
-        size += UA_Byte_calcSizeBinary(&byte);
-        size += UA_UInt32_calcSizeBinary(&p->securityHeader.securityTokenId);
-        size += UA_Byte_calcSizeBinary(&p->securityHeader.nonceLength);
-        if(p->securityHeader.nonceLength > 0)
-            size += (UA_Byte_calcSizeBinary(&p->securityHeader.messageNonce.data[0]) * p->securityHeader.nonceLength);
-        if(p->securityHeader.securityFooterEnabled)
-            size += UA_UInt16_calcSizeBinary(&p->securityHeader.securityFooterSize);
-    }
-    
-    if(p->networkMessageType == UA_NETWORKMESSAGE_DATASET) {
-        UA_Byte count = 1;
-        if(p->payloadHeaderEnabled) {
-            count = p->payloadHeader.dataSetPayloadHeader.count;
-            if(count > 1)
-                size += UA_UInt16_calcSizeBinary(&(p->payload.dataSetPayload.sizes[0])) * count;
-        }
-
-        for (size_t i = 0; i < count; i++)
-            size += UA_DataSetMessage_calcSizeBinary(&(p->payload.dataSetPayload.dataSetMessages[i]));
-    }
-
-    if (p->securityEnabled) {
-        if (p->securityHeader.securityFooterEnabled)
-            size += p->securityHeader.securityFooterSize;
-
-        if (p->securityHeader.networkMessageSigned)
-            size += UA_ByteString_calcSizeBinary(&p->signature);
-    }
-
-    retval = size;
-    return retval;
-}
-
-void
-UA_NetworkMessage_deleteMembers(UA_NetworkMessage* p) {
-    if(p->promotedFieldsEnabled)
-        UA_Array_delete(p->promotedFields, p->promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    if(p->securityEnabled && (p->securityHeader.nonceLength > 0))
-        UA_ByteString_deleteMembers(&p->securityHeader.messageNonce);
-
-    if(p->networkMessageType == UA_NETWORKMESSAGE_DATASET) {
-        if(p->payloadHeaderEnabled) {
-            if(p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds != NULL) {
-                UA_Array_delete(p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds,
-                                p->payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-            }
-
-            if(p->payload.dataSetPayload.sizes != NULL) { 
-                UA_Array_delete(p->payload.dataSetPayload.sizes,
-                                p->payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-            }
-        }
-
-        if(p->payload.dataSetPayload.dataSetMessages != NULL) {
-            UA_Byte count = 1;
-            if(p->payloadHeaderEnabled)
-                count = p->payloadHeader.dataSetPayloadHeader.count;
-            
-            for (size_t i = 0; i < count; i++)
-                UA_DataSetMessage_free(&(p->payload.dataSetPayload.dataSetMessages[i]));
-
-            UA_free(p->payload.dataSetPayload.dataSetMessages);
-        }
-    }
-
-    if(p->securityHeader.securityFooterEnabled && (p->securityHeader.securityFooterSize > 0))
-        UA_ByteString_deleteMembers(&p->securityFooter);
-
-    if(p->messageIdEnabled){
-           UA_String_deleteMembers(&p->messageId);
-    }
-
-    if(p->publisherIdEnabled && p->publisherIdType == UA_PUBLISHERDATATYPE_STRING){
-       UA_String_deleteMembers(&p->publisherId.publisherIdString);
-    }
-
-    memset(p, 0, sizeof(UA_NetworkMessage));
-}
-
-void UA_NetworkMessage_delete(UA_NetworkMessage* p) {
-    UA_NetworkMessage_deleteMembers(p);
-}
-
-UA_Boolean
-UA_NetworkMessage_ExtendedFlags1Enabled(const UA_NetworkMessage* src) {
-    UA_Boolean retval = false;
-
-    if((src->publisherIdType != UA_PUBLISHERDATATYPE_BYTE) 
-        || src->dataSetClassIdEnabled 
-        || src->securityEnabled 
-        || src->timestampEnabled 
-        || src->picosecondsEnabled
-        || UA_NetworkMessage_ExtendedFlags2Enabled(src))
-    {
-        retval = true;
-    }
-
-    return retval;
-}
-
-UA_Boolean
-UA_NetworkMessage_ExtendedFlags2Enabled(const UA_NetworkMessage* src) {
-    if(src->chunkMessage || src->promotedFieldsEnabled ||
-       src->networkMessageType != UA_NETWORKMESSAGE_DATASET)
-        return true;
-    return false;
-}
-
-UA_Boolean
-UA_DataSetMessageHeader_DataSetFlags2Enabled(const UA_DataSetMessageHeader* src) {
-    if(src->dataSetMessageType != UA_DATASETMESSAGE_DATAKEYFRAME ||
-       src->timestampEnabled || src->picoSecondsIncluded)
-        return true;
-    return false;
-}
-
-UA_StatusCode
-UA_DataSetMessageHeader_encodeBinary(const UA_DataSetMessageHeader* src, UA_Byte **bufPos,
-                                     const UA_Byte *bufEnd) {
-    UA_Byte v;
-    // DataSetFlags1 
-    v = (UA_Byte)src->fieldEncoding;
-    // shift left 1 bit
-    v = (UA_Byte)(v << DS_MH_SHIFT_LEN);
-
-    if(src->dataSetMessageValid)
-        v |= DS_MESSAGEHEADER_DS_MSG_VALID;
-
-    if(src->dataSetMessageSequenceNrEnabled)
-        v |= DS_MESSAGEHEADER_SEQ_NR_ENABLED_MASK;
-
-    if(src->statusEnabled)
-        v |= DS_MESSAGEHEADER_STATUS_ENABLED_MASK;
-
-    if(src->configVersionMajorVersionEnabled)
-        v |= DS_MESSAGEHEADER_CONFIGMAJORVERSION_ENABLED_MASK;
-
-    if(src->configVersionMinorVersionEnabled)
-        v |= DS_MESSAGEHEADER_CONFIGMINORVERSION_ENABLED_MASK;
-
-    if(UA_DataSetMessageHeader_DataSetFlags2Enabled(src))
-        v |= DS_MESSAGEHEADER_FLAGS2_ENABLED_MASK;
-
-    UA_StatusCode rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-    
-    // DataSetFlags2
-    if(UA_DataSetMessageHeader_DataSetFlags2Enabled(src)) {
-        v = (UA_Byte)src->dataSetMessageType;
-
-        if(src->timestampEnabled)
-            v |= DS_MESSAGEHEADER_TIMESTAMP_ENABLED_MASK;
-
-        if(src->picoSecondsIncluded)
-            v |= DS_MESSAGEHEADER_PICOSECONDS_INCLUDED_MASK;
-
-        rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // DataSetMessageSequenceNr
-    if(src->dataSetMessageSequenceNrEnabled) { 
-        rv = UA_UInt16_encodeBinary(&src->dataSetMessageSequenceNr, bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // Timestamp
-    if(src->timestampEnabled) {
-        rv = UA_DateTime_encodeBinary(&(src->timestamp), bufPos, bufEnd); /* UtcTime */
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // PicoSeconds
-    if(src->picoSecondsIncluded) {
-        rv = UA_UInt16_encodeBinary(&(src->picoSeconds), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // Status
-    if(src->statusEnabled) {
-        rv = UA_UInt16_encodeBinary(&(src->status), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // ConfigVersionMajorVersion
-    if(src->configVersionMajorVersionEnabled) {
-        rv = UA_UInt32_encodeBinary(&(src->configVersionMajorVersion), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    // ConfigVersionMinorVersion
-    if(src->configVersionMinorVersionEnabled) {
-        rv = UA_UInt32_encodeBinary(&(src->configVersionMinorVersion), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_DataSetMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset,
-                                     UA_DataSetMessageHeader* dst) {
-    memset(dst, 0, sizeof(UA_DataSetMessageHeader));
-    UA_Byte v = 0;
-    UA_StatusCode rv = UA_Byte_decodeBinary(src, offset, &v);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    UA_Byte v2 = v & DS_MESSAGEHEADER_FIELD_ENCODING_MASK;
-    v2 = (UA_Byte)(v2 >> DS_MH_SHIFT_LEN);
-    dst->fieldEncoding = (UA_FieldEncoding)v2;
-    
-    if((v & DS_MESSAGEHEADER_DS_MSG_VALID) != 0)
-        dst->dataSetMessageValid = true;
-
-    if((v & DS_MESSAGEHEADER_SEQ_NR_ENABLED_MASK) != 0)
-        dst->dataSetMessageSequenceNrEnabled = true;
-
-    if((v & DS_MESSAGEHEADER_STATUS_ENABLED_MASK) != 0)
-        dst->statusEnabled = true;
-
-    if((v & DS_MESSAGEHEADER_CONFIGMAJORVERSION_ENABLED_MASK) != 0)
-        dst->configVersionMajorVersionEnabled = true;
-
-    if((v & DS_MESSAGEHEADER_CONFIGMINORVERSION_ENABLED_MASK) != 0)
-        dst->configVersionMinorVersionEnabled = true;
-
-    if((v & DS_MESSAGEHEADER_FLAGS2_ENABLED_MASK) != 0) {
-        v = 0;
-        rv = UA_Byte_decodeBinary(src, offset, &v);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-        
-        dst->dataSetMessageType = (UA_DataSetMessageType)(v & DS_MESSAGEHEADER_DS_MESSAGE_TYPE_MASK);
-
-        if((v & DS_MESSAGEHEADER_TIMESTAMP_ENABLED_MASK) != 0)
-            dst->timestampEnabled = true;
-
-        if((v & DS_MESSAGEHEADER_PICOSECONDS_INCLUDED_MASK) != 0)
-            dst->picoSecondsIncluded = true;
-    } else {
-        dst->dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-        dst->picoSecondsIncluded = false;
-    }
-
-    if(dst->dataSetMessageSequenceNrEnabled) {
-        rv = UA_UInt16_decodeBinary(src, offset, &dst->dataSetMessageSequenceNr);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    } else {
-        dst->dataSetMessageSequenceNr = 0;
-    }
-
-    if(dst->timestampEnabled) {
-        rv = UA_DateTime_decodeBinary(src, offset, &dst->timestamp); /* UtcTime */
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    } else {
-        dst->timestamp = 0;
-    }
-
-    if(dst->picoSecondsIncluded) {
-        rv = UA_UInt16_decodeBinary(src, offset, &dst->picoSeconds);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    } else {
-        dst->picoSeconds = 0;
-    }
-
-    if(dst->statusEnabled) {
-        rv = UA_UInt16_decodeBinary(src, offset, &dst->status);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    } else {
-        dst->status = 0;
-    }
-
-    if(dst->configVersionMajorVersionEnabled) {
-        rv = UA_UInt32_decodeBinary(src, offset, &dst->configVersionMajorVersion);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    } else {
-        dst->configVersionMajorVersion = 0;
-    }
-
-    if(dst->configVersionMinorVersionEnabled) {
-        rv = UA_UInt32_decodeBinary(src, offset, &dst->configVersionMinorVersion);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    } else {
-        dst->configVersionMinorVersion = 0;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-size_t
-UA_DataSetMessageHeader_calcSizeBinary(const UA_DataSetMessageHeader* p) {
-    UA_Byte byte;
-    size_t size = UA_Byte_calcSizeBinary(&byte); // DataSetMessage Type + Flags
-    if(UA_DataSetMessageHeader_DataSetFlags2Enabled(p))
-        size += UA_Byte_calcSizeBinary(&byte);
-
-    if(p->dataSetMessageSequenceNrEnabled)
-        size += UA_UInt16_calcSizeBinary(&p->dataSetMessageSequenceNr);
-
-    if(p->timestampEnabled)
-        size += UA_DateTime_calcSizeBinary(&p->timestamp); /* UtcTime */
-
-    if(p->picoSecondsIncluded)
-        size += UA_UInt16_calcSizeBinary(&p->picoSeconds);
-
-    if(p->statusEnabled)
-        size += UA_UInt16_calcSizeBinary(&p->status);
-
-    if(p->configVersionMajorVersionEnabled)
-        size += UA_UInt32_calcSizeBinary(&p->configVersionMajorVersion);
-
-    if(p->configVersionMinorVersionEnabled)
-        size += UA_UInt32_calcSizeBinary(&p->configVersionMinorVersion);
-
-    return size;
-}
-
-UA_StatusCode
-UA_DataSetMessage_encodeBinary(const UA_DataSetMessage* src, UA_Byte **bufPos,
-                               const UA_Byte *bufEnd) {
-    UA_StatusCode rv = UA_DataSetMessageHeader_encodeBinary(&src->header, bufPos, bufEnd);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    if(src->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) {
-        if(src->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) {
-            rv = UA_UInt16_encodeBinary(&(src->data.keyFrameData.fieldCount), bufPos, bufEnd);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-        }
-
-        if(src->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-            for (UA_UInt16 i = 0; i < src->data.keyFrameData.fieldCount; i++) {
-                rv = UA_Variant_encodeBinary(&(src->data.keyFrameData.dataSetFields[i].value), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        } else if(src->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) {
-            return UA_STATUSCODE_BADNOTIMPLEMENTED;
-        } else if(src->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-            for (UA_UInt16 i = 0; i < src->data.keyFrameData.fieldCount; i++) {
-                rv = UA_DataValue_encodeBinary(&(src->data.keyFrameData.dataSetFields[i]), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-    } else if(src->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) {
-        // Encode Delta Frame
-        // Here the FieldCount is always present
-        rv = UA_UInt16_encodeBinary(&(src->data.keyFrameData.fieldCount), bufPos, bufEnd);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-
-        if(src->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-            for (UA_UInt16 i = 0; i < src->data.deltaFrameData.fieldCount; i++) {
-                rv = UA_UInt16_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldIndex), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-                
-                rv = UA_Variant_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldValue.value), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        } else if(src->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) {
-            return UA_STATUSCODE_BADNOTIMPLEMENTED;
-        } else if(src->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-            for (UA_UInt16 i = 0; i < src->data.deltaFrameData.fieldCount; i++) {
-                rv = UA_UInt16_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldIndex), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-
-                rv = UA_DataValue_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldValue), bufPos, bufEnd);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        }
-    } else if(src->header.dataSetMessageType != UA_DATASETMESSAGE_KEEPALIVE) {
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-    }
-
-    /* Keep-Alive Message contains no Payload Data */
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_DataSetMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetMessage* dst) {
-    memset(dst, 0, sizeof(UA_DataSetMessage));
-    UA_StatusCode rv = UA_DataSetMessageHeader_decodeBinary(src, offset, &dst->header);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    if(dst->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) {
-        if(dst->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) {
-            rv = UA_UInt16_decodeBinary(src, offset, &dst->data.keyFrameData.fieldCount);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-
-            if(dst->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-                dst->data.keyFrameData.dataSetFields =
-                    (UA_DataValue *)UA_Array_new(dst->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-                for (UA_UInt16 i = 0; i < dst->data.keyFrameData.fieldCount; i++) {
-                    UA_DataValue_init(&dst->data.keyFrameData.dataSetFields[i]);
-                    rv = UA_Variant_decodeBinary(src, offset, &dst->data.keyFrameData.dataSetFields[i].value);
-                    if(rv != UA_STATUSCODE_GOOD)
-                        return rv;
-                    dst->data.keyFrameData.dataSetFields[i].hasValue = true;
-                }
-            } else if(dst->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) {
-                return UA_STATUSCODE_BADNOTIMPLEMENTED;
-            } else if(dst->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-                dst->data.keyFrameData.dataSetFields =
-                    (UA_DataValue *)UA_Array_new(dst->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-                for (UA_UInt16 i = 0; i < dst->data.keyFrameData.fieldCount; i++) {
-                    rv = UA_DataValue_decodeBinary(src, offset, &(dst->data.keyFrameData.dataSetFields[i]));
-                    if(rv != UA_STATUSCODE_GOOD)
-                        return rv;
-                }
-            }
-        }
-    } else if(dst->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) {
-        if(dst->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) {
-            rv = UA_UInt16_decodeBinary(src, offset, &dst->data.deltaFrameData.fieldCount);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-
-            if(dst->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-                size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dst->data.deltaFrameData.fieldCount;
-                dst->data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-                for (UA_UInt16 i = 0; i < dst->data.deltaFrameData.fieldCount; i++) {
-                    rv = UA_UInt16_decodeBinary(src, offset, &dst->data.deltaFrameData.deltaFrameFields[i].fieldIndex);
-                    if(rv != UA_STATUSCODE_GOOD)
-                        return rv;
-                    
-                    UA_DataValue_init(&dst->data.deltaFrameData.deltaFrameFields[i].fieldValue);
-                    rv = UA_Variant_decodeBinary(src, offset, &dst->data.deltaFrameData.deltaFrameFields[i].fieldValue.value);
-                    if(rv != UA_STATUSCODE_GOOD)
-                        return rv;
-
-                    dst->data.deltaFrameData.deltaFrameFields[i].fieldValue.hasValue = true;
-                }
-            } else if(dst->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) {
-                return UA_STATUSCODE_BADNOTIMPLEMENTED;
-            } else if(dst->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-                size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dst->data.deltaFrameData.fieldCount;
-                dst->data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-                for (UA_UInt16 i = 0; i < dst->data.deltaFrameData.fieldCount; i++) {
-                    rv = UA_UInt16_decodeBinary(src, offset, &dst->data.deltaFrameData.deltaFrameFields[i].fieldIndex);
-                    if(rv != UA_STATUSCODE_GOOD)
-                        return rv;
-                    
-                    rv = UA_DataValue_decodeBinary(src, offset, &(dst->data.deltaFrameData.deltaFrameFields[i].fieldValue));
-                    if(rv != UA_STATUSCODE_GOOD)
-                        return rv;
-                }
-            }
-        }
-    } else if(dst->header.dataSetMessageType != UA_DATASETMESSAGE_KEEPALIVE) {
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-    }
-
-    /* Keep-Alive Message contains no Payload Data */
-    return UA_STATUSCODE_GOOD;
-}
-
-size_t
-UA_DataSetMessage_calcSizeBinary(const UA_DataSetMessage* p) {
-    size_t size = UA_DataSetMessageHeader_calcSizeBinary(&p->header);
-
-    if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) {
-        if(p->header.fieldEncoding != UA_FIELDENCODING_RAWDATA)
-            size += UA_calcSizeBinary(&p->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_UINT16]);
-
-        if(p->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-            for (UA_UInt16 i = 0; i < p->data.keyFrameData.fieldCount; i++)
-                size += UA_calcSizeBinary(&p->data.keyFrameData.dataSetFields[i].value, &UA_TYPES[UA_TYPES_VARIANT]);
-        } else if(p->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) {
-            // not implemented
-        } else if(p->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-            for (UA_UInt16 i = 0; i < p->data.keyFrameData.fieldCount; i++)
-                size += UA_calcSizeBinary(&p->data.keyFrameData.dataSetFields[i], &UA_TYPES[UA_TYPES_DATAVALUE]);
-        }
-    } else if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) {
-        if(p->header.fieldEncoding != UA_FIELDENCODING_RAWDATA)
-            size += UA_calcSizeBinary(&p->data.deltaFrameData.fieldCount, &UA_TYPES[UA_TYPES_UINT16]);
-
-        if(p->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-            for (UA_UInt16 i = 0; i < p->data.deltaFrameData.fieldCount; i++) {
-                size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldIndex, &UA_TYPES[UA_TYPES_UINT16]);
-                size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue.value, &UA_TYPES[UA_TYPES_VARIANT]);
-            }
-        } else if(p->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) {
-            // not implemented
-        } else if(p->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-            for (UA_UInt16 i = 0; i < p->data.deltaFrameData.fieldCount; i++) {
-                size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldIndex, &UA_TYPES[UA_TYPES_UINT16]);
-                size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue, &UA_TYPES[UA_TYPES_DATAVALUE]);
-            }
-        }
-    }
-
-    /* KeepAlive-Message contains no Payload Data */
-    return size;
-}
-
-void UA_DataSetMessage_free(const UA_DataSetMessage* p) {
-    if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) {
-        if(p->data.keyFrameData.dataSetFields != NULL)
-            UA_Array_delete(p->data.keyFrameData.dataSetFields, p->data.keyFrameData.fieldCount,
-                            &UA_TYPES[UA_TYPES_DATAVALUE]);
-        /* Json keys */
-        if(p->data.keyFrameData.fieldNames != NULL){
-            UA_Array_delete(p->data.keyFrameData.fieldNames, p->data.keyFrameData.fieldCount,
-                            &UA_TYPES[UA_TYPES_STRING]);
-        }
-    } else if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) {
-        if(p->data.deltaFrameData.deltaFrameFields != NULL) {
-            for(UA_UInt16 i = 0; i < p->data.deltaFrameData.fieldCount; i++) {
-                if(p->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-                    UA_DataValue_deleteMembers(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue);
-                } else if(p->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-                    UA_Variant_deleteMembers(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue.value);
-                }
-            }
-            UA_free(p->data.deltaFrameData.deltaFrameFields);
-        }
-    }
-}
-#endif /* UA_ENABLE_PUBSUB */
diff --git a/ext/open62541/src/pubsub/ua_pubsub_networkmessage.h b/ext/open62541/src/pubsub/ua_pubsub_networkmessage.h
deleted file mode 100644
index 892fe8d..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_networkmessage.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff)
- */
-
-#ifndef UA_PUBSUB_NETWORKMESSAGE_H_
-#define UA_PUBSUB_NETWORKMESSAGE_H_
-
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-
-_UA_BEGIN_DECLS
-
-/* DataSet Payload Header */
-typedef struct {
-    UA_Byte count;
-    UA_UInt16* dataSetWriterIds;
-} UA_DataSetPayloadHeader;
-
-/* FieldEncoding Enum  */
-typedef enum {
-    UA_FIELDENCODING_VARIANT = 0, 
-    UA_FIELDENCODING_RAWDATA = 1,
-    UA_FIELDENCODING_DATAVALUE = 2
-} UA_FieldEncoding;
-
-/* DataSetMessage Type */
-typedef enum {
-    UA_DATASETMESSAGE_DATAKEYFRAME = 0,
-    UA_DATASETMESSAGE_DATADELTAFRAME = 1,
-    UA_DATASETMESSAGE_EVENT = 2, 
-    UA_DATASETMESSAGE_KEEPALIVE = 3
-} UA_DataSetMessageType;
-
-/* DataSetMessage Header */
-typedef struct {
-    UA_Boolean dataSetMessageValid;
-    UA_FieldEncoding fieldEncoding;
-    UA_Boolean dataSetMessageSequenceNrEnabled;
-    UA_Boolean timestampEnabled;
-    UA_Boolean statusEnabled;
-    UA_Boolean configVersionMajorVersionEnabled;
-    UA_Boolean configVersionMinorVersionEnabled;
-    UA_DataSetMessageType dataSetMessageType;
-    UA_Boolean picoSecondsIncluded;
-    UA_UInt16 dataSetMessageSequenceNr;
-    UA_UtcTime timestamp;
-    UA_UInt16 picoSeconds;
-    UA_UInt16 status;
-    UA_UInt32 configVersionMajorVersion;
-    UA_UInt32 configVersionMinorVersion;
-} UA_DataSetMessageHeader;
-
-UA_StatusCode
-UA_DataSetMessageHeader_encodeBinary(const UA_DataSetMessageHeader* src,
-                                     UA_Byte **bufPos, const UA_Byte *bufEnd);
-
-UA_StatusCode
-UA_DataSetMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset,
-                                     UA_DataSetMessageHeader* dst);
-
-size_t
-UA_DataSetMessageHeader_calcSizeBinary(const UA_DataSetMessageHeader* p);
-
-/**
- * DataSetMessage
- * ^^^^^^^^^^^^^^ */
-
-typedef struct {
-    UA_UInt16 fieldCount;
-    UA_DataValue* dataSetFields;
-    /* Json keys for the dataSetFields: TODO: own dataSetMessageType for json? */
-    UA_String* fieldNames;
-} UA_DataSetMessage_DataKeyFrameData;
-
-typedef struct {
-    UA_UInt16 fieldIndex;
-    UA_DataValue fieldValue;
-} UA_DataSetMessage_DeltaFrameField;
-
-typedef struct {
-    UA_UInt16 fieldCount;
-    UA_DataSetMessage_DeltaFrameField* deltaFrameFields;
-} UA_DataSetMessage_DataDeltaFrameData;
-
-typedef struct {
-    UA_DataSetMessageHeader header;
-    union {
-        UA_DataSetMessage_DataKeyFrameData keyFrameData;
-        UA_DataSetMessage_DataDeltaFrameData deltaFrameData;
-    } data;
-} UA_DataSetMessage;
-
-UA_StatusCode
-UA_DataSetMessage_encodeBinary(const UA_DataSetMessage* src, UA_Byte **bufPos,
-                               const UA_Byte *bufEnd);
-
-UA_StatusCode
-UA_DataSetMessage_decodeBinary(const UA_ByteString *src, size_t *offset,
-                               UA_DataSetMessage* dst);
-
-size_t
-UA_DataSetMessage_calcSizeBinary(const UA_DataSetMessage* p);
-
-void UA_DataSetMessage_free(const UA_DataSetMessage* p);
-
-typedef struct {
-    UA_UInt16* sizes;
-    UA_DataSetMessage* dataSetMessages;
-} UA_DataSetPayload;
-
-typedef enum {
-    UA_PUBLISHERDATATYPE_BYTE = 0,
-    UA_PUBLISHERDATATYPE_UINT16 = 1,
-    UA_PUBLISHERDATATYPE_UINT32 = 2,
-    UA_PUBLISHERDATATYPE_UINT64 = 3,
-    UA_PUBLISHERDATATYPE_STRING = 4
-} UA_PublisherIdDatatype;
-
-typedef enum {
-    UA_NETWORKMESSAGE_DATASET = 0,
-    UA_NETWORKMESSAGE_DISCOVERY_REQUEST = 1,
-    UA_NETWORKMESSAGE_DISCOVERY_RESPONSE = 2
-} UA_NetworkMessageType;
-
-/**
- * UA_NetworkMessageGroupHeader
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
-typedef struct {
-    UA_Boolean writerGroupIdEnabled;
-    UA_Boolean groupVersionEnabled;
-    UA_Boolean networkMessageNumberEnabled;
-    UA_Boolean sequenceNumberEnabled;
-    UA_UInt16 writerGroupId;
-    UA_UInt32 groupVersion; // spec: type "VersionTime"
-    UA_UInt16 networkMessageNumber;
-    UA_UInt16 sequenceNumber;
-} UA_NetworkMessageGroupHeader;
-
-/**
- * UA_NetworkMessageSecurityHeader
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
-typedef struct {
-    UA_Boolean networkMessageSigned;
-    UA_Boolean networkMessageEncrypted;
-    UA_Boolean securityFooterEnabled;
-    UA_Boolean forceKeyReset;
-    UA_UInt32 securityTokenId;      // spec: IntegerId
-    UA_Byte nonceLength;
-    UA_ByteString messageNonce;
-    UA_UInt16 securityFooterSize;
-} UA_NetworkMessageSecurityHeader;
-
-/**
- * UA_NetworkMessage
- * ^^^^^^^^^^^^^^^^^ */
-typedef struct {
-    UA_Byte version;
-    UA_Boolean messageIdEnabled;
-    UA_String messageId; /* For Json NetworkMessage */
-    UA_Boolean publisherIdEnabled;
-    UA_Boolean groupHeaderEnabled;
-    UA_Boolean payloadHeaderEnabled;
-    UA_PublisherIdDatatype publisherIdType;
-    UA_Boolean dataSetClassIdEnabled;
-    UA_Boolean securityEnabled;
-    UA_Boolean timestampEnabled;
-    UA_Boolean picosecondsEnabled;
-    UA_Boolean chunkMessage;
-    UA_Boolean promotedFieldsEnabled;
-    UA_NetworkMessageType networkMessageType;
-    union {
-        UA_Byte publisherIdByte;
-        UA_UInt16 publisherIdUInt16;
-        UA_UInt32 publisherIdUInt32;
-        UA_UInt64 publisherIdUInt64;
-        UA_Guid publisherIdGuid;
-        UA_String publisherIdString;
-    } publisherId;
-    UA_Guid dataSetClassId;
-
-    UA_NetworkMessageGroupHeader groupHeader;
-
-    union {
-        UA_DataSetPayloadHeader dataSetPayloadHeader;
-    } payloadHeader;
-    
-    UA_DateTime timestamp;
-    UA_UInt16 picoseconds;
-    UA_UInt16 promotedFieldsSize;
-    UA_Variant* promotedFields; /* BaseDataType */
-    
-    UA_NetworkMessageSecurityHeader securityHeader;
-
-    union {
-        UA_DataSetPayload dataSetPayload;
-    } payload;
-    
-    UA_ByteString securityFooter;
-    UA_ByteString signature;
-} UA_NetworkMessage;
-
-UA_StatusCode
-UA_NetworkMessage_encodeBinary(const UA_NetworkMessage* src,
-                               UA_Byte **bufPos, const UA_Byte *bufEnd);
-
-UA_StatusCode
-UA_NetworkMessage_decodeBinary(const UA_ByteString *src, size_t *offset,
-                               UA_NetworkMessage* dst);
-
-size_t
-UA_NetworkMessage_calcSizeBinary(const UA_NetworkMessage* p);
-
-void
-UA_NetworkMessage_deleteMembers(UA_NetworkMessage* p);
-
-#define UA_NetworkMessage_clear(p) UA_NetworkMessage_deleteMembers(p)
-
-void
-UA_NetworkMessage_delete(UA_NetworkMessage* p);
-
-
-#ifdef UA_ENABLE_JSON_ENCODING
-UA_StatusCode
-UA_NetworkMessage_encodeJson(const UA_NetworkMessage *src,
-                             UA_Byte **bufPos, const UA_Byte **bufEnd, UA_String *namespaces,
-                             size_t namespaceSize, UA_String *serverUris,
-                             size_t serverUriSize, UA_Boolean useReversible);
-
-size_t
-UA_NetworkMessage_calcSizeJson(const UA_NetworkMessage *src,
-                               UA_String *namespaces, size_t namespaceSize,
-                               UA_String *serverUris, size_t serverUriSize,
-                               UA_Boolean useReversible);
-
-UA_StatusCode UA_NetworkMessage_decodeJson(UA_NetworkMessage *dst, const UA_ByteString *src);
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_PUBSUB_NETWORKMESSAGE_H_ */
diff --git a/ext/open62541/src/pubsub/ua_pubsub_networkmessage_json.c b/ext/open62541/src/pubsub/ua_pubsub_networkmessage_json.c
deleted file mode 100644
index 4281a80..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_networkmessage_json.c
+++ /dev/null
@@ -1,536 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2019 Fraunhofer IOSB (Author: Lukas Meling)
- */
-
-#include <open62541/types.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_pubsub_networkmessage.h"
-#include "ua_types_encoding_json.h"
-
-/* Json keys for dsm */
-const char * UA_DECODEKEY_MESSAGES = ("Messages");
-const char * UA_DECODEKEY_MESSAGETYPE = ("MessageType");
-const char * UA_DECODEKEY_MESSAGEID = ("MessageId");
-const char * UA_DECODEKEY_PUBLISHERID = ("PublisherId");
-const char * UA_DECODEKEY_DATASETCLASSID = ("DataSetClassId");
-
-/* Json keys for dsm */
-const char * UA_DECODEKEY_DATASETWRITERID = ("DataSetWriterId");
-const char * UA_DECODEKEY_SEQUENCENUMBER = ("SequenceNumber");
-const char * UA_DECODEKEY_METADATAVERSION = ("MetaDataVersion");
-const char * UA_DECODEKEY_TIMESTAMP = ("Timestamp");
-const char * UA_DECODEKEY_DSM_STATUS = ("Status");
-const char * UA_DECODEKEY_PAYLOAD = ("Payload");
-const char * UA_DECODEKEY_DS_TYPE = ("Type");
-
-/* -- json encoding/decoding -- */
-static UA_StatusCode writeJsonKey_UA_String(CtxJson *ctx, UA_String *in){
-    UA_STACKARRAY(char, out, in->length + 1);
-    memcpy(out, in->data, in->length);
-    out[in->length] = 0;
-    return writeJsonKey(ctx, out);
-}
-
-static UA_StatusCode
-UA_DataSetMessage_encodeJson_internal(const UA_DataSetMessage* src, UA_UInt16 dataSetWriterId,
-                                      CtxJson *ctx){
-    status rv = writeJsonObjStart(ctx);
-
-    /* DataSetWriterId */
-    rv |= writeJsonObjElm(ctx, UA_DECODEKEY_DATASETWRITERID,
-                          &dataSetWriterId, &UA_TYPES[UA_TYPES_UINT16]);
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    /* DataSetMessageSequenceNr */
-    if(src->header.dataSetMessageSequenceNrEnabled) {
-        rv |= writeJsonObjElm(ctx, UA_DECODEKEY_SEQUENCENUMBER,
-                              &src->header.dataSetMessageSequenceNr,
-                              &UA_TYPES[UA_TYPES_UINT16]);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    /* MetaDataVersion */
-    if(src->header.configVersionMajorVersionEnabled || src->header.configVersionMinorVersionEnabled) {
-        UA_ConfigurationVersionDataType cvd;
-        cvd.majorVersion = src->header.configVersionMajorVersion;
-        cvd.minorVersion = src->header.configVersionMinorVersion;
-        rv |= writeJsonObjElm(ctx, UA_DECODEKEY_METADATAVERSION, &cvd,
-                              &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE]);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    /* Timestamp */
-    if(src->header.timestampEnabled) {
-        rv |= writeJsonObjElm(ctx, UA_DECODEKEY_TIMESTAMP, &src->header.timestamp,
-                              &UA_TYPES[UA_TYPES_DATETIME]);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    /* Status */
-    if(src->header.statusEnabled) {
-        rv |= writeJsonObjElm(ctx, UA_DECODEKEY_DSM_STATUS,
-                              &src->header.status, &UA_TYPES[UA_TYPES_STATUSCODE]);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    rv |= writeJsonKey(ctx, UA_DECODEKEY_PAYLOAD);
-    rv |= writeJsonObjStart(ctx);
-
-    /* TODO: currently no difference between delta and key frames. Own
-     * dataSetMessageType for json?. If the field names are not defined, write
-     * out empty field names. */
-    if(src->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) {
-
-        if(src->header.fieldEncoding == UA_FIELDENCODING_VARIANT) {
-            /* KEYFRAME VARIANT */
-            for (UA_UInt16 i = 0; i < src->data.keyFrameData.fieldCount; i++) {
-                if(src->data.keyFrameData.fieldNames)
-                    rv |= writeJsonKey_UA_String(ctx, &src->data.keyFrameData.fieldNames[i]);
-                else
-                    rv |= writeJsonKey(ctx, "");
-                rv |= encodeJsonInternal(&(src->data.keyFrameData.dataSetFields[i].value),
-                                         &UA_TYPES[UA_TYPES_VARIANT], ctx);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        } else if(src->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) {
-            /* KEYFRAME DATAVALUE */
-            for (UA_UInt16 i = 0; i < src->data.keyFrameData.fieldCount; i++) {
-                if(src->data.keyFrameData.fieldNames)
-                    rv |= writeJsonKey_UA_String(ctx, &src->data.keyFrameData.fieldNames[i]);
-                else
-                    rv |= writeJsonKey(ctx, "");
-                rv |= encodeJsonInternal(&src->data.keyFrameData.dataSetFields[i],
-                                         &UA_TYPES[UA_TYPES_DATAVALUE], ctx);
-                if(rv != UA_STATUSCODE_GOOD)
-                    return rv;
-            }
-        } else {
-            /* RawData */
-            return UA_STATUSCODE_BADNOTIMPLEMENTED;
-        }
-    } else {
-        /* DeltaFrame */
-        return UA_STATUSCODE_BADNOTSUPPORTED;
-    }
-    rv |= writeJsonObjEnd(ctx); /* Payload */
-    rv |= writeJsonObjEnd(ctx); /* DataSetMessage */
-    return rv;
-}
-
-static UA_StatusCode
-UA_NetworkMessage_encodeJson_internal(const UA_NetworkMessage* src, CtxJson *ctx) {
-    status rv = UA_STATUSCODE_GOOD;
-    /* currently only ua-data is supported, no discovery message implemented */
-    if(src->networkMessageType != UA_NETWORKMESSAGE_DATASET)
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-
-    writeJsonObjStart(ctx);
-
-    /* Table 91 – JSON NetworkMessage Definition
-     * MessageId | String | A globally unique identifier for the message.
-     * This value is mandatory. But we don't check uniqueness in the
-     * encoding layer. */
-    rv |= writeJsonObjElm(ctx, UA_DECODEKEY_MESSAGEID,
-                          &src->messageId, &UA_TYPES[UA_TYPES_STRING]);
-
-    /* MessageType */
-    UA_String s = UA_STRING("ua-data");
-    rv |= writeJsonObjElm(ctx, UA_DECODEKEY_MESSAGETYPE,
-                          &s, &UA_TYPES[UA_TYPES_STRING]);
-
-    /* PublisherId */
-    if(src->publisherIdEnabled) {
-        rv = writeJsonKey(ctx, UA_DECODEKEY_PUBLISHERID);
-        switch (src->publisherIdType) {
-        case UA_PUBLISHERDATATYPE_BYTE:
-            rv |= encodeJsonInternal(&src->publisherId.publisherIdByte,
-                                     &UA_TYPES[UA_TYPES_BYTE], ctx);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT16:
-            rv |= encodeJsonInternal(&src->publisherId.publisherIdUInt16,
-                                     &UA_TYPES[UA_TYPES_UINT16], ctx);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT32:
-            rv |= encodeJsonInternal(&src->publisherId.publisherIdUInt32,
-                                     &UA_TYPES[UA_TYPES_UINT32], ctx);
-            break;
-
-        case UA_PUBLISHERDATATYPE_UINT64:
-            rv |= encodeJsonInternal(&src->publisherId.publisherIdUInt64,
-                                     &UA_TYPES[UA_TYPES_UINT64], ctx);
-            break;
-
-        case UA_PUBLISHERDATATYPE_STRING:
-            rv |= encodeJsonInternal(&src->publisherId.publisherIdString,
-                                     &UA_TYPES[UA_TYPES_STRING], ctx);
-            break;
-        }
-    }
-    if(rv != UA_STATUSCODE_GOOD)
-        return rv;
-
-    /* DataSetClassId */
-    if(src->dataSetClassIdEnabled) {
-        rv |= writeJsonObjElm(ctx, UA_DECODEKEY_DATASETCLASSID,
-                              &src->dataSetClassId, &UA_TYPES[UA_TYPES_GUID]);
-        if(rv != UA_STATUSCODE_GOOD)
-            return rv;
-    }
-
-    /* Payload: DataSetMessages */
-    UA_Byte count = src->payloadHeader.dataSetPayloadHeader.count;
-    if(count > 0){
-        UA_UInt16 *dataSetWriterIds = src->payloadHeader.dataSetPayloadHeader.dataSetWriterIds;
-        if(!dataSetWriterIds){
-            return UA_STATUSCODE_BADENCODINGERROR;
-        }
-
-        rv |= writeJsonKey(ctx, UA_DECODEKEY_MESSAGES);
-        rv |= writeJsonArrStart(ctx); /* start array */
-
-        for (UA_UInt16 i = 0; i < count; i++) {
-            writeJsonCommaIfNeeded(ctx);
-            rv |= UA_DataSetMessage_encodeJson_internal(&src->payload.dataSetPayload.dataSetMessages[i],
-                                                        dataSetWriterIds[i], ctx);
-            if(rv != UA_STATUSCODE_GOOD)
-                return rv;
-            /* comma is needed if more dsm are present */
-            ctx->commaNeeded[ctx->depth] = true;
-        }
-        rv |= writeJsonArrEnd(ctx); /* end array */
-    }
-
-    rv |= writeJsonObjEnd(ctx);
-    return rv;
-}
-
-UA_StatusCode
-UA_NetworkMessage_encodeJson(const UA_NetworkMessage *src,
-                             UA_Byte **bufPos, const UA_Byte **bufEnd, UA_String *namespaces,
-                             size_t namespaceSize, UA_String *serverUris,
-                             size_t serverUriSize, UA_Boolean useReversible) {
-    /* Set up the context */
-    CtxJson ctx;
-    memset(&ctx, 0, sizeof(ctx));
-    ctx.pos = *bufPos;
-    ctx.end = *bufEnd;
-    ctx.depth = 0;
-    ctx.namespaces = namespaces;
-    ctx.namespacesSize = namespaceSize;
-    ctx.serverUris = serverUris;
-    ctx.serverUrisSize = serverUriSize;
-    ctx.useReversible = useReversible;
-    ctx.calcOnly = false;
-
-    status ret = UA_NetworkMessage_encodeJson_internal(src, &ctx);
-
-    *bufPos = ctx.pos;
-    *bufEnd = ctx.end;
-    return ret;
-}
-
-size_t
-UA_NetworkMessage_calcSizeJson(const UA_NetworkMessage *src,
-                               UA_String *namespaces, size_t namespaceSize,
-                               UA_String *serverUris, size_t serverUriSize,
-                               UA_Boolean useReversible){
-
-    /* Set up the context */
-    CtxJson ctx;
-    memset(&ctx, 0, sizeof(ctx));
-    ctx.pos = 0;
-    ctx.end = (const UA_Byte*)(uintptr_t)SIZE_MAX;
-    ctx.depth = 0;
-    ctx.namespaces = namespaces;
-    ctx.namespacesSize = namespaceSize;
-    ctx.serverUris = serverUris;
-    ctx.serverUrisSize = serverUriSize;
-    ctx.useReversible = useReversible;
-    ctx.calcOnly = true;
-
-    status ret = UA_NetworkMessage_encodeJson_internal(src, &ctx);
-    if(ret != UA_STATUSCODE_GOOD)
-        return 0;
-    return (size_t)ctx.pos;
-}
-
-/* decode  json */
-static status
-MetaDataVersion_decodeJsonInternal(void* cvd, const UA_DataType *type, CtxJson *ctx,
-                                   ParseCtx *parseCtx, UA_Boolean moveToken){
-    return decodeJsonInternal(cvd, &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE],
-                              ctx, parseCtx, UA_TRUE);
-}
-
-static status
-DataSetPayload_decodeJsonInternal(void* dsmP, const UA_DataType *type, CtxJson *ctx,
-                                  ParseCtx *parseCtx, UA_Boolean moveToken) {
-    UA_DataSetMessage* dsm = (UA_DataSetMessage*)dsmP;
-    dsm->header.dataSetMessageValid = UA_TRUE;
-    if(isJsonNull(ctx, parseCtx)) {
-        parseCtx->index++;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    size_t length = (size_t)parseCtx->tokenArray[parseCtx->index].size;
-    UA_String *fieldNames = (UA_String*)UA_calloc(length, sizeof(UA_String));
-    dsm->data.keyFrameData.fieldNames = fieldNames;
-    dsm->data.keyFrameData.fieldCount = (UA_UInt16)length;
-    dsm->data.keyFrameData.dataSetFields = (UA_DataValue *)
-        UA_Array_new(dsm->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-
-    status ret = UA_STATUSCODE_GOOD;
-
-    parseCtx->index++; // We go to first Object key!
-
-    /* iterate over the key/value pairs in the object. Keys are stored in fieldnames. */
-    for(size_t i = 0; i < length; ++i) {
-        ret = getDecodeSignature(UA_TYPES_STRING)(&fieldNames[i], type, ctx, parseCtx, UA_TRUE);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-
-        //TODO: Is field value a variant or datavalue? Current check if type and body present.
-        size_t searchResult = 0;
-        status foundType = lookAheadForKey("Type", ctx, parseCtx, &searchResult);
-        status foundBody = lookAheadForKey("Body", ctx, parseCtx, &searchResult);
-        if(foundType == UA_STATUSCODE_GOOD && foundBody == UA_STATUSCODE_GOOD){
-            dsm->header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-            ret = getDecodeSignature(UA_TYPES_VARIANT)
-                (&dsm->data.keyFrameData.dataSetFields[i].value, type, ctx, parseCtx, UA_TRUE);
-            dsm->data.keyFrameData.dataSetFields[i].hasValue = UA_TRUE;
-        } else {
-            dsm->header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-            ret = getDecodeSignature(UA_TYPES_DATAVALUE)
-                (&dsm->data.keyFrameData.dataSetFields[i], type, ctx, parseCtx, UA_TRUE);
-            dsm->data.keyFrameData.dataSetFields[i].hasValue = UA_TRUE;
-        }
-
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-
-    }
-
-    return ret;
-}
-
-static status
-DatasetMessage_Payload_decodeJsonInternal(UA_DataSetMessage* dsm, const UA_DataType *type,
-                                          CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken) {
-    UA_ConfigurationVersionDataType cvd;
-    UA_UInt16 dataSetWriterId; /* the id is currently not processed */
-
-    dsm->header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-
-    DecodeEntry entries[6] = {
-        {UA_DECODEKEY_DATASETWRITERID, &dataSetWriterId,
-         getDecodeSignature(UA_TYPES_UINT16), false, NULL},
-        {UA_DECODEKEY_SEQUENCENUMBER, &dsm->header.dataSetMessageSequenceNr,
-         getDecodeSignature(UA_TYPES_UINT16), false, NULL},
-        {UA_DECODEKEY_METADATAVERSION, &cvd,
-         &MetaDataVersion_decodeJsonInternal, false, NULL},
-        {UA_DECODEKEY_TIMESTAMP, &dsm->header.timestamp,
-         getDecodeSignature(UA_TYPES_DATETIME), false, NULL},
-        {UA_DECODEKEY_DSM_STATUS, &dsm->header.status,
-         getDecodeSignature(UA_TYPES_UINT16), false, NULL},
-        {UA_DECODEKEY_PAYLOAD, dsm,
-         &DataSetPayload_decodeJsonInternal, false, NULL}
-    };
-
-    status ret = decodeFields(ctx, parseCtx, entries, 6, NULL);
-    if(ret != UA_STATUSCODE_GOOD || !entries[0].found){
-        /* no dataSetwriterid. Is mandatory. Abort. */
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }else{
-        if(parseCtx->custom != NULL){
-            UA_UInt16* dataSetWriterIdsArray = (UA_UInt16*)parseCtx->custom;
-
-            if(*parseCtx->currentCustomIndex  < parseCtx->numCustom){
-                 dataSetWriterIdsArray[*parseCtx->currentCustomIndex] = dataSetWriterId;
-                 (*parseCtx->currentCustomIndex)++;
-            }else{
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-        }else{
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    }
-    dsm->header.dataSetMessageSequenceNrEnabled = entries[1].found;
-    dsm->header.configVersionMajorVersion = cvd.majorVersion;
-    dsm->header.configVersionMinorVersion = cvd.minorVersion;
-    dsm->header.configVersionMajorVersionEnabled = entries[2].found;
-    dsm->header.configVersionMinorVersionEnabled = entries[2].found;
-    dsm->header.timestampEnabled = entries[3].found;
-    dsm->header.statusEnabled = entries[4].found;
-    if(!entries[5].found){
-        /* No payload found */
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-
-    dsm->header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    dsm->header.picoSecondsIncluded = UA_FALSE;
-    dsm->header.dataSetMessageValid = UA_TRUE;
-    dsm->header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    return ret;
-}
-
-static status
-DatasetMessage_Array_decodeJsonInternal(void *UA_RESTRICT dst, const UA_DataType *type,
-                                        CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken) {
-    /* Array! */
-    if(getJsmnType(parseCtx) != JSMN_ARRAY)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    size_t length = (size_t)parseCtx->tokenArray[parseCtx->index].size;
-
-    /* Return early for empty arrays */
-    if(length == 0)
-        return UA_STATUSCODE_GOOD;
-
-    /* Allocate memory */
-    UA_DataSetMessage *dsm = (UA_DataSetMessage*)UA_calloc(length, sizeof(UA_DataSetMessage));
-    if(dsm == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Copy new Pointer do dest */
-    memcpy(dst, &dsm, sizeof(void*));
-
-    /* We go to first Array member! */
-    parseCtx->index++;
-
-    status ret = UA_STATUSCODE_BADDECODINGERROR;
-    /* Decode array members */
-    for(size_t i = 0; i < length; ++i) {
-        ret = DatasetMessage_Payload_decodeJsonInternal(&dsm[i], NULL, ctx, parseCtx, UA_TRUE);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    return ret;
-}
-
-static status NetworkMessage_decodeJsonInternal(UA_NetworkMessage *dst, CtxJson *ctx,
-                                                ParseCtx *parseCtx) {
-    memset(dst, 0, sizeof(UA_NetworkMessage));
-    dst->chunkMessage = UA_FALSE;
-    dst->groupHeaderEnabled = UA_FALSE;
-    dst->payloadHeaderEnabled = UA_FALSE;
-    dst->picosecondsEnabled = UA_FALSE;
-    dst->promotedFieldsEnabled = UA_FALSE;
-
-    /* Look forward for publisheId, if present check if type if primitve (Number) or String. */
-    u8 publishIdTypeIndex = UA_TYPES_STRING;
-    size_t searchResultPublishIdType = 0;
-    status found = lookAheadForKey(UA_DECODEKEY_PUBLISHERID, ctx,
-                                   parseCtx, &searchResultPublishIdType);
-    if(found == UA_STATUSCODE_GOOD) {
-        jsmntok_t publishIdToken = parseCtx->tokenArray[searchResultPublishIdType];
-        if(publishIdToken.type == JSMN_PRIMITIVE) {
-            publishIdTypeIndex = UA_TYPES_UINT64;
-            dst->publisherIdType = UA_PUBLISHERDATATYPE_UINT64; //store in biggest possible
-        } else if(publishIdToken.type == JSMN_STRING) {
-            publishIdTypeIndex = UA_TYPES_STRING;
-            dst->publisherIdType = UA_PUBLISHERDATATYPE_STRING;
-        } else {
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    }
-
-    /* Is Messages an Array? How big? */
-    size_t messageCount = 0;
-    size_t searchResultMessages = 0;
-    found = lookAheadForKey(UA_DECODEKEY_MESSAGES, ctx, parseCtx, &searchResultMessages);
-    if(found != UA_STATUSCODE_GOOD)
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-    jsmntok_t bodyToken = parseCtx->tokenArray[searchResultMessages];
-    if(bodyToken.type != JSMN_ARRAY)
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-    messageCount = (size_t)parseCtx->tokenArray[searchResultMessages].size;
-
-    /* Set up custom context for the dataSetwriterId */
-    size_t currentCustomIndex = 0;
-    parseCtx->custom = (void*)UA_calloc(messageCount, sizeof(UA_UInt16));
-    parseCtx->currentCustomIndex = &currentCustomIndex;
-    parseCtx->numCustom = messageCount;
-
-    /* MessageType */
-    UA_Boolean isUaData = UA_TRUE;
-    size_t searchResultMessageType = 0;
-    found = lookAheadForKey(UA_DECODEKEY_MESSAGETYPE, ctx, parseCtx, &searchResultMessageType);
-    if(found != UA_STATUSCODE_GOOD)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    size_t size = (size_t)(parseCtx->tokenArray[searchResultMessageType].end - parseCtx->tokenArray[searchResultMessageType].start);
-    char* msgType = (char*)(ctx->pos + parseCtx->tokenArray[searchResultMessageType].start);
-    if(size == 7) { //ua-data
-        if(strncmp(msgType, "ua-data", size) != 0)
-            return UA_STATUSCODE_BADDECODINGERROR;
-        isUaData = UA_TRUE;
-    } else if(size == 11) { //ua-metadata
-        if(strncmp(msgType, "ua-metadata", size) != 0)
-            return UA_STATUSCODE_BADDECODINGERROR;
-        isUaData = UA_FALSE;
-    } else {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-
-    //TODO: MetaData
-    if(!isUaData)
-        return UA_STATUSCODE_BADNOTIMPLEMENTED;
-        
-    /* Network Message */
-    UA_String messageType;
-    DecodeEntry entries[5] = {
-        {UA_DECODEKEY_MESSAGEID, &dst->messageId, getDecodeSignature(UA_TYPES_STRING), false, NULL},
-        {UA_DECODEKEY_MESSAGETYPE, &messageType, NULL, false, NULL},
-        {UA_DECODEKEY_PUBLISHERID, &dst->publisherId.publisherIdString, getDecodeSignature(publishIdTypeIndex), false, NULL},
-        {UA_DECODEKEY_DATASETCLASSID, &dst->dataSetClassId, getDecodeSignature(UA_TYPES_GUID), false, NULL},
-        {UA_DECODEKEY_MESSAGES, &dst->payload.dataSetPayload.dataSetMessages, &DatasetMessage_Array_decodeJsonInternal, false, NULL}
-    };
-
-    //Store publisherId in correct union
-    if(publishIdTypeIndex == UA_TYPES_UINT64)
-        entries[2].fieldPointer = &dst->publisherId.publisherIdUInt64;
-
-    status ret = decodeFields(ctx, parseCtx, entries, 5, NULL);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    dst->messageIdEnabled = entries[0].found;
-    dst->publisherIdEnabled = entries[2].found;
-    if(dst->publisherIdEnabled)
-        dst->publisherIdType = UA_PUBLISHERDATATYPE_STRING;
-    dst->dataSetClassIdEnabled = entries[3].found;
-    dst->payloadHeaderEnabled = UA_TRUE;
-    dst->payloadHeader.dataSetPayloadHeader.count = (UA_Byte)messageCount;
-
-    //Set the dataSetWriterIds. They are filled in the dataSet decoding.
-    dst->payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16*)parseCtx->custom;
-    return ret;
-}
-
-status UA_NetworkMessage_decodeJson(UA_NetworkMessage *dst, const UA_ByteString *src){
-    /* Set up the context */
-    CtxJson ctx;
-    memset(&ctx, 0, sizeof(CtxJson));
-    ParseCtx parseCtx;
-    memset(&parseCtx, 0, sizeof(ParseCtx));
-    parseCtx.tokenArray = (jsmntok_t*)UA_malloc(sizeof(jsmntok_t) * UA_JSON_MAXTOKENCOUNT);
-    memset(parseCtx.tokenArray, 0, sizeof(jsmntok_t) * UA_JSON_MAXTOKENCOUNT);
-    status ret = tokenize(&parseCtx, &ctx, src);
-    if(ret != UA_STATUSCODE_GOOD){
-        return ret;
-    }
-    ret = NetworkMessage_decodeJsonInternal(dst, &ctx, &parseCtx);
-    UA_free(parseCtx.tokenArray);
-    return ret;
-}
diff --git a/ext/open62541/src/pubsub/ua_pubsub_ns0.c b/ext/open62541/src/pubsub/ua_pubsub_ns0.c
deleted file mode 100644
index 66ac573..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_ns0.c
+++ /dev/null
@@ -1,1153 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-#include "ua_pubsub_ns0.h"
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL /* conditional compilation */
-
-typedef struct{
-    UA_NodeId parentNodeId;
-    UA_UInt32 parentClassifier;
-    UA_UInt32 elementClassiefier;
-} UA_NodePropertyContext;
-
-//Prototypes
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode addWriterGroupAction(UA_Server *server,
-                                          const UA_NodeId *sessionId, void *sessionHandle,
-                                          const UA_NodeId *methodId, void *methodContext,
-                                          const UA_NodeId *objectId, void *objectContext,
-                                          size_t inputSize, const UA_Variant *input,
-                                          size_t outputSize, UA_Variant *output);
-static UA_StatusCode removeGroupAction(UA_Server *server,
-                                          const UA_NodeId *sessionId, void *sessionHandle,
-                                          const UA_NodeId *methodId, void *methodContext,
-                                          const UA_NodeId *objectId, void *objectContext,
-                                          size_t inputSize, const UA_Variant *input,
-                                          size_t outputSize, UA_Variant *output);
-static UA_StatusCode addDataSetWriterAction(UA_Server *server,
-                                          const UA_NodeId *sessionId, void *sessionHandle,
-                                          const UA_NodeId *methodId, void *methodContext,
-                                          const UA_NodeId *objectId, void *objectContext,
-                                          size_t inputSize, const UA_Variant *input,
-                                          size_t outputSize, UA_Variant *output);
-
-#endif
-
-static UA_StatusCode
-addPubSubObjectNode(UA_Server *server, char* name, UA_UInt32 objectid,
-              UA_UInt32 parentid, UA_UInt32 referenceid, UA_UInt32 type_id) {
-    UA_ObjectAttributes object_attr = UA_ObjectAttributes_default;
-    object_attr.displayName = UA_LOCALIZEDTEXT("", name);
-    return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid),
-                                   UA_NODEID_NUMERIC(0, parentid),
-                                   UA_NODEID_NUMERIC(0, referenceid),
-                                   UA_QUALIFIEDNAME(0, name),
-                                   UA_NODEID_NUMERIC(0, type_id),
-                                   object_attr, NULL, NULL);
-}
-
-static UA_StatusCode
-writePubSubNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v,
-                      size_t length, const UA_DataType *type) {
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setArray(&var, v, length, type);
-    return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var);
-}
-
-static UA_NodeId
-findSingleChildNode(UA_Server *server, UA_QualifiedName targetName,
-                    UA_NodeId referenceTypeId, UA_NodeId startingNode){
-    UA_NodeId resultNodeId;
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = referenceTypeId;
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = targetName;
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = startingNode;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-    UA_BrowsePathResult bpr =
-            UA_Server_translateBrowsePathToNodeIds(server, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD ||
-       bpr.targetsSize < 1)
-        return UA_NODEID_NULL;
-    if(UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, &resultNodeId) != UA_STATUSCODE_GOOD){
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return UA_NODEID_NULL;
-    }
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return resultNodeId;
-}
-
-static void
-onRead(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-       const UA_NodeId *nodeid, void *context,
-       const UA_NumericRange *range, const UA_DataValue *data) {
-    UA_Variant value;
-    UA_Variant_init(&value);
-    const UA_NodePropertyContext *nodeContext = (const UA_NodePropertyContext*)context;
-    const UA_NodeId *myNodeId = &nodeContext->parentNodeId;
-
-    switch(nodeContext->parentClassifier){
-    case UA_NS0ID_PUBSUBCONNECTIONTYPE: {
-        UA_PubSubConnection *pubSubConnection =
-            UA_PubSubConnection_findConnectionbyId(server, *myNodeId);
-        switch(nodeContext->elementClassiefier) {
-        case UA_NS0ID_PUBSUBCONNECTIONTYPE_PUBLISHERID:
-            if(pubSubConnection->config->publisherIdType == UA_PUBSUB_PUBLISHERID_STRING) {
-                UA_Variant_setScalar(&value, &pubSubConnection->config->publisherId.numeric,
-                                     &UA_TYPES[UA_TYPES_STRING]);
-            } else {
-                UA_Variant_setScalar(&value, &pubSubConnection->config->publisherId.numeric,
-                                     &UA_TYPES[UA_TYPES_UINT32]);
-            }
-            break;
-        default:
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "Read error! Unknown property.");
-        }
-        break;
-    }
-    case UA_NS0ID_WRITERGROUPTYPE: {
-        UA_WriterGroup *writerGroup = UA_WriterGroup_findWGbyId(server, *myNodeId);
-        if(!writerGroup)
-            return;
-        switch(nodeContext->elementClassiefier){
-        case UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL:
-            UA_Variant_setScalar(&value, &writerGroup->config.publishingInterval,
-                                 &UA_TYPES[UA_TYPES_DURATION]);
-            break;
-        default:
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "Read error! Unknown property.");
-        }
-        break;
-    }
-    case UA_NS0ID_PUBLISHEDDATAITEMSTYPE: {
-        UA_PublishedDataSet *publishedDataSet = UA_PublishedDataSet_findPDSbyId(server, *myNodeId);
-        if(!publishedDataSet)
-            return;
-        switch(nodeContext->elementClassiefier) {
-        case UA_NS0ID_PUBLISHEDDATAITEMSTYPE_PUBLISHEDDATA: {
-            UA_PublishedVariableDataType *pvd = (UA_PublishedVariableDataType *)
-                UA_calloc(publishedDataSet->fieldSize, sizeof(UA_PublishedVariableDataType));
-            size_t counter = 0;
-            UA_DataSetField *field;
-            LIST_FOREACH(field, &publishedDataSet->fields, listEntry) {
-                pvd[counter].attributeId = UA_ATTRIBUTEID_VALUE;
-                pvd[counter].publishedVariable = field->config.field.variable.publishParameters.publishedVariable;
-                //UA_NodeId_copy(&field->config.field.variable.publishParameters.publishedVariable, &pvd[counter].publishedVariable);
-                counter++;
-            }
-            UA_Variant_setArray(&value, pvd, publishedDataSet->fieldSize,
-                                &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]);
-            break;
-        }
-        case UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETMETADATA: {
-            UA_Variant_setScalarCopy(&value, &publishedDataSet->dataSetMetaData, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]);
-            break;
-        }
-        case UA_NS0ID_PUBLISHEDDATAITEMSTYPE_CONFIGURATIONVERSION: {
-            UA_Variant_setScalarCopy(&value, &publishedDataSet->dataSetMetaData.configurationVersion,
-                                     &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE]);
-            break;
-        }
-        default:
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "Read error! Unknown property.");
-        }
-        break;
-    }
-    default:
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Read error! Unknown parent element.");
-    }
-    UA_Server_writeValue(server, *nodeid, value);
-}
-
-static void
-onWrite(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-        const UA_NodeId *nodeId, void *nodeContext,
-        const UA_NumericRange *range, const UA_DataValue *data){
-    UA_Variant value;
-    UA_NodeId myNodeId;
-    UA_WriterGroup *writerGroup = NULL;
-    switch(((UA_NodePropertyContext *) nodeContext)->parentClassifier){
-        case UA_NS0ID_PUBSUBCONNECTIONTYPE:
-            //no runtime writable attributes
-            break;
-        case UA_NS0ID_WRITERGROUPTYPE:
-            myNodeId = ((UA_NodePropertyContext *) nodeContext)->parentNodeId;
-            writerGroup = UA_WriterGroup_findWGbyId(server, myNodeId);
-            UA_WriterGroupConfig writerGroupConfig;
-            memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-            if(!writerGroup)
-                return;
-            switch(((UA_NodePropertyContext *) nodeContext)->elementClassiefier){
-                case UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL:
-                    UA_Server_getWriterGroupConfig(server, writerGroup->identifier, &writerGroupConfig);
-                    writerGroupConfig.publishingInterval = *((UA_Duration *) data->value.data);
-                    UA_Server_updateWriterGroupConfig(server, writerGroup->identifier, &writerGroupConfig);
-                    UA_Variant_setScalar(&value, data->value.data, &UA_TYPES[UA_TYPES_DURATION]);
-                    UA_WriterGroupConfig_deleteMembers(&writerGroupConfig);
-                    break;
-                default:
-                    UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                                   "Write error! Unknown property element.");
-            }
-            break;
-        default:
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "Read error! Unknown parent element.");
-    }
-}
-
-static UA_StatusCode
-addVariableValueSource(UA_Server *server, UA_ValueCallback valueCallback,
-                       UA_NodeId node, UA_NodePropertyContext *context){
-    UA_Server_setNodeContext(server, node, context);
-    return UA_Server_setVariableNode_valueCallback(server, node, valueCallback);
-}
-
-/*************************************************/
-/*            PubSubConnection                   */
-/*************************************************/
-UA_StatusCode
-addPubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(connection->config->name.length > 512)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    UA_STACKARRAY(char, connectionName, sizeof(char) * connection->config->name.length +1);
-    memcpy(connectionName, connection->config->name.data, connection->config->name.length);
-    connectionName[connection->config->name.length] = '\0';
-    //This code block must use a lock
-    UA_Nodestore_removeNode(server->nsCtx, &connection->identifier);
-    UA_NodeId pubSubConnectionNodeId;
-    UA_ObjectAttributes attr = UA_ObjectAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("de-DE", connectionName);
-    retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,
-                                      UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric),
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE),
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_HASPUBSUBCONNECTION),
-                                      UA_QUALIFIEDNAME(0, connectionName),
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE),
-                                      (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],
-                                      NULL, &pubSubConnectionNodeId);
-    addPubSubObjectNode(server, "Address", connection->identifier.identifier.numeric+1,
-                        pubSubConnectionNodeId.identifier.numeric,  UA_NS0ID_HASCOMPONENT,
-                        UA_NS0ID_NETWORKADDRESSURLTYPE);
-    UA_Server_addNode_finish(server, pubSubConnectionNodeId);
-    //End lock zone
-
-    UA_NodeId addressNode, urlNode, interfaceNode, publisherIdNode, connectionPropertieNode, transportProfileUri;
-    addressNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Address"),
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                      UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric));
-    urlNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Url"),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), addressNode);
-    interfaceNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkInterface"),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), addressNode);
-    publisherIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                        UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric));
-    connectionPropertieNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConnectionProperties"),
-                                                 UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                                 UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric));
-    transportProfileUri = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "TransportProfileUri"),
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                          UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric));
-
-    if(UA_NodeId_equal(&addressNode, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&urlNode, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&interfaceNode, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&publisherIdNode, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&connectionPropertieNode, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&transportProfileUri, &UA_NODEID_NULL)) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    retVal |= writePubSubNs0VariableArray(server, connectionPropertieNode.identifier.numeric,
-                                          connection->config->connectionProperties,
-                                          connection->config->connectionPropertiesSize,
-                                          &UA_TYPES[UA_TYPES_KEYVALUEPAIR]);
-
-    UA_NetworkAddressUrlDataType *networkAddressUrlDataType = ((UA_NetworkAddressUrlDataType *) connection->config->address.data);
-    UA_Variant value;
-    UA_Variant_init(&value);
-    UA_Variant_setScalar(&value, &networkAddressUrlDataType->url, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_writeValue(server, urlNode, value);
-    UA_Variant_setScalar(&value, &networkAddressUrlDataType->networkInterface, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_writeValue(server, interfaceNode, value);
-    UA_Variant_setScalar(&value, &connection->config->transportProfileUri, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Server_writeValue(server, transportProfileUri, value);
-
-    UA_NodePropertyContext *connectionPublisherIdContext = (UA_NodePropertyContext *) UA_malloc(sizeof(UA_NodePropertyContext));
-    connectionPublisherIdContext->parentNodeId = connection->identifier;
-    connectionPublisherIdContext->parentClassifier = UA_NS0ID_PUBSUBCONNECTIONTYPE;
-    connectionPublisherIdContext->elementClassiefier = UA_NS0ID_PUBSUBCONNECTIONTYPE_PUBLISHERID;
-    UA_ValueCallback valueCallback;
-    valueCallback.onRead = onRead;
-    valueCallback.onWrite = NULL;
-    retVal |= addVariableValueSource(server, valueCallback, publisherIdNode, connectionPublisherIdContext);
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-    retVal |= UA_Server_addReference(server, connection->identifier,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP), true);
-    retVal |= UA_Server_addReference(server, connection->identifier,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP), true);
-    retVal |= UA_Server_addReference(server, connection->identifier,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP), true);
-#endif
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addPubSubConnectionAction(UA_Server *server,
-                          const UA_NodeId *sessionId, void *sessionHandle,
-                          const UA_NodeId *methodId, void *methodContext,
-                          const UA_NodeId *objectId, void *objectContext,
-                          size_t inputSize, const UA_Variant *input,
-                          size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_PubSubConnectionDataType pubSubConnectionDataType = *((UA_PubSubConnectionDataType *) input[0].data);
-    UA_NetworkAddressUrlDataType networkAddressUrlDataType;
-    memset(&networkAddressUrlDataType, 0, sizeof(networkAddressUrlDataType));
-    UA_ExtensionObject eo = pubSubConnectionDataType.address;
-    if(eo.encoding == UA_EXTENSIONOBJECT_DECODED){
-        if(eo.content.decoded.type == &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]){
-            if(UA_NetworkAddressUrlDataType_copy((UA_NetworkAddressUrlDataType *) eo.content.decoded.data,
-                                                 &networkAddressUrlDataType) != UA_STATUSCODE_GOOD){
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-            }
-        }
-    }
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.transportProfileUri = pubSubConnectionDataType.transportProfileUri;
-    connectionConfig.name = pubSubConnectionDataType.name;
-    //TODO set real connection state
-    connectionConfig.enabled = pubSubConnectionDataType.enabled;
-    //connectionConfig.enabled = pubSubConnectionDataType.enabled;
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrlDataType,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    if(pubSubConnectionDataType.publisherId.type == &UA_TYPES[UA_TYPES_UINT32]){
-        connectionConfig.publisherId.numeric = * ((UA_UInt32 *) pubSubConnectionDataType.publisherId.data);
-    } else if(pubSubConnectionDataType.publisherId.type == &UA_TYPES[UA_TYPES_STRING]){
-        connectionConfig.publisherIdType = UA_PUBSUB_PUBLISHERID_STRING;
-        UA_String_copy((UA_String *) pubSubConnectionDataType.publisherId.data, &connectionConfig.publisherId.string);
-    } else {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, "Unsupported PublisherId Type used.");
-        //TODO what's the best default behaviour here?
-        connectionConfig.publisherId.numeric = 0;
-    }
-    //call API function and create the connection
-    UA_NodeId connectionId;
-
-    retVal |= UA_Server_addPubSubConnection(server, &connectionConfig, &connectionId);
-
-    if(retVal != UA_STATUSCODE_GOOD){
-        return retVal;
-    }
-    for(size_t i = 0; i < pubSubConnectionDataType.writerGroupsSize; i++){
-        //UA_PubSubConnection_addWriterGroup(server, UA_NODEID_NULL, NULL, NULL);
-    }
-    for(size_t i = 0; i < pubSubConnectionDataType.readerGroupsSize; i++){
-        //UA_Server_addReaderGroup(server, NULL, NULL, NULL);
-    }
-    UA_NetworkAddressUrlDataType_deleteMembers(&networkAddressUrlDataType);
-    //set ouput value
-    UA_Variant_setScalarCopy(output, &connectionId, &UA_TYPES[UA_TYPES_NODEID]);
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-UA_StatusCode
-removePubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-    retVal |= UA_Server_deleteReference(server, connection->identifier, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP),
-                                        false);
-    retVal |= UA_Server_deleteReference(server, connection->identifier, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP),
-                                        false);
-    retVal |= UA_Server_deleteReference(server, connection->identifier, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP),
-                                        false);
-#endif
-    retVal |= UA_Server_deleteNode(server, connection->identifier, true);
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-removeConnectionAction(UA_Server *server,
-                       const UA_NodeId *sessionId, void *sessionHandle,
-                       const UA_NodeId *methodId, void *methodContext,
-                       const UA_NodeId *objectId, void *objectContext,
-                       size_t inputSize, const UA_Variant *input,
-                       size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data);
-    retVal |= UA_Server_removePubSubConnection(server, nodeToRemove);
-    if(retVal == UA_STATUSCODE_BADNOTFOUND)
-        retVal = UA_STATUSCODE_BADNODEIDUNKNOWN;
-    return retVal;
-}
-#endif
-
-/**********************************************/
-/*               DataSetReader                */
-/**********************************************/
-UA_StatusCode
-addDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader){
-    //TODO implement reader part
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addDataSetReaderAction(UA_Server *server,
-                       const UA_NodeId *sessionId, void *sessionHandle,
-                       const UA_NodeId *methodId, void *methodContext,
-                       const UA_NodeId *objectId, void *objectContext,
-                       size_t inputSize, const UA_Variant *input,
-                       size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_BADNOTIMPLEMENTED;
-    //TODO implement reader part
-    return retVal;
-}
-#endif
-
-UA_StatusCode
-removeDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader* dataSetReader){
-    //TODO implement reader part
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-removeDataSetReaderAction(UA_Server *server,
-                          const UA_NodeId *sessionId, void *sessionHandle,
-                          const UA_NodeId *methodId, void *methodContext,
-                          const UA_NodeId *objectId, void *objectContext,
-                          size_t inputSize, const UA_Variant *input,
-                          size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_BADNOTIMPLEMENTED;
-    //TODO implement reader part
-    return retVal;
-}
-#endif
-
-/*************************************************/
-/*                PublishedDataSet               */
-/*************************************************/
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addDataSetFolderAction(UA_Server *server,
-                       const UA_NodeId *sessionId, void *sessionHandle,
-                       const UA_NodeId *methodId, void *methodContext,
-                       const UA_NodeId *objectId, void *objectContext,
-                       size_t inputSize, const UA_Variant *input,
-                       size_t outputSize, UA_Variant *output){
-    /* defined in R 1.04 9.1.4.5.7 */
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_String newFolderName = *((UA_String *) input[0].data);
-    UA_NodeId generatedId;
-    UA_ObjectAttributes objectAttributes = UA_ObjectAttributes_default;
-    UA_LocalizedText name = {UA_STRING("en-US"), newFolderName};
-    objectAttributes.displayName = name;
-    retVal |= UA_Server_addObjectNode(server, UA_NODEID_NULL, *objectId, UA_NODEID_NUMERIC(0,UA_NS0ID_ORGANIZES),
-                                      UA_QUALIFIEDNAME(0, "DataSetFolder"), UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE),
-                                      objectAttributes, NULL, &generatedId);
-    UA_Variant_setScalarCopy(output, &generatedId, &UA_TYPES[UA_TYPES_NODEID]);
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-    retVal |= UA_Server_addReference(server, generatedId,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), true);
-    retVal |= UA_Server_addReference(server, generatedId,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), true);
-    retVal |= UA_Server_addReference(server, generatedId,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), true);
-    retVal |= UA_Server_addReference(server, generatedId,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), true);
-#endif
-    return retVal;
-}
-#endif
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-removeDataSetFolderAction(UA_Server *server,
-                          const UA_NodeId *sessionId, void *sessionHandle,
-                          const UA_NodeId *methodId, void *methodContext,
-                          const UA_NodeId *objectId, void *objectContext,
-                          size_t inputSize, const UA_Variant *input,
-                          size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data);
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-    retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS),
-                                        false);
-    retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET),
-                                        false);
-    retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER),
-                                        false);
-    retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER),
-                                        false);
-#endif
-    retVal |= UA_Server_deleteNode(server, nodeToRemove, false);
-    return retVal;
-}
-#endif
-
-UA_StatusCode
-addPublishedDataItemsRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(publishedDataSet->config.name.length > 512)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    UA_STACKARRAY(char, pdsName, sizeof(char) * publishedDataSet->config.name.length +1);
-    memcpy(pdsName, publishedDataSet->config.name.data, publishedDataSet->config.name.length);
-    pdsName[publishedDataSet->config.name.length] = '\0';
-    //This code block must use a lock
-    UA_Nodestore_removeNode(server->nsCtx, &publishedDataSet->identifier);
-    retVal |= addPubSubObjectNode(server, pdsName, publishedDataSet->identifier.identifier.numeric,
-                                  UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS,
-                                  UA_NS0ID_HASPROPERTY, UA_NS0ID_PUBLISHEDDATAITEMSTYPE);
-    //End lock zone
-
-    UA_ValueCallback valueCallback;
-    valueCallback.onRead = onRead;
-    valueCallback.onWrite = NULL;
-
-    UA_NodeId configurationVersionNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConfigurationVersion"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, publishedDataSet->identifier.identifier.numeric));
-    if(UA_NodeId_equal(&configurationVersionNode, &UA_NODEID_NULL))
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_NodePropertyContext * configurationVersionContext = (UA_NodePropertyContext *)
-        UA_malloc(sizeof(UA_NodePropertyContext));
-    configurationVersionContext->parentNodeId = publishedDataSet->identifier;
-    configurationVersionContext->parentClassifier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE;
-    configurationVersionContext->elementClassiefier =
-        UA_NS0ID_PUBLISHEDDATAITEMSTYPE_CONFIGURATIONVERSION;
-    retVal |= addVariableValueSource(server, valueCallback, configurationVersionNode,
-                                     configurationVersionContext);
-
-    UA_NodeId publishedDataNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishedData"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, publishedDataSet->identifier.identifier.numeric));
-    if(UA_NodeId_equal(&publishedDataNode, &UA_NODEID_NULL))
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_NodePropertyContext * publishingIntervalContext = (UA_NodePropertyContext *)
-        UA_malloc(sizeof(UA_NodePropertyContext));
-    publishingIntervalContext->parentNodeId = publishedDataSet->identifier;
-    publishingIntervalContext->parentClassifier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE;
-    publishingIntervalContext->elementClassiefier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE_PUBLISHEDDATA;
-    retVal |= addVariableValueSource(server, valueCallback, publishedDataNode,
-                                     publishingIntervalContext);
-
-    UA_NodeId dataSetMetaDataNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, publishedDataSet->identifier.identifier.numeric));
-    if(UA_NodeId_equal(&dataSetMetaDataNode, &UA_NODEID_NULL))
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_NodePropertyContext *metaDataContext = (UA_NodePropertyContext *)
-        UA_malloc(sizeof(UA_NodePropertyContext));
-    metaDataContext->parentNodeId = publishedDataSet->identifier;
-    metaDataContext->parentClassifier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE;
-    metaDataContext->elementClassiefier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETMETADATA;
-    retVal |= addVariableValueSource(server, valueCallback, dataSetMetaDataNode, metaDataContext);
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-    retVal |= UA_Server_addReference(server, publishedDataSet->identifier,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES), true);
-    retVal |= UA_Server_addReference(server, publishedDataSet->identifier,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES), true);
-#endif
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addPublishedDataItemsAction(UA_Server *server,
-                            const UA_NodeId *sessionId, void *sessionHandle,
-                            const UA_NodeId *methodId, void *methodContext,
-                            const UA_NodeId *objectId, void *objectContext,
-                            size_t inputSize, const UA_Variant *input,
-                            size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    size_t fieldNameAliasesSize = input[1].arrayLength;
-    UA_String * fieldNameAliases = (UA_String *) input[1].data;
-    size_t fieldFlagsSize = input[2].arrayLength;
-    UA_DataSetFieldFlags * fieldFlags = (UA_DataSetFieldFlags *) input[2].data;
-    size_t variablesToAddSize = input[3].arrayLength;
-    UA_PublishedVariableDataType *variablesToAddField = (UA_PublishedVariableDataType *) input[3].data;
-
-    if(!(fieldNameAliasesSize == fieldFlagsSize || fieldFlagsSize == variablesToAddSize))
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    UA_PublishedDataSetConfig publishedDataSetConfig;
-    memset(&publishedDataSetConfig, 0, sizeof(publishedDataSetConfig));
-    publishedDataSetConfig.name = *((UA_String *) input[0].data);
-    publishedDataSetConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-
-    UA_NodeId dataSetItemsNodeId;
-    retVal |= UA_Server_addPublishedDataSet(server, &publishedDataSetConfig, &dataSetItemsNodeId).addResult;
-
-    UA_DataSetFieldConfig dataSetFieldConfig;
-    for(size_t j = 0; j < variablesToAddSize; ++j) {
-        memset(&dataSetFieldConfig, 0, sizeof(dataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = fieldNameAliases[j];
-        if(fieldFlags[j] == UA_DATASETFIELDFLAGS_PROMOTEDFIELD){
-            dataSetFieldConfig.field.variable.promotedField = UA_TRUE;
-        }
-        dataSetFieldConfig.field.variable.publishParameters = variablesToAddField[j];
-        UA_Server_addDataSetField(server, dataSetItemsNodeId, &dataSetFieldConfig, NULL);
-    }
-    UA_PublishedVariableDataType_clear(variablesToAddField);
-    return retVal;
-}
-#endif
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addVariablesAction(UA_Server *server,
-                   const UA_NodeId *sessionId, void *sessionHandle,
-                   const UA_NodeId *methodId, void *methodContext,
-                   const UA_NodeId *objectId, void *objectContext,
-                   size_t inputSize, const UA_Variant *input,
-                   size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-
-    return retVal;
-}
-
-static UA_StatusCode
-removeVariablesAction(UA_Server *server,
-                      const UA_NodeId *sessionId, void *sessionHandle,
-                      const UA_NodeId *methodId, void *methodContext,
-                      const UA_NodeId *objectId, void *objectContext,
-                      size_t inputSize, const UA_Variant *input,
-                      size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-
-    return retVal;
-}
-#endif
-
-
-UA_StatusCode
-removePublishedDataSetRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    retVal |= UA_Server_deleteNode(server, publishedDataSet->identifier, false);
-
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-removePublishedDataSetAction(UA_Server *server,
-                             const UA_NodeId *sessionId, void *sessionHandle,
-                             const UA_NodeId *methodId, void *methodContext,
-                             const UA_NodeId *objectId, void *objectContext,
-                             size_t inputSize, const UA_Variant *input,
-                             size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data);
-    retVal |= UA_Server_removePublishedDataSet(server, nodeToRemove);
-    return retVal;
-}
-#endif
-
-/**********************************************/
-/*               WriterGroup                  */
-/**********************************************/
-
-static UA_StatusCode
-readContentMask(UA_Server *server, const UA_NodeId *sessionId,
-                void *sessionContext, const UA_NodeId *nodeId,
-                void *nodeContext, UA_Boolean includeSourceTimeStamp,
-                const UA_NumericRange *range, UA_DataValue *value) {
-    UA_WriterGroup *writerGroup = (UA_WriterGroup*)nodeContext;
-    if((writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED &&
-        writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) ||
-       writerGroup->config.messageSettings.content.decoded.type !=
-       &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE])
-        return UA_STATUSCODE_BADINTERNALERROR;
-    UA_UadpWriterGroupMessageDataType *wgm = (UA_UadpWriterGroupMessageDataType*)
-        writerGroup->config.messageSettings.content.decoded.data;
-
-    UA_Variant_setScalarCopy(&value->value, &wgm->networkMessageContentMask,
-                             &UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK]);
-    value->hasValue = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeContentMask(UA_Server *server, const UA_NodeId *sessionId,
-                 void *sessionContext, const UA_NodeId *nodeId,
-                 void *nodeContext, const UA_NumericRange *range,
-                 const UA_DataValue *value) {
-    UA_WriterGroup *writerGroup = (UA_WriterGroup*)nodeContext;
-    if((writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED &&
-        writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) ||
-       writerGroup->config.messageSettings.content.decoded.type !=
-       &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE])
-        return UA_STATUSCODE_BADINTERNALERROR;
-    UA_UadpWriterGroupMessageDataType *wgm = (UA_UadpWriterGroupMessageDataType*)
-        writerGroup->config.messageSettings.content.decoded.data;
-
-    if(!value->value.type)
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-    if(value->value.type->typeKind != UA_DATATYPEKIND_ENUM &&
-       value->value.type->typeKind != UA_DATATYPEKIND_INT32)
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    wgm->networkMessageContentMask = *(UA_UadpNetworkMessageContentMask*)value->value.data;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-addWriterGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(writerGroup->config.name.length > 512)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    UA_STACKARRAY(char, wgName, sizeof(char) * writerGroup->config.name.length + 1);
-    memcpy(wgName, writerGroup->config.name.data, writerGroup->config.name.length);
-    wgName[writerGroup->config.name.length] = '\0';
-    //This code block must use a lock
-    UA_Nodestore_removeNode(server->nsCtx, &writerGroup->identifier);
-    retVal |= addPubSubObjectNode(server, wgName, writerGroup->identifier.identifier.numeric,
-                                  writerGroup->linkedConnection.identifier.numeric,
-                                  UA_NS0ID_HASCOMPONENT, UA_NS0ID_WRITERGROUPTYPE);
-    //End lock zone
-    UA_NodeId keepAliveNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "KeepAliveTime"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric));
-    UA_NodeId publishingIntervalNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric));
-    if(UA_NodeId_equal(&keepAliveNode, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&publishingIntervalNode, &UA_NODEID_NULL))
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    UA_NodePropertyContext * publishingIntervalContext = (UA_NodePropertyContext *)
-        UA_malloc(sizeof(UA_NodePropertyContext));
-    publishingIntervalContext->parentNodeId = writerGroup->identifier;
-    publishingIntervalContext->parentClassifier = UA_NS0ID_WRITERGROUPTYPE;
-    publishingIntervalContext->elementClassiefier = UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL;
-    UA_ValueCallback valueCallback;
-    valueCallback.onRead = onRead;
-    valueCallback.onWrite = onWrite;
-    retVal |= addVariableValueSource(server, valueCallback,
-                                     publishingIntervalNode, publishingIntervalContext);
-    UA_Server_writeAccessLevel(server, publishingIntervalNode,
-                               UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE);
-
-    UA_NodeId priorityNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Priority"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric));
-    UA_NodeId writerGroupIdNode =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "WriterGroupId"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                            UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric));
-    UA_Variant value;
-    UA_Variant_init(&value);
-    UA_Variant_setScalar(&value, &writerGroup->config.publishingInterval, &UA_TYPES[UA_TYPES_DURATION]);
-    UA_Server_writeValue(server, publishingIntervalNode, value);
-    UA_Variant_setScalar(&value, &writerGroup->config.keepAliveTime, &UA_TYPES[UA_TYPES_DURATION]);
-    UA_Server_writeValue(server, keepAliveNode, value);
-    UA_Variant_setScalar(&value, &writerGroup->config.priority, &UA_TYPES[UA_TYPES_BYTE]);
-    UA_Server_writeValue(server, priorityNode, value);
-    UA_Variant_setScalar(&value, &writerGroup->config.writerGroupId, &UA_TYPES[UA_TYPES_UINT16]);
-    UA_Server_writeValue(server, writerGroupIdNode, value);
-
-    retVal |= addPubSubObjectNode(server, "MessageSettings", 0,
-                                  writerGroup->identifier.identifier.numeric,
-                                  UA_NS0ID_HASCOMPONENT, UA_NS0ID_UADPWRITERGROUPMESSAGETYPE);
-
-    /* Find the variable with the content mask */
-
-    UA_NodeId messageSettingsId =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "MessageSettings"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric));
-    UA_NodeId contentMaskId =
-        findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkMessageContentMask"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), messageSettingsId);
-    if(UA_NodeId_equal(&messageSettingsId, &UA_NODEID_NULL) ||
-       UA_NodeId_equal(&contentMaskId, &UA_NODEID_NULL)) {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-
-    /* Set the callback */
-    UA_DataSource ds;
-    ds.read = readContentMask;
-    ds.write = writeContentMask;
-    UA_Server_setVariableNode_dataSource(server, contentMaskId, ds);
-    UA_Server_setNodeContext(server, contentMaskId, writerGroup);
-
-    /* Make writable */
-    UA_Server_writeAccessLevel(server, contentMaskId,
-                               UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_READ);
-
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addWriterGroupAction(UA_Server *server,
-                             const UA_NodeId *sessionId, void *sessionHandle,
-                             const UA_NodeId *methodId, void *methodContext,
-                             const UA_NodeId *objectId, void *objectContext,
-                             size_t inputSize, const UA_Variant *input,
-                             size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_WriterGroupDataType *writerGroupDataType = ((UA_WriterGroupDataType *) input[0].data);
-    UA_NodeId generatedId;
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig));
-    writerGroupConfig.name = writerGroupDataType->name;
-    writerGroupConfig.publishingInterval = writerGroupDataType->publishingInterval;
-    writerGroupConfig.writerGroupId = writerGroupDataType->writerGroupId;
-    writerGroupConfig.enabled = writerGroupDataType->enabled;
-    writerGroupConfig.priority = writerGroupDataType->priority;
-    //TODO remove hard coded UADP
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    //ToDo transfer all arguments to internal WGConfiguration
-    retVal |= UA_Server_addWriterGroup(server, *objectId, &writerGroupConfig, &generatedId);
-    UA_Variant_setScalarCopy(output, &generatedId, &UA_TYPES[UA_TYPES_NODEID]);
-    return retVal;
-}
-#endif
-
-UA_StatusCode
-removeGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    retVal |= UA_Server_deleteNode(server, writerGroup->identifier, false);
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-removeGroupAction(UA_Server *server,
-                             const UA_NodeId *sessionId, void *sessionHandle,
-                             const UA_NodeId *methodId, void *methodContext,
-                             const UA_NodeId *objectId, void *objectContext,
-                             size_t inputSize, const UA_Variant *input,
-                             size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data);
-    if(UA_WriterGroup_findWGbyId(server, nodeToRemove) != NULL)
-        retVal |= UA_Server_removeWriterGroup(server, nodeToRemove);
-    //else
-        //retVal |= UA_Server_removeReaderGroup(server, nodeToRemve);
-    return retVal;
-}
-#endif
-
-/**********************************************/
-/*               ReaderGroup                  */
-/**********************************************/
-UA_StatusCode
-addReaderGroupRepresentation(UA_Server *server, UA_ReaderGroup *readerGroup){
-    //TODO implement reader part
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addReaderGroupAction(UA_Server *server,
-                     const UA_NodeId *sessionId, void *sessionHandle,
-                     const UA_NodeId *methodId, void *methodContext,
-                     const UA_NodeId *objectId, void *objectContext,
-                     size_t inputSize, const UA_Variant *input,
-                     size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    //TODO implement reader part
-    return retVal;
-}
-#endif
-
-/**********************************************/
-/*               DataSetWriter                */
-/**********************************************/
-UA_StatusCode
-addDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    if(dataSetWriter->config.name.length > 512)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    UA_STACKARRAY(char, dswName, sizeof(char) * dataSetWriter->config.name.length + 1);
-    memcpy(dswName, dataSetWriter->config.name.data, dataSetWriter->config.name.length);
-    dswName[dataSetWriter->config.name.length] = '\0';
-    //This code block must use a lock
-    UA_Nodestore_removeNode(server->nsCtx, &dataSetWriter->identifier);
-    retVal |= addPubSubObjectNode(server, dswName, dataSetWriter->identifier.identifier.numeric,
-                                  dataSetWriter->linkedWriterGroup.identifier.numeric,
-                                  UA_NS0ID_HASDATASETWRITER, UA_NS0ID_DATASETWRITERTYPE);
-    //End lock zone
-    retVal |= UA_Server_addReference(server, dataSetWriter->connectedDataSet,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETTOWRITER),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, dataSetWriter->identifier.identifier.numeric), true);
-
-
-    retVal |= addPubSubObjectNode(server, "MessageSettings", 0,
-                                  dataSetWriter->identifier.identifier.numeric,
-                                  UA_NS0ID_HASCOMPONENT, UA_NS0ID_UADPDATASETWRITERMESSAGETYPE);
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-addDataSetWriterAction(UA_Server *server,
-                       const UA_NodeId *sessionId, void *sessionHandle,
-                       const UA_NodeId *methodId, void *methodContext,
-                       const UA_NodeId *objectId, void *objectContext,
-                       size_t inputSize, const UA_Variant *input,
-                       size_t outputSize, UA_Variant *output){
-    UA_DataSetWriterDataType *dataSetWriterDataType = (UA_DataSetWriterDataType *) input[0].data;
-
-    UA_NodeId targetPDS = UA_NODEID_NULL;
-    for(size_t i = 0; i < server->pubSubManager.publishedDataSetsSize; ++i) {
-        if(UA_String_equal(&dataSetWriterDataType->dataSetName,
-                           &server->pubSubManager.publishedDataSets[i].config.name)){
-            targetPDS = server->pubSubManager.publishedDataSets[i].identifier;
-        }
-    }
-    if(UA_NodeId_isNull(&targetPDS))
-        return UA_STATUSCODE_BADPARENTNODEIDINVALID;
-
-    UA_NodeId generatedId;
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(UA_DataSetWriterConfig));
-    dataSetWriterConfig.name = dataSetWriterDataType->name;
-    dataSetWriterConfig.dataSetName = dataSetWriterDataType->dataSetName;
-    dataSetWriterConfig.keyFrameCount =  dataSetWriterDataType->keyFrameCount;
-    dataSetWriterConfig.dataSetWriterId = dataSetWriterDataType->dataSetWriterId;
-
-    UA_Server_addDataSetWriter(server, *objectId, targetPDS, &dataSetWriterConfig, &generatedId);
-    UA_Variant_setScalarCopy(output, &generatedId, &UA_TYPES[UA_TYPES_NODEID]);
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-
-UA_StatusCode
-removeDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    retVal |= UA_Server_deleteNode(server, dataSetWriter->identifier, false);
-    return retVal;
-}
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-static UA_StatusCode
-removeDataSetWriterAction(UA_Server *server,
-                          const UA_NodeId *sessionId, void *sessionHandle,
-                          const UA_NodeId *methodId, void *methodContext,
-                          const UA_NodeId *objectId, void *objectContext,
-                          size_t inputSize, const UA_Variant *input,
-                          size_t outputSize, UA_Variant *output){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data);
-    retVal |= UA_Server_removeDataSetWriter(server, nodeToRemove);
-    return retVal;
-}
-#endif
-
-/**********************************************/
-/*                Destructors                 */
-/**********************************************/
-
-static void
-connectionTypeDestructor(UA_Server *server,
-                         const UA_NodeId *sessionId, void *sessionContext,
-                         const UA_NodeId *typeId, void *typeContext,
-                         const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "Connection destructor called!");
-    UA_NodeId publisherIdNode;
-    publisherIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId);
-    UA_NodePropertyContext *internalConnectionContext;
-    UA_Server_getNodeContext(server, publisherIdNode, (void **) &internalConnectionContext);
-    if(!UA_NodeId_equal(&UA_NODEID_NULL , &publisherIdNode)){
-        UA_free(internalConnectionContext);
-    }
-
-}
-
-static void
-writerGroupTypeDestructor(UA_Server *server,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_NodeId *typeId, void *typeContext,
-                          const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "WriterGroup destructor called!");
-    UA_NodeId intervalNode;
-    intervalNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId);
-    UA_NodePropertyContext *internalConnectionContext;
-    UA_Server_getNodeContext(server, intervalNode, (void **) &internalConnectionContext);
-    if(!UA_NodeId_equal(&UA_NODEID_NULL , &intervalNode)){
-        UA_free(internalConnectionContext);
-    }
-}
-
-static void
-readerGroupTypeDestructor(UA_Server *server,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_NodeId *typeId, void *typeContext,
-                          const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "ReaderGroup destructor called!");
-}
-
-static void
-dataSetWriterTypeDestructor(UA_Server *server,
-                            const UA_NodeId *sessionId, void *sessionContext,
-                            const UA_NodeId *typeId, void *typeContext,
-                            const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "DataSetWriter destructor called!");
-}
-
-static void
-dataSetReaderTypeDestructor(UA_Server *server,
-                            const UA_NodeId *sessionId, void *sessionContext,
-                            const UA_NodeId *typeId, void *typeContext,
-                            const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "DataSetReader destructor called!");
-}
-
-static void
-publishedDataItemsTypeDestructor(UA_Server *server,
-                            const UA_NodeId *sessionId, void *sessionContext,
-                            const UA_NodeId *typeId, void *typeContext,
-                            const UA_NodeId *nodeId, void **nodeContext) {
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                "PublishedDataItems destructor called!");
-    void *childContext;
-    UA_NodeId node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishedData"),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId);
-    UA_Server_getNodeContext(server, node, (void**)&childContext);
-    if(!UA_NodeId_equal(&UA_NODEID_NULL , &node))
-        UA_free(childContext);
-
-    node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConfigurationVersion"),
-                               UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                               *nodeId);
-    UA_Server_getNodeContext(server, node, (void**)&childContext);
-    if(!UA_NodeId_equal(&UA_NODEID_NULL , &node))
-        UA_free(childContext);
-
-    node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"),
-                               UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId);
-    UA_Server_getNodeContext(server, node, (void**)&childContext);
-    if(!UA_NodeId_equal(&node, &UA_NODEID_NULL))
-        UA_free(childContext);
-}
-
-UA_StatusCode
-UA_Server_initPubSubNS0(UA_Server *server) {
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_String profileArray[1];
-    profileArray[0] = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-
-    retVal |= writePubSubNs0VariableArray(server, UA_NS0ID_PUBLISHSUBSCRIBE_SUPPORTEDTRANSPORTPROFILES,
-                                    profileArray,
-                                    1, &UA_TYPES[UA_TYPES_STRING]);
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION), addPubSubConnectionAction);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_REMOVECONNECTION), removeConnectionAction);
-    retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), true);
-    retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), true);
-    retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), true);
-    retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), true);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), addDataSetFolderAction);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), removeDataSetFolderAction);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), addPublishedDataItemsAction);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), removePublishedDataSetAction);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES), addVariablesAction);
-    retVal |= UA_Server_setMethodNode_callback(server,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES), removeVariablesAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP), addWriterGroupAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP), addReaderGroupAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP), removeGroupAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_WRITERGROUPTYPE_ADDDATASETWRITER), addDataSetWriterAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_WRITERGROUPTYPE_REMOVEDATASETWRITER), removeDataSetWriterAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_READERGROUPTYPE_ADDDATASETREADER), addDataSetReaderAction);
-    retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_READERGROUPTYPE_REMOVEDATASETREADER), removeDataSetReaderAction);
-
-#else
-    retVal |= UA_Server_deleteReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION),
-                                        false);
-    retVal |= UA_Server_deleteReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true,
-                                        UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_REMOVECONNECTION),
-                                        false);
-#endif
-    UA_NodeTypeLifecycle liveCycle;
-    liveCycle.constructor = NULL;
-    liveCycle.destructor = connectionTypeDestructor;
-    UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE), liveCycle);
-    liveCycle.destructor = writerGroupTypeDestructor;
-    UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_WRITERGROUPTYPE), liveCycle);
-    liveCycle.destructor = readerGroupTypeDestructor;
-    UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_READERGROUPTYPE), liveCycle);
-    liveCycle.destructor = dataSetWriterTypeDestructor;
-    UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETWRITERDATATYPE), liveCycle);
-    liveCycle.destructor = publishedDataItemsTypeDestructor;
-    UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE), liveCycle);
-    liveCycle.destructor = dataSetReaderTypeDestructor;
-    UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETREADERDATATYPE), liveCycle);
-
-    return retVal;
-}
-
-#endif /* UA_ENABLE_PUBSUB_INFORMATIONMODEL */
diff --git a/ext/open62541/src/pubsub/ua_pubsub_ns0.h b/ext/open62541/src/pubsub/ua_pubsub_ns0.h
deleted file mode 100644
index 7f9ec9c..0000000
--- a/ext/open62541/src/pubsub/ua_pubsub_ns0.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner)
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-#ifndef UA_PUBSUB_NS0_H_
-#define UA_PUBSUB_NS0_H_
-
-#include "server/ua_server_internal.h"
-#include "ua_pubsub.h"
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL /* conditional compilation */
-
-UA_StatusCode
-UA_Server_initPubSubNS0(UA_Server *server);
-
-UA_StatusCode
-addPubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection);
-
-UA_StatusCode
-removePubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection);
-
-UA_StatusCode
-addWriterGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup);
-
-UA_StatusCode
-addReaderGroupRepresentation(UA_Server *server, UA_ReaderGroup *readerGroup);
-
-UA_StatusCode
-removeGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup);
-
-UA_StatusCode
-addDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter);
-
-UA_StatusCode
-removeDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter);
-
-UA_StatusCode
-addPublishedDataItemsRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet);
-
-UA_StatusCode
-removePublishedDataSetRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet);
-
-UA_StatusCode
-addDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader);
-
-UA_StatusCode
-removeDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader);
-
-#endif /* UA_ENABLE_PUBSUB_INFORMATIONMODEL */
-
-_UA_END_DECLS
-
-#endif /* UA_PUBSUB_NS0_H_ */
diff --git a/ext/open62541/src/server/ua_discovery_manager.c b/ext/open62541/src/server/ua_discovery_manager.c
deleted file mode 100644
index 5024142..0000000
--- a/ext/open62541/src/server/ua_discovery_manager.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015-2016, 2019 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Julian Grothoff
- */
-
-#include "ua_server_internal.h"
-
-#ifdef UA_ENABLE_DISCOVERY
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-#ifndef IN_ZERONET
-#define IN_ZERONET(addr) ((addr & IN_CLASSA_NET) == 0)
-#endif
-
-/* Create multicast 224.0.0.251:5353 socket */
-static UA_SOCKET
-discovery_createMulticastSocket(UA_Server* server) {
-    UA_SOCKET s;
-    int flag = 1, ittl = 255;
-    struct sockaddr_in in;
-    struct ip_mreq mc;
-    char ttl = (char)255; // publish to complete net, not only subnet. See:
-                          // https://docs.oracle.com/cd/E23824_01/html/821-1602/sockets-137.html
-
-    memset(&in, 0, sizeof(in));
-    in.sin_family = AF_INET;
-    in.sin_port = htons(5353);
-    in.sin_addr.s_addr = 0;
-
-    if((s = UA_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == UA_INVALID_SOCKET)
-        return UA_INVALID_SOCKET;
-
-#ifdef SO_REUSEPORT
-    UA_setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char *)&flag, sizeof(flag));
-#endif
-    UA_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(flag));
-    if(UA_bind(s, (struct sockaddr *)&in, sizeof(in))) {
-        UA_close(s);
-        return UA_INVALID_SOCKET;
-    }
-
-    /* Custom outbound multicast interface */
-    size_t length = server->config.discovery.mdnsInterfaceIP.length;
-    if(length > 0){
-        char* interfaceName = (char*)UA_malloc(length+1);
-        if (!interfaceName) {
-            UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: cannot alloc memory for iface name");
-            return 0;
-        }
-        struct in_addr ina;
-        memset(&ina, 0, sizeof(ina));
-        memcpy(interfaceName, server->config.discovery.mdnsInterfaceIP.data, length);
-        interfaceName[length] = '\0';
-        inet_pton(AF_INET, interfaceName, &ina);
-        UA_free(interfaceName);
-        /* Set interface for outbound multicast */
-        if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char*)&ina, sizeof(ina)) < 0)
-            UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Multicast DNS: failed setting IP_MULTICAST_IF to %s: %s", inet_ntoa(ina), strerror(errno));
-    }
-
-    /* Check outbound multicast interface parameters */
-    struct in_addr interface_addr;
-    socklen_t addr_size = sizeof(struct in_addr);
-    if (getsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char*)&interface_addr, &addr_size) <  0) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: getsockopt(IP_MULTICAST_IF) failed");
-    }
-
-    if(IN_ZERONET(ntohl(interface_addr.s_addr))){
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: outbound interface 0.0.0.0, it means that the first OS interface is used (you can explicitly set the interface by using 'discovery.mdnsInterfaceIP' config parameter)");
-    }else{
-        char buf[16];
-        inet_ntop(AF_INET, &interface_addr, buf, 16);
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: outbound interface is %s", buf);
-    }
-
-    mc.imr_multiaddr.s_addr = inet_addr("224.0.0.251");
-    mc.imr_interface.s_addr = htonl(INADDR_ANY);
-    UA_setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mc, sizeof(mc));
-    UA_setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl));
-    UA_setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl, sizeof(ittl));
-
-    UA_socket_set_nonblocking(s); //TODO: check return value
-    return s;
-}
-
-static UA_StatusCode
-initMulticastDiscoveryServer(UA_DiscoveryManager *dm, UA_Server* server) {
-    server->discoveryManager.mdnsDaemon = mdnsd_new(QCLASS_IN, 1000);
-    UA_initialize_architecture_network();
-
-    if((server->discoveryManager.mdnsSocket = discovery_createMulticastSocket(server)) == UA_INVALID_SOCKET) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-                UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Could not create multicast socket. Error: %s", errno_str));
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    mdnsd_register_receive_callback(server->discoveryManager.mdnsDaemon,
-                                    mdns_record_received, server);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-destroyMulticastDiscoveryServer(UA_DiscoveryManager *dm) {
-    if (!dm->mdnsDaemon)
-        return;
-
-    mdnsd_shutdown(dm->mdnsDaemon);
-    mdnsd_free(dm->mdnsDaemon);
-
-    if(dm->mdnsSocket != UA_INVALID_SOCKET) {
-        UA_close(dm->mdnsSocket);
-        dm->mdnsSocket = UA_INVALID_SOCKET;
-    }
-}
-
-#endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-
-void
-UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server) {
-    LIST_INIT(&dm->registeredServers);
-    dm->registeredServersSize = 0;
-    LIST_INIT(&dm->periodicServerRegisterCallbacks);
-    dm->registerServerCallback = NULL;
-    dm->registerServerCallbackData = NULL;
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    dm->mdnsDaemon = NULL;
-    dm->mdnsSocket = UA_INVALID_SOCKET;
-    dm->mdnsMainSrvAdded = false;
-    if(server->config.discovery.mdnsEnable)
-        initMulticastDiscoveryServer(dm, server);
-
-    LIST_INIT(&dm->serverOnNetwork);
-    dm->serverOnNetworkSize = 0;
-    dm->serverOnNetworkRecordIdCounter = 0;
-    dm->serverOnNetworkRecordIdLastReset = UA_DateTime_now();
-    memset(dm->serverOnNetworkHash, 0,
-           sizeof(struct serverOnNetwork_hash_entry*) * SERVER_ON_NETWORK_HASH_PRIME);
-
-    dm->serverOnNetworkCallback = NULL;
-    dm->serverOnNetworkCallbackData = NULL;
-#endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-}
-
-void
-UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server) {
-    registeredServer_list_entry *rs, *rs_tmp;
-    LIST_FOREACH_SAFE(rs, &dm->registeredServers, pointers, rs_tmp) {
-        LIST_REMOVE(rs, pointers);
-        UA_RegisteredServer_deleteMembers(&rs->registeredServer);
-        UA_free(rs);
-    }
-    periodicServerRegisterCallback_entry *ps, *ps_tmp;
-    LIST_FOREACH_SAFE(ps, &dm->periodicServerRegisterCallbacks, pointers, ps_tmp) {
-        LIST_REMOVE(ps, pointers);
-        if (ps->callback->discovery_server_url)
-            UA_free(ps->callback->discovery_server_url);
-        UA_free(ps->callback);
-        UA_free(ps);
-    }
-
-# ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    if(server->config.discovery.mdnsEnable)
-        destroyMulticastDiscoveryServer(dm);
-
-    serverOnNetwork_list_entry *son, *son_tmp;
-    LIST_FOREACH_SAFE(son, &dm->serverOnNetwork, pointers, son_tmp) {
-        LIST_REMOVE(son, pointers);
-        UA_ServerOnNetwork_deleteMembers(&son->serverOnNetwork);
-        if(son->pathTmp)
-            UA_free(son->pathTmp);
-        UA_free(son);
-    }
-
-    for(size_t i = 0; i < SERVER_ON_NETWORK_HASH_PRIME; i++) {
-        serverOnNetwork_hash_entry* currHash = dm->serverOnNetworkHash[i];
-        while(currHash) {
-            serverOnNetwork_hash_entry* nextHash = currHash->next;
-            UA_free(currHash);
-            currHash = nextHash;
-        }
-    }
-
-# endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-}
-
-#endif /* UA_ENABLE_DISCOVERY */
diff --git a/ext/open62541/src/server/ua_discovery_manager.h b/ext/open62541/src/server/ua_discovery_manager.h
deleted file mode 100644
index 0399f99..0000000
--- a/ext/open62541/src/server/ua_discovery_manager.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Julian Grothoff
- */
-
-#ifndef UA_DISCOVERY_MANAGER_H_
-#define UA_DISCOVERY_MANAGER_H_
-
-#include <open62541/server.h>
-
-#include "open62541_queue.h"
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_DISCOVERY
-
-typedef struct registeredServer_list_entry {
-#if UA_MULTITHREADING >= 200
-    UA_DelayedCallback delayedCleanup;
-#endif
-    LIST_ENTRY(registeredServer_list_entry) pointers;
-    UA_RegisteredServer registeredServer;
-    UA_DateTime lastSeen;
-} registeredServer_list_entry;
-
-struct PeriodicServerRegisterCallback {
-    UA_UInt64 id;
-    UA_Double this_interval;
-    UA_Double default_interval;
-    UA_Boolean registered;
-    struct UA_Client* client;
-    char* discovery_server_url;
-};
-
-typedef struct periodicServerRegisterCallback_entry {
-#if UA_MULTITHREADING >= 200
-    UA_DelayedCallback delayedCleanup;
-#endif
-    LIST_ENTRY(periodicServerRegisterCallback_entry) pointers;
-    struct PeriodicServerRegisterCallback *callback;
-} periodicServerRegisterCallback_entry;
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-#include "mdnsd/libmdnsd/mdnsd.h"
-
-/**
- * TXT record:
- * [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,...
- *
- * A/AAAA record for all ip addresses:
- * [servername]-[hostname]._opcua-tcp._tcp.local. A [ip].
- * [hostname]. A [ip].
- */
-
-typedef struct serverOnNetwork_list_entry {
-#if UA_MULTITHREADING >= 200
-    UA_DelayedCallback delayedCleanup;
-#endif
-    LIST_ENTRY(serverOnNetwork_list_entry) pointers;
-    UA_ServerOnNetwork serverOnNetwork;
-    UA_DateTime created;
-    UA_DateTime lastSeen;
-    UA_Boolean txtSet;
-    UA_Boolean srvSet;
-    char* pathTmp;
-} serverOnNetwork_list_entry;
-
-#define SERVER_ON_NETWORK_HASH_PRIME 1009
-typedef struct serverOnNetwork_hash_entry {
-    serverOnNetwork_list_entry* entry;
-    struct serverOnNetwork_hash_entry* next;
-} serverOnNetwork_hash_entry;
-
-#endif
-
-typedef struct {
-    LIST_HEAD(, periodicServerRegisterCallback_entry) periodicServerRegisterCallbacks;
-    LIST_HEAD(, registeredServer_list_entry) registeredServers;
-    size_t registeredServersSize;
-    UA_Server_registerServerCallback registerServerCallback;
-    void* registerServerCallbackData;
-
-# ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    mdns_daemon_t *mdnsDaemon;
-    UA_SOCKET mdnsSocket;
-    UA_Boolean mdnsMainSrvAdded;
-
-    LIST_HEAD(, serverOnNetwork_list_entry) serverOnNetwork;
-    size_t serverOnNetworkSize;
-
-    UA_UInt32 serverOnNetworkRecordIdCounter;
-    UA_DateTime serverOnNetworkRecordIdLastReset;
-
-    /* hash mapping domain name to serverOnNetwork list entry */
-    struct serverOnNetwork_hash_entry* serverOnNetworkHash[SERVER_ON_NETWORK_HASH_PRIME];
-
-    UA_Server_serverOnNetworkCallback serverOnNetworkCallback;
-    void* serverOnNetworkCallbackData;
-
-#if UA_MULTITHREADING >= 200
-    pthread_t mdnsThread;
-    UA_Boolean mdnsRunning;
-#  endif
-# endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-} UA_DiscoveryManager;
-
-void UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server);
-void UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server);
-
-/* Checks if a registration timed out and removes that registration.
- * Should be called periodically in main loop */
-void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic);
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-void
-UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName,
-                                    const UA_MdnsDiscoveryConfiguration *mdnsConfig,
-                                    const UA_String *discoveryUrl,
-                                    UA_Boolean isOnline, UA_Boolean updateTxt);
-
-void mdns_record_received(const struct resource *r, void *data);
-
-void mdns_create_txt(UA_Server *server, const char *fullServiceDomain,
-                     const char *path, const UA_String *capabilites,
-                     const size_t capabilitiesSize,
-                     void (*conflict)(char *host, int type, void *arg));
-
-void mdns_set_address_record(UA_Server *server,
-                             const char *fullServiceDomain,
-                             const char *localDomain);
-
-mdns_record_t *
-mdns_find_record(mdns_daemon_t *mdnsDaemon, unsigned short type,
-                 const char *host, const char *rdname);
-
-void startMulticastDiscoveryServer(UA_Server *server);
-
-void stopMulticastDiscoveryServer(UA_Server *server);
-
-UA_StatusCode
-iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat,
-                                UA_Boolean processIn);
-
-typedef enum {
-    UA_DISCOVERY_TCP,     /* OPC UA TCP mapping */
-    UA_DISCOVERY_TLS     /* OPC UA HTTPS mapping */
-} UA_DiscoveryProtocol;
-
-/* Send a multicast probe to find any other OPC UA server on the network through mDNS. */
-UA_StatusCode
-UA_Discovery_multicastQuery(UA_Server* server);
-
-UA_StatusCode
-UA_Discovery_addRecord(UA_Server *server, const UA_String *servername,
-                       const UA_String *hostname, UA_UInt16 port,
-                       const UA_String *path, const UA_DiscoveryProtocol protocol,
-                       UA_Boolean createTxt, const UA_String* capabilites,
-                       const size_t capabilitiesSize);
-UA_StatusCode
-UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername,
-                          const UA_String *hostname, UA_UInt16 port,
-                          UA_Boolean removeTxt);
-
-#endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-
-#endif /* UA_ENABLE_DISCOVERY */
-
-_UA_END_DECLS
-
-#endif /* UA_DISCOVERY_MANAGER_H_ */
diff --git a/ext/open62541/src/server/ua_nodes.c b/ext/open62541/src/server/ua_nodes.c
deleted file mode 100644
index 07930c8..0000000
--- a/ext/open62541/src/server/ua_nodes.c
+++ /dev/null
@@ -1,622 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015, 2017 (c) Florian Palm
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Julian Grothoff
- */
-
-#include "ua_server_internal.h"
-#include "ua_types_encoding_binary.h"
-
-/* There is no UA_Node_new() method here. Creating nodes is part of the
- * NodeStore layer */
-
-void UA_Node_deleteMembers(UA_Node *node) {
-    /* Delete standard content */
-    UA_NodeId_deleteMembers(&node->nodeId);
-    UA_QualifiedName_deleteMembers(&node->browseName);
-    UA_LocalizedText_deleteMembers(&node->displayName);
-    UA_LocalizedText_deleteMembers(&node->description);
-
-    /* Delete references */
-    UA_Node_deleteReferences(node);
-
-    /* Delete unique content of the nodeclass */
-    switch(node->nodeClass) {
-    case UA_NODECLASS_OBJECT:
-        break;
-    case UA_NODECLASS_METHOD:
-        break;
-    case UA_NODECLASS_OBJECTTYPE:
-        break;
-    case UA_NODECLASS_VARIABLE:
-    case UA_NODECLASS_VARIABLETYPE: {
-        UA_VariableNode *p = (UA_VariableNode*)node;
-        UA_NodeId_deleteMembers(&p->dataType);
-        UA_Array_delete(p->arrayDimensions, p->arrayDimensionsSize,
-                        &UA_TYPES[UA_TYPES_INT32]);
-        p->arrayDimensions = NULL;
-        p->arrayDimensionsSize = 0;
-        if(p->valueSource == UA_VALUESOURCE_DATA)
-            UA_DataValue_deleteMembers(&p->value.data.value);
-        break;
-    }
-    case UA_NODECLASS_REFERENCETYPE: {
-        UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)node;
-        UA_LocalizedText_deleteMembers(&p->inverseName);
-        break;
-    }
-    case UA_NODECLASS_DATATYPE:
-        break;
-    case UA_NODECLASS_VIEW:
-        break;
-    default:
-        break;
-    }
-}
-
-static UA_StatusCode
-UA_ObjectNode_copy(const UA_ObjectNode *src, UA_ObjectNode *dst) {
-    dst->eventNotifier = src->eventNotifier;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-UA_CommonVariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
-    UA_StatusCode retval = UA_Array_copy(src->arrayDimensions,
-                                         src->arrayDimensionsSize,
-                                         (void**)&dst->arrayDimensions,
-                                         &UA_TYPES[UA_TYPES_INT32]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    dst->arrayDimensionsSize = src->arrayDimensionsSize;
-    retval = UA_NodeId_copy(&src->dataType, &dst->dataType);
-    dst->valueRank = src->valueRank;
-    dst->valueSource = src->valueSource;
-    if(src->valueSource == UA_VALUESOURCE_DATA) {
-        retval |= UA_DataValue_copy(&src->value.data.value,
-                                    &dst->value.data.value);
-        dst->value.data.callback = src->value.data.callback;
-    } else
-        dst->value.dataSource = src->value.dataSource;
-    return retval;
-}
-
-static UA_StatusCode
-UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) {
-    UA_StatusCode retval = UA_CommonVariableNode_copy(src, dst);
-    dst->accessLevel = src->accessLevel;
-    dst->minimumSamplingInterval = src->minimumSamplingInterval;
-    dst->historizing = src->historizing;
-    return retval;
-}
-
-static UA_StatusCode
-UA_VariableTypeNode_copy(const UA_VariableTypeNode *src,
-                         UA_VariableTypeNode *dst) {
-    UA_StatusCode retval = UA_CommonVariableNode_copy((const UA_VariableNode*)src,
-                                                      (UA_VariableNode*)dst);
-    dst->isAbstract = src->isAbstract;
-    return retval;
-}
-
-static UA_StatusCode
-UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) {
-    dst->executable = src->executable;
-    dst->method = src->method;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-UA_ObjectTypeNode_copy(const UA_ObjectTypeNode *src, UA_ObjectTypeNode *dst) {
-    dst->isAbstract = src->isAbstract;
-    dst->lifecycle = src->lifecycle;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src,
-                          UA_ReferenceTypeNode *dst) {
-    UA_StatusCode retval = UA_LocalizedText_copy(&src->inverseName,
-                                                 &dst->inverseName);
-    dst->isAbstract = src->isAbstract;
-    dst->symmetric = src->symmetric;
-    return retval;
-}
-
-static UA_StatusCode
-UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) {
-    dst->isAbstract = src->isAbstract;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) {
-    dst->containsNoLoops = src->containsNoLoops;
-    dst->eventNotifier = src->eventNotifier;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Node_copy(const UA_Node *src, UA_Node *dst) {
-    if(src->nodeClass != dst->nodeClass)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Copy standard content */
-    UA_StatusCode retval = UA_NodeId_copy(&src->nodeId, &dst->nodeId);
-    retval |= UA_QualifiedName_copy(&src->browseName, &dst->browseName);
-    retval |= UA_LocalizedText_copy(&src->displayName, &dst->displayName);
-    retval |= UA_LocalizedText_copy(&src->description, &dst->description);
-    dst->writeMask = src->writeMask;
-    dst->context = src->context;
-    dst->constructed = src->constructed;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Node_deleteMembers(dst);
-        return retval;
-    }
-
-    /* Copy the references */
-    dst->references = NULL;
-    if(src->referencesSize > 0) {
-        dst->references = (UA_NodeReferenceKind*)
-            UA_calloc(src->referencesSize, sizeof(UA_NodeReferenceKind));
-        if(!dst->references) {
-            UA_Node_deleteMembers(dst);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        dst->referencesSize = src->referencesSize;
-
-        for(size_t i = 0; i < src->referencesSize; ++i) {
-            UA_NodeReferenceKind *srefs = &src->references[i];
-            UA_NodeReferenceKind *drefs = &dst->references[i];
-            drefs->isInverse = srefs->isInverse;
-            retval = UA_NodeId_copy(&srefs->referenceTypeId, &drefs->referenceTypeId);
-            if(retval != UA_STATUSCODE_GOOD)
-                break;
-            retval = UA_Array_copy(srefs->targetIds, srefs->targetIdsSize,
-                                    (void**)&drefs->targetIds,
-                                    &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-            if(retval != UA_STATUSCODE_GOOD)
-                break;
-            drefs->targetIdsSize = srefs->targetIdsSize;
-        }
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_Node_deleteMembers(dst);
-            return retval;
-        }
-    }
-
-    /* Copy unique content of the nodeclass */
-    switch(src->nodeClass) {
-    case UA_NODECLASS_OBJECT:
-        retval = UA_ObjectNode_copy((const UA_ObjectNode*)src, (UA_ObjectNode*)dst);
-        break;
-    case UA_NODECLASS_VARIABLE:
-        retval = UA_VariableNode_copy((const UA_VariableNode*)src, (UA_VariableNode*)dst);
-        break;
-    case UA_NODECLASS_METHOD:
-        retval = UA_MethodNode_copy((const UA_MethodNode*)src, (UA_MethodNode*)dst);
-        break;
-    case UA_NODECLASS_OBJECTTYPE:
-        retval = UA_ObjectTypeNode_copy((const UA_ObjectTypeNode*)src, (UA_ObjectTypeNode*)dst);
-        break;
-    case UA_NODECLASS_VARIABLETYPE:
-        retval = UA_VariableTypeNode_copy((const UA_VariableTypeNode*)src, (UA_VariableTypeNode*)dst);
-        break;
-    case UA_NODECLASS_REFERENCETYPE:
-        retval = UA_ReferenceTypeNode_copy((const UA_ReferenceTypeNode*)src, (UA_ReferenceTypeNode*)dst);
-        break;
-    case UA_NODECLASS_DATATYPE:
-        retval = UA_DataTypeNode_copy((const UA_DataTypeNode*)src, (UA_DataTypeNode*)dst);
-        break;
-    case UA_NODECLASS_VIEW:
-        retval = UA_ViewNode_copy((const UA_ViewNode*)src, (UA_ViewNode*)dst);
-        break;
-    default:
-        break;
-    }
-
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_Node_deleteMembers(dst);
-
-    return retval;
-}
-
-UA_Node *
-UA_Node_copy_alloc(const UA_Node *src) {
-    /* use dstPtr to trick static code analysis in accepting dirty cast */
-    size_t nodesize = 0;
-    switch(src->nodeClass) {
-        case UA_NODECLASS_OBJECT:
-            nodesize = sizeof(UA_ObjectNode);
-            break;
-        case UA_NODECLASS_VARIABLE:
-            nodesize = sizeof(UA_VariableNode);
-            break;
-        case UA_NODECLASS_METHOD:
-            nodesize = sizeof(UA_MethodNode);
-            break;
-        case UA_NODECLASS_OBJECTTYPE:
-            nodesize = sizeof(UA_ObjectTypeNode);
-            break;
-        case UA_NODECLASS_VARIABLETYPE:
-            nodesize = sizeof(UA_VariableTypeNode);
-            break;
-        case UA_NODECLASS_REFERENCETYPE:
-            nodesize = sizeof(UA_ReferenceTypeNode);
-            break;
-        case UA_NODECLASS_DATATYPE:
-            nodesize = sizeof(UA_DataTypeNode);
-            break;
-        case UA_NODECLASS_VIEW:
-            nodesize = sizeof(UA_ViewNode);
-            break;
-        default:
-            return NULL;
-    }
-
-    UA_Node *dst = (UA_Node*)UA_calloc(1,nodesize);
-    if(!dst)
-        return NULL;
-
-    dst->nodeClass = src->nodeClass;
-
-    UA_StatusCode retval = UA_Node_copy(src, dst);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(dst);
-        return NULL;
-    }
-    return dst;
-}
-/******************************/
-/* Copy Attributes into Nodes */
-/******************************/
-
-static UA_StatusCode
-copyStandardAttributes(UA_Node *node, const UA_NodeAttributes *attr) {
-    /* retval  = UA_NodeId_copy(&item->requestedNewNodeId.nodeId, &node->nodeId); */
-    /* retval |= UA_QualifiedName_copy(&item->browseName, &node->browseName); */
-
-    UA_StatusCode retval;
-    /* The new nodeset format has optional display name.
-     * See https://github.com/open62541/open62541/issues/2627
-     * If display name is NULL, then we take the name part of the browse name */
-    if (attr->displayName.text.length == 0) {
-        retval = UA_String_copy(&node->browseName.name,
-                                       &node->displayName.text);
-    } else {
-        retval = UA_LocalizedText_copy(&attr->displayName,
-                                                     &node->displayName);
-        retval |= UA_LocalizedText_copy(&attr->description, &node->description);
-    }
-
-    node->writeMask = attr->writeMask;
-    return retval;
-}
-
-static UA_StatusCode
-copyCommonVariableAttributes(UA_VariableNode *node,
-                             const UA_VariableAttributes *attr) {
-    /* Copy the array dimensions */
-    UA_StatusCode retval =
-        UA_Array_copy(attr->arrayDimensions, attr->arrayDimensionsSize,
-                      (void**)&node->arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    node->arrayDimensionsSize = attr->arrayDimensionsSize;
-
-    /* Data type and value rank */
-    retval = UA_NodeId_copy(&attr->dataType, &node->dataType);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    node->valueRank = attr->valueRank;
-
-    /* Copy the value */
-    retval = UA_Variant_copy(&attr->value, &node->value.data.value.value);
-    node->valueSource = UA_VALUESOURCE_DATA;
-    node->value.data.value.hasValue = (node->value.data.value.value.type != NULL);
-
-    return retval;
-}
-
-static UA_StatusCode
-copyVariableNodeAttributes(UA_VariableNode *vnode,
-                           const UA_VariableAttributes *attr) {
-    vnode->accessLevel = attr->accessLevel;
-    vnode->historizing = attr->historizing;
-    vnode->minimumSamplingInterval = attr->minimumSamplingInterval;
-    return copyCommonVariableAttributes(vnode, attr);
-}
-
-static UA_StatusCode
-copyVariableTypeNodeAttributes(UA_VariableTypeNode *vtnode,
-                               const UA_VariableTypeAttributes *attr) {
-    vtnode->isAbstract = attr->isAbstract;
-    return copyCommonVariableAttributes((UA_VariableNode*)vtnode,
-                                        (const UA_VariableAttributes*)attr);
-}
-
-static UA_StatusCode
-copyObjectNodeAttributes(UA_ObjectNode *onode, const UA_ObjectAttributes *attr) {
-    onode->eventNotifier = attr->eventNotifier;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copyReferenceTypeNodeAttributes(UA_ReferenceTypeNode *rtnode,
-                                const UA_ReferenceTypeAttributes *attr) {
-    rtnode->isAbstract = attr->isAbstract;
-    rtnode->symmetric = attr->symmetric;
-    return UA_LocalizedText_copy(&attr->inverseName, &rtnode->inverseName);
-}
-
-static UA_StatusCode
-copyObjectTypeNodeAttributes(UA_ObjectTypeNode *otnode,
-                             const UA_ObjectTypeAttributes *attr) {
-    otnode->isAbstract = attr->isAbstract;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copyViewNodeAttributes(UA_ViewNode *vnode, const UA_ViewAttributes *attr) {
-    vnode->containsNoLoops = attr->containsNoLoops;
-    vnode->eventNotifier = attr->eventNotifier;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copyDataTypeNodeAttributes(UA_DataTypeNode *dtnode,
-                           const UA_DataTypeAttributes *attr) {
-    dtnode->isAbstract = attr->isAbstract;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copyMethodNodeAttributes(UA_MethodNode *mnode,
-                         const UA_MethodAttributes *attr) {
-    mnode->executable = attr->executable;
-    return UA_STATUSCODE_GOOD;
-}
-
-#define CHECK_ATTRIBUTES(TYPE)                           \
-    if(attributeType != &UA_TYPES[UA_TYPES_##TYPE]) {    \
-        retval = UA_STATUSCODE_BADNODEATTRIBUTESINVALID; \
-        break;                                           \
-    }
-
-UA_StatusCode
-UA_Node_setAttributes(UA_Node *node, const void *attributes,
-                      const UA_DataType *attributeType) {
-    /* Copy the attributes into the node */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    switch(node->nodeClass) {
-    case UA_NODECLASS_OBJECT:
-        CHECK_ATTRIBUTES(OBJECTATTRIBUTES);
-        retval = copyObjectNodeAttributes((UA_ObjectNode*)node,
-                                          (const UA_ObjectAttributes*)attributes);
-        break;
-    case UA_NODECLASS_VARIABLE:
-        CHECK_ATTRIBUTES(VARIABLEATTRIBUTES);
-        retval = copyVariableNodeAttributes((UA_VariableNode*)node,
-                                            (const UA_VariableAttributes*)attributes);
-        break;
-    case UA_NODECLASS_OBJECTTYPE:
-        CHECK_ATTRIBUTES(OBJECTTYPEATTRIBUTES);
-        retval = copyObjectTypeNodeAttributes((UA_ObjectTypeNode*)node,
-                                              (const UA_ObjectTypeAttributes*)attributes);
-        break;
-    case UA_NODECLASS_VARIABLETYPE:
-        CHECK_ATTRIBUTES(VARIABLETYPEATTRIBUTES);
-        retval = copyVariableTypeNodeAttributes((UA_VariableTypeNode*)node,
-                                                (const UA_VariableTypeAttributes*)attributes);
-        break;
-    case UA_NODECLASS_REFERENCETYPE:
-        CHECK_ATTRIBUTES(REFERENCETYPEATTRIBUTES);
-        retval = copyReferenceTypeNodeAttributes((UA_ReferenceTypeNode*)node,
-                                                 (const UA_ReferenceTypeAttributes*)attributes);
-        break;
-    case UA_NODECLASS_DATATYPE:
-        CHECK_ATTRIBUTES(DATATYPEATTRIBUTES);
-        retval = copyDataTypeNodeAttributes((UA_DataTypeNode*)node,
-                                            (const UA_DataTypeAttributes*)attributes);
-        break;
-    case UA_NODECLASS_VIEW:
-        CHECK_ATTRIBUTES(VIEWATTRIBUTES);
-        retval = copyViewNodeAttributes((UA_ViewNode*)node,
-                                        (const UA_ViewAttributes*)attributes);
-        break;
-    case UA_NODECLASS_METHOD:
-        CHECK_ATTRIBUTES(METHODATTRIBUTES);
-        retval = copyMethodNodeAttributes((UA_MethodNode*)node,
-                                          (const UA_MethodAttributes*)attributes);
-        break;
-    case UA_NODECLASS_UNSPECIFIED:
-    default:
-        retval = UA_STATUSCODE_BADNODECLASSINVALID;
-    }
-
-    if(retval == UA_STATUSCODE_GOOD)
-        retval = copyStandardAttributes(node, (const UA_NodeAttributes*)attributes);
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_Node_deleteMembers(node);
-    return retval;
-}
-
-/*********************/
-/* Manage References */
-/*********************/
-
-static UA_StatusCode
-addReferenceTarget(UA_NodeReferenceKind *refs, const UA_ExpandedNodeId *target) {
-    UA_ExpandedNodeId *targets =
-        (UA_ExpandedNodeId*) UA_realloc(refs->targetIds,
-                                        sizeof(UA_ExpandedNodeId) * (refs->targetIdsSize+1));
-    if(!targets)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    refs->targetIds = targets;
-    UA_StatusCode retval =
-        UA_ExpandedNodeId_copy(target, &refs->targetIds[refs->targetIdsSize]);
-
-    if(retval == UA_STATUSCODE_GOOD) {
-        refs->targetIdsSize++;
-    } else if(refs->targetIdsSize == 0) {
-        /* We had zero references before (realloc was a malloc) */
-        UA_free(refs->targetIds);
-        refs->targetIds = NULL;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-addReferenceKind(UA_Node *node, const UA_AddReferencesItem *item) {
-    UA_NodeReferenceKind *refs =
-        (UA_NodeReferenceKind*)UA_realloc(node->references,
-                                          sizeof(UA_NodeReferenceKind) * (node->referencesSize+1));
-    if(!refs)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    node->references = refs;
-    UA_NodeReferenceKind *newRef = &refs[node->referencesSize];
-    memset(newRef, 0, sizeof(UA_NodeReferenceKind));
-
-    newRef->isInverse = !item->isForward;
-    UA_StatusCode retval = UA_NodeId_copy(&item->referenceTypeId, &newRef->referenceTypeId);
-    retval |= addReferenceTarget(newRef, &item->targetNodeId);
-
-    if(retval == UA_STATUSCODE_GOOD) {
-        node->referencesSize++;
-    } else {
-        UA_NodeId_deleteMembers(&newRef->referenceTypeId);
-        if(node->referencesSize == 0) {
-            UA_free(node->references);
-            node->references = NULL;
-        }
-    }
-    return retval;
-}
-
-UA_StatusCode
-UA_Node_addReference(UA_Node *node, const UA_AddReferencesItem *item) {
-    UA_NodeReferenceKind *existingRefs = NULL;
-    for(size_t i = 0; i < node->referencesSize; ++i) {
-        UA_NodeReferenceKind *refs = &node->references[i];
-        if(refs->isInverse != item->isForward
-                && UA_NodeId_equal(&refs->referenceTypeId, &item->referenceTypeId)) {
-            existingRefs = refs;
-            break;
-        }
-    }
-    if(existingRefs != NULL) {
-        for(size_t i = 0; i < existingRefs->targetIdsSize; i++) {
-            if(UA_ExpandedNodeId_equal(&existingRefs->targetIds[i],
-                                       &item->targetNodeId)) {
-                return UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED;
-            }
-        }
-        return addReferenceTarget(existingRefs, &item->targetNodeId);
-    }
-    return addReferenceKind(node, item);
-}
-
-UA_StatusCode
-UA_Node_deleteReference(UA_Node *node, const UA_DeleteReferencesItem *item) {
-    for(size_t i = node->referencesSize; i > 0; --i) {
-        UA_NodeReferenceKind *refs = &node->references[i-1];
-        if(item->isForward == refs->isInverse)
-            continue;
-        if(!UA_NodeId_equal(&item->referenceTypeId, &refs->referenceTypeId))
-            continue;
-
-        for(size_t j = refs->targetIdsSize; j > 0; --j) {
-            UA_ExpandedNodeId *target = &refs->targetIds[j-1];
-            if(!UA_NodeId_equal(&item->targetNodeId.nodeId, &target->nodeId))
-                continue;
-
-            /* Ok, delete the reference */
-            UA_ExpandedNodeId_deleteMembers(target);
-            refs->targetIdsSize--;
-
-            /* One matching target remaining */
-            if(refs->targetIdsSize > 0) {
-                if(j-1 != refs->targetIdsSize) // avoid valgrind error: Source
-                                               // and destination overlap in
-                                               // memcpy
-                    *target = refs->targetIds[refs->targetIdsSize];
-                return UA_STATUSCODE_GOOD;
-            }
-
-            /* No target for the ReferenceType remaining. Remove entry. */
-            UA_free(refs->targetIds);
-            UA_NodeId_deleteMembers(&refs->referenceTypeId);
-            node->referencesSize--;
-            if(node->referencesSize > 0) {
-                if(i-1 != node->referencesSize) // avoid valgrind error: Source
-                                                // and destination overlap in
-                                                // memcpy
-                    node->references[i-1] = node->references[node->referencesSize];
-                return UA_STATUSCODE_GOOD;
-            }
-
-            /* No remaining references of any ReferenceType */
-            UA_free(node->references);
-            node->references = NULL;
-            return UA_STATUSCODE_GOOD;
-        }
-    }
-    return UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED;
-}
-
-void
-UA_Node_deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize,
-                               UA_NodeId* referencesSkip) {
-    /* Nothing to do */
-    if(node->referencesSize == 0 || node->references == NULL)
-        return;
-
-    for(size_t i = node->referencesSize; i > 0; --i) {
-        UA_NodeReferenceKind *refs = &node->references[i-1];
-
-        /* Shall we keep the references of this type? */
-        UA_Boolean skip = false;
-        for(size_t j = 0; j < referencesSkipSize; j++) {
-            if(UA_NodeId_equal(&refs->referenceTypeId, &referencesSkip[j])) {
-                skip = true;
-                break;
-            }
-        }
-        if(skip)
-            continue;
-
-        /* Remove references */
-        UA_Array_delete(refs->targetIds, refs->targetIdsSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-        UA_NodeId_deleteMembers(&refs->referenceTypeId);
-        node->referencesSize--;
-
-        /* Move last references-kind entry to this position */
-        if(i-1 == node->referencesSize) /* Don't memcpy over the same position */
-            continue;
-        node->references[i-1] = node->references[node->referencesSize];
-    }
-
-    if(node->referencesSize == 0) {
-        /* The array is empty. Remove. */
-        UA_free(node->references);
-        node->references = NULL;
-    } else {
-        /* Realloc to save memory */
-        UA_NodeReferenceKind *refs = (UA_NodeReferenceKind*)
-            UA_realloc(node->references, sizeof(UA_NodeReferenceKind) * node->referencesSize);
-        if(refs) /* Do nothing if realloc fails */
-            node->references = refs;
-    }
-}
-
-void UA_Node_deleteReferences(UA_Node *node) {
-    UA_Node_deleteReferencesSubset(node, 0, NULL);
-}
diff --git a/ext/open62541/src/server/ua_securechannel_manager.c b/ext/open62541/src/server/ua_securechannel_manager.c
deleted file mode 100644
index 2da1b90..0000000
--- a/ext/open62541/src/server/ua_securechannel_manager.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#include "ua_securechannel_manager.h"
-
-#include <open62541/transport_generated.h>
-
-#include "ua_server_internal.h"
-#include "ua_session.h"
-
-#define STARTCHANNELID 1
-#define STARTTOKENID 1
-
-UA_StatusCode
-UA_SecureChannelManager_init(UA_SecureChannelManager *cm, UA_Server *server) {
-    TAILQ_INIT(&cm->channels);
-    // TODO: use an ID that is likely to be unique after a restart
-    cm->lastChannelId = STARTCHANNELID;
-    cm->lastTokenId = STARTTOKENID;
-    cm->currentChannelCount = 0;
-    cm->server = server;
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_SecureChannelManager_deleteMembers(UA_SecureChannelManager *cm) {
-    channel_entry *entry, *temp;
-    TAILQ_FOREACH_SAFE(entry, &cm->channels, pointers, temp) {
-        TAILQ_REMOVE(&cm->channels, entry, pointers);
-        UA_SecureChannel_close(&entry->channel);
-        UA_SecureChannel_deleteMembers(&entry->channel);
-        UA_free(entry);
-    }
-}
-
-static void
-removeSecureChannelCallback(void *_, channel_entry *entry) {
-    UA_SecureChannel_deleteMembers(&entry->channel);
-}
-
-static void
-removeSecureChannel(UA_SecureChannelManager *cm, channel_entry *entry) {
-    /* Close the SecureChannel */
-    UA_SecureChannel_close(&entry->channel);
-
-    /* Detach the channel and make the capacity available */
-    TAILQ_REMOVE(&cm->channels, entry, pointers);
-    UA_atomic_subUInt32(&cm->currentChannelCount, 1);
-
-    /* Add a delayed callback to remove the channel when the currently
-     * scheduled jobs have completed */
-    entry->cleanupCallback.callback = (UA_ApplicationCallback)removeSecureChannelCallback;
-    entry->cleanupCallback.application = NULL;
-    entry->cleanupCallback.data = entry;
-    UA_WorkQueue_enqueueDelayed(&cm->server->workQueue, &entry->cleanupCallback);
-}
-
-/* remove channels that were not renewed or who have no connection attached */
-void
-UA_SecureChannelManager_cleanupTimedOut(UA_SecureChannelManager *cm,
-                                        UA_DateTime nowMonotonic) {
-    channel_entry *entry, *temp;
-    TAILQ_FOREACH_SAFE(entry, &cm->channels, pointers, temp) {
-        /* The channel was closed internally */
-        if(entry->channel.state == UA_SECURECHANNELSTATE_CLOSED ||
-           !entry->channel.connection) {
-            removeSecureChannel(cm, entry);
-            continue;
-        }
-
-        /* The channel has timed out */
-        UA_DateTime timeout =
-            entry->channel.securityToken.createdAt +
-            (UA_DateTime)(entry->channel.securityToken.revisedLifetime * UA_DATETIME_MSEC);
-        if(timeout < nowMonotonic) {
-            UA_LOG_INFO_CHANNEL(&cm->server->config.logger, &entry->channel,
-                                "SecureChannel has timed out");
-            removeSecureChannel(cm, entry);
-            continue;
-        }
-
-        /* Revolve the channel tokens */
-        if(entry->channel.nextSecurityToken.tokenId > 0) {
-            UA_SecureChannel_revolveTokens(&entry->channel);
-        }
-    }
-}
-
-/* remove the first channel that has no session attached */
-static UA_Boolean
-purgeFirstChannelWithoutSession(UA_SecureChannelManager *cm) {
-    channel_entry *entry;
-    TAILQ_FOREACH(entry, &cm->channels, pointers) {
-        if(LIST_EMPTY(&entry->channel.sessions)) {
-            UA_LOG_INFO_CHANNEL(&cm->server->config.logger, &entry->channel,
-                                "Channel was purged since maxSecureChannels was "
-                                "reached and channel had no session attached");
-            removeSecureChannel(cm, entry);
-            return true;
-        }
-    }
-    return false;
-}
-
-UA_StatusCode
-UA_SecureChannelManager_create(UA_SecureChannelManager *const cm, UA_Connection *const connection,
-                               const UA_SecurityPolicy *const securityPolicy,
-                               const UA_AsymmetricAlgorithmSecurityHeader *const asymHeader) {
-    /* connection already has a channel attached. */
-    if(connection->channel != NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Check if there exists a free SC, otherwise try to purge one SC without a
-     * session the purge has been introduced to pass CTT, it is not clear what
-     * strategy is expected here */
-    if(cm->currentChannelCount >= cm->server->config.maxSecureChannels &&
-       !purgeFirstChannelWithoutSession(cm))
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    UA_LOG_INFO(&cm->server->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
-                "Creating a new SecureChannel");
-
-    channel_entry *entry = (channel_entry *)UA_malloc(sizeof(channel_entry));
-    if(!entry)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Create the channel context and parse the sender (remote) certificate used for the
-     * secureChannel. */
-    UA_SecureChannel_init(&entry->channel);
-    UA_StatusCode retval =
-        UA_SecureChannel_setSecurityPolicy(&entry->channel, securityPolicy,
-                                           &asymHeader->senderCertificate);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(entry);
-        return retval;
-    }
-
-    /* Channel state is fresh (0) */
-    entry->channel.securityToken.channelId = 0;
-    entry->channel.securityToken.tokenId = cm->lastTokenId++;
-    entry->channel.securityToken.createdAt = UA_DateTime_now();
-    entry->channel.securityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime;
-
-    TAILQ_INSERT_TAIL(&cm->channels, entry, pointers);
-    UA_atomic_addUInt32(&cm->currentChannelCount, 1);
-    UA_Connection_attachSecureChannel(connection, &entry->channel);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_SecureChannel *channel,
-                             const UA_OpenSecureChannelRequest *request,
-                             UA_OpenSecureChannelResponse *response) {
-    if(channel->state != UA_SECURECHANNELSTATE_FRESH) {
-        UA_LOG_ERROR_CHANNEL(&cm->server->config.logger, channel,
-                             "Called open on already open or closed channel");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    if(request->securityMode != UA_MESSAGESECURITYMODE_NONE &&
-       UA_ByteString_equal(&channel->securityPolicy->policyUri, &UA_SECURITY_POLICY_NONE_URI)) {
-        return UA_STATUSCODE_BADSECURITYMODEREJECTED;
-    }
-
-    channel->securityMode = request->securityMode;
-    channel->securityToken.createdAt = UA_DateTime_nowMonotonic();
-    channel->securityToken.channelId = cm->lastChannelId++;
-    channel->securityToken.createdAt = UA_DateTime_now();
-
-    /* Set the lifetime. Lifetime 0 -> set the maximum possible */
-    channel->securityToken.revisedLifetime =
-        (request->requestedLifetime > cm->server->config.maxSecurityTokenLifetime) ?
-        cm->server->config.maxSecurityTokenLifetime : request->requestedLifetime;
-    if(channel->securityToken.revisedLifetime == 0)
-        channel->securityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime;
-
-    /* Set the nonces and generate the keys */
-    UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_SecureChannel_generateLocalNonce(channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_SecureChannel_generateNewKeys(channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Set the response */
-    retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_ChannelSecurityToken_copy(&channel->securityToken, &response->securityToken);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    response->responseHeader.timestamp = UA_DateTime_now();
-    response->responseHeader.requestHandle = request->requestHeader.requestHandle;
-
-    /* The channel is open */
-    channel->state = UA_SECURECHANNELSTATE_OPEN;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_SecureChannel *channel,
-                              const UA_OpenSecureChannelRequest *request,
-                              UA_OpenSecureChannelResponse *response) {
-    if(channel->state != UA_SECURECHANNELSTATE_OPEN) {
-        UA_LOG_ERROR_CHANNEL(&cm->server->config.logger, channel,
-                             "Called renew on channel which is not open");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* If no security token is already issued */
-    if(channel->nextSecurityToken.tokenId == 0) {
-        channel->nextSecurityToken.channelId = channel->securityToken.channelId;
-        channel->nextSecurityToken.tokenId = cm->lastTokenId++;
-        channel->nextSecurityToken.createdAt = UA_DateTime_now();
-        channel->nextSecurityToken.revisedLifetime =
-            (request->requestedLifetime > cm->server->config.maxSecurityTokenLifetime) ?
-            cm->server->config.maxSecurityTokenLifetime : request->requestedLifetime;
-        if(channel->nextSecurityToken.revisedLifetime == 0) /* lifetime 0 -> return the max lifetime */
-            channel->nextSecurityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime;
-    }
-
-    /* Replace the nonces */
-    UA_ByteString_deleteMembers(&channel->remoteNonce);
-    UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_SecureChannel_generateLocalNonce(channel);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Set the response */
-    response->responseHeader.requestHandle = request->requestHeader.requestHandle;
-    retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &response->securityToken);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Reset the internal creation date to the monotonic clock */
-    channel->nextSecurityToken.createdAt = UA_DateTime_nowMonotonic();
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_SecureChannel *
-UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId) {
-    channel_entry *entry;
-    TAILQ_FOREACH(entry, &cm->channels, pointers) {
-        if(entry->channel.securityToken.channelId == channelId)
-            return &entry->channel;
-    }
-    return NULL;
-}
-
-UA_StatusCode
-UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId) {
-    channel_entry *entry;
-    TAILQ_FOREACH(entry, &cm->channels, pointers) {
-        if(entry->channel.securityToken.channelId == channelId)
-            break;
-    }
-    if(!entry)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    removeSecureChannel(cm, entry);
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/src/server/ua_securechannel_manager.h b/ext/open62541/src/server/ua_securechannel_manager.h
deleted file mode 100644
index c9f040a..0000000
--- a/ext/open62541/src/server/ua_securechannel_manager.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_CHANNEL_MANAGER_H_
-#define UA_CHANNEL_MANAGER_H_
-
-#include <open62541/server.h>
-
-#include "open62541_queue.h"
-#include "ua_securechannel.h"
-#include "ua_util_internal.h"
-#include "ua_workqueue.h"
-
-_UA_BEGIN_DECLS
-
-typedef struct channel_entry {
-    UA_DelayedCallback cleanupCallback;
-    TAILQ_ENTRY(channel_entry) pointers;
-    UA_SecureChannel channel;
-} channel_entry;
-
-typedef struct {
-    TAILQ_HEAD(, channel_entry) channels; // doubly-linked list of channels
-    UA_UInt32 currentChannelCount;
-    UA_UInt32 lastChannelId;
-    UA_UInt32 lastTokenId;
-    UA_Server *server;
-} UA_SecureChannelManager;
-
-UA_StatusCode
-UA_SecureChannelManager_init(UA_SecureChannelManager *cm, UA_Server *server);
-
-/* Remove a all securechannels */
-void
-UA_SecureChannelManager_deleteMembers(UA_SecureChannelManager *cm);
-
-/* Remove timed out securechannels with a delayed callback. So all currently
- * scheduled jobs with a pointer to a securechannel can finish first. */
-void
-UA_SecureChannelManager_cleanupTimedOut(UA_SecureChannelManager *cm,
-                                        UA_DateTime nowMonotonic);
-
-UA_StatusCode
-UA_SecureChannelManager_create(UA_SecureChannelManager *const cm, UA_Connection *const connection,
-                               const UA_SecurityPolicy *const securityPolicy,
-                               const UA_AsymmetricAlgorithmSecurityHeader *const asymHeader);
-
-UA_StatusCode
-UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_SecureChannel *channel,
-                             const UA_OpenSecureChannelRequest *request,
-                             UA_OpenSecureChannelResponse *response);
-
-UA_StatusCode
-UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_SecureChannel *channel,
-                              const UA_OpenSecureChannelRequest *request,
-                              UA_OpenSecureChannelResponse *response);
-
-UA_SecureChannel *
-UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId);
-
-UA_StatusCode
-UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId);
-
-_UA_END_DECLS
-
-#endif /* UA_CHANNEL_MANAGER_H_ */
diff --git a/ext/open62541/src/server/ua_server.c b/ext/open62541/src/server/ua_server.c
deleted file mode 100644
index 19ce406..0000000
--- a/ext/open62541/src/server/ua_server.c
+++ /dev/null
@@ -1,690 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015 (c) LEvertz
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016 (c) Julian Grothoff
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2018 (c) Hilscher Gesellschaft für Systemautomation mbH (Author: Martin Lang)
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#include "ua_server_internal.h"
-
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-#include "ua_pubsub_ns0.h"
-#endif
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-#include "ua_subscription.h"
-#endif
-
-#ifdef UA_ENABLE_VALGRIND_INTERACTIVE
-#include <valgrind/memcheck.h>
-#endif
-
-/**********************/
-/* Namespace Handling */
-/**********************/
-
-/*
- * The NS1 Uri can be changed by the user to some custom string.
- * This method is called to initialize the NS1 Uri if it is not set before to the default Application URI.
- *
- * This is done as soon as the Namespace Array is read or written via node value read / write services,
- * or UA_Server_addNamespace, UA_Server_getNamespaceByName or UA_Server_run_startup is called.
- *
- * Therefore one has to set the custom NS1 URI before one of the previously mentioned steps.
- */
-void setupNs1Uri(UA_Server *server) {
-    if (!server->namespaces[1].data) {
-        UA_String_copy(&server->config.applicationDescription.applicationUri, &server->namespaces[1]);
-    }
-}
-
-UA_UInt16 addNamespace(UA_Server *server, const UA_String name) {
-    /* ensure that the uri for ns1 is set up from the app description */
-    setupNs1Uri(server);
-
-    /* Check if the namespace already exists in the server's namespace array */
-    for(UA_UInt16 i = 0; i < server->namespacesSize; ++i) {
-        if(UA_String_equal(&name, &server->namespaces[i]))
-            return i;
-    }
-
-    /* Make the array bigger */
-    UA_String *newNS = (UA_String*)UA_realloc(server->namespaces,
-                                              sizeof(UA_String) * (server->namespacesSize + 1));
-    if(!newNS)
-        return 0;
-    server->namespaces = newNS;
-
-    /* Copy the namespace string */
-    UA_StatusCode retval = UA_String_copy(&name, &server->namespaces[server->namespacesSize]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return 0;
-
-    /* Announce the change (otherwise, the array appears unchanged) */
-    ++server->namespacesSize;
-    return (UA_UInt16)(server->namespacesSize - 1);
-}
-
-UA_UInt16 UA_Server_addNamespace(UA_Server *server, const char* name) {
-    /* Override const attribute to get string (dirty hack) */
-    UA_String nameString;
-    nameString.length = strlen(name);
-    nameString.data = (UA_Byte*)(uintptr_t)name;
-    return addNamespace(server, nameString);
-}
-
-UA_ServerConfig*
-UA_Server_getConfig(UA_Server *server)
-{
-  if(!server)
-    return NULL;
-
-  return &server->config;
-}
-
-UA_StatusCode
-UA_Server_getNamespaceByName(UA_Server *server, const UA_String namespaceUri,
-                             size_t* foundIndex) {
-    /* ensure that the uri for ns1 is set up from the app description */
-    setupNs1Uri(server);
-
-    for(size_t idx = 0; idx < server->namespacesSize; idx++) {
-        if(!UA_String_equal(&server->namespaces[idx], &namespaceUri))
-            continue;
-        (*foundIndex) = idx;
-        return UA_STATUSCODE_GOOD;
-    }
-    return UA_STATUSCODE_BADNOTFOUND;
-}
-
-UA_StatusCode
-UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId,
-                               UA_NodeIteratorCallback callback, void *handle) {
-    const UA_Node *parent = UA_Nodestore_getNode(server->nsCtx, &parentNodeId);
-    if(!parent)
-        return UA_STATUSCODE_BADNODEIDINVALID;
-
-    /* TODO: We need to do an ugly copy of the references array since users may
-     * delete references from within the callback. In single-threaded mode this
-     * changes the same node we point at here. In multi-threaded mode, this
-     * creates a new copy as nodes are truly immutable.
-     * The callback could remove a node via the regular public API.
-     * This can remove a member of the nodes-array we iterate over...
-     * */
-    UA_Node *parentCopy = UA_Node_copy_alloc(parent);
-    if(!parentCopy) {
-        UA_Nodestore_releaseNode(server->nsCtx, parent);
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = parentCopy->referencesSize; i > 0; --i) {
-        UA_NodeReferenceKind *ref = &parentCopy->references[i - 1];
-        for(size_t j = 0; j<ref->targetIdsSize; j++) {
-            retval = callback(ref->targetIds[j].nodeId, ref->isInverse,
-                              ref->referenceTypeId, handle);
-            if(retval != UA_STATUSCODE_GOOD)
-                goto cleanup;
-        }
-    }
-
-cleanup:
-    UA_Node_deleteMembers(parentCopy);
-    UA_free(parentCopy);
-
-    UA_Nodestore_releaseNode(server->nsCtx, parent);
-    return retval;
-}
-
-/********************/
-/* Server Lifecycle */
-/********************/
-
-/* The server needs to be stopped before it can be deleted */
-void UA_Server_delete(UA_Server *server) {
-    /* Delete all internal data */
-    UA_SecureChannelManager_deleteMembers(&server->secureChannelManager);
-    UA_SessionManager_deleteMembers(&server->sessionManager);
-    UA_Array_delete(server->namespaces, server->namespacesSize, &UA_TYPES[UA_TYPES_STRING]);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_MonitoredItem *mon, *mon_tmp;
-    LIST_FOREACH_SAFE(mon, &server->localMonitoredItems, listEntry, mon_tmp) {
-        LIST_REMOVE(mon, listEntry);
-        UA_MonitoredItem_delete(server, mon);
-    }
-#endif
-
-#ifdef UA_ENABLE_PUBSUB
-    UA_PubSubManager_delete(server, &server->pubSubManager);
-#endif
-
-#ifdef UA_ENABLE_DISCOVERY
-    UA_DiscoveryManager_deleteMembers(&server->discoveryManager, server);
-#endif
-
-#if UA_MULTITHREADING >= 100
-    UA_LOCK_DESTROY(server->networkMutex)
-    UA_LOCK_DESTROY(server->serviceMutex)
-#endif
-
-    /* Clean up the Admin Session */
-    UA_Session_deleteMembersCleanup(&server->adminSession, server);
-
-    /* Clean up the work queue */
-    UA_WorkQueue_cleanup(&server->workQueue);
-
-    /* Delete the timed work */
-    UA_Timer_deleteMembers(&server->timer);
-
-    /* Clean up the nodestore */
-    UA_Nodestore_delete(server->nsCtx);
-
-    /* Clean up the config */
-    UA_ServerConfig_clean(&server->config);
-
-    /* Delete the server itself */
-    UA_free(server);
-}
-
-/* Recurring cleanup. Removing unused and timed-out channels and sessions */
-static void
-UA_Server_cleanup(UA_Server *server, void *_) {
-    UA_DateTime nowMonotonic = UA_DateTime_nowMonotonic();
-    UA_SessionManager_cleanupTimedOut(&server->sessionManager, nowMonotonic);
-    UA_SecureChannelManager_cleanupTimedOut(&server->secureChannelManager, nowMonotonic);
-#ifdef UA_ENABLE_DISCOVERY
-    UA_Discovery_cleanupTimedOut(server, nowMonotonic);
-#endif
-}
-
-/********************/
-/* Server Lifecycle */
-/********************/
-
-static UA_Server *
-UA_Server_init(UA_Server *server) {
-    /* Init start time to zero, the actual start time will be sampled in
-     * UA_Server_run_startup() */
-    server->startTime = 0;
-
-    /* Set a seed for non-cyptographic randomness */
-#ifndef UA_ENABLE_DETERMINISTIC_RNG
-    UA_random_seed((UA_UInt64)UA_DateTime_now());
-#endif
-
-#if UA_MULTITHREADING >= 100
-    UA_LOCK_INIT(server->networkMutex)
-    UA_LOCK_INIT(server->serviceMutex)
-#endif
-
-    /* Initialize the handling of repeated callbacks */
-    UA_Timer_init(&server->timer);
-
-    UA_WorkQueue_init(&server->workQueue);
-
-    /* Initialize the adminSession */
-    UA_Session_init(&server->adminSession);
-    server->adminSession.sessionId.identifierType = UA_NODEIDTYPE_GUID;
-    server->adminSession.sessionId.identifier.guid.data1 = 1;
-    server->adminSession.validTill = UA_INT64_MAX;
-
-    /* Create Namespaces 0 and 1
-     * Ns1 will be filled later with the uri from the app description */
-    server->namespaces = (UA_String *)UA_Array_new(2, &UA_TYPES[UA_TYPES_STRING]);
-    if(!server->namespaces) {
-        UA_Server_delete(server);
-        return NULL;
-    }
-    server->namespaces[0] = UA_STRING_ALLOC("http://opcfoundation.org/UA/");
-    server->namespaces[1] = UA_STRING_NULL;
-    server->namespacesSize = 2;
-
-    /* Initialized SecureChannel and Session managers */
-    UA_SecureChannelManager_init(&server->secureChannelManager, server);
-    UA_SessionManager_init(&server->sessionManager, server);
-
-    /* Add a regular callback for cleanup and maintenance. With a 10s interval. */
-    UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_Server_cleanup, NULL,
-                                  10000.0, NULL);
-
-    /* Initialize namespace 0*/
-    UA_StatusCode retVal = UA_Nodestore_new(&server->nsCtx);
-    if(retVal != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    retVal = UA_Server_initNS0(server);
-    if(retVal != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Build PubSub information model */
-#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL
-    UA_Server_initPubSubNS0(server);
-#endif
-
-    return server;
-
- cleanup:
-    UA_Server_delete(server);
-    return NULL;
-}
-
-UA_Server *
-UA_Server_new() {
-    /* Allocate the server */
-    UA_Server *server = (UA_Server *)UA_calloc(1, sizeof(UA_Server));
-    if(!server)
-        return NULL;
-    return UA_Server_init(server);
-}
-
-
-UA_Server *
-UA_Server_newWithConfig(const UA_ServerConfig *config) {
-    UA_Server *server = (UA_Server *)UA_calloc(1, sizeof(UA_Server));
-    if(!server)
-        return NULL;
-    if(config)
-        server->config = *config;
-    return UA_Server_init(server);
-}
-
-/* Returns if the server should be shut down immediately */
-static UA_Boolean
-setServerShutdown(UA_Server *server) {
-    if(server->endTime != 0)
-        return false;
-    if(server->config.shutdownDelay == 0)
-        return true;
-    UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                   "Shutting down the server with a delay of %i ms", (int)server->config.shutdownDelay);
-    server->endTime = UA_DateTime_now() + (UA_DateTime)(server->config.shutdownDelay * UA_DATETIME_MSEC);
-    return false;
-}
-
-/*******************/
-/* Timed Callbacks */
-/*******************/
-
-UA_StatusCode
-UA_Server_addTimedCallback(UA_Server *server, UA_ServerCallback callback,
-                           void *data, UA_DateTime date, UA_UInt64 *callbackId) {
-    return UA_Timer_addTimedCallback(&server->timer,
-                                     (UA_ApplicationCallback)callback,
-                                     server, data, date, callbackId);
-}
-
-UA_StatusCode
-UA_Server_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback,
-                              void *data, UA_Double interval_ms,
-                              UA_UInt64 *callbackId) {
-    return UA_Timer_addRepeatedCallback(&server->timer,
-                                        (UA_ApplicationCallback)callback,
-                                        server, data, interval_ms, callbackId);
-}
-
-UA_StatusCode
-UA_Server_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId,
-                                         UA_Double interval_ms) {
-    return UA_Timer_changeRepeatedCallbackInterval(&server->timer, callbackId,
-                                                   interval_ms);
-}
-
-void
-UA_Server_removeCallback(UA_Server *server, UA_UInt64 callbackId) {
-    UA_Timer_removeCallback(&server->timer, callbackId);
-}
-
-UA_StatusCode UA_EXPORT
-UA_Server_updateCertificate(UA_Server *server,
-                            const UA_ByteString *oldCertificate,
-                            const UA_ByteString *newCertificate,
-                            const UA_ByteString *newPrivateKey,
-                            UA_Boolean closeSessions,
-                            UA_Boolean closeSecureChannels) {
-
-    if (server == NULL || oldCertificate == NULL
-        || newCertificate == NULL || newPrivateKey == NULL) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    if (closeSessions) {
-        UA_SessionManager *sm = &server->sessionManager;
-        session_list_entry *current;
-        LIST_FOREACH(current, &sm->sessions, pointers) {
-            if (UA_ByteString_equal(oldCertificate,
-                                    &current->session.header.channel->securityPolicy->localCertificate)) {
-                UA_SessionManager_removeSession(sm, &current->session.header.authenticationToken);
-            }
-        }
-
-    }
-
-    if (closeSecureChannels) {
-        UA_SecureChannelManager *cm = &server->secureChannelManager;
-        channel_entry *entry;
-        TAILQ_FOREACH(entry, &cm->channels, pointers) {
-            if(UA_ByteString_equal(&entry->channel.securityPolicy->localCertificate, oldCertificate)){
-                UA_SecureChannelManager_close(cm, entry->channel.securityToken.channelId);
-            }
-        }
-    }
-
-    size_t i = 0;
-    while (i < server->config.endpointsSize) {
-        UA_EndpointDescription *ed = &server->config.endpoints[i];
-        if (UA_ByteString_equal(&ed->serverCertificate, oldCertificate)) {
-            UA_String_deleteMembers(&ed->serverCertificate);
-            UA_String_copy(newCertificate, &ed->serverCertificate);
-            UA_SecurityPolicy *sp = UA_SecurityPolicy_getSecurityPolicyByUri(server, &server->config.endpoints[i].securityPolicyUri);
-            if(!sp)
-                return UA_STATUSCODE_BADINTERNALERROR;
-            sp->updateCertificateAndPrivateKey(sp, *newCertificate, *newPrivateKey);
-        }
-        i++;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/***************************/
-/* Server lookup functions */
-/***************************/
-
-UA_SecurityPolicy *
-UA_SecurityPolicy_getSecurityPolicyByUri(const UA_Server *server,
-                                         const UA_ByteString *securityPolicyUri) {
-    for(size_t i = 0; i < server->config.securityPoliciesSize; i++) {
-        UA_SecurityPolicy *securityPolicyCandidate = &server->config.securityPolicies[i];
-        if(UA_ByteString_equal(securityPolicyUri, &securityPolicyCandidate->policyUri))
-            return securityPolicyCandidate;
-    }
-    return NULL;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-/* The local ApplicationURI has to match the certificates of the
- * SecurityPolicies */
-static void
-verifyServerApplicationURI(const UA_Server *server) {
-#if UA_LOGLEVEL <= 400
-    for(size_t i = 0; i < server->config.securityPoliciesSize; i++) {
-        UA_SecurityPolicy *sp = &server->config.securityPolicies[i];
-        if(!sp->certificateVerification)
-            continue;
-        UA_StatusCode retval =
-            sp->certificateVerification->
-            verifyApplicationURI(sp->certificateVerification->context,
-                                 &sp->localCertificate,
-                                 &server->config.applicationDescription.applicationUri);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "The configured ApplicationURI does not match the URI "
-                           "specified in the certificate for the SecurityPolicy %.*s",
-                           (int)sp->policyUri.length, sp->policyUri.data);
-        }
-    }
-#endif
-}
-#endif
-
-/********************/
-/* Main Server Loop */
-/********************/
-
-#define UA_MAXTIMEOUT 50 /* Max timeout in ms between main-loop iterations */
-
-/* Start: Spin up the workers and the network layer and sample the server's
- *        start time.
- * Iterate: Process repeated callbacks and events in the network layer. This
- *          part can be driven from an external main-loop in an event-driven
- *          single-threaded architecture.
- * Stop: Stop workers, finish all callbacks, stop the network layer, clean up */
-
-UA_StatusCode
-UA_Server_run_startup(UA_Server *server) {
-    /* ensure that the uri for ns1 is set up from the app description */
-    setupNs1Uri(server);
-
-    /* write ServerArray with same ApplicationURI value as NamespaceArray */
-    UA_StatusCode retVal = writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERARRAY,
-                                    &server->config.applicationDescription.applicationUri,
-                                    1, &UA_TYPES[UA_TYPES_STRING]);
-    if(retVal != UA_STATUSCODE_GOOD)
-        return retVal;
-
-    if(server->state > UA_SERVERLIFECYCLE_FRESH)
-        return UA_STATUSCODE_GOOD;
-
-    /* At least one endpoint has to be configured */
-    if(server->config.endpointsSize == 0) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "There has to be at least one endpoint.");
-    }
-
-    /* Initialized discovery */
-#ifdef UA_ENABLE_DISCOVERY
-    UA_DiscoveryManager_init(&server->discoveryManager, server);
-#endif
-
-    /* Does the ApplicationURI match the local certificates? */
-#ifdef UA_ENABLE_ENCRYPTION
-    verifyServerApplicationURI(server);
-#endif
-
-    /* Sample the start time and set it to the Server object */
-    server->startTime = UA_DateTime_now();
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setScalar(&var, &server->startTime, &UA_TYPES[UA_TYPES_DATETIME]);
-    UA_Server_writeValue(server,
-                         UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME),
-                         var);
-
-    /* Start the networklayers */
-    UA_StatusCode result = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < server->config.networkLayersSize; ++i) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        result |= nl->start(nl, &server->config.customHostname);
-    }
-
-    /* Update the application description to match the previously added discovery urls.
-     * We can only do this after the network layer is started since it inits the discovery url */
-    if (server->config.applicationDescription.discoveryUrlsSize != 0) {
-        UA_Array_delete(server->config.applicationDescription.discoveryUrls, server->config.applicationDescription.discoveryUrlsSize, &UA_TYPES[UA_TYPES_STRING]);
-        server->config.applicationDescription.discoveryUrlsSize = 0;
-    }
-    server->config.applicationDescription.discoveryUrls = (UA_String *) UA_Array_new(server->config.networkLayersSize, &UA_TYPES[UA_TYPES_STRING]);
-    if (!server->config.applicationDescription.discoveryUrls) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    server->config.applicationDescription.discoveryUrlsSize = server->config.networkLayersSize;
-    for (size_t i=0; i< server->config.applicationDescription.discoveryUrlsSize; i++) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        UA_String_copy(&nl->discoveryUrl, &server->config.applicationDescription.discoveryUrls[i]);
-    }
-
-    /* Spin up the worker threads */
-#if UA_MULTITHREADING >= 200
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Spinning up %u worker thread(s)", server->config.nThreads);
-    UA_WorkQueue_start(&server->workQueue, server->config.nThreads);
-#endif
-
-    /* Start the multicast discovery server */
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    if(server->config.discovery.mdnsEnable)
-        startMulticastDiscoveryServer(server);
-#endif
-
-    server->state = UA_SERVERLIFECYCLE_FRESH;
-
-    return result;
-}
-
-static void
-serverExecuteRepeatedCallback(UA_Server *server, UA_ApplicationCallback cb,
-                        void *callbackApplication, void *data) {
-#if UA_MULTITHREADING >= 200
-    UA_WorkQueue_enqueue(&server->workQueue, cb, callbackApplication, data);
-#else
-    cb(callbackApplication, data);
-#endif
-}
-
-UA_UInt16
-UA_Server_run_iterate(UA_Server *server, UA_Boolean waitInternal) {
-    /* Process repeated work */
-    UA_DateTime now = UA_DateTime_nowMonotonic();
-    UA_DateTime nextRepeated = UA_Timer_process(&server->timer, now,
-                     (UA_TimerExecutionCallback)serverExecuteRepeatedCallback, server);
-    UA_DateTime latest = now + (UA_MAXTIMEOUT * UA_DATETIME_MSEC);
-    if(nextRepeated > latest)
-        nextRepeated = latest;
-
-    UA_UInt16 timeout = 0;
-
-    /* round always to upper value to avoid timeout to be set to 0
-    * if(nextRepeated - now) < (UA_DATETIME_MSEC/2) */
-    if(waitInternal)
-        timeout = (UA_UInt16)(((nextRepeated - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC);
-
-    /* Listen on the networklayer */
-    for(size_t i = 0; i < server->config.networkLayersSize; ++i) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        nl->listen(nl, server, timeout);
-    }
-
-#if defined(UA_ENABLE_DISCOVERY_MULTICAST) && (UA_MULTITHREADING < 200)
-    if(server->config.discovery.mdnsEnable) {
-        // TODO multicastNextRepeat does not consider new input data (requests)
-        // on the socket. It will be handled on the next call. if needed, we
-        // need to use select with timeout on the multicast socket
-        // server->mdnsSocket (see example in mdnsd library) on higher level.
-        UA_DateTime multicastNextRepeat = 0;
-        UA_StatusCode hasNext =
-            iterateMulticastDiscoveryServer(server, &multicastNextRepeat, true);
-        if(hasNext == UA_STATUSCODE_GOOD && multicastNextRepeat < nextRepeated)
-            nextRepeated = multicastNextRepeat;
-    }
-#endif
-
-#if UA_MULTITHREADING < 200
-    UA_WorkQueue_manuallyProcessDelayed(&server->workQueue);
-#endif
-
-    now = UA_DateTime_nowMonotonic();
-    timeout = 0;
-    if(nextRepeated > now)
-        timeout = (UA_UInt16)((nextRepeated - now) / UA_DATETIME_MSEC);
-    return timeout;
-}
-
-UA_StatusCode
-UA_Server_run_shutdown(UA_Server *server) {
-    /* Stop the netowrk layer */
-    for(size_t i = 0; i < server->config.networkLayersSize; ++i) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        nl->stop(nl, server);
-    }
-
-#if UA_MULTITHREADING >= 200
-    /* Shut down the workers */
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Shutting down %u worker thread(s)",
-                (UA_UInt32)server->workQueue.workersSize);
-    UA_WorkQueue_stop(&server->workQueue);
-#endif
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    /* Stop multicast discovery */
-    if(server->config.discovery.mdnsEnable)
-        stopMulticastDiscoveryServer(server);
-#endif
-
-    /* Execute all delayed callbacks */
-    UA_WorkQueue_cleanup(&server->workQueue);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_Boolean
-testShutdownCondition(UA_Server *server) {
-    if(server->endTime == 0)
-        return false;
-    return (UA_DateTime_now() > server->endTime);
-}
-
-UA_StatusCode
-UA_Server_run(UA_Server *server, const volatile UA_Boolean *running) {
-    UA_StatusCode retval = UA_Server_run_startup(server);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-#ifdef UA_ENABLE_VALGRIND_INTERACTIVE
-    size_t loopCount = 0;
-#endif
-    while(!testShutdownCondition(server)) {
-#ifdef UA_ENABLE_VALGRIND_INTERACTIVE
-        if(loopCount == 0) {
-            VALGRIND_DO_LEAK_CHECK;
-        }
-        ++loopCount;
-        loopCount %= UA_VALGRIND_INTERACTIVE_INTERVAL;
-#endif
-        UA_Server_run_iterate(server, true);
-        if(!*running) {
-            if(setServerShutdown(server))
-                break;
-        }
-    }
-    return UA_Server_run_shutdown(server);
-}
-
-#ifdef UA_ENABLE_HISTORIZING
-/* Allow insert of historical data */
-UA_Boolean
-UA_Server_AccessControl_allowHistoryUpdateUpdateData(UA_Server *server,
-                                                     const UA_NodeId *sessionId, void *sessionContext,
-                                                     const UA_NodeId *nodeId,
-                                                     UA_PerformUpdateType performInsertReplace,
-                                                     const UA_DataValue *value) {
-    if(server->config.accessControl.allowHistoryUpdateUpdateData &&
-            !server->config.accessControl.allowHistoryUpdateUpdateData(server, &server->config.accessControl,
-                                                                       sessionId, sessionContext, nodeId,
-                                                                       performInsertReplace, value)) {
-        return false;
-    }
-    return true;
-}
-
-/* Allow delete of historical data */
-UA_Boolean
-UA_Server_AccessControl_allowHistoryUpdateDeleteRawModified(UA_Server *server,
-                                                            const UA_NodeId *sessionId, void *sessionContext,
-                                                            const UA_NodeId *nodeId,
-                                                            UA_DateTime startTimestamp,
-                                                            UA_DateTime endTimestamp,
-                                                            bool isDeleteModified) {
-    if(server->config.accessControl.allowHistoryUpdateDeleteRawModified &&
-            !server->config.accessControl.allowHistoryUpdateDeleteRawModified(server, &server->config.accessControl,
-                                                                              sessionId, sessionContext, nodeId,
-                                                                              startTimestamp, endTimestamp,
-                                                                              isDeleteModified)) {
-        return false;
-    }
-    return true;
-
-}
-#endif /* UA_ENABLE_HISTORIZING */
diff --git a/ext/open62541/src/server/ua_server_binary.c b/ext/open62541/src/server/ua_server_binary.c
deleted file mode 100644
index 4b0908c..0000000
--- a/ext/open62541/src/server/ua_server_binary.c
+++ /dev/null
@@ -1,837 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2014-2015, 2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016 (c) Joakim L. Gilje
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) TorbenD
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#include <open62541/transport_generated.h>
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/transport_generated_handling.h>
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_securechannel_manager.h"
-#include "ua_server_internal.h"
-#include "ua_services.h"
-#include "ua_session_manager.h"
-
-#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
-// store the authentication token and session ID so we can help fuzzing by setting
-// these values in the next request automatically
-UA_NodeId unsafe_fuzz_authenticationToken = {0, UA_NODEIDTYPE_NUMERIC, {0}};
-#endif
-
-#ifdef UA_DEBUG_DUMP_PKGS_FILE
-void UA_debug_dumpCompleteChunk(UA_Server *const server, UA_Connection *const connection,
-                                UA_ByteString *messageBuffer);
-#endif
-
-/********************/
-/* Helper Functions */
-/********************/
-
-static UA_StatusCode
-sendServiceFaultWithRequest(UA_SecureChannel *channel,
-                            const UA_RequestHeader *requestHeader,
-                            const UA_DataType *responseType,
-                            UA_UInt32 requestId, UA_StatusCode error) {
-    UA_STACKARRAY(UA_Byte, response, responseType->memSize);
-    UA_init(response, responseType);
-    UA_ResponseHeader *responseHeader = (UA_ResponseHeader*)response;
-    responseHeader->requestHandle = requestHeader->requestHandle;
-    responseHeader->timestamp = UA_DateTime_now();
-    responseHeader->serviceResult = error;
-
-    /* Send error message. Message type is MSG and not ERR, since we are on a
-     * SecureChannel! */
-    UA_StatusCode retval =
-        UA_SecureChannel_sendSymmetricMessage(channel, requestId, UA_MESSAGETYPE_MSG,
-                                              response, responseType);
-
-    UA_LOG_DEBUG(channel->securityPolicy->logger, UA_LOGCATEGORY_SERVER,
-                 "Sent ServiceFault with error code %s", UA_StatusCode_name(error));
-    return retval;
-}
-
- /* This is not an ERR message, the connection is not closed afterwards */
-static UA_StatusCode
-sendServiceFault(UA_SecureChannel *channel, const UA_ByteString *msg,
-                 size_t offset, const UA_DataType *responseType,
-                 UA_UInt32 requestId, UA_StatusCode error) {
-    UA_RequestHeader requestHeader;
-    UA_StatusCode retval = UA_RequestHeader_decodeBinary(msg, &offset, &requestHeader);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    retval = sendServiceFaultWithRequest(channel, &requestHeader, responseType,
-                                         requestId, error);
-    UA_RequestHeader_deleteMembers(&requestHeader);
-    return retval;
-}
-
-static void
-getServicePointers(UA_UInt32 requestTypeId, const UA_DataType **requestType,
-                   const UA_DataType **responseType, UA_Service *service,
-                   UA_Boolean *requiresSession) {
-    switch(requestTypeId) {
-    case UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_GetEndpoints;
-        *requestType = &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE];
-        *requiresSession = false;
-        break;
-    case UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_FindServers;
-        *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE];
-        *requiresSession = false;
-        break;
-#ifdef UA_ENABLE_DISCOVERY
-# ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    case UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_FindServersOnNetwork;
-        *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE];
-        *requiresSession = false;
-        break;
-# endif
-    case UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_RegisterServer;
-        *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE];
-        *requiresSession = false;
-        break;
-    case UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_RegisterServer2;
-        *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE];
-        *requiresSession = false;
-        break;
-#endif
-    case UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTBINARY:
-        *service = NULL; //(UA_Service)Service_CreateSession;
-        *requestType = &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE];
-        *requiresSession = false;
-        break;
-    case UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTBINARY:
-        *service = NULL; //(UA_Service)Service_ActivateSession;
-        *requestType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE];
-        break;
-    case UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_CloseSession;
-        *requestType = &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE];
-        break;
-    case UA_NS0ID_READREQUEST_ENCODING_DEFAULTBINARY:
-        *service = NULL;
-        *service = (UA_Service)Service_Read;
-        *requestType = &UA_TYPES[UA_TYPES_READREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_READRESPONSE];
-        break;
-    case UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_Write;
-        *requestType = &UA_TYPES[UA_TYPES_WRITEREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_WRITERESPONSE];
-        break;
-    case UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_Browse;
-        *requestType = &UA_TYPES[UA_TYPES_BROWSEREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_BROWSERESPONSE];
-        break;
-    case UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_BrowseNext;
-        *requestType = &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE];
-        break;
-    case UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_RegisterNodes;
-        *requestType = &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE];
-        break;
-    case UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_UnregisterNodes;
-        *requestType = &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE];
-        break;
-    case UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_TranslateBrowsePathsToNodeIds;
-        *requestType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE];
-        break;
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    case UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_CreateSubscription;
-        *requestType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE];
-        break;
-    case UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTBINARY:
-        *requestType = &UA_TYPES[UA_TYPES_PUBLISHREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_PUBLISHRESPONSE];
-        break;
-    case UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_Republish;
-        *requestType = &UA_TYPES[UA_TYPES_REPUBLISHREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE];
-        break;
-    case UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_ModifySubscription;
-        *requestType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE];
-        break;
-    case UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_SetPublishingMode;
-        *requestType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE];
-        break;
-    case UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_DeleteSubscriptions;
-        *requestType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE];
-        break;
-    case UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_CreateMonitoredItems;
-        *requestType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE];
-        break;
-    case UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_DeleteMonitoredItems;
-        *requestType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE];
-        break;
-    case UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_ModifyMonitoredItems;
-        *requestType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE];
-        break;
-    case UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_SetMonitoringMode;
-        *requestType = &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE];
-        break;
-#endif
-#ifdef UA_ENABLE_HISTORIZING
-        /* For History read */
-    case UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_HistoryRead;
-        *requestType = &UA_TYPES[UA_TYPES_HISTORYREADREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_HISTORYREADRESPONSE];
-        break;
-        /* For History update */
-    case UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_HistoryUpdate;
-        *requestType = &UA_TYPES[UA_TYPES_HISTORYUPDATEREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_HISTORYUPDATERESPONSE];
-        break;
-#endif
-
-#ifdef UA_ENABLE_METHODCALLS
-    case UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_Call;
-        *requestType = &UA_TYPES[UA_TYPES_CALLREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_CALLRESPONSE];
-        break;
-#endif
-
-#ifdef UA_ENABLE_NODEMANAGEMENT
-    case UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_AddNodes;
-        *requestType = &UA_TYPES[UA_TYPES_ADDNODESREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_ADDNODESRESPONSE];
-        break;
-    case UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_AddReferences;
-        *requestType = &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE];
-        break;
-    case UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_DeleteNodes;
-        *requestType = &UA_TYPES[UA_TYPES_DELETENODESREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_DELETENODESRESPONSE];
-        break;
-    case UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTBINARY:
-        *service = (UA_Service)Service_DeleteReferences;
-        *requestType = &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST];
-        *responseType = &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE];
-        break;
-#endif
-
-    default:
-        break;
-    }
-}
-
-/*************************/
-/* Process Message Types */
-/*************************/
-
-/* HEL -> Open up the connection */
-static UA_StatusCode
-processHEL(UA_Server *server, UA_Connection *connection,
-           const UA_ByteString *msg, size_t *offset) {
-    UA_TcpHelloMessage helloMessage;
-    UA_StatusCode retval = UA_TcpHelloMessage_decodeBinary(msg, offset, &helloMessage);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Currently not checked */
-    UA_String_deleteMembers(&helloMessage.endpointUrl);
-
-    /* TODO: Use the config of the exact NetworkLayer */
-    if(server->config.networkLayersSize == 0)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    const UA_ConnectionConfig *localConfig = &server->config.networkLayers[0].localConnectionConfig;
-
-    /* Parameterize the connection */
-    UA_ConnectionConfig remoteConfig;
-    remoteConfig.protocolVersion = helloMessage.protocolVersion;
-    remoteConfig.sendBufferSize = helloMessage.sendBufferSize;
-    remoteConfig.recvBufferSize = helloMessage.receiveBufferSize;
-    remoteConfig.maxMessageSize = helloMessage.maxMessageSize;
-    remoteConfig.maxChunkCount = helloMessage.maxChunkCount;
-    retval = UA_Connection_processHELACK(connection, localConfig, &remoteConfig);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                    "Connection %i | Error during the HEL/ACK handshake",
-                    (int)(connection->sockfd));
-        return retval;
-    }
-
-    /* Build acknowledge response */
-    UA_TcpAcknowledgeMessage ackMessage;
-    memcpy(&ackMessage, localConfig, sizeof(UA_TcpAcknowledgeMessage)); /* Same struct layout.. */
-    UA_TcpMessageHeader ackHeader;
-    ackHeader.messageTypeAndChunkType = UA_MESSAGETYPE_ACK + UA_CHUNKTYPE_FINAL;
-    ackHeader.messageSize = 8 + 20; /* ackHeader + ackMessage */
-
-    /* Get the send buffer from the network layer */
-    UA_ByteString ack_msg;
-    UA_ByteString_init(&ack_msg);
-    retval = connection->getSendBuffer(connection, connection->config.sendBufferSize, &ack_msg);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Encode and send the response */
-    UA_Byte *bufPos = ack_msg.data;
-    const UA_Byte *bufEnd = &ack_msg.data[ack_msg.length];
-
-    retval = UA_TcpMessageHeader_encodeBinary(&ackHeader, &bufPos, bufEnd);
-    if(retval != UA_STATUSCODE_GOOD) {
-        connection->releaseSendBuffer(connection, &ack_msg);
-        return retval;
-    }
-
-    retval = UA_TcpAcknowledgeMessage_encodeBinary(&ackMessage, &bufPos, bufEnd);
-    if(retval != UA_STATUSCODE_GOOD) {
-        connection->releaseSendBuffer(connection, &ack_msg);
-        return retval;
-    }
-    ack_msg.length = ackHeader.messageSize;
-    return connection->send(connection, &ack_msg);
-}
-
-/* OPN -> Open up/renew the securechannel */
-static UA_StatusCode
-processOPN(UA_Server *server, UA_SecureChannel *channel,
-           const UA_UInt32 requestId, const UA_ByteString *msg) {
-    /* Decode the request */
-    size_t offset = 0;
-    UA_NodeId requestType;
-    UA_OpenSecureChannelRequest openSecureChannelRequest;
-    UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestType);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_NodeId_deleteMembers(&requestType);
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                            "Could not decode the NodeId. Closing the connection");
-        UA_SecureChannelManager_close(&server->secureChannelManager, channel->securityToken.channelId);
-        return retval;
-    }
-    retval = UA_OpenSecureChannelRequest_decodeBinary(msg, &offset, &openSecureChannelRequest);
-
-    /* Error occurred */
-    if(retval != UA_STATUSCODE_GOOD ||
-       requestType.identifier.numeric != UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST].binaryEncodingId) {
-        UA_NodeId_deleteMembers(&requestType);
-        UA_OpenSecureChannelRequest_deleteMembers(&openSecureChannelRequest);
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                            "Could not decode the OPN message. Closing the connection.");
-        UA_SecureChannelManager_close(&server->secureChannelManager, channel->securityToken.channelId);
-        return retval;
-    }
-    UA_NodeId_deleteMembers(&requestType);
-
-    /* Call the service */
-    UA_OpenSecureChannelResponse openScResponse;
-    UA_OpenSecureChannelResponse_init(&openScResponse);
-    Service_OpenSecureChannel(server, channel, &openSecureChannelRequest, &openScResponse);
-    UA_OpenSecureChannelRequest_deleteMembers(&openSecureChannelRequest);
-    if(openScResponse.responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel, "Could not open a SecureChannel. "
-                            "Closing the connection.");
-        UA_SecureChannelManager_close(&server->secureChannelManager,
-                                      channel->securityToken.channelId);
-        return openScResponse.responseHeader.serviceResult;
-    }
-
-    /* Send the response */
-    retval = UA_SecureChannel_sendAsymmetricOPNMessage(channel, requestId, &openScResponse,
-                                                       &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    UA_OpenSecureChannelResponse_deleteMembers(&openScResponse);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                            "Could not send the OPN answer with error code %s",
-                            UA_StatusCode_name(retval));
-        UA_SecureChannelManager_close(&server->secureChannelManager,
-                                      channel->securityToken.channelId);
-        return retval;
-    }
-
-    return retval;
-}
-
-static UA_StatusCode
-sendResponse(UA_SecureChannel *channel, UA_UInt32 requestId, UA_UInt32 requestHandle,
-             UA_ResponseHeader *responseHeader, const UA_DataType *responseType) {
-    /* Prepare the ResponseHeader */
-    responseHeader->requestHandle = requestHandle;
-    responseHeader->timestamp = UA_DateTime_now();
-
-    /* Start the message context */
-    UA_MessageContext mc;
-    UA_StatusCode retval = UA_MessageContext_begin(&mc, channel, requestId, UA_MESSAGETYPE_MSG);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Assert's required for clang-analyzer */
-    UA_assert(mc.buf_pos == &mc.messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]);
-    UA_assert(mc.buf_end <= &mc.messageBuffer.data[mc.messageBuffer.length]);
-
-    /* Encode the response type */
-    UA_NodeId typeId = UA_NODEID_NUMERIC(0, responseType->binaryEncodingId);
-    retval = UA_MessageContext_encode(&mc, &typeId, &UA_TYPES[UA_TYPES_NODEID]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Encode the response */
-    retval = UA_MessageContext_encode(&mc, responseHeader, responseType);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Finish / send out */
-    return UA_MessageContext_finish(&mc);
-}
-
-static UA_StatusCode
-processMSGDecoded(UA_Server *server, UA_SecureChannel *channel, UA_UInt32 requestId,
-                  UA_Service service, const UA_RequestHeader *requestHeader,
-                  const UA_DataType *requestType, UA_ResponseHeader *responseHeader,
-                  const UA_DataType *responseType, UA_Boolean sessionRequired) {
-    /* CreateSession doesn't need a session */
-    if(requestType == &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]) {
-        Service_CreateSession(server, channel,
-                              (const UA_CreateSessionRequest *)requestHeader,
-                              (UA_CreateSessionResponse *)responseHeader);
-#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
-        /* Store the authentication token and session ID so we can help fuzzing
-         * by setting these values in the next request automatically */
-        UA_CreateSessionResponse *res = (UA_CreateSessionResponse *)responseHeader;
-        UA_NodeId_copy(&res->authenticationToken, &unsafe_fuzz_authenticationToken);
-#endif
-        return sendResponse(channel, requestId, requestHeader->requestHandle,
-                            responseHeader, responseType);
-    }
-
-    /* Find the matching session */
-    UA_Session *session = (UA_Session*)
-        UA_SecureChannel_getSession(channel, &requestHeader->authenticationToken);
-    if(!session && !UA_NodeId_isNull(&requestHeader->authenticationToken))
-        session = UA_SessionManager_getSessionByToken(&server->sessionManager,
-                                                      &requestHeader->authenticationToken);
-
-    if(requestType == &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]) {
-        if(!session) {
-            UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel,
-                                 "Trying to activate a session that is " \
-                                 "not known in the server");
-            return sendServiceFaultWithRequest(channel, requestHeader, responseType,
-                                    requestId, UA_STATUSCODE_BADSESSIONIDINVALID);
-        }
-        Service_ActivateSession(server, channel, session,
-                                (const UA_ActivateSessionRequest*)requestHeader,
-                                (UA_ActivateSessionResponse*)responseHeader);
-        return sendResponse(channel, requestId, requestHeader->requestHandle,
-                            responseHeader, responseType);
-    }
-
-    /* Set an anonymous, inactive session for services that need no session */
-    UA_Session anonymousSession;
-    if(!session) {
-        if(sessionRequired) {
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-            UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                                   "%s refused without a valid session",
-                                   requestType->typeName);
-#else
-            UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                                   "Service %i refused without a valid session",
-                                   requestType->binaryEncodingId);
-#endif
-            return sendServiceFaultWithRequest(channel, requestHeader, responseType,
-                                               requestId, UA_STATUSCODE_BADSESSIONIDINVALID);
-        }
-
-        UA_Session_init(&anonymousSession);
-        anonymousSession.sessionId = UA_NODEID_GUID(0, UA_GUID_NULL);
-        anonymousSession.header.channel = channel;
-        session = &anonymousSession;
-    }
-
-    /* Trying to use a non-activated session? Do not allow if request is of type
-     * CloseSessionRequest */
-    if(sessionRequired && !session->activated &&
-       requestType != &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]) {
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-        UA_LOG_WARNING_SESSION(&server->config.logger, session,
-                               "%s refused on a non-activated session",
-                               requestType->typeName);
-#else
-        UA_LOG_WARNING_SESSION(&server->config.logger, session,
-                               "Service %i refused on a non-activated session",
-                               requestType->binaryEncodingId);
-#endif
-        UA_SessionManager_removeSession(&server->sessionManager,
-                                        &session->header.authenticationToken);
-        return sendServiceFaultWithRequest(channel, requestHeader, responseType,
-                                           requestId, UA_STATUSCODE_BADSESSIONNOTACTIVATED);
-    }
-
-    /* The session is bound to another channel */
-    if(session != &anonymousSession && session->header.channel != channel) {
-        UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                               "Client tries to use a Session that is not "
-                               "bound to this SecureChannel");
-        return sendServiceFaultWithRequest(channel, requestHeader, responseType,
-                                           requestId, UA_STATUSCODE_BADSECURECHANNELIDINVALID);
-    }
-
-    /* Update the session lifetime */
-    UA_Session_updateLifetime(session);
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* The publish request is not answered immediately */
-    if(requestType == &UA_TYPES[UA_TYPES_PUBLISHREQUEST]) {
-        Service_Publish(server, session, (const UA_PublishRequest*)requestHeader, requestId);
-        return UA_STATUSCODE_GOOD;
-    }
-#endif
-
-    /* Dispatch the synchronous service call and send the response */
-    UA_LOCK(server->serviceMutex);
-    service(server, session, requestHeader, responseHeader);
-    UA_UNLOCK(server->serviceMutex);
-    return sendResponse(channel, requestId, requestHeader->requestHandle,
-                        responseHeader, responseType);
-}
-
-static UA_StatusCode
-processMSG(UA_Server *server, UA_SecureChannel *channel,
-           UA_UInt32 requestId, const UA_ByteString *msg) {
-    /* Decode the nodeid */
-    size_t offset = 0;
-    UA_NodeId requestTypeId;
-    UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestTypeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    if(requestTypeId.namespaceIndex != 0 ||
-       requestTypeId.identifierType != UA_NODEIDTYPE_NUMERIC)
-        UA_NodeId_deleteMembers(&requestTypeId); /* leads to badserviceunsupported */
-
-    size_t requestPos = offset; /* Store the offset (for sendServiceFault) */
-
-    /* Get the service pointers */
-    UA_Service service = NULL;
-    UA_Boolean sessionRequired = true;
-    const UA_DataType *requestType = NULL;
-    const UA_DataType *responseType = NULL;
-    getServicePointers(requestTypeId.identifier.numeric, &requestType,
-                       &responseType, &service, &sessionRequired);
-    if(!requestType) {
-        if(requestTypeId.identifier.numeric == 787) {
-            UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                                "Client requested a subscription, " \
-                                "but those are not enabled in the build");
-        } else {
-            UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                                "Unknown request with type identifier %i",
-                                requestTypeId.identifier.numeric);
-        }
-        return sendServiceFault(channel, msg, requestPos, &UA_TYPES[UA_TYPES_SERVICEFAULT],
-                                requestId, UA_STATUSCODE_BADSERVICEUNSUPPORTED);
-    }
-    UA_assert(responseType);
-
-    /* Decode the request */
-    UA_STACKARRAY(UA_Byte, request, requestType->memSize);
-    retval = UA_decodeBinary(msg, &offset, request, requestType, server->config.customDataTypes);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel,
-                             "Could not decode the request");
-        return sendServiceFault(channel, msg, requestPos, responseType, requestId, retval);
-    }
-
-    /* Check timestamp in the request header */
-    UA_RequestHeader *requestHeader = (UA_RequestHeader*)request;
-    if(requestHeader->timestamp == 0) {
-        if(server->config.verifyRequestTimestamp <= UA_RULEHANDLING_WARN) {
-            UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                                   "The server sends no timestamp in the request header. "
-                                   "See the 'verifyRequestTimestamp' setting.");
-            if(server->config.verifyRequestTimestamp <= UA_RULEHANDLING_ABORT) {
-                retval = sendServiceFaultWithRequest(channel, requestHeader, responseType,
-                                                     requestId, UA_STATUSCODE_BADINVALIDTIMESTAMP);
-                UA_deleteMembers(request, requestType);
-                return retval;
-            }
-        }
-    }
-
-#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
-    /* Set the authenticationToken from the create session request to help
-     * fuzzing cover more lines */
-    UA_NodeId_deleteMembers(&requestHeader->authenticationToken);
-    if(!UA_NodeId_isNull(&unsafe_fuzz_authenticationToken))
-        UA_NodeId_copy(&unsafe_fuzz_authenticationToken, &requestHeader->authenticationToken);
-#endif
-
-    /* Prepare the respone */
-    UA_STACKARRAY(UA_Byte, response, responseType->memSize);
-    UA_ResponseHeader *responseHeader = (UA_ResponseHeader*)response;
-    UA_init(response, responseType);
-
-    /* Continue with the decoded Request */
-    retval = processMSGDecoded(server, channel, requestId, service, requestHeader, requestType,
-                               responseHeader, responseType, sessionRequired);
-
-    /* Clean up */
-    UA_deleteMembers(request, requestType);
-    UA_deleteMembers(responseHeader, responseType);
-    return retval;
-}
-
-/* Takes decoded messages starting at the nodeid of the content type. */
-static void
-processSecureChannelMessage(void *application, UA_SecureChannel *channel,
-                            UA_MessageType messagetype, UA_UInt32 requestId,
-                            const UA_ByteString *message) {
-    UA_Server *server = (UA_Server*)application;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    switch(messagetype) {
-    case UA_MESSAGETYPE_OPN:
-        UA_LOG_TRACE_CHANNEL(&server->config.logger, channel,
-                             "Process an OPN on an open channel");
-        retval = processOPN(server, channel, requestId, message);
-        break;
-    case UA_MESSAGETYPE_MSG:
-        UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, "Process a MSG");
-        retval = processMSG(server, channel, requestId, message);
-        break;
-    case UA_MESSAGETYPE_CLO:
-        UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, "Process a CLO");
-        Service_CloseSecureChannel(server, channel);
-        break;
-    default:
-        UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, "Invalid message type");
-        retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-        break;
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                            "Processing the message failed with StatusCode %s. "
-                            "Closing the channel.", UA_StatusCode_name(retval));
-        Service_CloseSecureChannel(server, channel);
-    }
-}
-
-static UA_StatusCode
-createSecureChannel(void *application, UA_Connection *connection,
-                    UA_AsymmetricAlgorithmSecurityHeader *asymHeader) {
-    UA_Server *server = (UA_Server*)application;
-
-    /* Iterate over available endpoints and choose the correct one */
-    UA_SecurityPolicy *securityPolicy = NULL;
-    for(size_t i = 0; i < server->config.securityPoliciesSize; ++i) {
-        UA_SecurityPolicy *policy = &server->config.securityPolicies[i];
-        if(!UA_ByteString_equal(&asymHeader->securityPolicyUri, &policy->policyUri))
-            continue;
-
-        UA_StatusCode retval = policy->asymmetricModule.
-            compareCertificateThumbprint(policy, &asymHeader->receiverCertificateThumbprint);
-        if(retval != UA_STATUSCODE_GOOD)
-            continue;
-
-        /* We found the correct policy (except for security mode). The endpoint
-         * needs to be selected by the client / server to match the security
-         * mode in the endpoint for the session. */
-        securityPolicy = policy;
-        break;
-    }
-
-    if(!securityPolicy)
-        return UA_STATUSCODE_BADSECURITYPOLICYREJECTED;
-
-    /* Create a new channel */
-    return UA_SecureChannelManager_create(&server->secureChannelManager, connection,
-                                          securityPolicy, asymHeader);
-}
-
-static UA_StatusCode
-processCompleteChunkWithoutChannel(UA_Server *server, UA_Connection *connection,
-                                   UA_ByteString *message) {
-    /* Process chunk without a channel; must be OPN */
-    UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                 "Connection %i | No channel attached to the connection. "
-                 "Process the chunk directly", (int)(connection->sockfd));
-    size_t offset = 0;
-    UA_TcpMessageHeader tcpMessageHeader;
-    UA_StatusCode retval =
-        UA_TcpMessageHeader_decodeBinary(message, &offset, &tcpMessageHeader);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    // Only HEL and OPN messages possible without a channel (on the server side)
-    switch(tcpMessageHeader.messageTypeAndChunkType & 0x00ffffffu) {
-    case UA_MESSAGETYPE_HEL:
-        retval = processHEL(server, connection, message, &offset);
-        break;
-    case UA_MESSAGETYPE_OPN:
-    {
-        UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Connection %i | Process OPN message", (int)(connection->sockfd));
-
-        /* Called before HEL */
-        if(connection->state != UA_CONNECTION_ESTABLISHED) {
-            retval = UA_STATUSCODE_BADCOMMUNICATIONERROR;
-            break;
-        }
-
-        // Decode the asymmetric algorithm security header since it is not encrypted and
-        // needed to decide what security policy to use.
-        UA_AsymmetricAlgorithmSecurityHeader asymHeader;
-        UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader);
-        size_t messageHeaderOffset = UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH;
-        retval = UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(message,
-                                                                   &messageHeaderOffset,
-                                                                   &asymHeader);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-
-        retval = createSecureChannel(server, connection, &asymHeader);
-        UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-
-        retval = UA_SecureChannel_decryptAddChunk(connection->channel, message, false);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-
-        UA_SecureChannel_processCompleteMessages(connection->channel, server,
-                                                 processSecureChannelMessage);
-        break;
-    }
-    default:
-        UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                     "Connection %i | Expected OPN or HEL message on a connection "
-                     "without a SecureChannel", (int)(connection->sockfd));
-        retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-        break;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-processCompleteChunk(void *const application, UA_Connection *connection,
-                     UA_ByteString *chunk) {
-    UA_Server *server = (UA_Server*)application;
-#ifdef UA_DEBUG_DUMP_PKGS_FILE
-    UA_debug_dumpCompleteChunk(server, connection, chunk);
-#endif
-    if(!connection->channel)
-        return processCompleteChunkWithoutChannel(server, connection, chunk);
-    return UA_SecureChannel_decryptAddChunk(connection->channel, chunk, false);
-}
-
-void
-UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection,
-                               UA_ByteString *message) {
-    UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                 "Connection %i | Received a packet.", (int)(connection->sockfd));
-#ifdef UA_DEBUG_DUMP_PKGS
-    UA_dump_hex_pkg(message->data, message->length);
-#endif
-
-    UA_StatusCode retval = UA_Connection_processChunks(connection, server,
-                                                       processCompleteChunk, message);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                    "Connection %i | Processing the message failed with "
-                    "error %s", (int)(connection->sockfd), UA_StatusCode_name(retval));
-        /* Send an ERR message and close the connection */
-        UA_TcpErrorMessage error;
-        error.error = retval;
-        error.reason = UA_STRING_NULL;
-        UA_Connection_sendError(connection, &error);
-        connection->close(connection);
-        return;
-    }
-
-    UA_SecureChannel *channel = connection->channel;
-    if(!channel)
-        return;
-
-    /* Process complete messages */
-    UA_SecureChannel_processCompleteMessages(channel, server, processSecureChannelMessage);
-
-    /* Is the channel still open? */
-    if(channel->state == UA_SECURECHANNELSTATE_CLOSED)
-        return;
-
-    /* Store unused decoded chunks internally in the SecureChannel */
-    UA_SecureChannel_persistIncompleteMessages(connection->channel);
-}
-
-#if UA_MULTITHREADING >= 200
-static void
-deleteConnection(UA_Server *server, UA_Connection *connection) {
-    connection->free(connection);
-}
-#endif
-
-void
-UA_Server_removeConnection(UA_Server *server, UA_Connection *connection) {
-    UA_Connection_detachSecureChannel(connection);
-#if UA_MULTITHREADING >= 200
-    UA_DelayedCallback *dc = (UA_DelayedCallback*)UA_malloc(sizeof(UA_DelayedCallback));
-    if(!dc)
-        return; /* Malloc cannot fail on OS's that support multithreading. They
-                 * rather kill the process. */
-    dc->callback = (UA_ApplicationCallback)deleteConnection;
-    dc->application = server;
-    dc->data = connection;
-    UA_WorkQueue_enqueueDelayed(&server->workQueue, dc);
-#else
-    connection->free(connection);
-#endif
-}
diff --git a/ext/open62541/src/server/ua_server_config.c b/ext/open62541/src/server/ua_server_config.c
deleted file mode 100644
index d2b5ac7..0000000
--- a/ext/open62541/src/server/ua_server_config.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include <open62541/server_config.h>
-
-void
-UA_ServerConfig_clean(UA_ServerConfig *config) {
-    if(!config)
-        return;
-
-    /* Server Description */
-    UA_BuildInfo_deleteMembers(&config->buildInfo);
-    UA_ApplicationDescription_deleteMembers(&config->applicationDescription);
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    UA_MdnsDiscoveryConfiguration_clear(&config->discovery.mdns);
-    UA_String_clear(&config->discovery.mdnsInterfaceIP);
-#endif
-
-    /* Custom DataTypes */
-    /* nothing to do */
-
-    /* Networking */
-    for(size_t i = 0; i < config->networkLayersSize; ++i)
-        config->networkLayers[i].deleteMembers(&config->networkLayers[i]);
-    UA_free(config->networkLayers);
-    config->networkLayers = NULL;
-    config->networkLayersSize = 0;
-    UA_String_deleteMembers(&config->customHostname);
-    config->customHostname = UA_STRING_NULL;
-
-    for(size_t i = 0; i < config->securityPoliciesSize; ++i) {
-        UA_SecurityPolicy *policy = &config->securityPolicies[i];
-        policy->deleteMembers(policy);
-    }
-    UA_free(config->securityPolicies);
-    config->securityPolicies = NULL;
-    config->securityPoliciesSize = 0;
-
-    for(size_t i = 0; i < config->endpointsSize; ++i)
-        UA_EndpointDescription_deleteMembers(&config->endpoints[i]);
-
-    UA_free(config->endpoints);
-    config->endpoints = NULL;
-    config->endpointsSize = 0;
-
-    /* Certificate Validation */
-    if(config->certificateVerification.deleteMembers)
-        config->certificateVerification.deleteMembers(&config->certificateVerification);
-
-    /* Access Control */
-    if(config->accessControl.deleteMembers)
-        config->accessControl.deleteMembers(&config->accessControl);
-
-    /* Historical data */
-#ifdef UA_ENABLE_HISTORIZING
-    if(config->historyDatabase.deleteMembers)
-        config->historyDatabase.deleteMembers(&config->historyDatabase);
-#endif
-
-    /* Logger */
-    if(config->logger.clear)
-        config->logger.clear(config->logger.context);
-}
-
-void
-UA_ServerConfig_setCustomHostname(UA_ServerConfig *config,
-                                  const UA_String customHostname) {
-    if(!config)
-        return;
-    UA_String_deleteMembers(&config->customHostname);
-    UA_String_copy(&customHostname, &config->customHostname);
-}
-
-#ifdef UA_ENABLE_PUBSUB
-/* Add a pubsubTransportLayer to the configuration. Memory is reallocated on
- * demand. */
-UA_StatusCode
-UA_ServerConfig_addPubSubTransportLayer(UA_ServerConfig *config,
-        UA_PubSubTransportLayer *pubsubTransportLayer) {
-
-    if(config->pubsubTransportLayersSize == 0) {
-        config->pubsubTransportLayers = (UA_PubSubTransportLayer *)
-                UA_malloc(sizeof(UA_PubSubTransportLayer));
-    } else {
-        config->pubsubTransportLayers = (UA_PubSubTransportLayer*)
-                UA_realloc(config->pubsubTransportLayers,
-                sizeof(UA_PubSubTransportLayer) * (config->pubsubTransportLayersSize + 1));
-    }
-
-    if(config->pubsubTransportLayers == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    memcpy(&config->pubsubTransportLayers[config->pubsubTransportLayersSize],
-            pubsubTransportLayer, sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayersSize++;
-
-    return UA_STATUSCODE_GOOD;
-}
-#endif /* UA_ENABLE_PUBSUB */
diff --git a/ext/open62541/src/server/ua_server_discovery.c b/ext/open62541/src/server/ua_server_discovery.c
deleted file mode 100644
index f3dd79e..0000000
--- a/ext/open62541/src/server/ua_server_discovery.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include <open62541/client.h>
-
-#include "ua_server_internal.h"
-
-#ifdef UA_ENABLE_DISCOVERY
-
-static UA_StatusCode
-register_server_with_discovery_server(UA_Server *server,
-                                      UA_Client *client,
-                                      const UA_Boolean isUnregister,
-                                      const char* semaphoreFilePath) {
-    /* Prepare the request. Do not cleanup the request after the service call,
-     * as the members are stack-allocated or point into the server config. */
-    UA_RegisterServer2Request request;
-    UA_RegisterServer2Request_init(&request);
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-
-    request.server.isOnline = !isUnregister;
-    request.server.serverUri = server->config.applicationDescription.applicationUri;
-    request.server.productUri = server->config.applicationDescription.productUri;
-    request.server.serverType = server->config.applicationDescription.applicationType;
-    request.server.gatewayServerUri = server->config.applicationDescription.gatewayServerUri;
-
-    if(semaphoreFilePath) {
-#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE
-        request.server.semaphoreFilePath =
-            UA_STRING((char*)(uintptr_t)semaphoreFilePath); /* dirty cast */
-#else
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_CLIENT,
-                       "Ignoring semaphore file path. open62541 not compiled "
-                       "with UA_ENABLE_DISCOVERY_SEMAPHORE=ON");
-#endif
-    }
-
-    request.server.serverNames = &server->config.applicationDescription.applicationName;
-    request.server.serverNamesSize = 1;
-
-    /* Copy the discovery urls from the server config and the network layers*/
-    size_t config_discurls = server->config.applicationDescription.discoveryUrlsSize;
-    size_t nl_discurls = server->config.networkLayersSize;
-    size_t total_discurls = config_discurls + nl_discurls;
-    UA_STACKARRAY(UA_String, urlsBuf, total_discurls);
-    request.server.discoveryUrls = urlsBuf;
-    request.server.discoveryUrlsSize = total_discurls;
-
-    for(size_t i = 0; i < config_discurls; ++i)
-        request.server.discoveryUrls[i] = server->config.applicationDescription.discoveryUrls[i];
-
-    /* TODO: Add nl only if discoveryUrl not already present */
-    for(size_t i = 0; i < nl_discurls; ++i) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        request.server.discoveryUrls[config_discurls + i] = nl->discoveryUrl;
-    }
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    request.discoveryConfigurationSize = 1;
-    request.discoveryConfiguration = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(&request.discoveryConfiguration[0]);
-    // Set to NODELETE so that we can just use a pointer to the mdns config
-    request.discoveryConfiguration[0].encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    request.discoveryConfiguration[0].content.decoded.type = &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION];
-    request.discoveryConfiguration[0].content.decoded.data = &server->config.discovery.mdns;
-#endif
-
-    // First try with RegisterServer2, if that isn't implemented, use RegisterServer
-    UA_RegisterServer2Response response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST],
-                        &response, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]);
-
-    UA_StatusCode serviceResult = response.responseHeader.serviceResult;
-    UA_RegisterServer2Response_deleteMembers(&response);
-    UA_Array_delete(request.discoveryConfiguration,
-                    request.discoveryConfigurationSize,
-                    &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    request.discoveryConfiguration = NULL;
-    request.discoveryConfigurationSize = 0;
-
-    if(serviceResult == UA_STATUSCODE_BADNOTIMPLEMENTED ||
-       serviceResult == UA_STATUSCODE_BADSERVICEUNSUPPORTED) {
-        /* Try RegisterServer */
-        UA_RegisterServerRequest request_fallback;
-        UA_RegisterServerRequest_init(&request_fallback);
-        /* Copy from RegisterServer2 request */
-        request_fallback.requestHeader = request.requestHeader;
-        request_fallback.server = request.server;
-
-        UA_RegisterServerResponse response_fallback;
-
-        __UA_Client_Service(client, &request_fallback,
-                            &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST],
-                            &response_fallback,
-                            &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]);
-
-        serviceResult = response_fallback.responseHeader.serviceResult;
-        UA_RegisterServerResponse_deleteMembers(&response_fallback);
-    }
-
-    if(serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "RegisterServer/RegisterServer2 failed with statuscode %s",
-                     UA_StatusCode_name(serviceResult));
-    }
-
-    return serviceResult;
-}
-
-UA_StatusCode
-UA_Server_register_discovery(UA_Server *server, UA_Client *client,
-                             const char* semaphoreFilePath) {
-    return register_server_with_discovery_server(server, client,
-                                                 false, semaphoreFilePath);
-}
-
-UA_StatusCode
-UA_Server_unregister_discovery(UA_Server *server, UA_Client *client) {
-    return register_server_with_discovery_server(server, client,
-                                                 true, NULL);
-}
-
-#endif /* UA_ENABLE_DISCOVERY */
diff --git a/ext/open62541/src/server/ua_server_discovery_mdns.c b/ext/open62541/src/server/ua_server_discovery_mdns.c
deleted file mode 100644
index 74a2620..0000000
--- a/ext/open62541/src/server/ua_server_discovery_mdns.c
+++ /dev/null
@@ -1,711 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include "ua_server_internal.h"
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-#ifndef UA_ENABLE_AMALGAMATION
-#include "mdnsd/libmdnsd/xht.h"
-#include "mdnsd/libmdnsd/sdtxt.h"
-#endif
-
-#ifdef _WIN32
-/* inet_ntoa is deprecated on MSVC but used for compatibility */
-# define _WINSOCK_DEPRECATED_NO_WARNINGS
-# include <winsock2.h>
-# include <iphlpapi.h>
-# include <ws2tcpip.h>
-#else
-# include <sys/time.h> // for struct timeval
-# include <netinet/in.h> // for struct ip_mreq
-# include <ifaddrs.h>
-# include <net/if.h> /* for IFF_RUNNING */
-# include <netdb.h> // for recvfrom in cygwin
-#endif
-
-/* FIXME: Is this a required algorithm? Otherwise, reuse hashing for nodeids */
-/* Generates a hash code for a string.
- * This function uses the ELF hashing algorithm as reprinted in
- * Andrew Binstock, "Hashing Rehashed," Dr. Dobb's Journal, April 1996.
- */
-static int
-mdns_hash_record(const char *s) {
-    /* ELF hash uses unsigned chars and unsigned arithmetic for portability */
-    const unsigned char *name = (const unsigned char *) s;
-    unsigned long h = 0;
-    while(*name) {
-        h = (h << 4) + (unsigned long) (*name++);
-        unsigned long g;
-        if((g = (h & 0xF0000000UL)) != 0)
-            h ^= (g >> 24);
-        h &= ~g;
-    }
-    return (int) h;
-}
-
-static struct serverOnNetwork_list_entry *
-mdns_record_add_or_get(UA_DiscoveryManager *dm, const char *record, const char *serverName,
-                       size_t serverNameLen, UA_Boolean createNew) {
-    int hashIdx = mdns_hash_record(record) % SERVER_ON_NETWORK_HASH_PRIME;
-    struct serverOnNetwork_hash_entry *hash_entry = dm->serverOnNetworkHash[hashIdx];
-
-    while(hash_entry) {
-        size_t maxLen;
-        if(serverNameLen > hash_entry->entry->serverOnNetwork.serverName.length)
-            maxLen = hash_entry->entry->serverOnNetwork.serverName.length;
-        else
-            maxLen = serverNameLen;
-
-        if(strncmp((char *) hash_entry->entry->serverOnNetwork.serverName.data,
-                   serverName, maxLen) == 0)
-            return hash_entry->entry;
-        hash_entry = hash_entry->next;
-    }
-
-    if(!createNew)
-        return NULL;
-
-    /* not yet in list, create new one */
-    /* todo: malloc may fail: return a statuscode */
-    struct serverOnNetwork_list_entry *listEntry = (serverOnNetwork_list_entry*)
-        UA_malloc(sizeof(struct serverOnNetwork_list_entry));
-    listEntry->created = UA_DateTime_now();
-    listEntry->pathTmp = NULL;
-    listEntry->txtSet = false;
-    listEntry->srvSet = false;
-    UA_ServerOnNetwork_init(&listEntry->serverOnNetwork);
-    listEntry->serverOnNetwork.recordId = dm->serverOnNetworkRecordIdCounter;
-    listEntry->serverOnNetwork.serverName.length = serverNameLen;
-    /* todo: malloc may fail: return a statuscode */
-    listEntry->serverOnNetwork.serverName.data = (UA_Byte*)UA_malloc(serverNameLen);
-    memcpy(listEntry->serverOnNetwork.serverName.data, serverName, serverNameLen);
-    UA_atomic_addUInt32(&dm->serverOnNetworkRecordIdCounter, 1);
-    if(dm->serverOnNetworkRecordIdCounter == 0)
-        dm->serverOnNetworkRecordIdLastReset = UA_DateTime_now();
-
-    /* add to hash */
-    /* todo: malloc may fail: return a statuscode */
-    struct serverOnNetwork_hash_entry *newHashEntry = (struct serverOnNetwork_hash_entry*)
-        UA_malloc(sizeof(struct serverOnNetwork_hash_entry));
-    newHashEntry->next = dm->serverOnNetworkHash[hashIdx];
-    dm->serverOnNetworkHash[hashIdx] = newHashEntry;
-    newHashEntry->entry = listEntry;
-
-    LIST_INSERT_HEAD(&dm->serverOnNetwork, listEntry, pointers);
-
-    return listEntry;
-}
-
-#ifdef _WIN32
-
-/* see http://stackoverflow.com/a/10838854/869402 */
-static IP_ADAPTER_ADDRESSES *
-getInterfaces(const UA_Server *server) {
-    IP_ADAPTER_ADDRESSES* adapter_addresses = NULL;
-
-    /* Start with a 16 KB buffer and resize if needed - multiple attempts in
-     * case interfaces change while we are in the middle of querying them. */
-    DWORD adapter_addresses_buffer_size = 16 * 1024;
-    for(size_t attempts = 0; attempts != 3; ++attempts) {
-        /* todo: malloc may fail: return a statuscode */
-        adapter_addresses = (IP_ADAPTER_ADDRESSES*)UA_malloc(adapter_addresses_buffer_size);
-        if(!adapter_addresses) {
-            UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                         "GetAdaptersAddresses out of memory");
-            adapter_addresses = NULL;
-            break;
-        }
-        DWORD error = GetAdaptersAddresses(AF_UNSPEC,
-                                           GAA_FLAG_SKIP_ANYCAST |
-                                           GAA_FLAG_SKIP_DNS_SERVER |
-                                           GAA_FLAG_SKIP_FRIENDLY_NAME,
-                                           NULL, adapter_addresses,
-                                           &adapter_addresses_buffer_size);
-
-        if(ERROR_SUCCESS == error) {
-            break;
-        } else if (ERROR_BUFFER_OVERFLOW == error) {
-            /* Try again with the new size */
-            UA_free(adapter_addresses);
-            adapter_addresses = NULL;
-            continue;
-        }
-
-        /* Unexpected error */
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "GetAdaptersAddresses returned an unexpected error. "
-                     "Not setting mDNS A records.");
-        UA_free(adapter_addresses);
-        adapter_addresses = NULL;
-        break;
-    }
-    return adapter_addresses;
-}
-
-#endif /* _WIN32 */
-
-static UA_Boolean
-mdns_is_self_announce(const UA_Server *server, const struct serverOnNetwork_list_entry *entry) {
-    for (size_t i=0; i<server->config.networkLayersSize; i++) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        if(UA_String_equal(&entry->serverOnNetwork.discoveryUrl,
-                           &nl->discoveryUrl))
-            return true;
-        // check discoveryUrl ignoring tailing slash
-        if (((
-                nl->discoveryUrl.length == entry->serverOnNetwork.discoveryUrl.length +1 &&
-                nl->discoveryUrl.data[nl->discoveryUrl.length-1] == '/'
-              ) || (
-                entry->serverOnNetwork.discoveryUrl.length == nl->discoveryUrl.length +1 &&
-                entry->serverOnNetwork.discoveryUrl.data[entry->serverOnNetwork.discoveryUrl.length-1] == '/'
-              )
-            ) &&
-            memcmp(nl->discoveryUrl.data, entry->serverOnNetwork.discoveryUrl.data,
-                    UA_MIN(nl->discoveryUrl.length, entry->serverOnNetwork.discoveryUrl.length)) == 0
-        ) {
-            return true;
-        }
-        if (nl->discoveryUrl.length == entry->serverOnNetwork.discoveryUrl.length +1 &&
-            nl->discoveryUrl.data[nl->discoveryUrl.length-1] == '/' &&
-            memcmp(nl->discoveryUrl.data, entry->serverOnNetwork.discoveryUrl.data, nl->discoveryUrl.length-1) == 0
-                ) {
-            return true;
-        }
-    }
-
-    /* The discovery URL may also just contain the IP address, but in our
-     * discovery URL we are using hostname thus previous check may not detect
-     * the same URL. Therefore we also check if the name matches: */
-    UA_String hostnameRemote = UA_STRING_NULL;
-    UA_UInt16 portRemote = 4840;
-    UA_String pathRemote = UA_STRING_NULL;
-    UA_StatusCode retval =
-        UA_parseEndpointUrl(&entry->serverOnNetwork.discoveryUrl,
-                            &hostnameRemote, &portRemote, &pathRemote);
-    if(retval != UA_STATUSCODE_GOOD) {
-        /* skip invalid url */
-        return false;
-    }
-
-#ifdef _WIN32
-    IP_ADAPTER_ADDRESSES* adapter_addresses = getInterfaces(server);
-    if(!adapter_addresses) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "getifaddrs returned an unexpected error. Not setting mDNS A records.");
-        return false;
-    }
-#else
-    struct ifaddrs *ifaddr, *ifa;
-    if(getifaddrs(&ifaddr) == -1) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "getifaddrs returned an unexpected error. Not setting mDNS A records.");
-        return false;
-    }
-#endif
-
-
-    UA_Boolean isSelf = false;
-
-    for (size_t i=0; i<server->config.networkLayersSize; i++) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-
-        UA_String hostnameSelf = UA_STRING_NULL;
-        UA_UInt16 portSelf = 4840;
-        UA_String pathSelf = UA_STRING_NULL;
-
-        retval = UA_parseEndpointUrl(&nl->discoveryUrl, &hostnameSelf,
-                                     &portSelf, &pathSelf);
-        if(retval != UA_STATUSCODE_GOOD) {
-            /* skip invalid url */
-            continue;
-        }
-        if (portRemote != portSelf)
-            continue;
-
-#ifdef _WIN32
-        /* Iterate through all of the adapters */
-        IP_ADAPTER_ADDRESSES* adapter = adapter_addresses;
-        for(; adapter != NULL; adapter = adapter->Next) {
-            /* Skip loopback adapters */
-            if(IF_TYPE_SOFTWARE_LOOPBACK == adapter->IfType)
-                continue;
-
-            /* Parse all IPv4 and IPv6 addresses */
-            IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress;
-            for(; NULL != address; address = address->Next) {
-                int family = address->Address.lpSockaddr->sa_family;
-                if(AF_INET == family) {
-                    SOCKADDR_IN* ipv4 = (SOCKADDR_IN*)(address->Address.lpSockaddr); /* IPv4 */
-                    char *ipStr = inet_ntoa(ipv4->sin_addr);
-                    if(strncmp((const char*)hostnameRemote.data, ipStr,
-                               hostnameRemote.length) == 0) {
-                        isSelf = true;
-                        break;
-                    }
-                } else if(AF_INET6 == family) {
-                    /* IPv6 not implemented yet */
-                }
-            }
-            if (isSelf)
-                break;
-        }
-#else
-        /* Walk through linked list, maintaining head pointer so we can free
-         * list later */
-        int n;
-        for(ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
-            if(!ifa->ifa_addr)
-                continue;
-
-            if((strcmp("lo", ifa->ifa_name) == 0) ||
-               !(ifa->ifa_flags & (IFF_RUNNING))||
-               !(ifa->ifa_flags & (IFF_MULTICAST)))
-                continue;
-
-            /* IPv4 */
-            if(ifa->ifa_addr->sa_family == AF_INET) {
-                struct sockaddr_in* sa = (struct sockaddr_in*) ifa->ifa_addr;
-
-                char *ipStr = inet_ntoa(sa->sin_addr);
-                if(strncmp((const char*)hostnameRemote.data, ipStr,
-                           hostnameRemote.length) == 0) {
-                    isSelf = true;
-                    break;
-                }
-            }
-
-            /* IPv6 not implemented yet */
-        }
-#endif
-        if (isSelf)
-            break;
-    }
-
-#ifdef _WIN32
-    /* Cleanup */
-    UA_free(adapter_addresses);
-    adapter_addresses = NULL;
-#else
-    /* Clean up */
-    freeifaddrs(ifaddr);
-#endif
-
-    return isSelf;
-}
-
-static void
-mdns_record_remove(UA_Server *server, const char *record,
-                   struct serverOnNetwork_list_entry *entry) {
-    UA_DiscoveryManager *dm = &server->discoveryManager;
-
-    /* remove from hash */
-    int hashIdx = mdns_hash_record(record) % SERVER_ON_NETWORK_HASH_PRIME;
-    struct serverOnNetwork_hash_entry *hash_entry = dm->serverOnNetworkHash[hashIdx];
-    struct serverOnNetwork_hash_entry *prevEntry = hash_entry;
-    while(hash_entry) {
-        if(hash_entry->entry == entry) {
-            if(dm->serverOnNetworkHash[hashIdx] == hash_entry)
-                dm->serverOnNetworkHash[hashIdx] = hash_entry->next;
-            else if(prevEntry)
-                prevEntry->next = hash_entry->next;
-            break;
-        }
-        prevEntry = hash_entry;
-        hash_entry = hash_entry->next;
-    }
-    UA_free(hash_entry);
-
-    if(dm->serverOnNetworkCallback && !mdns_is_self_announce(server, entry))
-        dm->serverOnNetworkCallback(&entry->serverOnNetwork, false,
-                                    entry->txtSet, dm->serverOnNetworkCallbackData);
-
-    /* remove from list */
-    LIST_REMOVE(entry, pointers);
-    UA_ServerOnNetwork_deleteMembers(&entry->serverOnNetwork);
-    if(entry->pathTmp)
-        UA_free(entry->pathTmp);
-
-#if UA_MULTITHREADING >= 200
-    UA_atomic_subSize(&dm->serverOnNetworkSize, 1);
-    entry->delayedCleanup.callback = NULL; /* Only free the structure */
-    UA_WorkQueue_enqueueDelayed(&server->workQueue, &entry->delayedCleanup);
-#else
-    dm->serverOnNetworkSize--;
-    UA_free(entry);
-#endif
-}
-
-static void
-mdns_append_path_to_url(UA_String *url, const char *path) {
-    size_t pathLen = strlen(path);
-    /* todo: malloc may fail: return a statuscode */
-    char *newUrl = (char *)UA_malloc(url->length + pathLen);
-    memcpy(newUrl, url->data, url->length);
-    memcpy(newUrl + url->length, path, pathLen);
-    url->length = url->length + pathLen;
-    url->data = (UA_Byte *) newUrl;
-}
-
-static void
-setTxt(UA_Server *server, const struct resource *r,
-       struct serverOnNetwork_list_entry *entry) {
-    entry->txtSet = true;
-    xht_t *x = txt2sd(r->rdata, r->rdlength);
-    char *path = (char *) xht_get(x, "path");
-    char *caps = (char *) xht_get(x, "caps");
-
-    size_t pathLen = path ? strlen(path) : 0;
-
-    if(path && pathLen > 1) {
-        if(!entry->srvSet) {
-            /* txt arrived before SRV, thus cache path entry */
-            if (!entry->pathTmp) {
-                entry->pathTmp = (char*)UA_malloc(pathLen+1);
-                if (!entry->pathTmp) {
-                    UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Cannot alloc memory for mDNS srv path");
-                    return;
-                }
-                memcpy(&(entry->pathTmp), &path, pathLen);
-                entry->pathTmp[pathLen] = '\0';
-            }
-        } else {
-            /* SRV already there and discovery URL set. Add path to discovery URL */
-            mdns_append_path_to_url(&entry->serverOnNetwork.discoveryUrl, path);
-        }
-    }
-
-    if(caps && strlen(caps) > 0) {
-        /* count comma in caps */
-        size_t capsCount = 1;
-        for(size_t i = 0; caps[i]; i++) {
-            if(caps[i] == ',')
-                capsCount++;
-        }
-
-        /* set capabilities */
-        entry->serverOnNetwork.serverCapabilitiesSize = capsCount;
-        entry->serverOnNetwork.serverCapabilities =
-            (UA_String *) UA_Array_new(capsCount, &UA_TYPES[UA_TYPES_STRING]);
-
-        for(size_t i = 0; i < capsCount; i++) {
-            char *nextStr = strchr(caps, ',');
-            size_t len = nextStr ? (size_t) (nextStr - caps) : strlen(caps);
-            entry->serverOnNetwork.serverCapabilities[i].length = len;
-            /* todo: malloc may fail: return a statuscode */
-            entry->serverOnNetwork.serverCapabilities[i].data = (UA_Byte*)UA_malloc(len);
-            memcpy(entry->serverOnNetwork.serverCapabilities[i].data, caps, len);
-            if(nextStr)
-                caps = nextStr + 1;
-            else
-                break;
-        }
-    }
-    xht_free(x);
-}
-
-/* [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname]. */
-static void
-setSrv(UA_Server *server, const struct resource *r,
-       struct serverOnNetwork_list_entry *entry) {
-    entry->srvSet = true;
-
-
-    /* The specification Part 12 says: The hostname maps onto the SRV record
-     * target field. If the hostname is an IPAddress then it must be converted
-     * to a domain name. If this cannot be done then LDS shall report an
-     * error. */
-
-    size_t srvNameLen = strlen(r->known.srv.name);
-    if(srvNameLen > 0 && r->known.srv.name[srvNameLen - 1] == '.')
-        /* cut off last dot */
-        srvNameLen--;
-    /* opc.tcp://[servername]:[port][path] */
-    char *newUrl = (char*)UA_malloc(10 + srvNameLen + 8);
-    if (!newUrl) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Cannot allocate char for discovery url. Out of memory.");
-        return;
-    }
-    UA_snprintf(newUrl, 10 + srvNameLen + 8, "opc.tcp://%.*s:%d", (int) srvNameLen,
-             r->known.srv.name, r->known.srv.port);
-
-
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Multicast DNS: found server: %s", newUrl);
-    entry->serverOnNetwork.discoveryUrl = UA_String_fromChars(newUrl);
-    UA_free(newUrl);
-
-    if(entry->pathTmp) {
-        mdns_append_path_to_url(&entry->serverOnNetwork.discoveryUrl, entry->pathTmp);
-        UA_free(entry->pathTmp);
-    }
-}
-
-/* This will be called by the mDNS library on every record which is received */
-void
-mdns_record_received(const struct resource *r, void *data) {
-    UA_Server *server = (UA_Server *) data;
-    /* we only need SRV and TXT records */
-    /* TODO: remove magic number */
-    if((r->clazz != QCLASS_IN && r->clazz != QCLASS_IN + 32768) ||
-       (r->type != QTYPE_SRV && r->type != QTYPE_TXT))
-        return;
-
-    /* we only handle '_opcua-tcp._tcp.' records */
-    char *opcStr = strstr(r->name, "_opcua-tcp._tcp.");
-    if(!opcStr)
-        return;
-
-    /* Compute the length of the servername */
-    size_t servernameLen = (size_t) (opcStr - r->name);
-    if(servernameLen == 0)
-        return;
-    servernameLen--; /* remove point */
-
-    /* Get entry */
-    struct serverOnNetwork_list_entry *entry =
-            mdns_record_add_or_get(&server->discoveryManager, r->name, r->name,
-                                   servernameLen, r->ttl > 0);
-    if(!entry)
-        return;
-
-    /* Check that the ttl is positive */
-    if(r->ttl == 0) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                    "Multicast DNS: remove server (TTL=0): %.*s",
-                    (int)entry->serverOnNetwork.discoveryUrl.length,
-                    entry->serverOnNetwork.discoveryUrl.data);
-        mdns_record_remove(server, r->name, entry);
-        return;
-    }
-
-    /* Update lastSeen */
-    entry->lastSeen = UA_DateTime_nowMonotonic();
-
-    /* TXT and SRV are already set */
-    if(entry->txtSet && entry->srvSet) {
-        // call callback for every mdns package we received.
-        // This will also call the callback multiple times
-        if (server->discoveryManager.serverOnNetworkCallback &&
-            !mdns_is_self_announce(server, entry))
-            server->discoveryManager.
-                serverOnNetworkCallback(&entry->serverOnNetwork, true, entry->txtSet,
-                                        server->discoveryManager.serverOnNetworkCallbackData);
-        return;
-    }
-
-    /* Add the resources */
-    if(r->type == QTYPE_TXT && !entry->txtSet)
-        setTxt(server, r, entry);
-    else if (r->type == QTYPE_SRV && !entry->srvSet)
-        setSrv(server, r, entry);
-
-    /* Call callback to announce a new server */
-    if(entry->srvSet && server->discoveryManager.serverOnNetworkCallback &&
-       !mdns_is_self_announce(server, entry))
-        server->discoveryManager.
-            serverOnNetworkCallback(&entry->serverOnNetwork, true, entry->txtSet,
-                                    server->discoveryManager.serverOnNetworkCallbackData);
-}
-
-void
-mdns_create_txt(UA_Server *server, const char *fullServiceDomain, const char *path,
-                const UA_String *capabilites, const size_t capabilitiesSize,
-                void (*conflict)(char *host, int type, void *arg)) {
-    mdns_record_t *r = mdnsd_unique(server->discoveryManager.mdnsDaemon, fullServiceDomain,
-                                    QTYPE_TXT, 600, conflict, server);
-    xht_t *h = xht_new(11);
-    char *allocPath = NULL;
-    if(!path || strlen(path) == 0) {
-        xht_set(h, "path", "/");
-    } else {
-        /* path does not contain slash, so add it here */
-        size_t pathLen = strlen(path);
-        if(path[0] == '/') {
-            allocPath = (char*)UA_malloc(pathLen+1);
-            if (!allocPath) {
-                UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Cannot alloc memory for txt path");
-                return;
-            }
-            memcpy(&allocPath, &path, pathLen);
-            allocPath[pathLen] = '\0';
-        } else {
-            /* todo: malloc may fail: return a statuscode */
-            allocPath = (char*)UA_malloc(pathLen + 2);
-            allocPath[0] = '/';
-            memcpy(allocPath + 1, path, pathLen);
-            allocPath[pathLen + 1] = '\0';
-        }
-        xht_set(h, "path", allocPath);
-    }
-
-    /* calculate max string length: */
-    size_t capsLen = 0;
-    for(size_t i = 0; i < capabilitiesSize; i++) {
-        /* add comma or last \0 */
-        capsLen += capabilites[i].length + 1;
-    }
-
-    char *caps = NULL;
-    if(capsLen) {
-        /* freed when xht_free is called */
-        /* todo: malloc may fail: return a statuscode */
-        caps = (char*)UA_malloc(sizeof(char) * capsLen);
-        size_t idx = 0;
-        for(size_t i = 0; i < capabilitiesSize; i++) {
-            memcpy(caps + idx, (const char *) capabilites[i].data, capabilites[i].length);
-            idx += capabilites[i].length + 1;
-            caps[idx - 1] = ',';
-        }
-        caps[idx - 1] = '\0';
-
-        xht_set(h, "caps", caps);
-    } else {
-        xht_set(h, "caps", "NA");
-    }
-
-    int txtRecordLength;
-    unsigned char *packet = sd2txt(h, &txtRecordLength);
-    if(allocPath)
-        UA_free(allocPath);
-    if(caps)
-        UA_free(caps);
-    xht_free(h);
-    mdnsd_set_raw(server->discoveryManager.mdnsDaemon, r, (char *) packet,
-                  (unsigned short) txtRecordLength);
-    UA_free(packet);
-}
-
-mdns_record_t *
-mdns_find_record(mdns_daemon_t *mdnsDaemon, unsigned short type,
-                 const char *host, const char *rdname) {
-    mdns_record_t *r = mdnsd_get_published(mdnsDaemon, host);
-    if(!r)
-        return NULL;
-
-    /* search for the record with the correct ptr hostname */
-    while(r) {
-        const mdns_answer_t *data = mdnsd_record_data(r);
-        if(data->type == type && strcmp(data->rdname, rdname) == 0)
-            return r;
-        r = mdnsd_record_next(r);
-    }
-    return NULL;
-}
-
-/* set record in the given interface */
-static void
-mdns_set_address_record_if(UA_DiscoveryManager *dm, const char *fullServiceDomain,
-                           const char *localDomain, char *addr, UA_UInt16 addr_len) {
-    /* [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]. */
-    mdns_record_t *r = mdnsd_shared(dm->mdnsDaemon, fullServiceDomain, QTYPE_A, 600);
-    mdnsd_set_raw(dm->mdnsDaemon, r, addr, addr_len);
-
-    /* [hostname]. A [ip]. */
-    r = mdnsd_shared(dm->mdnsDaemon, localDomain, QTYPE_A, 600);
-    mdnsd_set_raw(dm->mdnsDaemon, r, addr, addr_len);
-}
-
-/* Loop over network interfaces and run set_address_record on each */
-#ifdef _WIN32
-
-void mdns_set_address_record(UA_Server *server, const char *fullServiceDomain,
-                             const char *localDomain) {
-    IP_ADAPTER_ADDRESSES* adapter_addresses = getInterfaces(server);
-    if(!adapter_addresses)
-        return;
-
-    /* Iterate through all of the adapters */
-    IP_ADAPTER_ADDRESSES* adapter = adapter_addresses;
-    for(; adapter != NULL; adapter = adapter->Next) {
-        /* Skip loopback adapters */
-        if(IF_TYPE_SOFTWARE_LOOPBACK == adapter->IfType)
-            continue;
-
-        /* Parse all IPv4 and IPv6 addresses */
-        IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress;
-        for(; NULL != address; address = address->Next) {
-            int family = address->Address.lpSockaddr->sa_family;
-            if(AF_INET == family) {
-                SOCKADDR_IN* ipv4 = (SOCKADDR_IN*)(address->Address.lpSockaddr); /* IPv4 */
-                mdns_set_address_record_if(&server->discoveryManager, fullServiceDomain,
-                                           localDomain, (char *)&ipv4->sin_addr, 4);
-            } else if(AF_INET6 == family) {
-                /* IPv6 */
-#if 0
-                SOCKADDR_IN6* ipv6 = (SOCKADDR_IN6*)(address->Address.lpSockaddr);
-
-                char str_buffer[INET6_ADDRSTRLEN] = {0};
-                inet_ntop(AF_INET6, &(ipv6->sin6_addr), str_buffer, INET6_ADDRSTRLEN);
-
-                std::string ipv6_str(str_buffer);
-
-                /* Detect and skip non-external addresses */
-                UA_Boolean is_link_local(false);
-                UA_Boolean is_special_use(false);
-
-                if(0 == ipv6_str.find("fe")) {
-                    char c = ipv6_str[2];
-                    if(c == '8' || c == '9' || c == 'a' || c == 'b')
-                        is_link_local = true;
-                } else if (0 == ipv6_str.find("2001:0:")) {
-                    is_special_use = true;
-                }
-
-                if(!(is_link_local || is_special_use))
-                    ipAddrs.mIpv6.push_back(ipv6_str);
-#endif
-            }
-        }
-    }
-
-    /* Cleanup */
-    UA_free(adapter_addresses);
-    adapter_addresses = NULL;
-}
-
-#else /* _WIN32 */
-
-void
-mdns_set_address_record(UA_Server *server, const char *fullServiceDomain,
-                        const char *localDomain) {
-    struct ifaddrs *ifaddr, *ifa;
-    if(getifaddrs(&ifaddr) == -1) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "getifaddrs returned an unexpected error. Not setting mDNS A records.");
-        return;
-    }
-
-    /* Walk through linked list, maintaining head pointer so we can free list later */
-    int n;
-    for(ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
-        if(!ifa->ifa_addr)
-            continue;
-
-        if((strcmp("lo", ifa->ifa_name) == 0) ||
-           !(ifa->ifa_flags & (IFF_RUNNING))||
-           !(ifa->ifa_flags & (IFF_MULTICAST)))
-            continue;
-
-        /* IPv4 */
-        if(ifa->ifa_addr->sa_family == AF_INET) {
-            struct sockaddr_in* sa = (struct sockaddr_in*) ifa->ifa_addr;
-            mdns_set_address_record_if(&server->discoveryManager, fullServiceDomain,
-                                       localDomain, (char*)&sa->sin_addr.s_addr, 4);
-        }
-
-        /* IPv6 not implemented yet */
-    }
-
-    /* Clean up */
-    freeifaddrs(ifaddr);
-}
-
-#endif /* _WIN32 */
-
-#endif /* UA_ENABLE_DISCOVERY_MULTICAST */
diff --git a/ext/open62541/src/server/ua_server_internal.h b/ext/open62541/src/server/ua_server_internal.h
deleted file mode 100644
index ae2e62e..0000000
--- a/ext/open62541/src/server/ua_server_internal.h
+++ /dev/null
@@ -1,356 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#ifndef UA_SERVER_INTERNAL_H_
-#define UA_SERVER_INTERNAL_H_
-
-#include <open62541/server.h>
-#include <open62541/server_config.h>
-#include <open62541/plugin/nodestore.h>
-
-#include "ua_connection_internal.h"
-#include "ua_securechannel_manager.h"
-#include "ua_session_manager.h"
-#include "ua_timer.h"
-#include "ua_util_internal.h"
-#include "ua_workqueue.h"
-
-_UA_BEGIN_DECLS
-
-#if UA_MULTITHREADING >= 100
-#undef UA_THREADSAFE
-#define UA_THREADSAFE UA_DEPRECATED
-#endif
-
-#ifdef UA_ENABLE_PUBSUB
-#include "ua_pubsub_manager.h"
-#endif
-
-#ifdef UA_ENABLE_DISCOVERY
-#include "ua_discovery_manager.h"
-#endif
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-#include "ua_subscription.h"
-
-typedef struct {
-    UA_MonitoredItem monitoredItem;
-    void *context;
-    union {
-        UA_Server_DataChangeNotificationCallback dataChangeCallback;
-        /* UA_Server_EventNotificationCallback eventCallback; */
-    } callback;
-} UA_LocalMonitoredItem;
-
-#endif
-
-typedef enum {
-    UA_SERVERLIFECYCLE_FRESH,
-    UA_SERVERLIFECYLE_RUNNING
-} UA_ServerLifecycle;
-
-struct UA_Server {
-    /* Config */
-    UA_ServerConfig config;
-    UA_DateTime startTime;
-    UA_DateTime endTime; /* Zeroed out. If a time is set, then the server shuts
-                          * down once the time has been reached */
-
-    /* Nodestore */
-    void *nsCtx;
-
-    UA_ServerLifecycle state;
-
-    /* Security */
-    UA_SecureChannelManager secureChannelManager;
-    UA_SessionManager sessionManager;
-    UA_Session adminSession; /* Local access to the services (for startup and
-                              * maintenance) uses this Session with all possible
-                              * access rights (Session Id: 1) */
-
-    /* Namespaces */
-    size_t namespacesSize;
-    UA_String *namespaces;
-
-    /* Callbacks with a repetition interval */
-    UA_Timer timer;
-
-    /* WorkQueue and worker threads */
-    UA_WorkQueue workQueue;
-
-    /* For bootstrapping, omit some consistency checks, creating a reference to
-     * the parent and member instantiation */
-    UA_Boolean bootstrapNS0;
-
-    /* Discovery */
-#ifdef UA_ENABLE_DISCOVERY
-    UA_DiscoveryManager discoveryManager;
-#endif
-
-    /* DataChange Subscriptions */
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    /* Num active subscriptions */
-    UA_UInt32 numSubscriptions;
-    /* Num active monitored items */
-    UA_UInt32 numMonitoredItems;
-    /* To be cast to UA_LocalMonitoredItem to get the callback and context */
-    LIST_HEAD(LocalMonitoredItems, UA_MonitoredItem) localMonitoredItems;
-    UA_UInt32 lastLocalMonitoredItemId;
-#endif
-
-    /* Publish/Subscribe */
-#ifdef UA_ENABLE_PUBSUB
-    UA_PubSubManager pubSubManager;
-#endif
-
-#if UA_MULTITHREADING >= 100
-    UA_LOCK_TYPE(networkMutex)
-    UA_LOCK_TYPE(serviceMutex)
-#endif
-};
-
-/*****************/
-/* Node Handling */
-/*****************/
-
-/* Deletes references from the node which are not matching any type in the given
- * array. Could be used to e.g. delete all the references, except
- * 'HASMODELINGRULE' */
-void UA_Node_deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize,
-                                    UA_NodeId* referencesSkip);
-
-/* Calls the callback with the node retrieved from the nodestore on top of the
- * stack. Either a copy or the original node for in-situ editing. Depends on
- * multithreading and the nodestore.*/
-typedef UA_StatusCode (*UA_EditNodeCallback)(UA_Server*, UA_Session*,
-                                             UA_Node *node, void*);
-UA_StatusCode UA_Server_editNode(UA_Server *server, UA_Session *session,
-                                 const UA_NodeId *nodeId,
-                                 UA_EditNodeCallback callback,
-                                 void *data);
-
-/*********************/
-/* Utility Functions */
-/*********************/
-
-/* A few global NodeId definitions */
-extern const UA_NodeId subtypeId;
-extern const UA_NodeId hierarchicalReferences;
-
-void setupNs1Uri(UA_Server *server);
-UA_UInt16 addNamespace(UA_Server *server, const UA_String name);
-
-UA_Boolean
-UA_Node_hasSubTypeOrInstances(const UA_Node *node);
-
-/* Recursively searches "upwards" in the tree following specific reference types */
-UA_Boolean
-isNodeInTree(void *nsCtx, const UA_NodeId *leafNode,
-             const UA_NodeId *nodeToFind, const UA_NodeId *referenceTypeIds,
-             size_t referenceTypeIdsSize);
-
-/* Returns an array with the hierarchy of nodes. The start nodes are returned as
- * well. The returned array starts at the leaf and continues "upwards" or
- * "downwards". Duplicate entries are removed. The parameter `walkDownwards`
- * indicates the direction of search. */
-UA_StatusCode
-browseRecursive(UA_Server *server,
-                size_t startNodesSize, const UA_NodeId *startNodes,
-                size_t refTypesSize, const UA_NodeId *refTypes,
-                UA_BrowseDirection browseDirection, UA_Boolean includeStartNodes,
-                size_t *resultsSize, UA_ExpandedNodeId **results);
-
-/* If refTypes is non-NULL, tries to realloc and increase the length */
-UA_StatusCode
-referenceSubtypes(UA_Server *server, const UA_NodeId *refType,
-                  size_t *refTypesSize, UA_NodeId **refTypes);
-
-/* Returns the recursive type and interface hierarchy of the node */ 
-UA_StatusCode
-getParentTypeAndInterfaceHierarchy(UA_Server *server, const UA_NodeId *typeNode,
-                                   UA_NodeId **typeHierarchy, size_t *typeHierarchySize);
-
-/* Returns the type node from the node on the stack top. The type node is pushed
- * on the stack and returned. */
-const UA_Node * getNodeType(UA_Server *server, const UA_Node *node);
-
-/* Write a node attribute with a defined session */
-UA_StatusCode
-writeWithSession(UA_Server *server, UA_Session *session,
-                 const UA_WriteValue *value);
-
-
-/* Many services come as an array of operations. This function generalizes the
- * processing of the operations. */
-typedef void (*UA_ServiceOperation)(UA_Server *server, UA_Session *session,
-                                    const void *context,
-                                    const void *requestOperation,
-                                    void *responseOperation);
-
-UA_StatusCode
-UA_Server_processServiceOperations(UA_Server *server, UA_Session *session,
-                                   UA_ServiceOperation operationCallback,
-                                   const void *context,
-                                   const size_t *requestOperations,
-                                   const UA_DataType *requestOperationsType,
-                                   size_t *responseOperations,
-                                   const UA_DataType *responseOperationsType)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-
-/******************************************/
-/* Internal function calls, without locks */
-/******************************************/
-UA_StatusCode
-deleteNode(UA_Server *server, const UA_NodeId nodeId,
-           UA_Boolean deleteReferences);
-
-UA_StatusCode
-addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId *requestedNewNodeId,
-        const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
-        const UA_QualifiedName browseName, const UA_NodeId *typeDefinition,
-        const UA_NodeAttributes *attr, const UA_DataType *attributeType,
-        void *nodeContext, UA_NodeId *outNewNodeId);
-
-UA_StatusCode
-setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId,
-                           const UA_DataSource dataSource);
-
-UA_StatusCode
-setMethodNode_callback(UA_Server *server,
-                       const UA_NodeId methodNodeId,
-                       UA_MethodCallback methodCallback);
-
-UA_StatusCode
-writeAttribute(UA_Server *server, const UA_WriteValue *value);
-
-UA_StatusCode
-writeWithWriteValue(UA_Server *server, const UA_NodeId *nodeId,
-                    const UA_AttributeId attributeId,
-                    const UA_DataType *attr_type,
-                    const void *attr);
-
-UA_DataValue
-readAttribute(UA_Server *server, const UA_ReadValueId *item,
-              UA_TimestampsToReturn timestamps);
-
-UA_StatusCode
-readWithReadValue(UA_Server *server, const UA_NodeId *nodeId,
-                  const UA_AttributeId attributeId, void *v);
-
-UA_BrowsePathResult
-translateBrowsePathToNodeIds(UA_Server *server, const UA_BrowsePath *browsePath);
-
-void
-monitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem);
-
-UA_BrowsePathResult
-browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin,
-                           size_t browsePathSize, const UA_QualifiedName *browsePath);
-
-/***************************************/
-/* Check Information Model Consistency */
-/***************************************/
-
-/* Read a node attribute in the context of a "checked-out" node. So the
- * attribute will not be copied when possible. The variant then points into the
- * node and has UA_VARIANT_DATA_NODELETE set. */
-void
-ReadWithNode(const UA_Node *node, UA_Server *server, UA_Session *session,
-             UA_TimestampsToReturn timestampsToReturn,
-             const UA_ReadValueId *id, UA_DataValue *v);
-
-UA_StatusCode
-readValueAttribute(UA_Server *server, UA_Session *session,
-                   const UA_VariableNode *vn, UA_DataValue *v);
-
-/* Test whether the value matches a variable definition given by
- * - datatype
- * - valueranke
- * - array dimensions.
- * Sometimes it can be necessary to transform the content of the value, e.g.
- * byte array to bytestring or uint32 to some enum. If editableValue is non-NULL,
- * we try to create a matching variant that points to the original data. */
-UA_Boolean
-compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId,
-                UA_Int32 targetValueRank, size_t targetArrayDimensionsSize,
-                const UA_UInt32 *targetArrayDimensions, const UA_Variant *value,
-                const UA_NumericRange *range);
-
-UA_Boolean
-compatibleArrayDimensions(size_t constraintArrayDimensionsSize,
-                          const UA_UInt32 *constraintArrayDimensions,
-                          size_t testArrayDimensionsSize,
-                          const UA_UInt32 *testArrayDimensions);
-
-UA_Boolean
-compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize,
-                               const UA_UInt32 *targetArrayDimensions);
-
-UA_Boolean
-compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session,
-                                   UA_Int32 valueRank, size_t arrayDimensionsSize);
-
-UA_Boolean
-compatibleDataType(UA_Server *server, const UA_NodeId *dataType,
-                   const UA_NodeId *constraintDataType, UA_Boolean isValue);
-
-UA_Boolean
-compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank);
-
-struct BrowseOpts {
-    UA_UInt32 maxReferences;
-    UA_Boolean recursive;
-};
-
-void
-Operation_Browse(UA_Server *server, UA_Session *session, const UA_UInt32 *maxrefs,
-                 const UA_BrowseDescription *descr, UA_BrowseResult *result);
-
-UA_DataValue
-UA_Server_readWithSession(UA_Server *server, UA_Session *session,
-                          const UA_ReadValueId *item,
-                          UA_TimestampsToReturn timestampsToReturn);
-
-/*****************************/
-/* AddNodes Begin and Finish */
-/*****************************/
-
-/* Creates a new node in the nodestore. */
-UA_StatusCode
-AddNode_raw(UA_Server *server, UA_Session *session, void *nodeContext,
-            const UA_AddNodesItem *item, UA_NodeId *outNewNodeId);
-
-/* Check the reference to the parent node; Add references. */
-UA_StatusCode
-AddNode_addRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId,
-                const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
-                const UA_NodeId *typeDefinitionId);
-
-/* Type-check type-definition; Run the constructors */
-UA_StatusCode
-AddNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId);
-
-/**********************/
-/* Create Namespace 0 */
-/**********************/
-
-UA_StatusCode UA_Server_initNS0(UA_Server *server);
-
-UA_StatusCode writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v,
-                      size_t length, const UA_DataType *type);
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_INTERNAL_H_ */
diff --git a/ext/open62541/src/server/ua_server_ns0.c b/ext/open62541/src/server/ua_server_ns0.c
deleted file mode 100644
index 6dd2fe8..0000000
--- a/ext/open62541/src/server/ua_server_ns0.c
+++ /dev/null
@@ -1,1088 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Thomas Bender
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2017 (c) Henrik Norrman
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#include "open62541/namespace0_generated.h"
-
-#include "ua_server_internal.h"
-#include "ua_session.h"
-#include "ua_subscription.h"
-
-static UA_StatusCode
-addNode_raw(UA_Server *server, UA_NodeClass nodeClass,
-            UA_UInt32 nodeId, char *name, void *attributes,
-            const UA_DataType *attributesType) {
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.nodeClass = nodeClass;
-    item.requestedNewNodeId.nodeId = UA_NODEID_NUMERIC(0, nodeId);
-    item.browseName = UA_QUALIFIEDNAME(0, name);
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.data = attributes;
-    item.nodeAttributes.content.decoded.type = attributesType;
-    return AddNode_raw(server, &server->adminSession, NULL, &item, NULL);
-}
-
-static UA_StatusCode
-addNode_finish(UA_Server *server, UA_UInt32 nodeId,
-               UA_UInt32 parentNodeId, UA_UInt32 referenceTypeId) {
-    const UA_NodeId sourceId = UA_NODEID_NUMERIC(0, nodeId);
-    const UA_NodeId refTypeId = UA_NODEID_NUMERIC(0, referenceTypeId);
-    const UA_ExpandedNodeId targetId = UA_EXPANDEDNODEID_NUMERIC(0, parentNodeId);
-    UA_StatusCode retval = UA_Server_addReference(server, sourceId, refTypeId, targetId, false);
-    if (retval != UA_STATUSCODE_GOOD)
-        return retval;
-    return AddNode_finish(server, &server->adminSession, &sourceId);
-}
-
-static UA_StatusCode
-addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid,
-              UA_UInt32 parentid, UA_UInt32 referenceid, UA_UInt32 type_id) {
-    UA_ObjectAttributes object_attr = UA_ObjectAttributes_default;
-    object_attr.displayName = UA_LOCALIZEDTEXT("", name);
-    return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid),
-                                   UA_NODEID_NUMERIC(0, parentid),
-                                   UA_NODEID_NUMERIC(0, referenceid),
-                                   UA_QUALIFIEDNAME(0, name),
-                                   UA_NODEID_NUMERIC(0, type_id),
-                                   object_attr, NULL, NULL);
-}
-
-static UA_StatusCode
-addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid,
-                     UA_Boolean isabstract, UA_Boolean symmetric, UA_UInt32 parentid) {
-    UA_ReferenceTypeAttributes reference_attr = UA_ReferenceTypeAttributes_default;
-    reference_attr.displayName = UA_LOCALIZEDTEXT("", name);
-    reference_attr.isAbstract = isabstract;
-    reference_attr.symmetric = symmetric;
-    if(inverseName)
-        reference_attr.inverseName = UA_LOCALIZEDTEXT("", inverseName);
-    return UA_Server_addReferenceTypeNode(server, UA_NODEID_NUMERIC(0, referencetypeid),
-                                   UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL,
-                                   UA_QUALIFIEDNAME(0, name), reference_attr, NULL, NULL);
-}
-
-/***************************/
-/* Bootstrap NS0 hierarchy */
-/***************************/
-
-/* Creates the basic nodes which are expected by the nodeset compiler to be
- * already created. This is necessary to reduce the dependencies for the nodeset
- * compiler. */
-static UA_StatusCode
-UA_Server_createNS0_base(UA_Server *server) {
-    /* Bootstrap References and HasSubtype */
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-    UA_ReferenceTypeAttributes references_attr = UA_ReferenceTypeAttributes_default;
-    references_attr.displayName = UA_LOCALIZEDTEXT("", "References");
-    references_attr.isAbstract = true;
-    references_attr.symmetric = true;
-    references_attr.inverseName = UA_LOCALIZEDTEXT("", "References");
-    ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References",
-                       &references_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
-
-    UA_ReferenceTypeAttributes hassubtype_attr = UA_ReferenceTypeAttributes_default;
-    hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype");
-    hassubtype_attr.isAbstract = false;
-    hassubtype_attr.symmetric = false;
-    hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "HasSupertype");
-    ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype",
-                       &hassubtype_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
-
-    UA_ReferenceTypeAttributes aggregates_attr = UA_ReferenceTypeAttributes_default;
-    aggregates_attr.displayName = UA_LOCALIZEDTEXT("", "Aggregates");
-    aggregates_attr.isAbstract = false;
-    aggregates_attr.symmetric = false;
-    aggregates_attr.inverseName = UA_LOCALIZEDTEXT("", "AggregatedBy");
-    ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_AGGREGATES, "Aggregates",
-                       &aggregates_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
-
-    ret |= addReferenceTypeNode(server, "HierarchicalReferences", NULL,
-                         UA_NS0ID_HIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES);
-
-    ret |= addReferenceTypeNode(server, "NonHierarchicalReferences", NULL,
-                         UA_NS0ID_NONHIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES);
-
-    ret |= addReferenceTypeNode(server, "HasChild", NULL, UA_NS0ID_HASCHILD,
-                         true, false, UA_NS0ID_HIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "Organizes", "OrganizedBy", UA_NS0ID_ORGANIZES,
-                         false, false, UA_NS0ID_HIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "HasEventSource", "EventSourceOf", UA_NS0ID_HASEVENTSOURCE,
-                         false, false, UA_NS0ID_HIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "HasModellingRule", "ModellingRuleOf", UA_NS0ID_HASMODELLINGRULE,
-                         false, false, UA_NS0ID_NONHIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "HasEncoding", "EncodingOf", UA_NS0ID_HASENCODING,
-                         false, false, UA_NS0ID_NONHIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "HasDescription", "DescriptionOf", UA_NS0ID_HASDESCRIPTION,
-                         false, false, UA_NS0ID_NONHIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "HasTypeDefinition", "TypeDefinitionOf", UA_NS0ID_HASTYPEDEFINITION,
-                         false, false, UA_NS0ID_NONHIERARCHICALREFERENCES);
-
-    ret |= addReferenceTypeNode(server, "GeneratesEvent", "GeneratedBy", UA_NS0ID_GENERATESEVENT,
-                         false, false, UA_NS0ID_NONHIERARCHICALREFERENCES);
-
-    /* Complete bootstrap of Aggregates */
-    ret |= addNode_finish(server, UA_NS0ID_AGGREGATES, UA_NS0ID_HASCHILD, UA_NS0ID_HASSUBTYPE);
-
-    /* Complete bootstrap of HasSubtype */
-    ret |= addNode_finish(server, UA_NS0ID_HASSUBTYPE, UA_NS0ID_HASCHILD, UA_NS0ID_HASSUBTYPE);
-
-    ret |= addReferenceTypeNode(server, "HasProperty", "PropertyOf", UA_NS0ID_HASPROPERTY,
-                         false, false, UA_NS0ID_AGGREGATES);
-
-    ret |= addReferenceTypeNode(server, "HasComponent", "ComponentOf", UA_NS0ID_HASCOMPONENT,
-                         false, false, UA_NS0ID_AGGREGATES);
-
-    ret |= addReferenceTypeNode(server, "HasNotifier", "NotifierOf", UA_NS0ID_HASNOTIFIER,
-                         false, false, UA_NS0ID_HASEVENTSOURCE);
-
-    ret |= addReferenceTypeNode(server, "HasOrderedComponent", "OrderedComponentOf",
-                         UA_NS0ID_HASORDEREDCOMPONENT, false, false, UA_NS0ID_HASCOMPONENT);
-
-    /**************/
-    /* Data Types */
-    /**************/
-
-    /* Bootstrap BaseDataType */
-    UA_DataTypeAttributes basedatatype_attr = UA_DataTypeAttributes_default;
-    basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType");
-    basedatatype_attr.isAbstract = true;
-    ret |= addNode_raw(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType",
-                       &basedatatype_attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]);
-
-    /*****************/
-    /* VariableTypes */
-    /*****************/
-
-    UA_VariableTypeAttributes basevar_attr = UA_VariableTypeAttributes_default;
-    basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType");
-    basevar_attr.isAbstract = true;
-    basevar_attr.valueRank = UA_VALUERANK_ANY;
-    basevar_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
-    ret |= addNode_raw(server, UA_NODECLASS_VARIABLETYPE, UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType",
-                       &basevar_attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]);
-
-    UA_VariableTypeAttributes bdv_attr = UA_VariableTypeAttributes_default;
-    bdv_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataVariableType");
-    bdv_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
-    bdv_attr.valueRank = UA_VALUERANK_ANY;
-    ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE),
-                                         UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "BaseDataVariableType"),
-                                         UA_NODEID_NULL, bdv_attr, NULL, NULL);
-
-    UA_VariableTypeAttributes prop_attr = UA_VariableTypeAttributes_default;
-    prop_attr.displayName = UA_LOCALIZEDTEXT("", "PropertyType");
-    prop_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
-    prop_attr.valueRank = UA_VALUERANK_ANY;
-    ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE),
-                                         UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "PropertyType"),
-                                         UA_NODEID_NULL, prop_attr, NULL, NULL);
-
-    /***************/
-    /* ObjectTypes */
-    /***************/
-
-    UA_ObjectTypeAttributes baseobj_attr = UA_ObjectTypeAttributes_default;
-    baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType");
-    ret |= addNode_raw(server, UA_NODECLASS_OBJECTTYPE, UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType",
-                       &baseobj_attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]);
-
-    UA_ObjectTypeAttributes folder_attr = UA_ObjectTypeAttributes_default;
-    folder_attr.displayName = UA_LOCALIZEDTEXT("", "FolderType");
-    ret |= UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                       UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "FolderType"),
-                                       folder_attr, NULL, NULL);
-
-    /******************/
-    /* Root and below */
-    /******************/
-
-    ret |= addObjectNode(server, "Root", UA_NS0ID_ROOTFOLDER, 0, 0, UA_NS0ID_FOLDERTYPE);
-
-    ret |= addObjectNode(server, "Objects", UA_NS0ID_OBJECTSFOLDER, UA_NS0ID_ROOTFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-
-    ret |= addObjectNode(server, "Types", UA_NS0ID_TYPESFOLDER, UA_NS0ID_ROOTFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-
-    ret |= addObjectNode(server, "ReferenceTypes", UA_NS0ID_REFERENCETYPESFOLDER, UA_NS0ID_TYPESFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-    ret |= addNode_finish(server, UA_NS0ID_REFERENCES, UA_NS0ID_REFERENCETYPESFOLDER,
-                   UA_NS0ID_ORGANIZES);
-
-    ret |= addObjectNode(server, "DataTypes", UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_TYPESFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-    ret |= addNode_finish(server, UA_NS0ID_BASEDATATYPE, UA_NS0ID_DATATYPESFOLDER,
-                   UA_NS0ID_ORGANIZES);
-
-    ret |= addObjectNode(server, "VariableTypes", UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_TYPESFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-    ret |= addNode_finish(server, UA_NS0ID_BASEVARIABLETYPE, UA_NS0ID_VARIABLETYPESFOLDER,
-                   UA_NS0ID_ORGANIZES);
-
-    ret |= addObjectNode(server, "ObjectTypes", UA_NS0ID_OBJECTTYPESFOLDER, UA_NS0ID_TYPESFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-    ret |= addNode_finish(server, UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_OBJECTTYPESFOLDER,
-                   UA_NS0ID_ORGANIZES);
-
-    ret |= addObjectNode(server, "EventTypes", UA_NS0ID_EVENTTYPESFOLDER, UA_NS0ID_TYPESFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-
-    ret |= addObjectNode(server, "Views", UA_NS0ID_VIEWSFOLDER, UA_NS0ID_ROOTFOLDER,
-                  UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
-
-    if(ret != UA_STATUSCODE_GOOD)
-        ret = UA_STATUSCODE_BADINTERNALERROR;
-
-    return ret;
-}
-
-/****************/
-/* Data Sources */
-/****************/
-
-static UA_StatusCode
-readStatus(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-           const UA_NodeId *nodeId, void *nodeContext, UA_Boolean sourceTimestamp,
-           const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    if(sourceTimestamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-
-    void *data = NULL;
-
-    UA_assert(nodeId->identifierType == UA_NODEIDTYPE_NUMERIC);
-
-    switch(nodeId->identifier.numeric) {
-    case UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN: {
-        UA_UInt32 *shutdown = UA_UInt32_new();
-        if(!shutdown)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        if(server->endTime != 0)
-            *shutdown = (UA_UInt32)((server->endTime - UA_DateTime_now()) / UA_DATETIME_SEC);
-        value->value.data = shutdown;
-        value->value.type = &UA_TYPES[UA_TYPES_UINT32];
-        value->hasValue = true;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_STATE: {
-        UA_ServerState *state = UA_ServerState_new();
-        if(!state)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        if(server->endTime != 0)
-            *state = UA_SERVERSTATE_SHUTDOWN;
-        value->value.data = state;
-        value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATE];
-        value->hasValue = true;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    case UA_NS0ID_SERVER_SERVERSTATUS: {
-        UA_ServerStatusDataType *statustype = UA_ServerStatusDataType_new();
-        if(!statustype)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        statustype->startTime = server->startTime;
-        statustype->currentTime = UA_DateTime_now();
-
-        statustype->state = UA_SERVERSTATE_RUNNING;
-        statustype->secondsTillShutdown = 0;
-        if(server->endTime != 0) {
-            statustype->state = UA_SERVERSTATE_SHUTDOWN;
-            statustype->secondsTillShutdown = (UA_UInt32)((server->endTime - UA_DateTime_now()) / UA_DATETIME_SEC);
-        }
-
-        value->value.data = statustype;
-        value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE];
-        value->hasValue = true;
-        return UA_BuildInfo_copy(&server->config.buildInfo, &statustype->buildInfo);
-    }
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO:
-        value->value.type = &UA_TYPES[UA_TYPES_BUILDINFO];
-        data = &server->config.buildInfo;
-        break;
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI:
-        value->value.type = &UA_TYPES[UA_TYPES_STRING];
-        data = &server->config.buildInfo.productUri;
-        break;
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME:
-        value->value.type = &UA_TYPES[UA_TYPES_STRING];
-        data = &server->config.buildInfo.manufacturerName;
-        break;
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME:
-        value->value.type = &UA_TYPES[UA_TYPES_STRING];
-        data = &server->config.buildInfo.productName;
-        break;
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION:
-        value->value.type = &UA_TYPES[UA_TYPES_STRING];
-        data = &server->config.buildInfo.softwareVersion;
-        break;
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER:
-        value->value.type = &UA_TYPES[UA_TYPES_STRING];
-        data = &server->config.buildInfo.buildNumber;
-        break;
-
-    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE:
-        value->value.type = &UA_TYPES[UA_TYPES_DATETIME];
-        data = &server->config.buildInfo.buildDate;
-        break;
-
-    default:
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINTERNALERROR;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    value->value.data = UA_new(value->value.type);
-    if(!value->value.data) {
-        value->value.type = NULL;
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    value->hasValue = true;
-    return UA_copy(data, value->value.data, value->value.type);
-}
-
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-static UA_StatusCode
-readServiceLevel(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-                 const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp,
-                 const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    value->value.type = &UA_TYPES[UA_TYPES_BYTE];
-    value->value.arrayLength = 0;
-    UA_Byte *byte = UA_Byte_new();
-    *byte = 255;
-    value->value.data = byte;
-    value->value.arrayDimensionsSize = 0;
-    value->value.arrayDimensions = NULL;
-    value->hasValue = true;
-    if(includeSourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readAuditing(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-             const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp,
-             const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    value->value.type = &UA_TYPES[UA_TYPES_BOOLEAN];
-    value->value.arrayLength = 0;
-    UA_Boolean *boolean = UA_Boolean_new();
-    *boolean = false;
-    value->value.data = boolean;
-    value->value.arrayDimensionsSize = 0;
-    value->value.arrayDimensions = NULL;
-    value->hasValue = true;
-    if(includeSourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-static UA_StatusCode
-readNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-               const UA_NodeId *nodeid, void *nodeContext, UA_Boolean includeSourceTimeStamp,
-               const UA_NumericRange *range,
-               UA_DataValue *value) {
-    /* ensure that the uri for ns1 is set up from the app description */
-    setupNs1Uri(server);
-
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_StatusCode retval;
-    retval = UA_Variant_setArrayCopy(&value->value, server->namespaces,
-                                     server->namespacesSize, &UA_TYPES[UA_TYPES_STRING]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    value->hasValue = true;
-    if(includeSourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-                const UA_NodeId *nodeid, void *nodeContext, const UA_NumericRange *range,
-                const UA_DataValue *value) {
-    /* Check the data type */
-    if(!value->hasValue ||
-       value->value.type != &UA_TYPES[UA_TYPES_STRING])
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* Check that the variant is not empty */
-    if(!value->value.data)
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* TODO: Writing with a range is not implemented */
-    if(range)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_String *newNamespaces = (UA_String*)value->value.data;
-    size_t newNamespacesSize = value->value.arrayLength;
-
-    /* Test if we append to the existing namespaces */
-    if(newNamespacesSize <= server->namespacesSize)
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* ensure that the uri for ns1 is set up from the app description */
-    setupNs1Uri(server);
-    
-    /* Test if the existing namespaces are unchanged */
-    for(size_t i = 0; i < server->namespacesSize; ++i) {
-        if(!UA_String_equal(&server->namespaces[i], &newNamespaces[i]))
-            return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Add namespaces */
-    for(size_t i = server->namespacesSize; i < newNamespacesSize; ++i)
-        addNamespace(server, newNamespaces[i]);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readCurrentTime(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-                const UA_NodeId *nodeid, void *nodeContext, UA_Boolean sourceTimeStamp,
-                const UA_NumericRange *range, UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_DateTime currentTime = UA_DateTime_now();
-    UA_StatusCode retval = UA_Variant_setScalarCopy(&value->value, &currentTime,
-                                                    &UA_TYPES[UA_TYPES_DATETIME]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    value->hasValue = true;
-    if(sourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = currentTime;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-static UA_StatusCode
-readMinSamplingInterval(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-               const UA_NodeId *nodeid, void *nodeContext, UA_Boolean includeSourceTimeStamp,
-               const UA_NumericRange *range,
-               UA_DataValue *value) {
-    if(range) {
-        value->hasStatus = true;
-        value->status = UA_STATUSCODE_BADINDEXRANGEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    UA_StatusCode retval;
-    retval = UA_Variant_setScalarCopy(&value->value,
-                                      &server->config.samplingIntervalLimits.min,
-                                      &UA_TYPES[UA_TYPES_DURATION]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    value->hasValue = true;
-    if(includeSourceTimeStamp) {
-        value->hasSourceTimestamp = true;
-        value->sourceTimestamp = UA_DateTime_now();
-    }
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-#if defined(UA_GENERATED_NAMESPACE_ZERO) && defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS)
-static UA_StatusCode
-readMonitoredItems(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
-                   const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId,
-                   void *objectContext, size_t inputSize,
-                   const UA_Variant *input, size_t outputSize,
-                   UA_Variant *output) {
-    UA_Session *session = UA_SessionManager_getSessionById(&server->sessionManager, sessionId);
-    if(!session)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    if (inputSize == 0 || !input[0].data)
-        return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-    UA_UInt32 subscriptionId = *((UA_UInt32*)(input[0].data));
-    UA_Subscription* subscription = UA_Session_getSubscriptionById(session, subscriptionId);
-    if(!subscription)
-    {
-        if(LIST_EMPTY(&session->serverSubscriptions))
-        {
-          UA_Variant_setArray(&output[0], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), 
-                              0, &UA_TYPES[UA_TYPES_UINT32]);
-          UA_Variant_setArray(&output[1], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), 
-                              0, &UA_TYPES[UA_TYPES_UINT32]);
-
-          return UA_STATUSCODE_BADNOMATCH;
-        }
-        
-        return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-    }
-
-    UA_UInt32 sizeOfOutput = 0;
-    UA_MonitoredItem* monitoredItem;
-    LIST_FOREACH(monitoredItem, &subscription->monitoredItems, listEntry) {
-        ++sizeOfOutput;
-    }
-    if(sizeOfOutput==0)
-        return UA_STATUSCODE_GOOD;
-
-    UA_UInt32* clientHandles = (UA_UInt32 *)UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_UInt32* serverHandles = (UA_UInt32 *)UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_UInt32 i = 0;
-    LIST_FOREACH(monitoredItem, &subscription->monitoredItems, listEntry) {
-        clientHandles[i] = monitoredItem->clientHandle;
-        serverHandles[i] = monitoredItem->monitoredItemId;
-        ++i;
-    }
-    UA_Variant_setArray(&output[0], serverHandles, sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_Variant_setArray(&output[1], clientHandles, sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]);
-    return UA_STATUSCODE_GOOD;
-}
-#endif /* defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) */
-
-UA_StatusCode
-writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v,
-                      size_t length, const UA_DataType *type) {
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setArray(&var, v, length, type);
-    return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var);
-}
-
-#ifndef UA_GENERATED_NAMESPACE_ZERO
-static UA_StatusCode
-addVariableNode(UA_Server *server, char* name, UA_UInt32 variableid,
-                UA_UInt32 parentid, UA_UInt32 referenceid,
-                UA_Int32 valueRank, UA_UInt32 dataType) {
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("", name);
-    attr.dataType = UA_NODEID_NUMERIC(0, dataType);
-    attr.valueRank = valueRank;
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ;
-    return UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(0, variableid),
-                                     UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NUMERIC(0, referenceid),
-                                     UA_QUALIFIEDNAME(0, name),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                     attr, NULL, NULL);
-}
-
-/* A minimal server object that is not complete and does not use the mandated
- * references to a server type. To be used on very constrained devices. */
-static UA_StatusCode
-UA_Server_minimalServerObject(UA_Server *server) {
-    /* Server */
-    UA_StatusCode retval = addObjectNode(server, "Server", UA_NS0ID_SERVER, UA_NS0ID_OBJECTSFOLDER,
-                                         UA_NS0ID_ORGANIZES, UA_NS0ID_BASEOBJECTTYPE);
-
-    /* Use a valuerank of -2 for now. The array is added later on and the valuerank set to 1. */
-    retval |= addVariableNode(server, "ServerArray", UA_NS0ID_SERVER_SERVERARRAY,
-                              UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY,
-                              UA_VALUERANK_ANY, UA_NS0ID_BASEDATATYPE);
-    retval |= addVariableNode(server, "NamespaceArray", UA_NS0ID_SERVER_NAMESPACEARRAY,
-                              UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY,
-                              UA_VALUERANK_ANY, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "ServerStatus", UA_NS0ID_SERVER_SERVERSTATUS,
-                              UA_NS0ID_SERVER, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "CurrentTime", UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME,
-                              UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "State", UA_NS0ID_SERVER_SERVERSTATUS_STATE,
-                              UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "BuildInfo", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO,
-                              UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "ProductUri", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI,
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "ManufacturerName",
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME,
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "ProductName",
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME,
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "SoftwareVersion",
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION,
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "BuildNumber",
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER,
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    retval |= addVariableNode(server, "BuildDate",
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE,
-                              UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT,
-                              UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE);
-
-    return retval;
-}
-
-#else
-
-static UA_StatusCode
-writeNs0Variable(UA_Server *server, UA_UInt32 id, void *v, const UA_DataType *type) {
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setScalar(&var, v, type);
-    return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var);
-}
-
-static void
-addModellingRules(UA_Server *server) {
-    /* Test if the ModellingRules folder was added. (Only for the full ns0.) */
-    UA_NodeClass mrnc = UA_NODECLASS_UNSPECIFIED;
-    UA_StatusCode retval = UA_Server_readNodeClass(server,
-                                                   UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES),
-                                                   &mrnc);
-    if(retval != UA_STATUSCODE_GOOD)
-        return;
-
-    /* Add ExposesItsArray */
-    UA_Server_addReference(server,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY),
-                           true);
-
-    /* Add Mandatory */
-    UA_Server_addReference(server,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY),
-                           true);
-
-
-    /* Add MandatoryPlaceholder */
-    UA_Server_addReference(server,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER),
-                           true);
-
-    /* Add Optional */
-    UA_Server_addReference(server,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_OPTIONAL),
-                           true);
-
-    /* Add OptionalPlaceholder */
-    UA_Server_addReference(server,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES),
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER),
-                           true);
-}
-
-#endif
-
-/* Initialize the nodeset 0 by using the generated code of the nodeset compiler.
- * This also initialized the data sources for various variables, such as for
- * example server time. */
-UA_StatusCode
-UA_Server_initNS0(UA_Server *server) {
-
-    /* Initialize base nodes which are always required an cannot be created
-     * through the NS compiler */
-    server->bootstrapNS0 = true;
-    UA_StatusCode retVal = UA_Server_createNS0_base(server);
-    server->bootstrapNS0 = false;
-    if(retVal != UA_STATUSCODE_GOOD)
-        return retVal;
-
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    /* Load nodes and references generated from the XML ns0 definition */
-    retVal = namespace0_generated(server);
-#else
-    /* Create a minimal server object */
-    retVal = UA_Server_minimalServerObject(server);
-#endif
-
-    if(retVal != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Initialization of Namespace 0 (before bootstrapping) "
-                     "failed with %s. See previous outputs for any error messages.",
-                     UA_StatusCode_name(retVal));
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* NamespaceArray */
-    UA_DataSource namespaceDataSource = {readNamespaces, writeNamespaces};
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                                                   UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
-                                                   namespaceDataSource);
-    retVal |= UA_Server_writeValueRank(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), 1);
-
-    /* ServerArray */
-    retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERARRAY,
-                                    &server->config.applicationDescription.applicationUri,
-                                    1, &UA_TYPES[UA_TYPES_STRING]);
-    retVal |= UA_Server_writeValueRank(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERARRAY), 1);
-
-    /* ServerStatus */
-    UA_DataSource serverStatus = {readStatus, NULL};
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                        UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), serverStatus);
-
-    /* StartTime will be sampled in UA_Server_run_startup()*/
-
-    /* CurrentTime */
-    UA_DataSource currentTime = {readCurrentTime, NULL};
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), currentTime);
-
-    /* State */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE),
-                                                   serverStatus);
-
-    /* BuildInfo */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), serverStatus);
-
-    /* BuildInfo - ProductUri */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI),
-                                                   serverStatus);
-
-    /* BuildInfo - ManufacturerName */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME),
-                                                   serverStatus);
-
-    /* BuildInfo - ProductName */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME),
-                                                   serverStatus);
-
-    /* BuildInfo - SoftwareVersion */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION),
-                                                   serverStatus);
-
-    /* BuildInfo - BuildNumber */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER),
-                                                   serverStatus);
-
-    /* BuildInfo - BuildDate */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE),
-                                                   serverStatus);
-
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-
-    /* SecondsTillShutdown */
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN),
-                                                   serverStatus);
-
-    /* ShutDownReason */
-    UA_LocalizedText shutdownReason;
-    UA_LocalizedText_init(&shutdownReason);
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON,
-                               &shutdownReason, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-
-    /* ServiceLevel */
-    UA_DataSource serviceLevel = {readServiceLevel, NULL};
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                        UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVICELEVEL), serviceLevel);
-
-    /* ServerDiagnostics - ServerDiagnosticsSummary */
-    UA_ServerDiagnosticsSummaryDataType serverDiagnosticsSummary;
-    UA_ServerDiagnosticsSummaryDataType_init(&serverDiagnosticsSummary);
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY,
-                               &serverDiagnosticsSummary,
-                               &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]);
-
-    /* ServerDiagnostics - EnabledFlag */
-    UA_Boolean enabledFlag = false;
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG,
-                               &enabledFlag, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* According to Specification part-5 - pg.no-11(PDF pg.no-29), when the ServerDiagnostics is disabled the client
-     * may modify the value of enabledFlag=true in the server. By default, this node have CurrentRead/Write access.
-     * In CTT, Subscription_Minimum_1/002.js test will modify the above flag. This will not be a problem when build
-     * configuration is set at UA_NAMESPACE_ZERO="REDUCED" as NodeIds will not be present. When UA_NAMESPACE_ZERO="FULL",
-     * the test will fail. Hence made the NodeId as read only */
-    retVal |= UA_Server_writeAccessLevel(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG),
-                                         UA_ACCESSLEVELMASK_READ);
-
-    /* Auditing */
-    UA_DataSource auditing = {readAuditing, NULL};
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                        UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_AUDITING), auditing);
-
-    /* Redundancy Support */
-    UA_RedundancySupport redundancySupport = UA_REDUNDANCYSUPPORT_NONE;
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT,
-                               &redundancySupport, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]);
-
-    /* Remove unused subtypes of ServerRedundancy */
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_CURRENTSERVERID), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANTSERVERARRAY), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERURIARRAY), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERNETWORKGROUPS), true);
-
-    /* ServerCapabilities - LocaleIdArray */
-    UA_LocaleId locale_en = UA_STRING("en");
-    retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY,
-                                    &locale_en, 1, &UA_TYPES[UA_TYPES_LOCALEID]);
-
-    /* ServerCapabilities - MaxBrowseContinuationPoints */
-    UA_UInt16 maxBrowseContinuationPoints = UA_MAXCONTINUATIONPOINTS;
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS,
-                               &maxBrowseContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
-
-    /* ServerProfileArray */
-    UA_String profileArray[3];
-    UA_UInt16 profileArraySize = 0;
-#define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING(x)
-    ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/MicroEmbeddedDevice");
-#ifdef UA_ENABLE_NODEMANAGEMENT
-    ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NodeManagement");
-#endif
-#ifdef UA_ENABLE_METHODCALLS
-    ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/Methods");
-#endif
-    retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY,
-                                    profileArray, profileArraySize, &UA_TYPES[UA_TYPES_STRING]);
-
-    /* ServerCapabilities - MaxQueryContinuationPoints */
-    UA_UInt16 maxQueryContinuationPoints = 0;
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS,
-                               &maxQueryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
-
-    /* ServerCapabilities - MaxHistoryContinuationPoints */
-    UA_UInt16 maxHistoryContinuationPoints = 0;
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS,
-                               &maxHistoryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
-
-    /* ServerCapabilities - MinSupportedSampleRate */
-    UA_DataSource samplingInterval = {readMinSamplingInterval, NULL};
-    retVal |= UA_Server_setVariableNode_dataSource(server,
-                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE),
-                                                   samplingInterval);
-
-    /* ServerCapabilities - OperationLimits - MaxNodesPerRead */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD,
-                               &server->config.maxNodesPerRead, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - maxNodesPerWrite */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERWRITE,
-                               &server->config.maxNodesPerWrite, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - MaxNodesPerMethodCall */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERMETHODCALL,
-                               &server->config.maxNodesPerMethodCall, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - MaxNodesPerBrowse */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERBROWSE,
-                               &server->config.maxNodesPerBrowse, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - MaxNodesPerRegisterNodes */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREGISTERNODES,
-                               &server->config.maxNodesPerRegisterNodes, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - MaxNodesPerTranslateBrowsePathsToNodeIds */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS,
-                               &server->config.maxNodesPerTranslateBrowsePathsToNodeIds, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - MaxNodesPerNodeManagement */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERNODEMANAGEMENT,
-                               &server->config.maxNodesPerNodeManagement, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - OperationLimits - MaxMonitoredItemsPerCall */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL,
-                               &server->config.maxMonitoredItemsPerCall, &UA_TYPES[UA_TYPES_UINT32]);
-
-#ifdef UA_ENABLE_MICRO_EMB_DEV_PROFILE
-    /* Remove unused operation limit components */
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXSTRINGLENGTH), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXARRAYLENGTH), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBYTESTRINGLENGTH), true);
-
-    /* Remove not supported Server Instance */
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DICTIONARIES), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_ESTIMATEDRETURNTIME), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACES), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_RESENDDATA), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVERCONFIGURATION), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE), true);
-
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SAMPLINGINTERVALDIAGNOSTICSARRAY), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY), true);
-
-    /* Removing these NodeIds make Server Object to be non-complaint with UA 1.03  in CTT (Base Inforamtion/Base Info Core Structure/ 001.js)
-     * In the 1.04 specification this has been resolved by allowing to remove these static nodes as well */
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY), true);
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SUBSCRIPTIONDIAGNOSTICSARRAY), true);
-#endif
-
-#ifndef UA_ENABLE_HISTORIZING
-    UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_HISTORYSERVERCAPABILITIES), true);
-#else
-    /* ServerCapabilities - HistoryServerCapabilities - AccessHistoryDataCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYDATACAPABILITY,
-                               &server->config.accessHistoryDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - MaxReturnDataValues */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNDATAVALUES,
-                               &server->config.maxReturnDataValues, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - AccessHistoryEventsCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYEVENTSCAPABILITY,
-                               &server->config.accessHistoryEventsCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - MaxReturnEventValues */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNEVENTVALUES,
-                               &server->config.maxReturnEventValues, &UA_TYPES[UA_TYPES_UINT32]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - InsertDataCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTDATACAPABILITY,
-                               &server->config.insertDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - InsertEventCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTEVENTCAPABILITY,
-                               &server->config.insertEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - InsertAnnotationsCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTANNOTATIONCAPABILITY,
-                               &server->config.insertAnnotationsCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - ReplaceDataCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEDATACAPABILITY,
-                               &server->config.replaceDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - ReplaceEventCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEEVENTCAPABILITY,
-                               &server->config.replaceEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - UpdateDataCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEDATACAPABILITY,
-                               &server->config.updateDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - UpdateEventCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEEVENTCAPABILITY,
-                               &server->config.updateEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - DeleteRawCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETERAWCAPABILITY,
-                               &server->config.deleteRawCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - DeleteEventCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEEVENTCAPABILITY,
-                               &server->config.deleteEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    /* ServerCapabilities - HistoryServerCapabilities - DeleteAtTimeDataCapability */
-    retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEATTIMECAPABILITY,
-                               &server->config.deleteAtTimeDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]);
-#endif
-
-#if defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS)
-    retVal |= UA_Server_setMethodNode_callback(server,
-                        UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), readMonitoredItems);
-#endif
-
-    /* The HasComponent references to the ModellingRules are not part of the
-     * Nodeset2.xml. So we add the references manually. */
-    addModellingRules(server);
-
-#endif /* UA_GENERATED_NAMESPACE_ZERO */
-
-    /* create the OverFlowEventType
-     * The EventQueueOverflowEventType is defined as abstract, therefore we can not create an instance of that type
-     * directly, but need to create a subtype. This is already posted on the OPC Foundation bug tracker under the
-     * following link for clarification: https://opcfoundation-onlineapplications.org/mantis/view.php?id=4206 */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    UA_ObjectTypeAttributes overflowAttr = UA_ObjectTypeAttributes_default;
-    overflowAttr.description = UA_LOCALIZEDTEXT("en-US", "A simple event for indicating a queue overflow.");
-    overflowAttr.displayName = UA_LOCALIZEDTEXT("en-US", "SimpleOverflowEventType");
-    retVal |= UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE),
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE),
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                          UA_QUALIFIEDNAME(0, "SimpleOverflowEventType"),
-                                          overflowAttr, NULL, NULL);
-#endif
-
-    if(retVal != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Initialization of Namespace 0 (after bootstrapping) "
-                     "failed with %s. See previous outputs for any error messages.",
-                     UA_StatusCode_name(retVal));
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/src/server/ua_server_utils.c b/ext/open62541/src/server/ua_server_utils.c
deleted file mode 100644
index 4706ede..0000000
--- a/ext/open62541/src/server/ua_server_utils.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Florian Palm
- *    Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Julian Grothoff
- */
-
-#include "ua_server_internal.h"
-
-#define UA_MAX_TREE_RECURSE 50 /* How deep up/down the tree do we recurse at most? */
-
-/********************************/
-/* Information Model Operations */
-/********************************/
-
-/* Keeps track of already visited nodes to detect circular references */
-struct ref_history {
-    struct ref_history *parent; /* the previous element */
-    const UA_NodeId *id; /* the id of the node at this depth */
-    UA_UInt16 depth;
-};
-
-static UA_Boolean
-isNodeInTreeNoCircular(void *nsCtx, const UA_NodeId *leafNode, const UA_NodeId *nodeToFind,
-                       struct ref_history *visitedRefs, const UA_NodeId *referenceTypeIds,
-                       size_t referenceTypeIdsSize) {
-    if(UA_NodeId_equal(nodeToFind, leafNode))
-        return true;
-
-    if(visitedRefs->depth >= UA_MAX_TREE_RECURSE)
-        return false;
-
-    const UA_Node *node = UA_Nodestore_getNode(nsCtx, leafNode);
-    if(!node)
-        return false;
-
-    for(size_t i = 0; i < node->referencesSize; ++i) {
-        UA_NodeReferenceKind *refs = &node->references[i];
-        /* Search upwards in the tree */
-        if(!refs->isInverse)
-            continue;
-
-        /* Consider only the indicated reference types */
-        UA_Boolean match = false;
-        for(size_t j = 0; j < referenceTypeIdsSize; ++j) {
-            if(UA_NodeId_equal(&refs->referenceTypeId, &referenceTypeIds[j])) {
-                match = true;
-                break;
-            }
-        }
-        if(!match)
-            continue;
-
-        /* Match the targets or recurse */
-        for(size_t j = 0; j < refs->targetIdsSize; ++j) {
-            /* Check if we already have seen the referenced node and skip to
-             * avoid endless recursion. Do this only at every 5th depth to save
-             * effort. Circular dependencies are rare and forbidden for most
-             * reference types. */
-            if(visitedRefs->depth % 5 == 4) {
-                struct ref_history *last = visitedRefs;
-                UA_Boolean skip = false;
-                while(!skip && last) {
-                    if(UA_NodeId_equal(last->id, &refs->targetIds[j].nodeId))
-                        skip = true;
-                    last = last->parent;
-                }
-                if(skip)
-                    continue;
-            }
-
-            /* Stack-allocate the visitedRefs structure for the next depth */
-            struct ref_history nextVisitedRefs = {visitedRefs, &refs->targetIds[j].nodeId,
-                                                  (UA_UInt16)(visitedRefs->depth+1)};
-
-            /* Recurse */
-            UA_Boolean foundRecursive =
-                isNodeInTreeNoCircular(nsCtx, &refs->targetIds[j].nodeId, nodeToFind, &nextVisitedRefs,
-                                       referenceTypeIds, referenceTypeIdsSize);
-            if(foundRecursive) {
-                UA_Nodestore_releaseNode(nsCtx, node);
-                return true;
-            }
-        }
-    }
-
-    UA_Nodestore_releaseNode(nsCtx, node);
-    return false;
-}
-
-UA_Boolean
-isNodeInTree(void *nsCtx, const UA_NodeId *leafNode, const UA_NodeId *nodeToFind,
-             const UA_NodeId *referenceTypeIds, size_t referenceTypeIdsSize) {
-    struct ref_history visitedRefs = {NULL, leafNode, 0};
-    return isNodeInTreeNoCircular(nsCtx, leafNode, nodeToFind, &visitedRefs,
-                                  referenceTypeIds, referenceTypeIdsSize);
-}
-
-const UA_Node *
-getNodeType(UA_Server *server, const UA_Node *node) {
-    /* The reference to the parent is different for variable and variabletype */
-    UA_NodeId parentRef;
-    UA_Boolean inverse;
-    UA_NodeClass typeNodeClass;
-    switch(node->nodeClass) {
-    case UA_NODECLASS_OBJECT:
-        parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION);
-        inverse = false;
-        typeNodeClass = UA_NODECLASS_OBJECTTYPE;
-        break;
-    case UA_NODECLASS_VARIABLE:
-        parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION);
-        inverse = false;
-        typeNodeClass = UA_NODECLASS_VARIABLETYPE;
-        break;
-    case UA_NODECLASS_OBJECTTYPE:
-    case UA_NODECLASS_VARIABLETYPE:
-    case UA_NODECLASS_REFERENCETYPE:
-    case UA_NODECLASS_DATATYPE:
-        parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
-        inverse = true;
-        typeNodeClass = node->nodeClass;
-        break;
-    default:
-        return NULL;
-    }
-
-    /* Return the first matching candidate */
-    for(size_t i = 0; i < node->referencesSize; ++i) {
-        if(node->references[i].isInverse != inverse)
-            continue;
-        if(!UA_NodeId_equal(&node->references[i].referenceTypeId, &parentRef))
-            continue;
-        UA_assert(node->references[i].targetIdsSize > 0);
-        const UA_NodeId *targetId = &node->references[i].targetIds[0].nodeId;
-        const UA_Node *type = UA_Nodestore_getNode(server->nsCtx, targetId);
-        if(!type)
-            continue;
-        if(type->nodeClass == typeNodeClass)
-            return type;
-        UA_Nodestore_releaseNode(server->nsCtx, type);
-    }
-
-    return NULL;
-}
-
-UA_Boolean
-UA_Node_hasSubTypeOrInstances(const UA_Node *node) {
-    const UA_NodeId hasSubType = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
-    const UA_NodeId hasTypeDefinition = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION);
-    for(size_t i = 0; i < node->referencesSize; ++i) {
-        if(node->references[i].isInverse == false &&
-           UA_NodeId_equal(&node->references[i].referenceTypeId, &hasSubType))
-            return true;
-        if(node->references[i].isInverse == true &&
-           UA_NodeId_equal(&node->references[i].referenceTypeId, &hasTypeDefinition))
-            return true;
-    }
-    return false;
-}
-
-static const UA_NodeId hasInterfaceNodeId =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASINTERFACE}};
-
-UA_StatusCode
-getParentTypeAndInterfaceHierarchy(UA_Server *server, const UA_NodeId *typeNode,
-                                   UA_NodeId **typeHierarchy, size_t *typeHierarchySize) {
-    UA_ExpandedNodeId *subTypes = NULL;
-    size_t subTypesSize = 0;
-    UA_StatusCode retval = browseRecursive(server, 1, typeNode, 1, &subtypeId,
-                                           UA_BROWSEDIRECTION_INVERSE, false,
-                                           &subTypesSize, &subTypes);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_assert(subTypesSize < 1000);
-
-    UA_ExpandedNodeId *interfaces = NULL;
-    size_t interfacesSize = 0;
-    retval = browseRecursive(server, 1, typeNode, 1, &hasInterfaceNodeId,
-                             UA_BROWSEDIRECTION_FORWARD, false,
-                             &interfacesSize, &interfaces);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_NODEID]);
-        return retval;
-    }
-
-    UA_assert(interfacesSize < 1000);
-
-    UA_NodeId *hierarchy = (UA_NodeId*)
-        UA_malloc(sizeof(UA_NodeId) * (1 + subTypesSize + interfacesSize));
-    if(!hierarchy) {
-        UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-        UA_Array_delete(interfaces, interfacesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    retval = UA_NodeId_copy(typeNode, hierarchy);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(hierarchy);
-        UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-        UA_Array_delete(interfaces, interfacesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    for(size_t i = 0; i < subTypesSize; i++) {
-        hierarchy[i+1] = subTypes[i].nodeId;
-        UA_NodeId_init(&subTypes[i].nodeId);
-    }
-    for(size_t i = 0; i < interfacesSize; i++) {
-        hierarchy[i+1+subTypesSize] = interfaces[i].nodeId;
-        UA_NodeId_init(&interfaces[i].nodeId);
-    }
-
-    *typeHierarchy = hierarchy;
-    *typeHierarchySize = subTypesSize + interfacesSize + 1;
-
-    UA_assert(*typeHierarchySize < 1000);
-
-    UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    UA_Array_delete(interfaces, interfacesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    return UA_STATUSCODE_GOOD;
-}
-
-/* For mulithreading: make a copy of the node, edit and replace.
- * For singlethreading: edit the original */
-UA_StatusCode
-UA_Server_editNode(UA_Server *server, UA_Session *session,
-                   const UA_NodeId *nodeId, UA_EditNodeCallback callback,
-                   void *data) {
-#ifndef UA_ENABLE_IMMUTABLE_NODES
-    /* Get the node and process it in-situ */
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId);
-    if(!node)
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    UA_StatusCode retval = callback(server, session, (UA_Node*)(uintptr_t)node, data);
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    return retval;
-#else
-    UA_StatusCode retval;
-    do {
-        /* Get an editable copy of the node */
-        UA_Node *node;
-        retval = UA_Nodestore_getNodeCopy(server->nsCtx, nodeId, &node);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        /* Run the operation on the copy */
-        retval = callback(server, session, node, data);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_Nodestore_deleteNode(server->nsCtx, node);
-            return retval;
-        }
-
-        /* Replace the node */
-        retval = UA_Nodestore_replaceNode(server->nsCtx, node);
-    } while(retval != UA_STATUSCODE_GOOD);
-    return retval;
-#endif
-}
-
-UA_StatusCode
-UA_Server_processServiceOperations(UA_Server *server, UA_Session *session,
-                                   UA_ServiceOperation operationCallback,
-                                   const void *context, const size_t *requestOperations,
-                                   const UA_DataType *requestOperationsType,
-                                   size_t *responseOperations,
-                                   const UA_DataType *responseOperationsType) {
-    size_t ops = *requestOperations;
-    if(ops == 0)
-        return UA_STATUSCODE_BADNOTHINGTODO;
-
-    /* No padding after size_t */
-    void **respPos = (void**)((uintptr_t)responseOperations + sizeof(size_t));
-    *respPos = UA_Array_new(ops, responseOperationsType);
-    if(!(*respPos))
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    *responseOperations = ops;
-    uintptr_t respOp = (uintptr_t)*respPos;
-    /* No padding after size_t */
-    uintptr_t reqOp = *(uintptr_t*)((uintptr_t)requestOperations + sizeof(size_t));
-    for(size_t i = 0; i < ops; i++) {
-        operationCallback(server, session, context, (void*)reqOp, (void*)respOp);
-        reqOp += requestOperationsType->memSize;
-        respOp += responseOperationsType->memSize;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* A few global NodeId definitions */
-const UA_NodeId subtypeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}};
-const UA_NodeId hierarchicalReferences = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HIERARCHICALREFERENCES}};
-
-/*********************************/
-/* Default attribute definitions */
-/*********************************/
-
-const UA_ObjectAttributes UA_ObjectAttributes_default = {
-    0,                      /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}}, /* displayName */
-    {{0, NULL}, {0, NULL}}, /* description */
-    0, 0,                   /* writeMask (userWriteMask) */
-    0                       /* eventNotifier */
-};
-
-const UA_VariableAttributes UA_VariableAttributes_default = {
-    0,                           /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}},      /* displayName */
-    {{0, NULL}, {0, NULL}},      /* description */
-    0, 0,                        /* writeMask (userWriteMask) */
-    {NULL, UA_VARIANT_DATA,
-     0, NULL, 0, NULL},          /* value */
-    {0, UA_NODEIDTYPE_NUMERIC,
-     {UA_NS0ID_BASEDATATYPE}},   /* dataType */
-    UA_VALUERANK_ANY,            /* valueRank */
-    0, NULL,                     /* arrayDimensions */
-    UA_ACCESSLEVELMASK_READ, 0,  /* accessLevel (userAccessLevel) */
-    0.0,                         /* minimumSamplingInterval */
-    false                        /* historizing */
-};
-
-const UA_MethodAttributes UA_MethodAttributes_default = {
-    0,                      /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}}, /* displayName */
-    {{0, NULL}, {0, NULL}}, /* description */
-    0, 0,                   /* writeMask (userWriteMask) */
-    true, true              /* executable (userExecutable) */
-};
-
-const UA_ObjectTypeAttributes UA_ObjectTypeAttributes_default = {
-    0,                      /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}}, /* displayName */
-    {{0, NULL}, {0, NULL}}, /* description */
-    0, 0,                   /* writeMask (userWriteMask) */
-    false                   /* isAbstract */
-};
-
-const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = {
-    0,                           /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}},      /* displayName */
-    {{0, NULL}, {0, NULL}},      /* description */
-    0, 0,                        /* writeMask (userWriteMask) */
-    {NULL, UA_VARIANT_DATA,
-     0, NULL, 0, NULL},          /* value */
-    {0, UA_NODEIDTYPE_NUMERIC,
-     {UA_NS0ID_BASEDATATYPE}},   /* dataType */
-    UA_VALUERANK_ANY,            /* valueRank */
-    0, NULL,                     /* arrayDimensions */
-    false                        /* isAbstract */
-};
-
-const UA_ReferenceTypeAttributes UA_ReferenceTypeAttributes_default = {
-    0,                      /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}}, /* displayName */
-    {{0, NULL}, {0, NULL}}, /* description */
-    0, 0,                   /* writeMask (userWriteMask) */
-    false,                  /* isAbstract */
-    false,                  /* symmetric */
-    {{0, NULL}, {0, NULL}}  /* inverseName */
-};
-
-const UA_DataTypeAttributes UA_DataTypeAttributes_default = {
-    0,                      /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}}, /* displayName */
-    {{0, NULL}, {0, NULL}}, /* description */
-    0, 0,                   /* writeMask (userWriteMask) */
-    false                   /* isAbstract */
-};
-
-const UA_ViewAttributes UA_ViewAttributes_default = {
-    0,                      /* specifiedAttributes */
-    {{0, NULL}, {0, NULL}}, /* displayName */
-    {{0, NULL}, {0, NULL}}, /* description */
-    0, 0,                   /* writeMask (userWriteMask) */
-    false,                  /* containsNoLoops */
-    0                       /* eventNotifier */
-};
-
diff --git a/ext/open62541/src/server/ua_services.h b/ext/open62541/src/server/ua_services.h
deleted file mode 100644
index aad45b3..0000000
--- a/ext/open62541/src/server/ua_services.h
+++ /dev/null
@@ -1,495 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2015 (c) Sten Grüner
- *    Copyright 2014 (c) LEvertz
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015 (c) Christian Fimmers
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_SERVICES_H_
-#define UA_SERVICES_H_
-
-#include <open62541/server.h>
-
-#include "ua_session.h"
-
-_UA_BEGIN_DECLS
-
-/**
- * .. _services:
- *
- * Services
- * ========
- *
- * In OPC UA, all communication is based on service calls, each consisting of a
- * request and a response message. These messages are defined as data structures
- * with a binary encoding and listed in :ref:`generated-types`. Since all
- * Services are pre-defined in the standard, they cannot be modified by the
- * user. But you can use the :ref:`Call <method-services>` service to invoke
- * user-defined methods on the server.
- *
- * The following service signatures are internal and *not visible to users*.
- * Still, we present them here for an overview of the capabilities of OPC UA.
- * Please refer to the :ref:`client` and :ref:`server` API where the services
- * are exposed to end users. Please see part 4 of the OPC UA standard for the
- * authoritative definition of the service and their behaviour.
- *
- * Most services take as input the server, the current session and pointers to
- * the request and response structures. Possible error codes are returned as
- * part of the response. */
-
-typedef void (*UA_Service)(UA_Server*, UA_Session*,
-                           const void *request, void *response);
-
-/**
- * Discovery Service Set
- * ---------------------
- * This Service Set defines Services used to discover the Endpoints implemented
- * by a Server and to read the security configuration for those Endpoints.
- *
- * FindServers Service
- * ^^^^^^^^^^^^^^^^^^^
- * Returns the Servers known to a Server or Discovery Server. The Client may
- * reduce the number of results returned by specifying filter criteria */
-void Service_FindServers(UA_Server *server, UA_Session *session,
-                         const UA_FindServersRequest *request,
-                         UA_FindServersResponse *response);
-
-/**
- * GetEndpoints Service
- * ^^^^^^^^^^^^^^^^^^^^
- * Returns the Endpoints supported by a Server and all of the configuration
- * information required to establish a SecureChannel and a Session. */
-void Service_GetEndpoints(UA_Server *server, UA_Session *session,
-                          const UA_GetEndpointsRequest *request,
-                          UA_GetEndpointsResponse *response);
-
-#ifdef UA_ENABLE_DISCOVERY
-
-# ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-/**
- * FindServersOnNetwork Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Returns the Servers known to a Discovery Server. Unlike FindServer,
- * this Service is only implemented by Discovery Servers. It additionally
- * returns servers which may have been detected through Multicast. */
-void Service_FindServersOnNetwork(UA_Server *server, UA_Session *session,
-                                  const UA_FindServersOnNetworkRequest *request,
-                                  UA_FindServersOnNetworkResponse *response);
-
-# endif /* UA_ENABLE_DISCOVERY_MULTICAST */
-
-/**
- * RegisterServer
- * ^^^^^^^^^^^^^^
- * Registers a remote server in the local discovery service. */
-void Service_RegisterServer(UA_Server *server, UA_Session *session,
-                            const UA_RegisterServerRequest *request,
-                            UA_RegisterServerResponse *response);
-
-/**
- * RegisterServer2
- * ^^^^^^^^^^^^^^^
- * This Service allows a Server to register its DiscoveryUrls and capabilities
- * with a Discovery Server. It extends the registration information from
- * RegisterServer with information necessary for FindServersOnNetwork. */
-void Service_RegisterServer2(UA_Server *server, UA_Session *session,
-                            const UA_RegisterServer2Request *request,
-                            UA_RegisterServer2Response *response);
-
-#endif /* UA_ENABLE_DISCOVERY */
-
-/**
- * SecureChannel Service Set
- * -------------------------
- * This Service Set defines Services used to open a communication channel that
- * ensures the confidentiality and Integrity of all Messages exchanged with the
- * Server.
- *
- * OpenSecureChannel Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^
- * Open or renew a SecureChannel that can be used to ensure Confidentiality and
- * Integrity for Message exchange during a Session. */
-void Service_OpenSecureChannel(UA_Server *server, UA_SecureChannel* channel,
-                               const UA_OpenSecureChannelRequest *request,
-                               UA_OpenSecureChannelResponse *response);
-
-/**
- * CloseSecureChannel Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to terminate a SecureChannel. */
-void Service_CloseSecureChannel(UA_Server *server, UA_SecureChannel *channel);
-
-/**
- * Session Service Set
- * -------------------
- * This Service Set defines Services for an application layer connection
- * establishment in the context of a Session.
- *
- * CreateSession Service
- * ^^^^^^^^^^^^^^^^^^^^^
- * Used by an OPC UA Client to create a Session and the Server returns two
- * values which uniquely identify the Session. The first value is the sessionId
- * which is used to identify the Session in the audit logs and in the Server's
- * address space. The second is the authenticationToken which is used to
- * associate an incoming request with a Session. */
-void Service_CreateSession(UA_Server *server, UA_SecureChannel *channel,
-                           const UA_CreateSessionRequest *request,
-                           UA_CreateSessionResponse *response);
-
-/**
- * ActivateSession
- * ^^^^^^^^^^^^^^^
- * Used by the Client to submit its SoftwareCertificates to the Server for
- * validation and to specify the identity of the user associated with the
- * Session. This Service request shall be issued by the Client before it issues
- * any other Service request after CreateSession. Failure to do so shall cause
- * the Server to close the Session. */
-void Service_ActivateSession(UA_Server *server, UA_SecureChannel *channel,
-                             UA_Session *session,
-                             const UA_ActivateSessionRequest *request,
-                             UA_ActivateSessionResponse *response);
-
-/**
- * CloseSession
- * ^^^^^^^^^^^^
- * Used to terminate a Session. */
-void Service_CloseSession(UA_Server *server, UA_Session *session,
-                          const UA_CloseSessionRequest *request,
-                          UA_CloseSessionResponse *response);
-
-/**
- * Cancel Service
- * ^^^^^^^^^^^^^^
- * Used to cancel outstanding Service requests. Successfully cancelled service
- * requests shall respond with Bad_RequestCancelledByClient. */
-/* Not Implemented */
-
-/**
- * NodeManagement Service Set
- * --------------------------
- * This Service Set defines Services to add and delete AddressSpace Nodes and
- * References between them. All added Nodes continue to exist in the
- * AddressSpace even if the Client that created them disconnects from the
- * Server.
- *
- * AddNodes Service
- * ^^^^^^^^^^^^^^^^
- * Used to add one or more Nodes into the AddressSpace hierarchy. */
-void Service_AddNodes(UA_Server *server, UA_Session *session,
-                      const UA_AddNodesRequest *request,
-                      UA_AddNodesResponse *response);
-
-/**
- * AddReferences Service
- * ^^^^^^^^^^^^^^^^^^^^^
- * Used to add one or more References to one or more Nodes. */
-void Service_AddReferences(UA_Server *server, UA_Session *session,
-                           const UA_AddReferencesRequest *request,
-                           UA_AddReferencesResponse *response);
-
-/**
- * DeleteNodes Service
- * ^^^^^^^^^^^^^^^^^^^
- * Used to delete one or more Nodes from the AddressSpace. */
-void Service_DeleteNodes(UA_Server *server, UA_Session *session,
-                         const UA_DeleteNodesRequest *request,
-                         UA_DeleteNodesResponse *response);
-
-/**
- * DeleteReferences
- * ^^^^^^^^^^^^^^^^
- * Used to delete one or more References of a Node. */
-void Service_DeleteReferences(UA_Server *server, UA_Session *session,
-                              const UA_DeleteReferencesRequest *request,
-                              UA_DeleteReferencesResponse *response);
-
-/**
- * .. _view-services:
- *
- * View Service Set
- * ----------------
- * Clients use the browse Services of the View Service Set to navigate through
- * the AddressSpace or through a View which is a subset of the AddressSpace.
- *
- * Browse Service
- * ^^^^^^^^^^^^^^
- * Used to discover the References of a specified Node. The browse can be
- * further limited by the use of a View. This Browse Service also supports a
- * primitive filtering capability. */
-void Service_Browse(UA_Server *server, UA_Session *session,
-                    const UA_BrowseRequest *request,
-                    UA_BrowseResponse *response);
-
-/**
- * BrowseNext Service
- * ^^^^^^^^^^^^^^^^^^
- * Used to request the next set of Browse or BrowseNext response information
- * that is too large to be sent in a single response. "Too large" in this
- * context means that the Server is not able to return a larger response or that
- * the number of results to return exceeds the maximum number of results to
- * return that was specified by the Client in the original Browse request. */
-void Service_BrowseNext(UA_Server *server, UA_Session *session,
-                        const UA_BrowseNextRequest *request,
-                        UA_BrowseNextResponse *response);
-
-/**
- * TranslateBrowsePathsToNodeIds Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to translate textual node paths to their respective ids. */
-void Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session,
-             const UA_TranslateBrowsePathsToNodeIdsRequest *request,
-             UA_TranslateBrowsePathsToNodeIdsResponse *response);
-
-/**
- * RegisterNodes Service
- * ^^^^^^^^^^^^^^^^^^^^^
- * Used by Clients to register the Nodes that they know they will access
- * repeatedly (e.g. Write, Call). It allows Servers to set up anything needed so
- * that the access operations will be more efficient. */
-void Service_RegisterNodes(UA_Server *server, UA_Session *session,
-                           const UA_RegisterNodesRequest *request,
-                           UA_RegisterNodesResponse *response);
-
-/**
- * UnregisterNodes Service
- * ^^^^^^^^^^^^^^^^^^^^^^^
- * This Service is used to unregister NodeIds that have been obtained via the
- * RegisterNodes service. */
-void Service_UnregisterNodes(UA_Server *server, UA_Session *session,
-                             const UA_UnregisterNodesRequest *request,
-                             UA_UnregisterNodesResponse *response);
-
-/**
- * Query Service Set
- * -----------------
- * This Service Set is used to issue a Query to a Server. OPC UA Query is
- * generic in that it provides an underlying storage mechanism independent Query
- * capability that can be used to access a wide variety of OPC UA data stores
- * and information management systems. OPC UA Query permits a Client to access
- * data maintained by a Server without any knowledge of the logical schema used
- * for internal storage of the data. Knowledge of the AddressSpace is
- * sufficient.
- *
- * QueryFirst Service
- * ^^^^^^^^^^^^^^^^^^
- * This Service is used to issue a Query request to the Server. */
-/* Not Implemented */
-
-/**
- * QueryNext Service
- * ^^^^^^^^^^^^^^^^^
- * This Service is used to request the next set of QueryFirst or QueryNext
- * response information that is too large to be sent in a single response. */
-/* Not Impelemented */
-
-/**
- * Attribute Service Set
- * ---------------------
- * This Service Set provides Services to access Attributes that are part of
- * Nodes.
- *
- * Read Service
- * ^^^^^^^^^^^^
- * Used to read attributes of nodes. For constructed attribute values whose
- * elements are indexed, such as an array, this Service allows Clients to read
- * the entire set of indexed values as a composite, to read individual elements
- * or to read ranges of elements of the composite. */
-void Service_Read(UA_Server *server, UA_Session *session,
-                  const UA_ReadRequest *request, UA_ReadResponse *response);
-
-/**
- * Write Service
- * ^^^^^^^^^^^^^
- * Used to write attributes of nodes. For constructed attribute values whose
- * elements are indexed, such as an array, this Service allows Clients to write
- * the entire set of indexed values as a composite, to write individual elements
- * or to write ranges of elements of the composite. */
-void Service_Write(UA_Server *server, UA_Session *session,
-                   const UA_WriteRequest *request, UA_WriteResponse *response);
-
-/**
- * HistoryRead Service
- * ^^^^^^^^^^^^^^^^^^^
- * Used to read historical values or Events of one or more Nodes. Servers may
- * make historical values available to Clients using this Service, although the
- * historical values themselves are not visible in the AddressSpace. */
-#ifdef UA_ENABLE_HISTORIZING
-void Service_HistoryRead(UA_Server *server, UA_Session *session,
-                         const UA_HistoryReadRequest *request,
-                         UA_HistoryReadResponse *response);
-
-/**
- * HistoryUpdate Service
- * ^^^^^^^^^^^^^^^^^^^^^
- * Used to update historical values or Events of one or more Nodes. Several
- * request parameters indicate how the Server is to update the historical value
- * or Event. Valid actions are Insert, Replace or Delete. */
-void
-Service_HistoryUpdate(UA_Server *server, UA_Session *session,
-                      const UA_HistoryUpdateRequest *request,
-                      UA_HistoryUpdateResponse *response);
-#endif
-
-/**
- * .. _method-services:
- *
- * Method Service Set
- * ------------------
- * The Method Service Set defines the means to invoke methods. A method shall be
- * a component of an Object. See the section on :ref:`MethodNodes <methodnode>`
- * for more information.
- *
- * Call Service
- * ^^^^^^^^^^^^
- * Used to call (invoke) a methods. Each method call is invoked within the
- * context of an existing Session. If the Session is terminated, the results of
- * the method's execution cannot be returned to the Client and are discarded. */
-#ifdef UA_ENABLE_METHODCALLS
-void Service_Call(UA_Server *server, UA_Session *session,
-                  const UA_CallRequest *request,
-                  UA_CallResponse *response);
-#endif
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-/**
- * MonitoredItem Service Set
- * -------------------------
- * Clients define MonitoredItems to subscribe to data and Events. Each
- * MonitoredItem identifies the item to be monitored and the Subscription to use
- * to send Notifications. The item to be monitored may be any Node Attribute.
- *
- * CreateMonitoredItems Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to create and add one or more MonitoredItems to a Subscription. A
- * MonitoredItem is deleted automatically by the Server when the Subscription is
- * deleted. Deleting a MonitoredItem causes its entire set of triggered item
- * links to be deleted, but has no effect on the MonitoredItems referenced by
- * the triggered items. */
-void Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
-                                  const UA_CreateMonitoredItemsRequest *request,
-                                  UA_CreateMonitoredItemsResponse *response);
-
-/**
- * DeleteMonitoredItems Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to remove one or more MonitoredItems of a Subscription. When a
- * MonitoredItem is deleted, its triggered item links are also deleted. */
-void Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session,
-                                  const UA_DeleteMonitoredItemsRequest *request,
-                                  UA_DeleteMonitoredItemsResponse *response);
-
-/**
- * ModifyMonitoredItems Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to modify MonitoredItems of a Subscription. Changes to the MonitoredItem
- * settings shall be applied immediately by the Server. They take effect as soon
- * as practical but not later than twice the new revisedSamplingInterval.
- *
- * Illegal request values for parameters that can be revised do not generate
- * errors. Instead the server will choose default values and indicate them in
- * the corresponding revised parameter. */
-void Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session,
-                                  const UA_ModifyMonitoredItemsRequest *request,
-                                  UA_ModifyMonitoredItemsResponse *response);
-
-/**
- * SetMonitoringMode Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to set the monitoring mode for one or more MonitoredItems of a
- * Subscription. */
-void Service_SetMonitoringMode(UA_Server *server, UA_Session *session,
-                               const UA_SetMonitoringModeRequest *request,
-                               UA_SetMonitoringModeResponse *response);
-
-/**
- * SetTriggering Service
- * ^^^^^^^^^^^^^^^^^^^^^
- * Used to create and delete triggering links for a triggering item. */
-/* Not Implemented */
-
-/**
- * Subscription Service Set
- * ------------------------
- * Subscriptions are used to report Notifications to the Client.
- *
- * CreateSubscription Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to create a Subscription. Subscriptions monitor a set of MonitoredItems
- * for Notifications and return them to the Client in response to Publish
- * requests. */
-void Service_CreateSubscription(UA_Server *server, UA_Session *session,
-                                const UA_CreateSubscriptionRequest *request,
-                                UA_CreateSubscriptionResponse *response);
-
-/**
- * ModifySubscription Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to modify a Subscription. */
-void Service_ModifySubscription(UA_Server *server, UA_Session *session,
-                                const UA_ModifySubscriptionRequest *request,
-                                UA_ModifySubscriptionResponse *response);
-
-/**
- * SetPublishingMode Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to enable sending of Notifications on one or more Subscriptions. */
-void Service_SetPublishingMode(UA_Server *server, UA_Session *session,
-                               const UA_SetPublishingModeRequest *request,
-                               UA_SetPublishingModeResponse *response);
-
-/**
- * Publish Service
- * ^^^^^^^^^^^^^^^
- * Used for two purposes. First, it is used to acknowledge the receipt of
- * NotificationMessages for one or more Subscriptions. Second, it is used to
- * request the Server to return a NotificationMessage or a keep-alive
- * Message.
- *
- * Note that the service signature is an exception and does not contain a
- * pointer to a PublishResponse. That is because the service queues up publish
- * requests internally and sends responses asynchronously based on timeouts. */
-void Service_Publish(UA_Server *server, UA_Session *session,
-                     const UA_PublishRequest *request, UA_UInt32 requestId);
-
-/**
- * Republish Service
- * ^^^^^^^^^^^^^^^^^
- * Requests the Subscription to republish a NotificationMessage from its
- * retransmission queue. */
-void Service_Republish(UA_Server *server, UA_Session *session,
-                       const UA_RepublishRequest *request,
-                       UA_RepublishResponse *response);
-
-/**
- * DeleteSubscriptions Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Invoked to delete one or more Subscriptions that belong to the Client's
- * Session. */
-void Service_DeleteSubscriptions(UA_Server *server, UA_Session *session,
-                                 const UA_DeleteSubscriptionsRequest *request,
-                                 UA_DeleteSubscriptionsResponse *response);
-
-/**
- * TransferSubscription Service
- * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- * Used to transfer a Subscription and its MonitoredItems from one Session to
- * another. For example, a Client may need to reopen a Session and then transfer
- * its Subscriptions to that Session. It may also be used by one Client to take
- * over a Subscription from another Client by transferring the Subscription to
- * its Session. */
-/* Not Implemented */
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-
-_UA_END_DECLS
-
-#endif /* UA_SERVICES_H_ */
diff --git a/ext/open62541/src/server/ua_services_attribute.c b/ext/open62541/src/server/ua_services_attribute.c
deleted file mode 100644
index c779746..0000000
--- a/ext/open62541/src/server/ua_services_attribute.c
+++ /dev/null
@@ -1,1707 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2015 (c) Christian Fimmers
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2015 (c) wuyangtang
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Thomas Bender
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2017 (c) Jonas Green
- *    Copyright 2017 (c) Henrik Norrman
- */
-
-#include "ua_server_internal.h"
-#include "ua_types_encoding_binary.h"
-#include "ua_services.h"
-
-#ifdef UA_ENABLE_HISTORIZING
-#include <open62541/plugin/historydatabase.h>
-#endif
-
-/******************/
-/* Access Control */
-/******************/
-
-static UA_UInt32
-getUserWriteMask(UA_Server *server, const UA_Session *session,
-                 const UA_Node *node) {
-    if(session == &server->adminSession)
-        return 0xFFFFFFFF; /* the local admin user has all rights */
-    UA_UInt32 retval = node->writeMask;
-    UA_UNLOCK(server->serviceMutex);
-    retval &= server->config.accessControl.getUserRightsMask(server, &server->config.accessControl,
-                                                             &session->sessionId, session->sessionHandle,
-                                                             &node->nodeId, node->context);
-    UA_LOCK(server->serviceMutex);
-    return retval;
-}
-
-static UA_Byte
-getAccessLevel(UA_Server *server, const UA_Session *session,
-               const UA_VariableNode *node) {
-    if(session == &server->adminSession)
-        return 0xFF; /* the local admin user has all rights */
-    return node->accessLevel;
-}
-
-static UA_Byte
-getUserAccessLevel(UA_Server *server, const UA_Session *session,
-                   const UA_VariableNode *node) {
-    if(session == &server->adminSession)
-        return 0xFF; /* the local admin user has all rights */
-    UA_Byte retval = node->accessLevel;
-    UA_UNLOCK(server->serviceMutex);
-    retval &= server->config.accessControl.getUserAccessLevel(server, &server->config.accessControl,
-                                                    &session->sessionId, session->sessionHandle,
-                                                    &node->nodeId, node->context);
-    UA_LOCK(server->serviceMutex);
-    return retval;
-}
-
-static UA_Boolean
-getUserExecutable(UA_Server *server, const UA_Session *session,
-                  const UA_MethodNode *node) {
-    if(session == &server->adminSession)
-        return true; /* the local admin user has all rights */
-    UA_Boolean retval = node->executable;
-    UA_UNLOCK(server->serviceMutex);
-    retval &= server->config.accessControl.getUserExecutable(server, &server->config.accessControl,
-                                                             &session->sessionId, session->sessionHandle,
-                                                             &node->nodeId, node->context);
-    UA_LOCK(server->serviceMutex);
-    return retval;
-}
-
-/****************/
-/* Read Service */
-/****************/
-
-static UA_StatusCode
-readIsAbstractAttribute(const UA_Node *node, UA_Variant *v) {
-    const UA_Boolean *isAbstract;
-    switch(node->nodeClass) {
-    case UA_NODECLASS_REFERENCETYPE:
-        isAbstract = &((const UA_ReferenceTypeNode*)node)->isAbstract;
-        break;
-    case UA_NODECLASS_OBJECTTYPE:
-        isAbstract = &((const UA_ObjectTypeNode*)node)->isAbstract;
-        break;
-    case UA_NODECLASS_VARIABLETYPE:
-        isAbstract = &((const UA_VariableTypeNode*)node)->isAbstract;
-        break;
-    case UA_NODECLASS_DATATYPE:
-        isAbstract = &((const UA_DataTypeNode*)node)->isAbstract;
-        break;
-    default:
-        return UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-    }
-
-    return UA_Variant_setScalarCopy(v, isAbstract, &UA_TYPES[UA_TYPES_BOOLEAN]);
-}
-
-static UA_StatusCode
-readValueAttributeFromNode(UA_Server *server, UA_Session *session,
-                           const UA_VariableNode *vn, UA_DataValue *v,
-                           UA_NumericRange *rangeptr) {
-    /* Update the value by the user callback */
-    if(vn->value.data.callback.onRead) {
-        UA_UNLOCK(server->serviceMutex);
-        vn->value.data.callback.onRead(server, &session->sessionId,
-                                       session->sessionHandle, &vn->nodeId,
-                                       vn->context, rangeptr, &vn->value.data.value);
-        UA_LOCK(server->serviceMutex);
-        vn = (const UA_VariableNode*)UA_Nodestore_getNode(server->nsCtx, &vn->nodeId);
-        if(!vn)
-            return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-
-    /* Set the result */
-    if(rangeptr)
-        return UA_Variant_copyRange(&vn->value.data.value.value, &v->value, *rangeptr);
-    UA_StatusCode retval = UA_DataValue_copy(&vn->value.data.value, v);
-
-    /* Clean up */
-    if(vn->value.data.callback.onRead)
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node *)vn);
-    return retval;
-}
-
-static UA_StatusCode
-readValueAttributeFromDataSource(UA_Server *server, UA_Session *session,
-                                 const UA_VariableNode *vn, UA_DataValue *v,
-                                 UA_TimestampsToReturn timestamps,
-                                 UA_NumericRange *rangeptr) {
-    if(!vn->value.dataSource.read)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    UA_Boolean sourceTimeStamp = (timestamps == UA_TIMESTAMPSTORETURN_SOURCE ||
-                                  timestamps == UA_TIMESTAMPSTORETURN_BOTH);
-    UA_DataValue v2;
-    UA_DataValue_init(&v2);
-    UA_UNLOCK(server->serviceMutex);
-    UA_StatusCode retval = vn->value.dataSource.
-        read(server, &session->sessionId, session->sessionHandle,
-             &vn->nodeId, vn->context, sourceTimeStamp, rangeptr, &v2);
-    UA_LOCK(server->serviceMutex);
-    if(v2.hasValue && v2.value.storageType == UA_VARIANT_DATA_NODELETE) {
-        retval = UA_DataValue_copy(&v2, v);
-        UA_DataValue_deleteMembers(&v2);
-    } else {
-        *v = v2;
-    }
-    return retval;
-}
-
-static UA_StatusCode
-readValueAttributeComplete(UA_Server *server, UA_Session *session,
-                           const UA_VariableNode *vn, UA_TimestampsToReturn timestamps,
-                           const UA_String *indexRange, UA_DataValue *v) {
-    /* Compute the index range */
-    UA_NumericRange range;
-    UA_NumericRange *rangeptr = NULL;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(indexRange && indexRange->length > 0) {
-        retval = UA_NumericRange_parseFromString(&range, indexRange);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-        rangeptr = &range;
-    }
-
-    /* Read the value */
-    if(vn->valueSource == UA_VALUESOURCE_DATA)
-        retval = readValueAttributeFromNode(server, session, vn, v, rangeptr);
-    else
-        retval = readValueAttributeFromDataSource(server, session, vn, v, timestamps, rangeptr);
-
-    /* Clean up */
-    if(rangeptr)
-        UA_free(range.dimensions);
-    return retval;
-}
-
-UA_StatusCode
-readValueAttribute(UA_Server *server, UA_Session *session,
-                   const UA_VariableNode *vn, UA_DataValue *v) {
-    return readValueAttributeComplete(server, session, vn, UA_TIMESTAMPSTORETURN_NEITHER, NULL, v);
-}
-
-static const UA_String binEncoding = {sizeof("Default Binary")-1, (UA_Byte*)"Default Binary"};
-static const UA_String xmlEncoding = {sizeof("Default XML")-1, (UA_Byte*)"Default XML"};
-static const UA_String jsonEncoding = {sizeof("Default JSON")-1, (UA_Byte*)"Default JSON"};
-
-#define CHECK_NODECLASS(CLASS)                                  \
-    if(!(node->nodeClass & (CLASS))) {                          \
-        retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;           \
-        break;                                                  \
-    }
-
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-static const UA_DataType *
-findDataType(const UA_Node *node, const UA_DataTypeArray *customTypes) {
-    for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
-        if(UA_NodeId_equal(&UA_TYPES[i].typeId, &node->nodeId)) {
-            return &UA_TYPES[i];
-        }
-    }
-
-    // lookup custom type
-    while(customTypes) {
-        for(size_t i = 0; i < customTypes->typesSize; ++i) {
-            if(UA_NodeId_equal(&customTypes->types[i].typeId, &node->nodeId))
-                return &customTypes->types[i];
-        }
-        customTypes = customTypes->next;
-    }
-    return NULL;
-}
-
-static UA_StatusCode
-getStructureDefinition(const UA_DataType *type, UA_StructureDefinition *def) {
-    def->baseDataType = UA_NODEID_NUMERIC(0, UA_NS0ID_STRUCTURE);
-    def->defaultEncodingId =
-        UA_NODEID_NUMERIC(type->typeId.namespaceIndex, type->binaryEncodingId);
-    def->structureType = UA_STRUCTURETYPE_STRUCTURE;
-    def->fieldsSize = type->membersSize;
-    def->fields =
-        (UA_StructureField *)UA_calloc(def->fieldsSize, sizeof(UA_StructureField));
-    if(!def->fields) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    const UA_DataType *typelists[2] = {UA_TYPES, &type[-type->typeIndex]};
-    for(size_t cnt = 0; cnt < def->fieldsSize; cnt++) {
-        const UA_DataTypeMember *m = &type->members[cnt];
-        def->fields[cnt].valueRank = UA_TRUE == m->isArray ? 1 : -1;
-        def->fields[cnt].arrayDimensions = NULL;
-        def->fields[cnt].arrayDimensionsSize = 0;
-        def->fields[cnt].name =
-            UA_STRING((char *)(uintptr_t)m->memberName);
-        def->fields[cnt].description.locale = UA_STRING_NULL;
-        def->fields[cnt].description.text = UA_STRING_NULL;
-        def->fields[cnt].dataType = typelists[!m->namespaceZero][m->memberTypeIndex].typeId;
-        def->fields[cnt].maxStringLength = 0;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-/* Returns a datavalue that may point into the node via the
- * UA_VARIANT_DATA_NODELETE tag. Don't access the returned DataValue once the
- * node has been released! */
-void
-ReadWithNode(const UA_Node *node, UA_Server *server, UA_Session *session,
-             UA_TimestampsToReturn timestampsToReturn,
-             const UA_ReadValueId *id, UA_DataValue *v) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Read the attribute %i", id->attributeId);
-
-    /* Only Binary Encoding is supported */
-    if(id->dataEncoding.name.length > 0 &&
-       !UA_String_equal(&binEncoding, &id->dataEncoding.name)) {
-        if(UA_String_equal(&xmlEncoding, &id->dataEncoding.name) ||
-           UA_String_equal(&jsonEncoding, &id->dataEncoding.name))
-           v->status = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED;
-        else
-           v->status = UA_STATUSCODE_BADDATAENCODINGINVALID;
-        v->hasStatus = true;
-        return;
-    }
-
-    /* Index range for an attribute other than value */
-    if(id->indexRange.length > 0 && id->attributeId != UA_ATTRIBUTEID_VALUE) {
-        v->hasStatus = true;
-        v->status = UA_STATUSCODE_BADINDEXRANGENODATA;
-        return;
-    }
-
-    /* Read the attribute */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    switch(id->attributeId) {
-    case UA_ATTRIBUTEID_NODEID:
-        retval = UA_Variant_setScalarCopy(&v->value, &node->nodeId, &UA_TYPES[UA_TYPES_NODEID]);
-        break;
-    case UA_ATTRIBUTEID_NODECLASS:
-        retval = UA_Variant_setScalarCopy(&v->value, &node->nodeClass, &UA_TYPES[UA_TYPES_NODECLASS]);
-        break;
-    case UA_ATTRIBUTEID_BROWSENAME:
-        retval = UA_Variant_setScalarCopy(&v->value, &node->browseName, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-        break;
-    case UA_ATTRIBUTEID_DISPLAYNAME:
-        retval = UA_Variant_setScalarCopy(&v->value, &node->displayName, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-        break;
-    case UA_ATTRIBUTEID_DESCRIPTION:
-        retval = UA_Variant_setScalarCopy(&v->value, &node->description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-        break;
-    case UA_ATTRIBUTEID_WRITEMASK:
-        retval = UA_Variant_setScalarCopy(&v->value, &node->writeMask, &UA_TYPES[UA_TYPES_UINT32]);
-        break;
-    case UA_ATTRIBUTEID_USERWRITEMASK: {
-        UA_UInt32 userWriteMask = getUserWriteMask(server, session, node);
-        retval = UA_Variant_setScalarCopy(&v->value, &userWriteMask, &UA_TYPES[UA_TYPES_UINT32]);
-        break; }
-    case UA_ATTRIBUTEID_ISABSTRACT:
-        retval = readIsAbstractAttribute(node, &v->value);
-        break;
-    case UA_ATTRIBUTEID_SYMMETRIC:
-        CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ReferenceTypeNode*)node)->symmetric,
-                          &UA_TYPES[UA_TYPES_BOOLEAN]);
-        break;
-    case UA_ATTRIBUTEID_INVERSENAME:
-        CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ReferenceTypeNode*)node)->inverseName,
-                          &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-        break;
-    case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-        CHECK_NODECLASS(UA_NODECLASS_VIEW);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ViewNode*)node)->containsNoLoops,
-                          &UA_TYPES[UA_TYPES_BOOLEAN]);
-        break;
-    case UA_ATTRIBUTEID_EVENTNOTIFIER:
-        CHECK_NODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT);
-        if(node->nodeClass == UA_NODECLASS_VIEW) {
-            retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ViewNode*)node)->eventNotifier,
-                              &UA_TYPES[UA_TYPES_BYTE]);
-        }
-        else{
-            retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ObjectNode*)node)->eventNotifier,
-                              &UA_TYPES[UA_TYPES_BYTE]);
-        }
-        break;
-    case UA_ATTRIBUTEID_VALUE: {
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        /* VariableTypes don't have the AccessLevel concept. Always allow reading the value. */
-        if(node->nodeClass == UA_NODECLASS_VARIABLE) {
-            /* The access to a value variable is granted via the AccessLevel
-             * and UserAccessLevel attributes */
-            UA_Byte accessLevel = getAccessLevel(server, session, (const UA_VariableNode*)node);
-            if(!(accessLevel & (UA_ACCESSLEVELMASK_READ))) {
-                retval = UA_STATUSCODE_BADNOTREADABLE;
-                break;
-            }
-            accessLevel = getUserAccessLevel(server, session,
-                                             (const UA_VariableNode*)node);
-            if(!(accessLevel & (UA_ACCESSLEVELMASK_READ))) {
-                retval = UA_STATUSCODE_BADUSERACCESSDENIED;
-                break;
-            }
-        }
-        retval = readValueAttributeComplete(server, session, (const UA_VariableNode*)node,
-                                            timestampsToReturn, &id->indexRange, v);
-        break;
-    }
-    case UA_ATTRIBUTEID_DATATYPE:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableTypeNode*)node)->dataType,
-                                          &UA_TYPES[UA_TYPES_NODEID]);
-        break;
-    case UA_ATTRIBUTEID_VALUERANK:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableTypeNode*)node)->valueRank,
-                                          &UA_TYPES[UA_TYPES_INT32]);
-        break;
-    case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        retval = UA_Variant_setArrayCopy(&v->value, ((const UA_VariableTypeNode*)node)->arrayDimensions,
-                                         ((const UA_VariableTypeNode*)node)->arrayDimensionsSize,
-                                         &UA_TYPES[UA_TYPES_UINT32]);
-        break;
-    case UA_ATTRIBUTEID_ACCESSLEVEL:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableNode*)node)->accessLevel,
-                                          &UA_TYPES[UA_TYPES_BYTE]);
-        break;
-    case UA_ATTRIBUTEID_USERACCESSLEVEL: {
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        UA_Byte userAccessLevel = getUserAccessLevel(server, session, (const UA_VariableNode*)node);
-        retval = UA_Variant_setScalarCopy(&v->value, &userAccessLevel, &UA_TYPES[UA_TYPES_BYTE]);
-        break; }
-    case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableNode*)node)->minimumSamplingInterval,
-                          &UA_TYPES[UA_TYPES_DOUBLE]);
-        break;
-    case UA_ATTRIBUTEID_HISTORIZING:
-        CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableNode*)node)->historizing,
-                          &UA_TYPES[UA_TYPES_BOOLEAN]);
-        break;
-    case UA_ATTRIBUTEID_EXECUTABLE:
-        CHECK_NODECLASS(UA_NODECLASS_METHOD);
-        retval = UA_Variant_setScalarCopy(&v->value, &((const UA_MethodNode*)node)->executable,
-                          &UA_TYPES[UA_TYPES_BOOLEAN]);
-        break;
-    case UA_ATTRIBUTEID_USEREXECUTABLE: {
-        CHECK_NODECLASS(UA_NODECLASS_METHOD);
-        UA_Boolean userExecutable = getUserExecutable(server, session, (const UA_MethodNode*)node);
-        retval = UA_Variant_setScalarCopy(&v->value, &userExecutable, &UA_TYPES[UA_TYPES_BOOLEAN]);
-        break; }
-    case UA_ATTRIBUTEID_DATATYPEDEFINITION: {
-        CHECK_NODECLASS(UA_NODECLASS_DATATYPE);
-
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-        const UA_DataType *type = findDataType(node, server->config.customDataTypes);
-        if(!type) {
-            retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-            break;
-        }
-
-        if(UA_DATATYPEKIND_STRUCTURE == type->typeKind ||
-           UA_DATATYPEKIND_OPTSTRUCT == type->typeKind) {
-            UA_StructureDefinition def;
-            retval = getStructureDefinition(type, &def);
-            if(UA_STATUSCODE_GOOD!=retval)
-                break;            
-            retval = UA_Variant_setScalarCopy(&v->value, &def,
-                                              &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]);
-            UA_free(def.fields);
-            break;
-        }
-#endif
-        retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-        break; }
-    default:
-        retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-    }
-
-    /* Return error code when reading has failed */
-    if(retval != UA_STATUSCODE_GOOD) {
-        v->hasStatus = true;
-        v->status = retval;
-        return;
-    }
-
-    v->hasValue = true;
-
-    /* Create server timestamp */
-    if(timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER ||
-       timestampsToReturn == UA_TIMESTAMPSTORETURN_BOTH) {
-        if (!v->hasServerTimestamp) {
-            v->serverTimestamp = UA_DateTime_now();
-            v->hasServerTimestamp = true;
-        }
-    } else {
-        /* In case the ServerTimestamp has been set manually */
-        v->hasServerTimestamp = false;
-    }
-
-    /* Handle source time stamp */
-    if(id->attributeId == UA_ATTRIBUTEID_VALUE) {
-        if(timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER ||
-           timestampsToReturn == UA_TIMESTAMPSTORETURN_NEITHER) {
-            v->hasSourceTimestamp = false;
-            v->hasSourcePicoseconds = false;
-        } else if(!v->hasSourceTimestamp) {
-            v->sourceTimestamp = UA_DateTime_now();
-            v->hasSourceTimestamp = true;
-        }
-    }
-}
-
-static void
-Operation_Read(UA_Server *server, UA_Session *session, UA_ReadRequest *request,
-               UA_ReadValueId *rvi, UA_DataValue *result) {
-    /* Get the node */
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &rvi->nodeId);
-
-    /* Perform the read operation */
-    if(node) {
-        ReadWithNode(node, server, session, request->timestampsToReturn, rvi, result);
-        UA_Nodestore_releaseNode(server->nsCtx, node);
-    } else {
-        result->hasStatus = true;
-        result->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-}
-
-void
-Service_Read(UA_Server *server, UA_Session *session,
-             const UA_ReadRequest *request, UA_ReadResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing ReadRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Check if the timestampstoreturn is valid */
-    if(request->timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID;
-        return;
-    }
-
-    /* Check if maxAge is valid */
-    if(request->maxAge < 0) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADMAXAGEINVALID;
-        return;
-    }
-
-    /* Check if there are too many operations */
-    if(server->config.maxNodesPerRead != 0 &&
-       request->nodesToReadSize > server->config.maxNodesPerRead) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Read,
-                                           request,
-                                           &request->nodesToReadSize, &UA_TYPES[UA_TYPES_READVALUEID],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-
-UA_DataValue
-UA_Server_readWithSession(UA_Server *server, UA_Session *session,
-                          const UA_ReadValueId *item,
-                          UA_TimestampsToReturn timestampsToReturn) {
-    UA_DataValue dv;
-    UA_DataValue_init(&dv);
-
-    /* Get the node */
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &item->nodeId);
-    if(!node) {
-        dv.hasStatus = true;
-        dv.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        return dv;
-    }
-
-    /* Perform the read operation */
-    ReadWithNode(node, server, session, timestampsToReturn, item, &dv);
-
-    /* Release the node and return */
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    return dv;
-}
-
-UA_DataValue
-readAttribute(UA_Server *server, const UA_ReadValueId *item,
-               UA_TimestampsToReturn timestamps) {
-    return UA_Server_readWithSession(server, &server->adminSession, item, timestamps);
-}
-
-UA_StatusCode
-readWithReadValue(UA_Server *server, const UA_NodeId *nodeId,
-                                const UA_AttributeId attributeId, void *v) {
-    /* Call the read service */
-    UA_ReadValueId item;
-    UA_ReadValueId_init(&item);
-    item.nodeId = *nodeId;
-    item.attributeId = attributeId;
-    UA_DataValue dv = readAttribute(server, &item, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    /* Check the return value */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(dv.hasStatus)
-        retval = dv.status;
-    else if(!dv.hasValue)
-        retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_DataValue_deleteMembers(&dv);
-        return retval;
-    }
-
-    if(attributeId == UA_ATTRIBUTEID_VALUE ||
-       attributeId == UA_ATTRIBUTEID_ARRAYDIMENSIONS) {
-        /* Return the entire variant */
-        memcpy(v, &dv.value, sizeof(UA_Variant));
-    } else {
-        /* Return the variant content only */
-        memcpy(v, dv.value.data, dv.value.type->memSize);
-        UA_free(dv.value.data);
-    }
-    return retval;
-}
-
-/* Exposes the Read service to local users */
-UA_DataValue
-UA_Server_read(UA_Server *server, const UA_ReadValueId *item,
-               UA_TimestampsToReturn timestamps) {
-    UA_LOCK(server->serviceMutex);
-    UA_DataValue dv = readAttribute(server, item, timestamps);
-    UA_UNLOCK(server->serviceMutex);
-    return dv;
-}
-
-/* Used in inline functions exposing the Read service with more syntactic sugar
- * for individual attributes */
-UA_StatusCode
-__UA_Server_read(UA_Server *server, const UA_NodeId *nodeId,
-                 const UA_AttributeId attributeId, void *v) {
-   UA_LOCK(server->serviceMutex);
-   UA_StatusCode retval = readWithReadValue(server, nodeId, attributeId, v);
-   UA_UNLOCK(server->serviceMutex);
-   return retval;
-}
-
-UA_StatusCode
-UA_Server_readObjectProperty(UA_Server *server, const UA_NodeId objectId,
-                             const UA_QualifiedName propertyName,
-                             UA_Variant *value) {
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = propertyName;
-
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = objectId;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-
-    UA_StatusCode retval;
-    UA_BrowsePathResult bpr = translateBrowsePathToNodeIds(server, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        retval = bpr.statusCode;
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return retval;
-    }
-
-    retval = UA_Server_readValue(server, bpr.targets[0].targetId.nodeId, value);
-
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return retval;
-}
-
-/*****************/
-/* Type Checking */
-/*****************/
-
-static UA_DataTypeKind
-typeEquivalence(const UA_DataType *t) {
-    UA_DataTypeKind k = (UA_DataTypeKind)t->typeKind;
-    if(k == UA_DATATYPEKIND_ENUM)
-        return UA_DATATYPEKIND_INT32;
-    return k;
-}
-
-static const UA_NodeId enumNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_ENUMERATION}};
-
-UA_Boolean
-compatibleDataType(UA_Server *server, const UA_NodeId *dataType,
-                   const UA_NodeId *constraintDataType, UA_Boolean isValue) {
-    /* Do not allow empty datatypes */
-    if(UA_NodeId_isNull(dataType))
-       return false;
-
-    /* No constraint (TODO: use variant instead) */
-    if(UA_NodeId_isNull(constraintDataType))
-        return true;
-
-    /* Same datatypes */
-    if (UA_NodeId_equal(dataType, constraintDataType))
-        return true;
-
-    /* Variant allows any subtype */
-    if(UA_NodeId_equal(constraintDataType, &UA_TYPES[UA_TYPES_VARIANT].typeId))
-        return true;
-
-    /* Is the value-type a subtype of the required type? */
-    if(isNodeInTree(server->nsCtx, dataType, constraintDataType, &subtypeId, 1))
-        return true;
-
-    /* Enum allows Int32 (only) */
-    if(UA_NodeId_equal(dataType, &UA_TYPES[UA_TYPES_INT32].typeId) &&
-       isNodeInTree(server->nsCtx, constraintDataType, &enumNodeId, &subtypeId, 1))
-        return true;
-
-    /* More checks for the data type of real values (variants) */
-    if(isValue) {
-        /* If value is a built-in type: The target data type may be a sub type of
-         * the built-in type. (e.g. UtcTime is sub-type of DateTime and has a
-         * DateTime value). A type is builtin if its NodeId is in Namespace 0 and
-         * has a numeric identifier <= 25 (DiagnosticInfo) */
-        if(dataType->namespaceIndex == 0 &&
-           dataType->identifierType == UA_NODEIDTYPE_NUMERIC &&
-           dataType->identifier.numeric <= 25 &&
-           isNodeInTree(server->nsCtx, constraintDataType,
-                        dataType, &subtypeId, 1))
-            return true;
-    }
-
-    return false;
-}
-
-/* Test whether a ValueRank and the given arraydimensions are compatible.
- *
- * 5.6.2 Variable NodeClass: If the maximum is unknown the value shall be 0. The
- * number of elements shall be equal to the value of the ValueRank Attribute.
- * This Attribute shall be null if ValueRank <= 0. */
-UA_Boolean
-compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session,
-                                   UA_Int32 valueRank, size_t arrayDimensionsSize) {
-    /* ValueRank invalid */
-    if(valueRank < UA_VALUERANK_SCALAR_OR_ONE_DIMENSION) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "The ValueRank is invalid (< -3)");
-        return false;
-    }
-
-    /* case -3, UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: the value can be a scalar or a one dimensional array */
-    /* case -2, UA_VALUERANK_ANY: the value can be a scalar or an array with any number of dimensions */
-    /* case -1, UA_VALUERANK_SCALAR: the value is a scalar */
-    /* case  0, UA_VALUERANK_ONE_OR_MORE_DIMENSIONS:  the value is an array with one or more dimensions */
-    if(valueRank <= UA_VALUERANK_ONE_OR_MORE_DIMENSIONS) {
-        if(arrayDimensionsSize > 0) {
-            UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "No ArrayDimensions can be defined for a ValueRank <= 0");
-            return false;
-        }
-        return true;
-    }
-    
-    /* case >= 1, UA_VALUERANK_ONE_DIMENSION: the value is an array with the specified number of dimensions */
-    if(arrayDimensionsSize != (size_t)valueRank) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "The number of ArrayDimensions is not equal to the (positive) ValueRank");
-        return false;
-    }
-    return true;
-}
-
-UA_Boolean
-compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank) {
-    /* Check if the valuerank of the variabletype allows the change. */
-    switch(constraintValueRank) {
-    case UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: /* the value can be a scalar or a one dimensional array */
-        if(valueRank != UA_VALUERANK_SCALAR && valueRank != UA_VALUERANK_ONE_DIMENSION)
-            return false;
-        break;
-    case UA_VALUERANK_ANY: /* the value can be a scalar or an array with any number of dimensions */
-        break;
-    case UA_VALUERANK_SCALAR: /* the value is a scalar */
-        if(valueRank != UA_VALUERANK_SCALAR)
-            return false;
-        break;
-    case UA_VALUERANK_ONE_OR_MORE_DIMENSIONS: /* the value is an array with one or more dimensions */
-        if(valueRank < (UA_Int32) UA_VALUERANK_ONE_OR_MORE_DIMENSIONS)
-            return false;
-        break;
-    default: /* >= 1: the value is an array with the specified number of dimensions */
-        if(valueRank != constraintValueRank)
-            return false;
-        break;
-    }
-    return true;
-}
-
-/* Check if the ValueRank allows for the value dimension. This is more
- * permissive than checking for the ArrayDimensions attribute. Because the value
- * can have dimensions if the ValueRank < 0 */
-static UA_Boolean
-compatibleValueRankValue(UA_Int32 valueRank, const UA_Variant *value) {
-    /* Invalid ValueRank */
-    if(valueRank < UA_VALUERANK_SCALAR_OR_ONE_DIMENSION)
-        return false;
-
-    /* Empty arrays (-1) always match */
-    if(!value->data)
-        return true;
-
-    size_t arrayDims = value->arrayDimensionsSize;
-    if(arrayDims == 0 && !UA_Variant_isScalar(value))
-        arrayDims = 1; /* array but no arraydimensions -> implicit array dimension 1 */
-
-    /* We cannot simply use compatibleValueRankArrayDimensions since we can have
-     * defined ArrayDimensions for the value if the ValueRank is -2 */
-    switch(valueRank) {
-    case UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: /* The value can be a scalar or a one dimensional array */
-        return (arrayDims <= 1);
-    case UA_VALUERANK_ANY: /* The value can be a scalar or an array with any number of dimensions */
-        return true;
-    case UA_VALUERANK_SCALAR: /* The value is a scalar */
-        return (arrayDims == 0);
-    default:
-        break;
-    }
-
-    UA_assert(valueRank >= UA_VALUERANK_ONE_OR_MORE_DIMENSIONS);
-
-    /* case 0:  the value is an array with one or more dimensions */
-    return (arrayDims == (UA_UInt32)valueRank);
-}
-
-UA_Boolean
-compatibleArrayDimensions(size_t constraintArrayDimensionsSize,
-                          const UA_UInt32 *constraintArrayDimensions,
-                          size_t testArrayDimensionsSize,
-                          const UA_UInt32 *testArrayDimensions) {
-    /* No array dimensions defined -> everything is permitted if the value rank fits */
-    if(constraintArrayDimensionsSize == 0)
-        return true;
-
-    /* Dimension count must match */
-    if(testArrayDimensionsSize != constraintArrayDimensionsSize)
-        return false;
-
-    /* Dimension lengths must not be larger than the constraint. Zero in the
-     * constraint indicates a wildcard. */
-    for(size_t i = 0; i < constraintArrayDimensionsSize; ++i) {
-        if(constraintArrayDimensions[i] < testArrayDimensions[i] &&
-           constraintArrayDimensions[i] != 0)
-            return false;
-    }
-    return true;
-}
-
-UA_Boolean
-compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize,
-                               const UA_UInt32 *targetArrayDimensions) {
-    size_t valueArrayDimensionsSize = value->arrayDimensionsSize;
-    UA_UInt32 *valueArrayDimensions = value->arrayDimensions;
-    UA_UInt32 tempArrayDimensions;
-    if(!valueArrayDimensions && !UA_Variant_isScalar(value)) {
-        valueArrayDimensionsSize = 1;
-        tempArrayDimensions = (UA_UInt32)value->arrayLength;
-        valueArrayDimensions = &tempArrayDimensions;
-    }
-    UA_assert(valueArrayDimensionsSize == 0 || valueArrayDimensions != NULL);
-    return compatibleArrayDimensions(targetArrayDimensionsSize, targetArrayDimensions,
-                                     valueArrayDimensionsSize, valueArrayDimensions);
-}
-
-UA_Boolean
-compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId,
-                UA_Int32 targetValueRank, size_t targetArrayDimensionsSize,
-                const UA_UInt32 *targetArrayDimensions, const UA_Variant *value,
-                const UA_NumericRange *range) {
-    /* Empty value */
-    if(!value->type) {
-        /* Empty value is allowed for BaseDataType */
-        if(UA_NodeId_equal(targetDataTypeId, &UA_TYPES[UA_TYPES_VARIANT].typeId) ||
-           UA_NodeId_equal(targetDataTypeId, &UA_NODEID_NULL))
-            return true;
-
-        /* Allow empty node values since existing information models may have
-         * variables with no value, e.g. OldValues - ns=0;i=3024. See also
-         * #1889, https://github.com/open62541/open62541/pull/1889#issuecomment-403506538 */
-        if(server->config.relaxEmptyValueConstraint) {
-            UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                                 "Only Variables with data type BaseDataType can contain an "
-                                 "empty value. Allow via explicit constraint relaxation.");
-            return true;
-        }
-
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "Only Variables with data type BaseDataType can contain an empty value");
-        return false;
-    }
-
-    /* Has the value a subtype of the required type? BaseDataType (Variant) can
-     * be anything... */
-    if(!compatibleDataType(server, &value->type->typeId, targetDataTypeId, true))
-        return false;
-
-    /* Array dimensions are checked later when writing the range */
-    if(range)
-        return true;
-
-    /* See if the array dimensions match. */
-    if(!compatibleValueArrayDimensions(value, targetArrayDimensionsSize, targetArrayDimensions))
-        return false;
-
-    /* Check if the valuerank allows for the value dimension */
-    return compatibleValueRankValue(targetValueRank, value);
-}
-
-/*****************/
-/* Write Service */
-/*****************/
-
-static void
-adjustValue(UA_Server *server, UA_Variant *value,
-            const UA_NodeId *targetDataTypeId) {
-    const UA_DataType *targetDataType = UA_findDataType(targetDataTypeId);
-    if(!targetDataType)
-        return;
-
-    /* A string is written to a byte array. the valuerank and array dimensions
-     * are checked later */
-    if(targetDataType == &UA_TYPES[UA_TYPES_BYTE] &&
-       value->type == &UA_TYPES[UA_TYPES_BYTESTRING] &&
-       UA_Variant_isScalar(value)) {
-        UA_ByteString *str = (UA_ByteString*)value->data;
-        value->type = &UA_TYPES[UA_TYPES_BYTE];
-        value->arrayLength = str->length;
-        value->data = str->data;
-        return;
-    }
-
-    /* An enum was sent as an int32, or an opaque type as a bytestring. This
-     * is detected with the typeIndex indicating the "true" datatype. */
-    UA_DataTypeKind te1 = typeEquivalence(targetDataType);
-    UA_DataTypeKind te2 = typeEquivalence(value->type);
-    if(te1 == te2 && te1 <= UA_DATATYPEKIND_ENUM) {
-        value->type = targetDataType;
-        return;
-    }
-
-    /* No more possible equivalencies */
-}
-
-static UA_StatusCode
-writeArrayDimensionsAttribute(UA_Server *server, UA_Session *session,
-                              UA_VariableNode *node, const UA_VariableTypeNode *type,
-                              size_t arrayDimensionsSize, UA_UInt32 *arrayDimensions) {
-    UA_assert(node != NULL);
-    UA_assert(type != NULL);
-
-    /* If this is a variabletype, there must be no instances or subtypes of it
-     * when we do the change */
-    if(node->nodeClass == UA_NODECLASS_VARIABLETYPE &&
-       UA_Node_hasSubTypeOrInstances((UA_Node*)node)) {
-        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                    "Cannot change a variable type with existing instances");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Check that the array dimensions match with the valuerank */
-    if(!compatibleValueRankArrayDimensions(server, session, node->valueRank, arrayDimensionsSize)) {
-        UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Cannot write the ArrayDimensions. The ValueRank does not match.");
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-    }
-
-    /* Check if the array dimensions match with the wildcards in the
-     * variabletype (dimension length 0) */
-    if(type->arrayDimensions &&
-       !compatibleArrayDimensions(type->arrayDimensionsSize, type->arrayDimensions,
-                                  arrayDimensionsSize, arrayDimensions)) {
-       UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                    "Array dimensions in the variable type do not match");
-       return UA_STATUSCODE_BADTYPEMISMATCH;
-    }
-
-    /* Check if the current value is compatible with the array dimensions */
-    UA_DataValue value;
-    UA_DataValue_init(&value);
-    UA_StatusCode retval = readValueAttribute(server, session, node, &value);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    if(value.hasValue) {
-        if(!compatibleValueArrayDimensions(&value.value, arrayDimensionsSize, arrayDimensions))
-            retval = UA_STATUSCODE_BADTYPEMISMATCH;
-        UA_DataValue_deleteMembers(&value);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                         "Array dimensions in the current value do not match");
-            return retval;
-        }
-    }
-
-    /* Ok, apply */
-    UA_UInt32 *oldArrayDimensions = node->arrayDimensions;
-    size_t oldArrayDimensionsSize = node->arrayDimensionsSize;
-    retval = UA_Array_copy(arrayDimensions, arrayDimensionsSize,
-                           (void**)&node->arrayDimensions,
-                           &UA_TYPES[UA_TYPES_UINT32]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    UA_Array_delete(oldArrayDimensions, oldArrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]);
-    node->arrayDimensionsSize = arrayDimensionsSize;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Stack layout: ... | node | type */
-static UA_StatusCode
-writeValueRankAttribute(UA_Server *server, UA_Session *session,
-                        UA_VariableNode *node, const UA_VariableTypeNode *type,
-                        UA_Int32 valueRank) {
-    UA_assert(node != NULL);
-    UA_assert(type != NULL);
-
-    UA_Int32 constraintValueRank = type->valueRank;
-
-    /* If this is a variabletype, there must be no instances or subtypes of it
-     * when we do the change */
-    if(node->nodeClass == UA_NODECLASS_VARIABLETYPE &&
-       UA_Node_hasSubTypeOrInstances((const UA_Node*)node))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Check if the valuerank of the variabletype allows the change. */
-    if(!compatibleValueRanks(valueRank, constraintValueRank))
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* Check if the new valuerank is compatible with the array dimensions. Use
-     * the read service to handle data sources. */
-    size_t arrayDims = node->arrayDimensionsSize;
-    if(arrayDims == 0) {
-        /* the value could be an array with no arrayDimensions defined.
-           dimensions zero indicate a scalar for compatibleValueRankArrayDimensions. */
-        UA_DataValue value;
-        UA_DataValue_init(&value);
-        UA_StatusCode retval = readValueAttribute(server, session, node, &value);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-        if(!value.hasValue || !value.value.type) {
-            /* no value -> apply */
-            node->valueRank = valueRank;
-            return UA_STATUSCODE_GOOD;
-        }
-        if(!UA_Variant_isScalar(&value.value))
-            arrayDims = 1;
-        UA_DataValue_deleteMembers(&value);
-    }
-    if(!compatibleValueRankArrayDimensions(server, session, valueRank, arrayDims))
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* All good, apply the change */
-    node->valueRank = valueRank;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeDataTypeAttribute(UA_Server *server, UA_Session *session,
-                       UA_VariableNode *node, const UA_VariableTypeNode *type,
-                       const UA_NodeId *dataType) {
-    UA_assert(node != NULL);
-    UA_assert(type != NULL);
-
-    /* If this is a variabletype, there must be no instances or subtypes of it
-       when we do the change */
-    if(node->nodeClass == UA_NODECLASS_VARIABLETYPE &&
-       UA_Node_hasSubTypeOrInstances((const UA_Node*)node))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Does the new type match the constraints of the variabletype? */
-    if(!compatibleDataType(server, dataType, &type->dataType, false))
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* Check if the current value would match the new type */
-    UA_DataValue value;
-    UA_DataValue_init(&value);
-    UA_StatusCode retval = readValueAttribute(server, session, node, &value);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    if(value.hasValue) {
-        if(!compatibleValue(server, session, dataType, node->valueRank,
-                            node->arrayDimensionsSize, node->arrayDimensions,
-                            &value.value, NULL))
-            retval = UA_STATUSCODE_BADTYPEMISMATCH;
-        UA_DataValue_deleteMembers(&value);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                         "The current value does not match the new data type");
-            return retval;
-        }
-    }
-
-    /* Replace the datatype nodeid */
-    UA_NodeId dtCopy = node->dataType;
-    retval = UA_NodeId_copy(dataType, &node->dataType);
-    if(retval != UA_STATUSCODE_GOOD) {
-        node->dataType = dtCopy;
-        return retval;
-    }
-    UA_NodeId_deleteMembers(&dtCopy);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeValueAttributeWithoutRange(UA_VariableNode *node, const UA_DataValue *value) {
-    UA_DataValue new_value;
-    UA_StatusCode retval = UA_DataValue_copy(value, &new_value);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    UA_DataValue_deleteMembers(&node->value.data.value);
-    node->value.data.value = new_value;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeValueAttributeWithRange(UA_VariableNode *node, const UA_DataValue *value,
-                             const UA_NumericRange *rangeptr) {
-    /* Value on both sides? */
-    if(value->status != node->value.data.value.status ||
-       !value->hasValue || !node->value.data.value.hasValue)
-        return UA_STATUSCODE_BADINDEXRANGEINVALID;
-
-    /* Make scalar a one-entry array for range matching */
-    UA_Variant editableValue;
-    const UA_Variant *v = &value->value;
-    if(UA_Variant_isScalar(&value->value)) {
-        editableValue = value->value;
-        editableValue.arrayLength = 1;
-        v = &editableValue;
-    }
-
-    /* Check that the type is an exact match and not only "compatible" */
-    if(!node->value.data.value.value.type || !v->type ||
-       !UA_NodeId_equal(&node->value.data.value.value.type->typeId,
-                        &v->type->typeId))
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-
-    /* Write the value */
-    UA_StatusCode retval = UA_Variant_setRangeCopy(&node->value.data.value.value,
-                                                   v->data, v->arrayLength, *rangeptr);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Write the status and timestamps */
-    node->value.data.value.hasStatus = value->hasStatus;
-    node->value.data.value.status = value->status;
-    node->value.data.value.hasSourceTimestamp = value->hasSourceTimestamp;
-    node->value.data.value.sourceTimestamp = value->sourceTimestamp;
-    node->value.data.value.hasSourcePicoseconds = value->hasSourcePicoseconds;
-    node->value.data.value.sourcePicoseconds = value->sourcePicoseconds;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Stack layout: ... | node */
-static UA_StatusCode
-writeValueAttribute(UA_Server *server, UA_Session *session,
-                    UA_VariableNode *node, const UA_DataValue *value,
-                    const UA_String *indexRange) {
-    UA_assert(node != NULL);
-
-    /* Parse the range */
-    UA_NumericRange range;
-    UA_NumericRange *rangeptr = NULL;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(indexRange && indexRange->length > 0) {
-        retval = UA_NumericRange_parseFromString(&range, indexRange);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-        rangeptr = &range;
-    }
-
-    /* Created an editable version. The data is not touched. Only the variant
-     * "container". */
-    UA_DataValue adjustedValue = *value;
-
-    /* Type checking. May change the type of editableValue */
-    if(value->hasValue && value->value.type) {
-        adjustValue(server, &adjustedValue.value, &node->dataType);
-
-        /* The value may be an extension object, especially the nodeset compiler
-         * uses extension objects to write variable values. If value is an
-         * extension object we check if the current node value is also an
-         * extension object. */
-        const UA_NodeId nodeDataType = UA_NODEID_NUMERIC(0, UA_NS0ID_STRUCTURE);
-        const UA_NodeId *nodeDataTypePtr = &node->dataType;
-        if(value->value.type->typeId.identifierType == UA_NODEIDTYPE_NUMERIC &&
-           value->value.type->typeId.identifier.numeric == UA_NS0ID_STRUCTURE)
-            nodeDataTypePtr = &nodeDataType;
-
-        if(!compatibleValue(server, session, nodeDataTypePtr, node->valueRank,
-                            node->arrayDimensionsSize, node->arrayDimensions,
-                            &adjustedValue.value, rangeptr)) {
-            if(rangeptr)
-                UA_free(range.dimensions);
-            return UA_STATUSCODE_BADTYPEMISMATCH;
-        }
-    }
-
-    /* Set the source timestamp if there is none */
-    UA_DateTime now = UA_DateTime_now();
-    if(!adjustedValue.hasSourceTimestamp) {
-        adjustedValue.sourceTimestamp = now;
-        adjustedValue.hasSourceTimestamp = true;
-    }
-
-    if(!adjustedValue.hasServerTimestamp) {
-        adjustedValue.serverTimestamp = now;
-        adjustedValue.hasServerTimestamp = true;
-    }
-
-    /* Ok, do it */
-    if(node->valueSource == UA_VALUESOURCE_DATA) {
-        if(!rangeptr)
-            retval = writeValueAttributeWithoutRange(node, &adjustedValue);
-        else
-            retval = writeValueAttributeWithRange(node, &adjustedValue, rangeptr);
-
-#ifdef UA_ENABLE_HISTORIZING
-        /* node is a UA_VariableNode*, but it may also point to a UA_VariableTypeNode */
-        /* UA_VariableTypeNode doesn't have the historizing attribute */
-        if(retval == UA_STATUSCODE_GOOD && node->nodeClass == UA_NODECLASS_VARIABLE &&
-                server->config.historyDatabase.setValue) {
-            UA_UNLOCK(server->serviceMutex);
-            server->config.historyDatabase.setValue(server, server->config.historyDatabase.context,
-                                                    &session->sessionId, session->sessionHandle,
-                                                    &node->nodeId, node->historizing, &adjustedValue);
-            UA_LOCK(server->serviceMutex);
-        }
-#endif
-        /* Callback after writing */
-        if(retval == UA_STATUSCODE_GOOD && node->value.data.callback.onWrite) {
-            UA_UNLOCK(server->serviceMutex)
-            node->value.data.callback.onWrite(server, &session->sessionId,
-                                              session->sessionHandle, &node->nodeId,
-                                              node->context, rangeptr,
-                                              &adjustedValue);
-            UA_LOCK(server->serviceMutex);
-
-        }
-    } else {
-        if(node->value.dataSource.write) {
-            UA_UNLOCK(server->serviceMutex);
-            retval = node->value.dataSource.write(server, &session->sessionId,
-                                                  session->sessionHandle, &node->nodeId,
-                                                  node->context, rangeptr, &adjustedValue);
-            UA_LOCK(server->serviceMutex);
-        } else {
-            retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        }
-    }
-
-    /* Clean up */
-    if(rangeptr)
-        UA_free(range.dimensions);
-    return retval;
-}
-
-static UA_StatusCode
-writeIsAbstractAttribute(UA_Node *node, UA_Boolean value) {
-    switch(node->nodeClass) {
-    case UA_NODECLASS_OBJECTTYPE:
-        ((UA_ObjectTypeNode*)node)->isAbstract = value;
-        break;
-    case UA_NODECLASS_REFERENCETYPE:
-        ((UA_ReferenceTypeNode*)node)->isAbstract = value;
-        break;
-    case UA_NODECLASS_VARIABLETYPE:
-        ((UA_VariableTypeNode*)node)->isAbstract = value;
-        break;
-    case UA_NODECLASS_DATATYPE:
-        ((UA_DataTypeNode*)node)->isAbstract = value;
-        break;
-    default:
-        return UA_STATUSCODE_BADNODECLASSINVALID;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/*****************/
-/* Write Service */
-/*****************/
-
-#define CHECK_DATATYPE_SCALAR(EXP_DT)                                   \
-    if(!wvalue->value.hasValue ||                                       \
-       &UA_TYPES[UA_TYPES_##EXP_DT] != wvalue->value.value.type ||      \
-       !UA_Variant_isScalar(&wvalue->value.value)) {                    \
-        retval = UA_STATUSCODE_BADTYPEMISMATCH;                         \
-        break;                                                          \
-    }
-
-#define CHECK_DATATYPE_ARRAY(EXP_DT)                                    \
-    if(!wvalue->value.hasValue ||                                       \
-       &UA_TYPES[UA_TYPES_##EXP_DT] != wvalue->value.value.type ||      \
-       UA_Variant_isScalar(&wvalue->value.value)) {                     \
-        retval = UA_STATUSCODE_BADTYPEMISMATCH;                         \
-        break;                                                          \
-    }
-
-#define CHECK_NODECLASS_WRITE(CLASS)                                    \
-    if((node->nodeClass & (CLASS)) == 0) {                              \
-        retval = UA_STATUSCODE_BADNODECLASSINVALID;                     \
-        break;                                                          \
-    }
-
-#define CHECK_USERWRITEMASK(mask)                           \
-    if(!(userWriteMask & (mask))) {                         \
-        retval = UA_STATUSCODE_BADUSERACCESSDENIED;         \
-        break;                                              \
-    }
-
-#define GET_NODETYPE                                \
-    type = (const UA_VariableTypeNode*)             \
-        getNodeType(server, node);                  \
-    if(!type) {                                     \
-        retval = UA_STATUSCODE_BADTYPEMISMATCH;     \
-        break;                                      \
-    }
-
-/* This function implements the main part of the write service and operates on a
-   copy of the node (not in single-threaded mode). */
-static UA_StatusCode
-copyAttributeIntoNode(UA_Server *server, UA_Session *session,
-                      UA_Node *node, const UA_WriteValue *wvalue) {
-    const void *value = wvalue->value.value.data;
-    UA_UInt32 userWriteMask = getUserWriteMask(server, session, node);
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    const UA_VariableTypeNode *type;
-
-    switch(wvalue->attributeId) {
-    case UA_ATTRIBUTEID_NODEID:
-    case UA_ATTRIBUTEID_NODECLASS:
-    case UA_ATTRIBUTEID_USERWRITEMASK:
-    case UA_ATTRIBUTEID_USERACCESSLEVEL:
-    case UA_ATTRIBUTEID_USEREXECUTABLE:
-        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        break;
-    case UA_ATTRIBUTEID_BROWSENAME:
-        CHECK_USERWRITEMASK(UA_WRITEMASK_BROWSENAME);
-        CHECK_DATATYPE_SCALAR(QUALIFIEDNAME);
-        UA_QualifiedName_deleteMembers(&node->browseName);
-        UA_QualifiedName_copy((const UA_QualifiedName *)value, &node->browseName);
-        break;
-    case UA_ATTRIBUTEID_DISPLAYNAME:
-        CHECK_USERWRITEMASK(UA_WRITEMASK_DISPLAYNAME);
-        CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT);
-        UA_LocalizedText_deleteMembers(&node->displayName);
-        UA_LocalizedText_copy((const UA_LocalizedText *)value, &node->displayName);
-        break;
-    case UA_ATTRIBUTEID_DESCRIPTION:
-        CHECK_USERWRITEMASK(UA_WRITEMASK_DESCRIPTION);
-        CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT);
-        UA_LocalizedText_deleteMembers(&node->description);
-        UA_LocalizedText_copy((const UA_LocalizedText *)value, &node->description);
-        break;
-    case UA_ATTRIBUTEID_WRITEMASK:
-        CHECK_USERWRITEMASK(UA_WRITEMASK_WRITEMASK);
-        CHECK_DATATYPE_SCALAR(UINT32);
-        node->writeMask = *(const UA_UInt32*)value;
-        break;
-    case UA_ATTRIBUTEID_ISABSTRACT:
-        CHECK_USERWRITEMASK(UA_WRITEMASK_ISABSTRACT);
-        CHECK_DATATYPE_SCALAR(BOOLEAN);
-        retval = writeIsAbstractAttribute(node, *(const UA_Boolean*)value);
-        break;
-    case UA_ATTRIBUTEID_SYMMETRIC:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_REFERENCETYPE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_SYMMETRIC);
-        CHECK_DATATYPE_SCALAR(BOOLEAN);
-        ((UA_ReferenceTypeNode*)node)->symmetric = *(const UA_Boolean*)value;
-        break;
-    case UA_ATTRIBUTEID_INVERSENAME:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_REFERENCETYPE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_INVERSENAME);
-        CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT);
-        UA_LocalizedText_deleteMembers(&((UA_ReferenceTypeNode*)node)->inverseName);
-        UA_LocalizedText_copy((const UA_LocalizedText *)value,
-                              &((UA_ReferenceTypeNode*)node)->inverseName);
-        break;
-    case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VIEW);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_CONTAINSNOLOOPS);
-        CHECK_DATATYPE_SCALAR(BOOLEAN);
-        ((UA_ViewNode*)node)->containsNoLoops = *(const UA_Boolean*)value;
-        break;
-    case UA_ATTRIBUTEID_EVENTNOTIFIER:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_EVENTNOTIFIER);
-        CHECK_DATATYPE_SCALAR(BYTE);
-        if(node->nodeClass == UA_NODECLASS_VIEW) {
-            ((UA_ViewNode*)node)->eventNotifier = *(const UA_Byte*)value;
-        } else {
-            ((UA_ObjectNode*)node)->eventNotifier = *(const UA_Byte*)value;
-        }
-        break;
-    case UA_ATTRIBUTEID_VALUE:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        if(node->nodeClass == UA_NODECLASS_VARIABLE) {
-            /* The access to a value variable is granted via the AccessLevel
-             * and UserAccessLevel attributes */
-            UA_Byte accessLevel = getAccessLevel(server, session, (const UA_VariableNode*)node);
-            if(!(accessLevel & (UA_ACCESSLEVELMASK_WRITE))) {
-                retval = UA_STATUSCODE_BADNOTWRITABLE;
-                break;
-            }
-            accessLevel = getUserAccessLevel(server, session,
-                                             (const UA_VariableNode*)node);
-            if(!(accessLevel & (UA_ACCESSLEVELMASK_WRITE))) {
-                retval = UA_STATUSCODE_BADUSERACCESSDENIED;
-                break;
-            }
-        } else { /* UA_NODECLASS_VARIABLETYPE */
-            CHECK_USERWRITEMASK(UA_WRITEMASK_VALUEFORVARIABLETYPE);
-        }
-        retval = writeValueAttribute(server, session, (UA_VariableNode*)node,
-                                     &wvalue->value, &wvalue->indexRange);
-        break;
-    case UA_ATTRIBUTEID_DATATYPE:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_DATATYPE);
-        CHECK_DATATYPE_SCALAR(NODEID);
-        GET_NODETYPE
-        retval = writeDataTypeAttribute(server, session, (UA_VariableNode*)node,
-                                        type, (const UA_NodeId*)value);
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)type);
-        break;
-    case UA_ATTRIBUTEID_VALUERANK:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_VALUERANK);
-        CHECK_DATATYPE_SCALAR(INT32);
-        GET_NODETYPE
-        retval = writeValueRankAttribute(server, session, (UA_VariableNode*)node,
-                                         type, *(const UA_Int32*)value);
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)type);
-        break;
-    case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_ARRRAYDIMENSIONS);
-        CHECK_DATATYPE_ARRAY(UINT32);
-        GET_NODETYPE
-        retval = writeArrayDimensionsAttribute(server, session, (UA_VariableNode*)node,
-                                               type, wvalue->value.value.arrayLength,
-                                               (UA_UInt32 *)wvalue->value.value.data);
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)type);
-        break;
-    case UA_ATTRIBUTEID_ACCESSLEVEL:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_ACCESSLEVEL);
-        CHECK_DATATYPE_SCALAR(BYTE);
-        ((UA_VariableNode*)node)->accessLevel = *(const UA_Byte*)value;
-        break;
-    case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_MINIMUMSAMPLINGINTERVAL);
-        CHECK_DATATYPE_SCALAR(DOUBLE);
-        ((UA_VariableNode*)node)->minimumSamplingInterval = *(const UA_Double*)value;
-        break;
-    case UA_ATTRIBUTEID_HISTORIZING:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_HISTORIZING);
-        CHECK_DATATYPE_SCALAR(BOOLEAN);
-        ((UA_VariableNode*)node)->historizing = *(const UA_Boolean*)value;
-        break;
-    case UA_ATTRIBUTEID_EXECUTABLE:
-        CHECK_NODECLASS_WRITE(UA_NODECLASS_METHOD);
-        CHECK_USERWRITEMASK(UA_WRITEMASK_EXECUTABLE);
-        CHECK_DATATYPE_SCALAR(BOOLEAN);
-        ((UA_MethodNode*)node)->executable = *(const UA_Boolean*)value;
-        break;
-    default:
-        retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
-        break;
-    }
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "WriteRequest returned status code %s",
-                            UA_StatusCode_name(retval));
-    return retval;
-}
-
-static void
-Operation_Write(UA_Server *server, UA_Session *session, void *context,
-                UA_WriteValue *wv, UA_StatusCode *result) {
-    *result = UA_Server_editNode(server, session, &wv->nodeId,
-                        (UA_EditNodeCallback)copyAttributeIntoNode, wv);
-}
-
-void
-Service_Write(UA_Server *server, UA_Session *session,
-              const UA_WriteRequest *request,
-              UA_WriteResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing WriteRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxNodesPerWrite != 0 &&
-       request->nodesToWriteSize > server->config.maxNodesPerWrite) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Write, NULL,
-                                           &request->nodesToWriteSize, &UA_TYPES[UA_TYPES_WRITEVALUE],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-UA_StatusCode
-writeWithSession(UA_Server *server, UA_Session *session,
-                           const UA_WriteValue *value) {
-    return UA_Server_editNode(server, session, &value->nodeId,
-                              (UA_EditNodeCallback)copyAttributeIntoNode,
-                              /* casting away const qualifier because callback uses const anyway */
-                              (UA_WriteValue *)(uintptr_t)value);
-}
-
-UA_StatusCode
-writeAttribute(UA_Server *server, const UA_WriteValue *value) {
-    return UA_Server_editNode(server, &server->adminSession, &value->nodeId,
-                              (UA_EditNodeCallback)copyAttributeIntoNode,
-                               /* casting away const qualifier because callback uses const anyway */
-                              (UA_WriteValue *)(uintptr_t)value);
-}
-
-UA_StatusCode
-UA_Server_write(UA_Server *server, const UA_WriteValue *value) {
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = writeAttribute(server, value);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-UA_StatusCode
-writeWithWriteValue(UA_Server *server, const UA_NodeId *nodeId,
-                  const UA_AttributeId attributeId,
-                  const UA_DataType *attr_type,
-                  const void *attr) {
-    UA_WriteValue wvalue;
-    UA_WriteValue_init(&wvalue);
-    wvalue.nodeId = *nodeId;
-    wvalue.attributeId = attributeId;
-    wvalue.value.hasValue = true;
-    if(attr_type != &UA_TYPES[UA_TYPES_VARIANT]) {
-        /* hacked cast. the target WriteValue is used as const anyway */
-        UA_Variant_setScalar(&wvalue.value.value,
-                             (void*)(uintptr_t)attr, attr_type);
-    } else {
-        wvalue.value.value = *(const UA_Variant*)attr;
-    }
-    return writeAttribute(server, &wvalue);
-}
-
-/* Convenience function to be wrapped into inline functions */
-UA_StatusCode
-__UA_Server_write(UA_Server *server, const UA_NodeId *nodeId,
-                  const UA_AttributeId attributeId,
-                  const UA_DataType *attr_type,
-                  const void *attr) {
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = writeWithWriteValue(server, nodeId, attributeId, attr_type, attr);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-#ifdef UA_ENABLE_HISTORIZING
-void
-Service_HistoryRead(UA_Server *server, UA_Session *session,
-                    const UA_HistoryReadRequest *request,
-                    UA_HistoryReadResponse *response) {
-    if(request->historyReadDetails.encoding != UA_EXTENSIONOBJECT_DECODED) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTSUPPORTED;
-        return;
-    }
-
-    if(request->historyReadDetails.content.decoded.type != &UA_TYPES[UA_TYPES_READRAWMODIFIEDDETAILS]) {
-        /* TODO handle more request->historyReadDetails.content.decoded.type types */
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-        return;
-    }
-
-    /* History read with ReadRawModifiedDetails */
-    UA_ReadRawModifiedDetails * details = (UA_ReadRawModifiedDetails*)
-        request->historyReadDetails.content.decoded.data;
-    if(details->isReadModified) {
-        // TODO add server->config.historyReadService.read_modified
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-        return;
-    }
-
-    /* Something to do? */
-    if(request->nodesToReadSize == 0) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
-        return;
-    }
-
-    /* Check if there are too many operations */
-    if(server->config.maxNodesPerRead != 0 &&
-       request->nodesToReadSize > server->config.maxNodesPerRead) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    /* The history database is not configured */
-    if(!server->config.historyDatabase.readRaw) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED;
-        return;
-    }
-
-    /* Allocate a temporary array to forward the result pointers to the
-     * backend */
-    UA_HistoryData ** historyData = (UA_HistoryData **)
-        UA_calloc(request->nodesToReadSize, sizeof(UA_HistoryData*));
-    if(!historyData) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-
-    /* Allocate the results array */
-    response->results = (UA_HistoryReadResult*)UA_Array_new(request->nodesToReadSize,
-                                                            &UA_TYPES[UA_TYPES_HISTORYREADRESULT]);
-    if(!response->results) {
-        UA_free(historyData);
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    response->resultsSize = request->nodesToReadSize;
-
-    for(size_t i = 0; i < response->resultsSize; ++i) {
-        UA_HistoryData * data = UA_HistoryData_new();
-        response->results[i].historyData.encoding = UA_EXTENSIONOBJECT_DECODED;
-        response->results[i].historyData.content.decoded.type = &UA_TYPES[UA_TYPES_HISTORYDATA];
-        response->results[i].historyData.content.decoded.data = data;
-        historyData[i] = data;
-    }
-    UA_UNLOCK(server->serviceMutex);
-    server->config.historyDatabase.readRaw(server, server->config.historyDatabase.context,
-                                           &session->sessionId, session->sessionHandle,
-                                           &request->requestHeader, details,
-                                           request->timestampsToReturn,
-                                           request->releaseContinuationPoints,
-                                           request->nodesToReadSize, request->nodesToRead,
-                                           response, historyData);
-    UA_LOCK(server->serviceMutex);
-    UA_free(historyData);
-}
-
-void
-Service_HistoryUpdate(UA_Server *server, UA_Session *session,
-                    const UA_HistoryUpdateRequest *request,
-                    UA_HistoryUpdateResponse *response) {
-    response->resultsSize = request->historyUpdateDetailsSize;
-    response->results = (UA_HistoryUpdateResult*)UA_Array_new(response->resultsSize, &UA_TYPES[UA_TYPES_HISTORYUPDATERESULT]);
-    if (!response->results) {
-        response->resultsSize = 0;
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    for (size_t i = 0; i < request->historyUpdateDetailsSize; ++i) {
-        UA_HistoryUpdateResult_init(&response->results[i]);
-        if(request->historyUpdateDetails[i].encoding != UA_EXTENSIONOBJECT_DECODED) {
-            response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED;
-            continue;
-        }
-        if (request->historyUpdateDetails[i].content.decoded.type
-                == &UA_TYPES[UA_TYPES_UPDATEDATADETAILS]) {
-            if (server->config.historyDatabase.updateData) {
-                UA_UNLOCK(server->serviceMutex);
-                server->config.historyDatabase.updateData(server,
-                                                          server->config.historyDatabase.context,
-                                                          &session->sessionId, session->sessionHandle,
-                                                          &request->requestHeader,
-                                                          (UA_UpdateDataDetails*)request->historyUpdateDetails[i].content.decoded.data,
-                                                          &response->results[i]);
-                UA_LOCK(server->serviceMutex);
-            } else {
-                response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED;
-            }
-            continue;
-        } else
-        if (request->historyUpdateDetails[i].content.decoded.type
-                == &UA_TYPES[UA_TYPES_DELETERAWMODIFIEDDETAILS]) {
-            if (server->config.historyDatabase.deleteRawModified) {
-                UA_UNLOCK(server->serviceMutex);
-                server->config.historyDatabase.deleteRawModified(server,
-                                                                 server->config.historyDatabase.context,
-                                                                 &session->sessionId, session->sessionHandle,
-                                                                 &request->requestHeader,
-                                                                 (UA_DeleteRawModifiedDetails*)request->historyUpdateDetails[i].content.decoded.data,
-                                                                 &response->results[i]);
-                UA_LOCK(server->serviceMutex);
-            } else {
-                response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED;
-            }
-            continue;
-        } else {
-            response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED;
-            continue;
-        }
-    }
-    response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-UA_StatusCode UA_EXPORT
-UA_Server_writeObjectProperty(UA_Server *server, const UA_NodeId objectId,
-                              const UA_QualifiedName propertyName,
-                              const UA_Variant value) {
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = propertyName;
-
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = objectId;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-
-    UA_StatusCode retval;
-    UA_BrowsePathResult bpr = translateBrowsePathToNodeIds(server, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        retval = bpr.statusCode;
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return retval;
-    }
-
-    retval = UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
-
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return retval;
-}
-
-UA_StatusCode UA_EXPORT
-UA_Server_writeObjectProperty_scalar(UA_Server *server, const UA_NodeId objectId,
-                                     const UA_QualifiedName propertyName,
-                                     const void *value, const UA_DataType *type) {
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setScalar(&var, (void*)(uintptr_t)value, type);
-    return UA_Server_writeObjectProperty(server, objectId, propertyName, var);
-}
diff --git a/ext/open62541/src/server/ua_services_discovery.c b/ext/open62541/src/server/ua_services_discovery.c
deleted file mode 100644
index 9983375..0000000
--- a/ext/open62541/src/server/ua_services_discovery.c
+++ /dev/null
@@ -1,723 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-
-#ifdef UA_ENABLE_DISCOVERY
-
-#include "ua_client_internal.h"
-
-static UA_StatusCode
-setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *request,
-                                              UA_ApplicationDescription *target,
-                                              const UA_RegisteredServer *registeredServer) {
-    UA_ApplicationDescription_init(target);
-    UA_StatusCode retval = UA_String_copy(&registeredServer->serverUri, &target->applicationUri);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_String_copy(&registeredServer->productUri, &target->productUri);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    // if the client requests a specific locale, select the corresponding server name
-    if(request->localeIdsSize) {
-        UA_Boolean appNameFound = false;
-        for(size_t i =0; i<request->localeIdsSize && !appNameFound; i++) {
-            for(size_t j =0; j<registeredServer->serverNamesSize; j++) {
-                if(UA_String_equal(&request->localeIds[i], &registeredServer->serverNames[j].locale)) {
-                    retval = UA_LocalizedText_copy(&registeredServer->serverNames[j],
-                                                   &target->applicationName);
-                    if(retval != UA_STATUSCODE_GOOD)
-                        return retval;
-                    appNameFound = true;
-                    break;
-                }
-            }
-        }
-
-        // server does not have the requested local, therefore we can select the
-        // most suitable one
-        if(!appNameFound && registeredServer->serverNamesSize) {
-            retval = UA_LocalizedText_copy(&registeredServer->serverNames[0],
-                                           &target->applicationName);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-        }
-    } else if(registeredServer->serverNamesSize) {
-        // just take the first name
-        retval = UA_LocalizedText_copy(&registeredServer->serverNames[0], &target->applicationName);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    target->applicationType = registeredServer->serverType;
-    retval = UA_String_copy(&registeredServer->gatewayServerUri, &target->gatewayServerUri);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    // TODO where do we get the discoveryProfileUri for application data?
-
-    target->discoveryUrlsSize = registeredServer->discoveryUrlsSize;
-    if(registeredServer->discoveryUrlsSize) {
-        size_t duSize = sizeof(UA_String) * registeredServer->discoveryUrlsSize;
-        target->discoveryUrls = (UA_String *)UA_malloc(duSize);
-        if(!target->discoveryUrls)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        for(size_t i = 0; i < registeredServer->discoveryUrlsSize; i++) {
-            retval = UA_String_copy(&registeredServer->discoveryUrls[i], &target->discoveryUrls[i]);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-        }
-    }
-
-    return retval;
-}
-#endif
-
-static UA_StatusCode
-setApplicationDescriptionFromServer(UA_ApplicationDescription *target, const UA_Server *server) {
-    /* Copy ApplicationDescription from the config */
-    UA_StatusCode result = UA_ApplicationDescription_copy(&server->config.applicationDescription, target);
-    if(result != UA_STATUSCODE_GOOD)
-        return result;
-
-    /* Add the discoveryUrls from the networklayers only if discoveryUrl
-     * not already present and to avoid redundancy */
-    if(!target->discoveryUrlsSize) {
-        size_t discSize = sizeof(UA_String) * (target->discoveryUrlsSize + server->config.networkLayersSize);
-        UA_String* disc = (UA_String *)UA_realloc(target->discoveryUrls, discSize);
-        if(!disc)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        size_t existing = target->discoveryUrlsSize;
-        target->discoveryUrls = disc;
-        target->discoveryUrlsSize += server->config.networkLayersSize;
-
-        for(size_t i = 0; i < server->config.networkLayersSize; i++) {
-            UA_ServerNetworkLayer* nl = &server->config.networkLayers[i];
-            UA_String_copy(&nl->discoveryUrl, &target->discoveryUrls[existing + i]);
-        }
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-void Service_FindServers(UA_Server *server, UA_Session *session,
-                         const UA_FindServersRequest *request,
-                         UA_FindServersResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing FindServersRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Return the server itself? */
-    UA_Boolean foundSelf = false;
-    if(request->serverUrisSize) {
-        for(size_t i = 0; i < request->serverUrisSize; i++) {
-            if(UA_String_equal(&request->serverUris[i],
-                               &server->config.applicationDescription.applicationUri)) {
-                foundSelf = true;
-                break;
-            }
-        }
-    } else {
-        foundSelf = true;
-    }
-
-#ifndef UA_ENABLE_DISCOVERY
-    if(!foundSelf)
-        return;
-
-    UA_ApplicationDescription *ad = UA_ApplicationDescription_new();
-    if(!ad) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-
-    UA_StatusCode retval = setApplicationDescriptionFromServer(ad, server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ApplicationDescription_delete(ad);
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-
-    response->servers = ad;
-    response->serversSize = 1;
-    return;
-
-#else
-
-    /* Temporarily store all the pointers which we found to avoid reiterating
-     * through the list */
-    size_t foundServersSize = 0;
-    UA_STACKARRAY(UA_RegisteredServer*, foundServers, server->discoveryManager.registeredServersSize+1);
-
-    registeredServer_list_entry* current;
-    LIST_FOREACH(current, &server->discoveryManager.registeredServers, pointers) {
-        if(request->serverUrisSize) {
-            /* If client only requested a specific set of servers */
-            for(size_t i = 0; i < request->serverUrisSize; i++) {
-                if(UA_String_equal(&current->registeredServer.serverUri, &request->serverUris[i])) {
-                    foundServers[foundServersSize] = &current->registeredServer;
-                    foundServersSize++;
-                    break;
-                }
-            }
-        } else {
-            /* Return all registered servers */
-            foundServers[foundServersSize] = &current->registeredServer;
-            foundServersSize++;
-        }
-    }
-
-    size_t allocSize = foundServersSize;
-    if(foundSelf)
-        allocSize++;
-
-    /* Nothing to do? */
-    if(allocSize == 0)
-        return;
-
-    /* Allocate memory */
-    response->servers = (UA_ApplicationDescription*)UA_Array_new(allocSize, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]);
-    if(!response->servers) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    response->serversSize = allocSize;
-
-    /* Copy into the response. TODO: Evaluate return codes */
-    size_t pos = 0;
-    if(foundSelf) {
-        setApplicationDescriptionFromServer(&response->servers[pos++], server);
-    }
-    for(size_t i = 0; i < foundServersSize; i++) {
-        setApplicationDescriptionFromRegisteredServer(request, &response->servers[pos++], foundServers[i]);
-    }
-
-#endif
-}
-
-void
-Service_GetEndpoints(UA_Server *server, UA_Session *session,
-                     const UA_GetEndpointsRequest *request,
-                     UA_GetEndpointsResponse *response) {
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* If the client expects to see a specific endpointurl, mirror it back. If
-       not, clone the endpoints with the discovery url of all networklayers. */
-    const UA_String *endpointUrl = &request->endpointUrl;
-    if(endpointUrl->length > 0) {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                             "Processing GetEndpointsRequest with endpointUrl "
-                             UA_PRINTF_STRING_FORMAT, UA_PRINTF_STRING_DATA(*endpointUrl));
-    } else {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                             "Processing GetEndpointsRequest with an empty endpointUrl");
-    }
-
-    /* test if the supported binary profile shall be returned */
-    size_t reSize = sizeof(UA_Boolean) * server->config.endpointsSize;
-    UA_STACKARRAY(UA_Boolean, relevant_endpoints, reSize);
-    memset(relevant_endpoints, 0, reSize);
-    size_t relevant_count = 0;
-    if(request->profileUrisSize == 0) {
-        for(size_t j = 0; j < server->config.endpointsSize; ++j)
-            relevant_endpoints[j] = true;
-        relevant_count = server->config.endpointsSize;
-    } else {
-        for(size_t j = 0; j < server->config.endpointsSize; ++j) {
-            for(size_t i = 0; i < request->profileUrisSize; ++i) {
-                if(!UA_String_equal(&request->profileUris[i],
-                                    &server->config.endpoints[j].transportProfileUri))
-                    continue;
-                relevant_endpoints[j] = true;
-                ++relevant_count;
-                break;
-            }
-        }
-    }
-
-    if(relevant_count == 0) {
-        response->endpointsSize = 0;
-        return;
-    }
-
-    /* Clone the endpoint for each networklayer? */
-    size_t clone_times = 1;
-    UA_Boolean nl_endpointurl = false;
-    if(endpointUrl->length == 0) {
-        clone_times = server->config.networkLayersSize;
-        nl_endpointurl = true;
-    }
-
-    response->endpoints =
-        (UA_EndpointDescription*)UA_Array_new(relevant_count * clone_times,
-                                              &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-    if(!response->endpoints) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    response->endpointsSize = relevant_count * clone_times;
-
-    size_t k = 0;
-    UA_StatusCode retval;
-    for(size_t i = 0; i < clone_times; ++i) {
-        if(nl_endpointurl)
-            endpointUrl = &server->config.networkLayers[i].discoveryUrl;
-        for(size_t j = 0; j < server->config.endpointsSize; ++j) {
-            if(!relevant_endpoints[j])
-                continue;
-            retval = UA_EndpointDescription_copy(&server->config.endpoints[j],
-                                                 &response->endpoints[k]);
-            if(retval != UA_STATUSCODE_GOOD)
-                goto error;
-            retval = UA_String_copy(endpointUrl, &response->endpoints[k].endpointUrl);
-            if(retval != UA_STATUSCODE_GOOD)
-                goto error;
-            ++k;
-        }
-    }
-
-    return;
-error:
-    response->responseHeader.serviceResult = retval;
-    UA_Array_delete(response->endpoints, response->endpointsSize,
-                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-    response->endpoints = NULL;
-    response->endpointsSize = 0;
-}
-
-#ifdef UA_ENABLE_DISCOVERY
-
-static void
-process_RegisterServer(UA_Server *server, UA_Session *session,
-                       const UA_RequestHeader* requestHeader,
-                       const UA_RegisteredServer *requestServer,
-                       const size_t requestDiscoveryConfigurationSize,
-                       const UA_ExtensionObject *requestDiscoveryConfiguration,
-                       UA_ResponseHeader* responseHeader,
-                       size_t *responseConfigurationResultsSize,
-                       UA_StatusCode **responseConfigurationResults,
-                       size_t *responseDiagnosticInfosSize,
-                       UA_DiagnosticInfo *responseDiagnosticInfos) {
-    /* Find the server from the request in the registered list */
-    registeredServer_list_entry* current;
-    registeredServer_list_entry *registeredServer_entry = NULL;
-    LIST_FOREACH(current, &server->discoveryManager.registeredServers, pointers) {
-        if(UA_String_equal(&current->registeredServer.serverUri, &requestServer->serverUri)) {
-            registeredServer_entry = current;
-            break;
-        }
-    }
-
-    UA_MdnsDiscoveryConfiguration *mdnsConfig = NULL;
-
-    const UA_String* mdnsServerName = NULL;
-    if(requestDiscoveryConfigurationSize) {
-        *responseConfigurationResults =
-            (UA_StatusCode *)UA_Array_new(requestDiscoveryConfigurationSize,
-                                          &UA_TYPES[UA_TYPES_STATUSCODE]);
-        if(!(*responseConfigurationResults)) {
-            responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-            return;
-        }
-        *responseConfigurationResultsSize = requestDiscoveryConfigurationSize;
-
-        for(size_t i = 0; i < requestDiscoveryConfigurationSize; i++) {
-            const UA_ExtensionObject *object = &requestDiscoveryConfiguration[i];
-            if(!mdnsConfig && (object->encoding == UA_EXTENSIONOBJECT_DECODED ||
-                               object->encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) &&
-               (object->content.decoded.type == &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION])) {
-                mdnsConfig = (UA_MdnsDiscoveryConfiguration *)object->content.decoded.data;
-                mdnsServerName = &mdnsConfig->mdnsServerName;
-                (*responseConfigurationResults)[i] = UA_STATUSCODE_GOOD;
-            } else {
-                (*responseConfigurationResults)[i] = UA_STATUSCODE_BADNOTSUPPORTED;
-            }
-        }
-    }
-
-    if(!mdnsServerName && requestServer->serverNamesSize)
-        mdnsServerName = &requestServer->serverNames[0].text;
-
-    if(!mdnsServerName) {
-        responseHeader->serviceResult = UA_STATUSCODE_BADSERVERNAMEMISSING;
-        return;
-    }
-
-    if(requestServer->discoveryUrlsSize == 0) {
-        responseHeader->serviceResult = UA_STATUSCODE_BADDISCOVERYURLMISSING;
-        return;
-    }
-
-    if(requestServer->semaphoreFilePath.length) {
-#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE
-        char* filePath = (char*)
-            UA_malloc(sizeof(char)*requestServer->semaphoreFilePath.length+1);
-        if(!filePath) {
-            UA_LOG_ERROR_SESSION(&server->config.logger, session,
-                                 "Cannot allocate memory for semaphore path. Out of memory.");
-            responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-            return;
-        }
-        memcpy(filePath, requestServer->semaphoreFilePath.data, requestServer->semaphoreFilePath.length );
-        filePath[requestServer->semaphoreFilePath.length] = '\0';
-        if(!UA_fileExists( filePath )) {
-            responseHeader->serviceResult = UA_STATUSCODE_BADSEMPAHOREFILEMISSING;
-            UA_free(filePath);
-            return;
-        }
-        UA_free(filePath);
-#else
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_CLIENT,
-                       "Ignoring semaphore file path. open62541 not compiled "
-                       "with UA_ENABLE_DISCOVERY_SEMAPHORE=ON");
-#endif
-    }
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    if(server->config.discovery.mdnsEnable) {
-        for(size_t i = 0; i < requestServer->discoveryUrlsSize; i++) {
-            /* create TXT if is online and first index, delete TXT if is offline and last index */
-            UA_Boolean updateTxt = (requestServer->isOnline && i==0) ||
-                (!requestServer->isOnline && i==requestServer->discoveryUrlsSize);
-            UA_Server_updateMdnsForDiscoveryUrl(server, mdnsServerName, mdnsConfig,
-                                                &requestServer->discoveryUrls[i],
-                                                requestServer->isOnline, updateTxt);
-        }
-    }
-#endif
-
-    if(!requestServer->isOnline) {
-        // server is shutting down. Remove it from the registered servers list
-        if(!registeredServer_entry) {
-            // server not found, show warning
-            UA_LOG_WARNING_SESSION(&server->config.logger, session,
-                                   "Could not unregister server %.*s. Not registered.",
-                                   (int)requestServer->serverUri.length, requestServer->serverUri.data);
-            responseHeader->serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
-            return;
-        }
-
-        if(server->discoveryManager.registerServerCallback)
-            server->discoveryManager.
-                registerServerCallback(requestServer,
-                                       server->discoveryManager.registerServerCallbackData);
-
-        // server found, remove from list
-        LIST_REMOVE(registeredServer_entry, pointers);
-        UA_RegisteredServer_deleteMembers(&registeredServer_entry->registeredServer);
-#if UA_MULTITHREADING >= 200
-        UA_atomic_subSize(&server->discoveryManager.registeredServersSize, 1);
-        registeredServer_entry->delayedCleanup.callback = NULL; /* only free the structure */
-        UA_WorkQueue_enqueueDelayed(&server->workQueue, &registeredServer_entry->delayedCleanup);
-#else
-        UA_free(registeredServer_entry);
-        server->discoveryManager.registeredServersSize--;
-#endif
-        responseHeader->serviceResult = UA_STATUSCODE_GOOD;
-        return;
-    }
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(!registeredServer_entry) {
-        // server not yet registered, register it by adding it to the list
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Registering new server: %.*s",
-                             (int)requestServer->serverUri.length, requestServer->serverUri.data);
-
-        registeredServer_entry =
-            (registeredServer_list_entry *)UA_malloc(sizeof(registeredServer_list_entry));
-        if(!registeredServer_entry) {
-            responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-            return;
-        }
-
-        LIST_INSERT_HEAD(&server->discoveryManager.registeredServers, registeredServer_entry, pointers);
-#if UA_MULTITHREADING >= 200
-        UA_atomic_addSize(&server->discoveryManager.registeredServersSize, 1);
-#else
-        server->discoveryManager.registeredServersSize++;
-#endif
-    } else {
-        UA_RegisteredServer_deleteMembers(&registeredServer_entry->registeredServer);
-    }
-
-    // Always call the callback, if it is set.
-    // Previously we only called it if it was a new register call. It may be the case that this endpoint
-    // registered before, then crashed, restarts and registeres again. In that case the entry is not deleted
-    // and the callback would not be called.
-    if(server->discoveryManager.registerServerCallback)
-        server->discoveryManager.
-            registerServerCallback(requestServer,
-                                   server->discoveryManager.registerServerCallbackData);
-
-    // copy the data from the request into the list
-    UA_RegisteredServer_copy(requestServer, &registeredServer_entry->registeredServer);
-    registeredServer_entry->lastSeen = UA_DateTime_nowMonotonic();
-    responseHeader->serviceResult = retval;
-}
-
-void Service_RegisterServer(UA_Server *server, UA_Session *session,
-                            const UA_RegisterServerRequest *request,
-                            UA_RegisterServerResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing RegisterServerRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-    process_RegisterServer(server, session, &request->requestHeader, &request->server, 0,
-                           NULL, &response->responseHeader, 0, NULL, 0, NULL);
-}
-
-void Service_RegisterServer2(UA_Server *server, UA_Session *session,
-                            const UA_RegisterServer2Request *request,
-                             UA_RegisterServer2Response *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing RegisterServer2Request");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-    process_RegisterServer(server, session, &request->requestHeader, &request->server,
-                           request->discoveryConfigurationSize, request->discoveryConfiguration,
-                           &response->responseHeader, &response->configurationResultsSize,
-                           &response->configurationResults, &response->diagnosticInfosSize,
-                           response->diagnosticInfos);
-}
-
-/* Cleanup server registration: If the semaphore file path is set, then it just
- * checks the existence of the file. When it is deleted, the registration is
- * removed. If there is no semaphore file, then the registration will be removed
- * if it is older than 60 minutes. */
-void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic) {
-    UA_DateTime timedOut = nowMonotonic;
-    // registration is timed out if lastSeen is older than 60 minutes (default
-    // value, can be modified by user).
-    if(server->config.discovery.cleanupTimeout)
-        timedOut -= server->config.discovery.cleanupTimeout*UA_DATETIME_SEC;
-
-    registeredServer_list_entry* current, *temp;
-    LIST_FOREACH_SAFE(current, &server->discoveryManager.registeredServers, pointers, temp) {
-        UA_Boolean semaphoreDeleted = false;
-
-#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE
-        if(current->registeredServer.semaphoreFilePath.length) {
-            size_t fpSize = sizeof(char)*current->registeredServer.semaphoreFilePath.length+1;
-            // todo: malloc may fail: return a statuscode
-            char* filePath = (char *)UA_malloc(fpSize);
-            if(filePath) {
-                memcpy(filePath, current->registeredServer.semaphoreFilePath.data,
-                       current->registeredServer.semaphoreFilePath.length );
-                filePath[current->registeredServer.semaphoreFilePath.length] = '\0';
-                semaphoreDeleted = UA_fileExists(filePath) == false;
-                UA_free(filePath);
-            } else {
-                UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                             "Cannot check registration semaphore. Out of memory");
-            }
-        }
-#endif
-
-        if(semaphoreDeleted || (server->config.discovery.cleanupTimeout &&
-                                current->lastSeen < timedOut)) {
-            if(semaphoreDeleted) {
-                UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                            "Registration of server with URI %.*s is removed because "
-                            "the semaphore file '%.*s' was deleted.",
-                            (int)current->registeredServer.serverUri.length,
-                            current->registeredServer.serverUri.data,
-                            (int)current->registeredServer.semaphoreFilePath.length,
-                            current->registeredServer.semaphoreFilePath.data);
-            } else {
-                // cppcheck-suppress unreadVariable
-                UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                            "Registration of server with URI %.*s has timed out and is removed.",
-                            (int)current->registeredServer.serverUri.length,
-                            current->registeredServer.serverUri.data);
-            }
-            LIST_REMOVE(current, pointers);
-            UA_RegisteredServer_deleteMembers(&current->registeredServer);
-#if UA_MULTITHREADING >= 200
-            UA_atomic_subSize(&server->discoveryManager.registeredServersSize, 1);
-            current->delayedCleanup.callback = NULL; /* Only free the structure */
-            UA_WorkQueue_enqueueDelayed(&server->workQueue, &current->delayedCleanup);
-#else
-            UA_free(current);
-            server->discoveryManager.registeredServersSize--;
-#endif
-        }
-    }
-}
-
-/* Called by the UA_Server callback. The OPC UA specification says:
- *
- * > If an error occurs during registration (e.g. the Discovery Server is not running) then the Server
- * > must periodically re-attempt registration. The frequency of these attempts should start at 1 second
- * > but gradually increase until the registration frequency is the same as what it would be if not
- * > errors occurred. The recommended approach would double the period each attempt until reaching the maximum.
- *
- * We will do so by using the additional data parameter which holds information
- * if the next interval is default or if it is a repeated call. */
-static void
-periodicServerRegister(UA_Server *server, void *data) {
-    UA_assert(data != NULL);
-
-    struct PeriodicServerRegisterCallback *cb = (struct PeriodicServerRegisterCallback *)data;
-
-    UA_StatusCode retval = UA_Client_connect_noSession(cb->client, cb->discovery_server_url);
-    if (retval == UA_STATUSCODE_GOOD) {
-        /* Register
-           You can also use a semaphore file. That file must exist. When the file is
-           deleted, the server is automatically unregistered. The semaphore file has
-           to be accessible by the discovery server
-
-           UA_StatusCode retval = UA_Server_register_discovery(server,
-           "opc.tcp://localhost:4840", "/path/to/some/file");
-        */
-        retval = UA_Server_register_discovery(server, cb->client, NULL);
-    }
-    if (cb->client->state == UA_CLIENTSTATE_CONNECTED) {
-        UA_StatusCode retval1 = UA_Client_disconnect(cb->client);
-        if(retval1 != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                         "Could not disconnect client from register server. StatusCode %s",
-                         UA_StatusCode_name(retval));
-        }
-    }
-    /* Registering failed */
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Could not register server with discovery server. "
-                     "Is the discovery server started? StatusCode %s",
-                     UA_StatusCode_name(retval));
-
-        /* If the server was previously registered, retry in one second,
-         * else, double the previous interval */
-        UA_Double nextInterval = 1000.0;
-        if(!cb->registered)
-            nextInterval = cb->this_interval * 2;
-
-        /* The interval should be smaller than the default interval */
-        if(nextInterval > cb->default_interval)
-            nextInterval = cb->default_interval;
-
-        cb->this_interval = nextInterval;
-        UA_Server_changeRepeatedCallbackInterval(server, cb->id, nextInterval);
-        return;
-    }
-
-    /* Registering succeeded */
-    UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                 "Server successfully registered. Next periodical register will be in %d seconds",
-                 (int)(cb->default_interval/1000));
-
-    if(!cb->registered) {
-        retval = UA_Server_changeRepeatedCallbackInterval(server, cb->id, cb->default_interval);
-        /* If changing the interval fails, try again after the next registering */
-        if(retval == UA_STATUSCODE_GOOD)
-            cb->registered = true;
-    }
-}
-
-UA_StatusCode
-UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
-                                            struct UA_Client *client,
-                                            const char* discoveryServerUrl,
-                                            UA_Double intervalMs,
-                                            UA_Double delayFirstRegisterMs,
-                                            UA_UInt64 *periodicCallbackId) {
-
-    /* No valid server URL */
-    if(!discoveryServerUrl) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "No discovery server URL provided");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-
-    if (client->connection.state != UA_CONNECTION_CLOSED)
-        return UA_STATUSCODE_BADINVALIDSTATE;
-
-    /* check if we are already registering with the given discovery url and remove the old periodic call */
-    {
-        periodicServerRegisterCallback_entry *rs, *rs_tmp;
-        LIST_FOREACH_SAFE(rs, &server->discoveryManager.
-                          periodicServerRegisterCallbacks, pointers, rs_tmp) {
-            if(strcmp(rs->callback->discovery_server_url, discoveryServerUrl) == 0) {
-                UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                            "There is already a register callback for '%s' in place. Removing the older one.", discoveryServerUrl);
-                UA_Server_removeRepeatedCallback(server, rs->callback->id);
-                LIST_REMOVE(rs, pointers);
-                UA_free(rs->callback->discovery_server_url);
-                UA_free(rs->callback);
-                UA_free(rs);
-                break;
-            }
-        }
-    }
-
-    /* Allocate and initialize */
-    struct PeriodicServerRegisterCallback* cb =
-        (struct PeriodicServerRegisterCallback*)
-        UA_malloc(sizeof(struct PeriodicServerRegisterCallback));
-    if(!cb)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Start repeating a failed register after 1s, then increase the delay. Set
-     * to 500ms, as the delay is doubled before changing the callback
-     * interval.*/
-    cb->this_interval = 500.0;
-    cb->default_interval = intervalMs;
-    cb->registered = false;
-    cb->client = client;
-    size_t len = strlen(discoveryServerUrl);
-    cb->discovery_server_url = (char*)UA_malloc(len+1);
-    if (!cb->discovery_server_url) {
-        UA_free(cb);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    memcpy(cb->discovery_server_url, discoveryServerUrl, len+1);
-
-    /* Add the callback */
-    UA_StatusCode retval =
-        UA_Server_addRepeatedCallback(server, periodicServerRegister,
-                                      cb, delayFirstRegisterMs, &cb->id);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Could not create periodic job for server register. "
-                     "StatusCode %s", UA_StatusCode_name(retval));
-        UA_free(cb);
-        return retval;
-    }
-
-#ifndef __clang_analyzer__
-    // the analyzer reports on LIST_INSERT_HEAD a use after free false positive
-    periodicServerRegisterCallback_entry *newEntry =
-            (periodicServerRegisterCallback_entry *)UA_malloc(sizeof(periodicServerRegisterCallback_entry));
-    if(!newEntry) {
-        UA_Server_removeRepeatedCallback(server, cb->id);
-        UA_free(cb);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    newEntry->callback = cb;
-    LIST_INSERT_HEAD(&server->discoveryManager.periodicServerRegisterCallbacks, newEntry, pointers);
-#endif
-
-    if(periodicCallbackId)
-        *periodicCallbackId = cb->id;
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_Server_setRegisterServerCallback(UA_Server *server,
-                                    UA_Server_registerServerCallback cb,
-                                    void* data) {
-    server->discoveryManager.registerServerCallback = cb;
-    server->discoveryManager.registerServerCallbackData = data;
-}
-
-#endif /* UA_ENABLE_DISCOVERY */
diff --git a/ext/open62541/src/server/ua_services_discovery_multicast.c b/ext/open62541/src/server/ua_services_discovery_multicast.c
deleted file mode 100644
index d0f5934..0000000
--- a/ext/open62541/src/server/ua_services_discovery_multicast.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-
-#if defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST)
-
-#if UA_MULTITHREADING >= 200
-
-static void *
-multicastWorkerLoop(UA_Server *server) {
-    struct timeval next_sleep = {.tv_sec = 0, .tv_usec = 0};
-    volatile UA_Boolean *running = &server->discoveryManager.mdnsRunning;
-    fd_set fds;
-
-    while(*running) {
-        FD_ZERO(&fds);
-        UA_fd_set(server->discoveryManager.mdnsSocket, &fds);
-        select(server->discoveryManager.mdnsSocket + 1, &fds, 0, 0, &next_sleep);
-
-        if(!*running)
-            break;
-
-        unsigned short retVal =
-            mdnsd_step(server->discoveryManager.mdnsDaemon, server->discoveryManager.mdnsSocket,
-                       FD_ISSET(server->discoveryManager.mdnsSocket, &fds), true, &next_sleep);
-        if(retVal == 1) {
-            UA_LOG_SOCKET_ERRNO_WRAP(
-                UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                          "Multicast error: Can not read from socket. %s", errno_str));
-            break;
-        } else if (retVal == 2) {
-            UA_LOG_SOCKET_ERRNO_WRAP(
-                UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                         "Multicast error: Can not write to socket. %s", errno_str));
-            break;
-        }
-    }
-    return NULL;
-}
-
-static UA_StatusCode
-multicastListenStart(UA_Server* server) {
-    int err = pthread_create(&server->discoveryManager.mdnsThread, NULL,
-                             (void* (*)(void*))multicastWorkerLoop, server);
-    if(err != 0) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Multicast error: Can not create multicast thread.");
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-multicastListenStop(UA_Server* server) {
-    mdnsd_shutdown(server->discoveryManager.mdnsDaemon);
-    // wake up select
-    if (write(server->discoveryManager.mdnsSocket, "\0", 1)) {
-        // TODO: if makes no sense here?
-    }  // TODO: move to arch?
-    if (pthread_join(server->discoveryManager.mdnsThread, NULL)) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Multicast error: Can not stop thread.");
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-# endif /* UA_MULTITHREADING */
-
-static UA_StatusCode
-addMdnsRecordForNetworkLayer(UA_Server *server, const UA_String *appName,
-                             const UA_ServerNetworkLayer* nl) {
-    UA_String hostname = UA_STRING_NULL;
-    UA_UInt16 port = 4840;
-    UA_String path = UA_STRING_NULL;
-    UA_StatusCode retval = UA_parseEndpointUrl(&nl->discoveryUrl, &hostname,
-                                               &port, &path);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                       "Server url is invalid: %.*s",
-                       (int)nl->discoveryUrl.length, nl->discoveryUrl.data);
-        return retval;
-    }
-
-    retval = UA_Discovery_addRecord(server, appName, &hostname, port,
-                                    &path, UA_DISCOVERY_TCP, true,
-                                    server->config.discovery.mdns.serverCapabilities,
-                                    server->config.discovery.mdns.serverCapabilitiesSize);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                       "Cannot add mDNS Record: %s",
-                       UA_StatusCode_name(retval));
-        return retval;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-void startMulticastDiscoveryServer(UA_Server *server) {
-    UA_String *appName = &server->config.discovery.mdns.mdnsServerName;
-    for(size_t i = 0; i < server->config.networkLayersSize; i++)
-        addMdnsRecordForNetworkLayer(server, appName, &server->config.networkLayers[i]);
-
-    /* find any other server on the net */
-    UA_Discovery_multicastQuery(server);
-
-#if UA_MULTITHREADING >= 200
-    multicastListenStart(server);
-# endif
-}
-
-void
-stopMulticastDiscoveryServer(UA_Server *server) {
-    if (!server->discoveryManager.mdnsDaemon)
-        return;
-
-    char hostname[256];
-    if(UA_gethostname(hostname, 255) == 0) {
-        UA_String hnString = UA_STRING(hostname);
-        UA_Discovery_removeRecord(server, &server->config.discovery.mdns.mdnsServerName,
-                                  &hnString, 4840, true);
-    } else {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Could not get hostname for multicast discovery.");
-    }
-
-#if UA_MULTITHREADING >= 200
-    multicastListenStop(server);
-# else
-    // send out last package with TTL = 0
-    iterateMulticastDiscoveryServer(server, NULL, false);
-# endif
-}
-
-/* All filter criteria must be fulfilled */
-static UA_Boolean
-filterServerRecord(size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
-                   serverOnNetwork_list_entry* current) {
-    for(size_t i = 0; i < serverCapabilityFilterSize; i++) {
-        for(size_t j = 0; j < current->serverOnNetwork.serverCapabilitiesSize; j++)
-            if(!UA_String_equal(&serverCapabilityFilter[i],
-                                &current->serverOnNetwork.serverCapabilities[j]))
-                return false;
-    }
-    return true;
-}
-
-void Service_FindServersOnNetwork(UA_Server *server, UA_Session *session,
-                                  const UA_FindServersOnNetworkRequest *request,
-                                  UA_FindServersOnNetworkResponse *response) {
-    if (!server->config.discovery.mdnsEnable) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTIMPLEMENTED;
-        return;
-    }
-
-    /* Set LastCounterResetTime */
-    UA_DateTime_copy(&server->discoveryManager.serverOnNetworkRecordIdLastReset,
-                     &response->lastCounterResetTime);
-
-    /* Compute the max number of records to return */
-    UA_UInt32 recordCount = 0;
-    if(request->startingRecordId < server->discoveryManager.serverOnNetworkRecordIdCounter)
-        recordCount = server->discoveryManager.serverOnNetworkRecordIdCounter -
-            request->startingRecordId;
-    if(request->maxRecordsToReturn && recordCount > request->maxRecordsToReturn)
-        recordCount = UA_MIN(recordCount, request->maxRecordsToReturn);
-    if(recordCount == 0) {
-        response->serversSize = 0;
-        return;
-    }
-
-    /* Iterate over all records and add to filtered list */
-    UA_UInt32 filteredCount = 0;
-    UA_STACKARRAY(UA_ServerOnNetwork*, filtered, recordCount);
-    serverOnNetwork_list_entry* current;
-    LIST_FOREACH(current, &server->discoveryManager.serverOnNetwork, pointers) {
-        if(filteredCount >= recordCount)
-            break;
-        if(current->serverOnNetwork.recordId < request->startingRecordId)
-            continue;
-        if(!filterServerRecord(request->serverCapabilityFilterSize,
-                               request->serverCapabilityFilter, current))
-            continue;
-        filtered[filteredCount++] = &current->serverOnNetwork;
-    }
-
-    if(filteredCount == 0)
-        return;
-
-    /* Allocate the array for the response */
-    response->servers =
-        (UA_ServerOnNetwork*)UA_malloc(sizeof(UA_ServerOnNetwork)*filteredCount);
-    if(!response->servers) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    response->serversSize = filteredCount;
-
-    /* Copy the server names */
-    for(size_t i = 0; i < filteredCount; i++)
-        UA_ServerOnNetwork_copy(filtered[i], &response->servers[filteredCount-i-1]);
-}
-
-void
-UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName,
-                                    const UA_MdnsDiscoveryConfiguration *mdnsConfig,
-                                    const UA_String *discoveryUrl,
-                                    UA_Boolean isOnline, UA_Boolean updateTxt) {
-    UA_String hostname = UA_STRING_NULL;
-    UA_UInt16 port = 4840;
-    UA_String path = UA_STRING_NULL;
-    UA_StatusCode retval = UA_parseEndpointUrl(discoveryUrl, &hostname, &port, &path);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK,
-                       "Server url invalid: %.*s",
-                       (int)discoveryUrl->length, discoveryUrl->data);
-        return;
-    }
-
-    if(!isOnline) {
-        UA_StatusCode removeRetval =
-                UA_Discovery_removeRecord(server, serverName, &hostname,
-                                          port, updateTxt);
-        if(removeRetval != UA_STATUSCODE_GOOD)
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "Could not remove mDNS record for hostname %.*s.",
-                           (int)serverName->length, serverName->data);
-        return;
-    }
-
-    UA_String *capabilities = NULL;
-    size_t capabilitiesSize = 0;
-    if(mdnsConfig) {
-        capabilities = mdnsConfig->serverCapabilities;
-        capabilitiesSize = mdnsConfig->serverCapabilitiesSize;
-    }
-
-    UA_StatusCode addRetval =
-        UA_Discovery_addRecord(server, serverName, &hostname,
-                               port, &path, UA_DISCOVERY_TCP, updateTxt,
-                               capabilities, capabilitiesSize);
-    if(addRetval != UA_STATUSCODE_GOOD)
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Could not add mDNS record for hostname %.*s.",
-                       (int)serverName->length, serverName->data);
-}
-
-void
-UA_Server_setServerOnNetworkCallback(UA_Server *server,
-                                     UA_Server_serverOnNetworkCallback cb,
-                                     void* data) {
-    server->discoveryManager.serverOnNetworkCallback = cb;
-    server->discoveryManager.serverOnNetworkCallbackData = data;
-}
-
-static void
-UA_Discovery_multicastConflict(char *name, int type, void *arg) {
-    // cppcheck-suppress unreadVariable
-    UA_Server *server = (UA_Server*) arg;
-    UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                 "Multicast DNS name conflict detected: "
-                 "'%s' for type %d", name, type);
-}
-
-/* Create a service domain with the format [servername]-[hostname]._opcua-tcp._tcp.local. */
-static void
-createFullServiceDomain(char *outServiceDomain, size_t maxLen,
-                        const UA_String *servername, const UA_String *hostname) {
-    size_t hostnameLen = hostname->length;
-    size_t servernameLen = servername->length;
-
-    maxLen -= 24; /* the length we have remaining before the opc ua postfix and
-                   * the trailing zero */
-
-    /* Can we use hostname and servername with full length? */
-    if(hostnameLen + servernameLen + 1 > maxLen) {
-        if(servernameLen + 2 > maxLen) {
-            servernameLen = maxLen;
-            hostnameLen = 0;
-        } else {
-            hostnameLen = maxLen - servernameLen - 1;
-        }
-    }
-
-    size_t offset = 0;
-    if (hostnameLen > 0) {
-        UA_snprintf(outServiceDomain, maxLen + 1, "%.*s-%.*s",
-                    (int) servernameLen, (char *) servername->data,
-                    (int) hostnameLen, (char *) hostname->data);
-        offset = servernameLen + hostnameLen + 1;
-    }
-    else {
-        UA_snprintf(outServiceDomain, maxLen + 1, "%.*s",
-                    (int) servernameLen, (char *) servername->data);
-        offset = servernameLen;
-    }
-    UA_snprintf(&outServiceDomain[offset], 24, "._opcua-tcp._tcp.local.");
-}
-
-/* Check if mDNS already has an entry for given hostname and port combination */
-static UA_Boolean
-UA_Discovery_recordExists(UA_Server* server, const char* fullServiceDomain,
-                          unsigned short port, const UA_DiscoveryProtocol protocol) {
-    // [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname].
-    mdns_record_t *r  = mdnsd_get_published(server->discoveryManager.mdnsDaemon, fullServiceDomain);
-    while(r) {
-        const mdns_answer_t *data = mdnsd_record_data(r);
-        if(data->type == QTYPE_SRV && (port == 0 || data->srv.port == port))
-            return true;
-        r = mdnsd_record_next(r);
-    }
-    return false;
-}
-
-static int
-discovery_multicastQueryAnswer(mdns_answer_t *a, void *arg) {
-    UA_Server *server = (UA_Server*) arg;
-    if(a->type != QTYPE_PTR)
-        return 0;
-
-    if(a->rdname == NULL)
-        return 0;
-
-    /* Skip, if we already know about this server */
-    UA_Boolean exists =
-        UA_Discovery_recordExists(server, a->rdname, 0, UA_DISCOVERY_TCP);
-    if(exists == true)
-        return 0;
-
-    if(mdnsd_has_query(server->discoveryManager.mdnsDaemon, a->rdname))
-        return 0;
-
-    UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                 "mDNS send query for: %s SRV&TXT %s", a->name, a->rdname);
-
-    mdnsd_query(server->discoveryManager.mdnsDaemon, a->rdname, QTYPE_SRV,
-                discovery_multicastQueryAnswer, server);
-    mdnsd_query(server->discoveryManager.mdnsDaemon, a->rdname, QTYPE_TXT,
-                discovery_multicastQueryAnswer, server);
-    return 0;
-}
-
-UA_StatusCode
-UA_Discovery_multicastQuery(UA_Server* server) {
-    mdnsd_query(server->discoveryManager.mdnsDaemon, "_opcua-tcp._tcp.local.",
-                QTYPE_PTR,discovery_multicastQueryAnswer, server);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Discovery_addRecord(UA_Server *server, const UA_String *servername,
-                       const UA_String *hostname, UA_UInt16 port,
-                       const UA_String *path, const UA_DiscoveryProtocol protocol,
-                       UA_Boolean createTxt, const UA_String* capabilites,
-                       const size_t capabilitiesSize) {
-    // we assume that the hostname is not an IP address, but a valid domain name
-    // It is required by the OPC UA spec (see Part 12, DiscoveryURL to DNS SRV mapping)
-    // to always use the hostname instead of the IP address
-
-    if(capabilitiesSize > 0 && !capabilites)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    size_t hostnameLen = hostname->length;
-    size_t servernameLen = servername->length;
-    if(hostnameLen == 0 || servernameLen == 0)
-        return UA_STATUSCODE_BADOUTOFRANGE;
-
-    // use a limit for the hostname length to make sure full string fits into 63
-    // chars (limited by DNS spec)
-    if(hostnameLen+servernameLen + 1 > 63) { // include dash between servername-hostname
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Multicast DNS: Combination of hostname+servername exceeds "
-                       "maximum of 62 chars. It will be truncated.");
-    } else if(hostnameLen > 63) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Multicast DNS: Hostname length exceeds maximum of 63 chars. "
-                       "It will be truncated.");
-    }
-
-    if(!server->discoveryManager.mdnsMainSrvAdded) {
-        mdns_record_t *r =
-            mdnsd_shared(server->discoveryManager.mdnsDaemon, "_services._dns-sd._udp.local.",
-                         QTYPE_PTR, 600);
-        mdnsd_set_host(server->discoveryManager.mdnsDaemon, r, "_opcua-tcp._tcp.local.");
-        server->discoveryManager.mdnsMainSrvAdded = true;
-    }
-
-    // [servername]-[hostname]._opcua-tcp._tcp.local.
-    char fullServiceDomain[63+24];
-    createFullServiceDomain(fullServiceDomain, 63+24, servername, hostname);
-
-    UA_Boolean exists = UA_Discovery_recordExists(server, fullServiceDomain, port, protocol);
-    if(exists == true)
-        return UA_STATUSCODE_GOOD;
-
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Multicast DNS: add record for domain: %s", fullServiceDomain);
-
-    // _services._dns-sd._udp.local. PTR _opcua-tcp._tcp.local
-
-    // check if there is already a PTR entry for the given service.
-
-    // _opcua-tcp._tcp.local. PTR [servername]-[hostname]._opcua-tcp._tcp.local.
-    mdns_record_t *r = mdns_find_record(server->discoveryManager.mdnsDaemon, QTYPE_PTR,
-                                        "_opcua-tcp._tcp.local.", fullServiceDomain);
-    if(!r) {
-        r = mdnsd_shared(server->discoveryManager.mdnsDaemon, "_opcua-tcp._tcp.local.", QTYPE_PTR, 600);
-        mdnsd_set_host(server->discoveryManager.mdnsDaemon, r, fullServiceDomain);
-    }
-
-    /* The first 63 characters of the hostname (or less) */
-    size_t maxHostnameLen = UA_MIN(hostnameLen, 63);
-    char localDomain[65];
-    memcpy(localDomain, hostname->data, maxHostnameLen);
-    localDomain[maxHostnameLen] = '.';
-    localDomain[maxHostnameLen+1] = '\0';
-
-    // [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname].
-    r = mdnsd_unique(server->discoveryManager.mdnsDaemon, fullServiceDomain, QTYPE_SRV, 600,
-                     UA_Discovery_multicastConflict, server);
-    mdnsd_set_srv(server->discoveryManager.mdnsDaemon, r, 0, 0, port, localDomain);
-
-    // A/AAAA record for all ip addresses.
-    // [servername]-[hostname]._opcua-tcp._tcp.local. A [ip].
-    // [hostname]. A [ip].
-    mdns_set_address_record(server, fullServiceDomain, localDomain);
-
-    // TXT record: [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,...
-    UA_STACKARRAY(char, pathChars, path->length + 1);
-    if(createTxt) {
-        if(path->length > 0)
-            memcpy(pathChars, path->data, path->length);
-        pathChars[path->length] = 0;
-        mdns_create_txt(server, fullServiceDomain, pathChars, capabilites,
-                        capabilitiesSize, UA_Discovery_multicastConflict);
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername,
-                          const UA_String *hostname, UA_UInt16 port,
-                          UA_Boolean removeTxt) {
-    // use a limit for the hostname length to make sure full string fits into 63
-    // chars (limited by DNS spec)
-    size_t hostnameLen = hostname->length;
-    size_t servernameLen = servername->length;
-    if(hostnameLen == 0 || servernameLen == 0)
-        return UA_STATUSCODE_BADOUTOFRANGE;
-
-    if(hostnameLen+servernameLen+1 > 63) { // include dash between servername-hostname
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Multicast DNS: Combination of hostname+servername exceeds "
-                       "maximum of 62 chars. It will be truncated.");
-    }
-
-    // [servername]-[hostname]._opcua-tcp._tcp.local.
-    char fullServiceDomain[63 + 24];
-    createFullServiceDomain(fullServiceDomain, 63+24, servername, hostname);
-
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Multicast DNS: remove record for domain: %s", fullServiceDomain);
-
-    // _opcua-tcp._tcp.local. PTR [servername]-[hostname]._opcua-tcp._tcp.local.
-    mdns_record_t *r = mdns_find_record(server->discoveryManager.mdnsDaemon, QTYPE_PTR,
-                                        "_opcua-tcp._tcp.local.", fullServiceDomain);
-    if(!r) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Multicast DNS: could not remove record. "
-                       "PTR Record not found for domain: %s", fullServiceDomain);
-        return UA_STATUSCODE_BADNOTHINGTODO;
-    }
-    mdnsd_done(server->discoveryManager.mdnsDaemon, r);
-
-    // looks for [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port hostname.local.
-    // and TXT record: [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,...
-    // and A record: [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]
-    mdns_record_t *r2 = mdnsd_get_published(server->discoveryManager.mdnsDaemon, fullServiceDomain);
-    if(!r2) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Multicast DNS: could not remove record. Record not "
-                       "found for domain: %s", fullServiceDomain);
-        return UA_STATUSCODE_BADNOTHINGTODO;
-    }
-
-    while(r2) {
-        const mdns_answer_t *data = mdnsd_record_data(r2);
-        mdns_record_t *next = mdnsd_record_next(r2);
-        if((removeTxt && data->type == QTYPE_TXT) ||
-           (removeTxt && data->type == QTYPE_A) ||
-           data->srv.port == port) {
-            mdnsd_done(server->discoveryManager.mdnsDaemon, r2);
-        }
-        r2 = next;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat,
-                                UA_Boolean processIn) {
-    struct timeval next_sleep = { 0, 0 };
-    unsigned short retval = mdnsd_step(server->discoveryManager.mdnsDaemon,
-                                       (int)server->discoveryManager.mdnsSocket,
-                                       processIn, true, &next_sleep);
-    if(retval == 1) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-               UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Multicast error: Can not read from socket. %s", errno_str));
-        return UA_STATUSCODE_BADNOCOMMUNICATION;
-    } else if(retval == 2) {
-        UA_LOG_SOCKET_ERRNO_WRAP(
-                UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Multicast error: Can not write to socket. %s", errno_str));
-        return UA_STATUSCODE_BADNOCOMMUNICATION;
-    }
-
-    if(nextRepeat)
-        *nextRepeat = UA_DateTime_now() +
-            (UA_DateTime)((next_sleep.tv_sec * UA_DATETIME_SEC) +
-                          (next_sleep.tv_usec * UA_DATETIME_USEC));
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif /* defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST) */
diff --git a/ext/open62541/src/server/ua_services_method.c b/ext/open62541/src/server/ua_services_method.c
deleted file mode 100644
index 49cc97c..0000000
--- a/ext/open62541/src/server/ua_services_method.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2017 (c) Florian Palm
- *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016 (c) LEvertz
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Julian Grothoff
- */
-
-#include "ua_services.h"
-#include "ua_server_internal.h"
-
-#ifdef UA_ENABLE_METHODCALLS /* conditional compilation */
-
-static const UA_VariableNode *
-getArgumentsVariableNode(UA_Server *server, const UA_MethodNode *ofMethod,
-                         UA_String withBrowseName) {
-    UA_NodeId hasProperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    for(size_t i = 0; i < ofMethod->referencesSize; ++i) {
-        UA_NodeReferenceKind *rk = &ofMethod->references[i];
-
-        if(rk->isInverse != false)
-            continue;
-
-        if(!UA_NodeId_equal(&hasProperty, &rk->referenceTypeId))
-            continue;
-
-        for(size_t j = 0; j < rk->targetIdsSize; ++j) {
-            const UA_Node *refTarget =
-                UA_Nodestore_getNode(server->nsCtx, &rk->targetIds[j].nodeId);
-            if(!refTarget)
-                continue;
-            if(refTarget->nodeClass == UA_NODECLASS_VARIABLE &&
-               refTarget->browseName.namespaceIndex == 0 &&
-               UA_String_equal(&withBrowseName, &refTarget->browseName.name)) {
-                return (const UA_VariableNode*)refTarget;
-            }
-            UA_Nodestore_releaseNode(server->nsCtx, refTarget);
-        }
-    }
-    return NULL;
-}
-
-/* inputArgumentResults has the length request->inputArgumentsSize */
-static UA_StatusCode
-typeCheckArguments(UA_Server *server, UA_Session *session,
-                   const UA_VariableNode *argRequirements, size_t argsSize,
-                   UA_Variant *args, UA_StatusCode *inputArgumentResults) {
-    /* Verify that we have a Variant containing UA_Argument (scalar or array) in
-     * the "InputArguments" node */
-    if(argRequirements->valueSource != UA_VALUESOURCE_DATA)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    if(!argRequirements->value.data.value.hasValue)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    if(argRequirements->value.data.value.value.type != &UA_TYPES[UA_TYPES_ARGUMENT])
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Verify the number of arguments. A scalar argument value is interpreted as
-     * an array of length 1. */
-    size_t argReqsSize = argRequirements->value.data.value.value.arrayLength;
-    if(UA_Variant_isScalar(&argRequirements->value.data.value.value))
-        argReqsSize = 1;
-    if(argReqsSize > argsSize)
-        return UA_STATUSCODE_BADARGUMENTSMISSING;
-    if(argReqsSize < argsSize)
-        return UA_STATUSCODE_BADTOOMANYARGUMENTS;
-
-    /* Type-check every argument against the definition */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_Argument *argReqs = (UA_Argument*)argRequirements->value.data.value.value.data;
-    for(size_t i = 0; i < argReqsSize; ++i) {
-        if(!compatibleValue(server, session, &argReqs[i].dataType, argReqs[i].valueRank,
-                            argReqs[i].arrayDimensionsSize, argReqs[i].arrayDimensions,
-                            &args[i], NULL)) {
-            inputArgumentResults[i] = UA_STATUSCODE_BADTYPEMISMATCH;
-            retval = UA_STATUSCODE_BADINVALIDARGUMENT;
-        }
-    }
-    return retval;
-}
-
-/* inputArgumentResults has the length request->inputArgumentsSize */
-static UA_StatusCode
-validMethodArguments(UA_Server *server, UA_Session *session, const UA_MethodNode *method,
-                     const UA_CallMethodRequest *request,
-                     UA_StatusCode *inputArgumentResults) {
-    /* Get the input arguments node */
-    const UA_VariableNode *inputArguments =
-        getArgumentsVariableNode(server, method, UA_STRING("InputArguments"));
-    if(!inputArguments) {
-        if(request->inputArgumentsSize > 0)
-            return UA_STATUSCODE_BADTOOMANYARGUMENTS;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Verify the request */
-    UA_StatusCode retval = typeCheckArguments(server, session, inputArguments,
-                                              request->inputArgumentsSize,
-                                              request->inputArguments,
-                                              inputArgumentResults);
-
-    /* Release the input arguments node */
-    UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)inputArguments);
-    return retval;
-}
-
-static const UA_NodeId hasComponentNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT}};
-static const UA_NodeId hasSubTypeNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}};
-
-static void
-callWithMethodAndObject(UA_Server *server, UA_Session *session,
-                        const UA_CallMethodRequest *request, UA_CallMethodResult *result,
-                        const UA_MethodNode *method, const UA_ObjectNode *object) {
-    /* Verify the object's NodeClass */
-    if(object->nodeClass != UA_NODECLASS_OBJECT &&
-       object->nodeClass != UA_NODECLASS_OBJECTTYPE) {
-        result->statusCode = UA_STATUSCODE_BADNODECLASSINVALID;
-        return;
-    }
-
-    /* Verify the method's NodeClass */
-    if(method->nodeClass != UA_NODECLASS_METHOD) {
-        result->statusCode = UA_STATUSCODE_BADNODECLASSINVALID;
-        return;
-    }
-
-    /* Is there a method to execute? */
-    if(!method->method) {
-        result->statusCode = UA_STATUSCODE_BADINTERNALERROR;
-        return;
-    }
-
-    /* Verify method/object relations. Object must have a hasComponent or a
-     * subtype of hasComponent reference to the method node. Therefore, check
-     * every reference between the parent object and the method node if there is
-     * a hasComponent (or subtype) reference */
-    UA_Boolean found = false;
-    for(size_t i = 0; i < object->referencesSize && !found; ++i) {
-        UA_NodeReferenceKind *rk = &object->references[i];
-        if(rk->isInverse)
-            continue;
-        if(!isNodeInTree(server->nsCtx, &rk->referenceTypeId,
-                         &hasComponentNodeId, &hasSubTypeNodeId, 1))
-            continue;
-        for(size_t j = 0; j < rk->targetIdsSize; ++j) {
-            if(UA_NodeId_equal(&rk->targetIds[j].nodeId, &request->methodId)) {
-                found = true;
-                break;
-            }
-        }
-    }
-    if(!found) {
-        result->statusCode = UA_STATUSCODE_BADMETHODINVALID;
-        return;
-    }
-
-    /* Verify access rights */
-    UA_Boolean executable = method->executable;
-    if(session != &server->adminSession) {
-        UA_UNLOCK(server->serviceMutex);
-        executable = executable &&
-                     server->config.accessControl.getUserExecutableOnObject(server,
-                                                                            &server->config.accessControl, &session->sessionId,
-                                                                            session->sessionHandle, &request->methodId, method->context,
-                                                                            &request->objectId, object->context);
-        UA_LOCK(server->serviceMutex);
-    }
-
-    if(!executable) {
-        result->statusCode = UA_STATUSCODE_BADNOTEXECUTABLE;
-        return;
-    }
-
-    /* Allocate the inputArgumentResults array */
-    result->inputArgumentResults = (UA_StatusCode*)
-        UA_Array_new(request->inputArgumentsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-    if(!result->inputArgumentResults) {
-        result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    result->inputArgumentResultsSize = request->inputArgumentsSize;
-
-    /* Verify Input Arguments */
-    result->statusCode = validMethodArguments(server, session, method, request, result->inputArgumentResults);
-
-    /* Return inputArgumentResults only for BADINVALIDARGUMENT */
-    if(result->statusCode != UA_STATUSCODE_BADINVALIDARGUMENT) {
-        UA_Array_delete(result->inputArgumentResults, result->inputArgumentResultsSize,
-                        &UA_TYPES[UA_TYPES_STATUSCODE]);
-        result->inputArgumentResults = NULL;
-        result->inputArgumentResultsSize = 0;
-    }
-
-    /* Error during type-checking? */
-    if(result->statusCode != UA_STATUSCODE_GOOD)
-        return;
-
-    /* Get the output arguments node */
-    const UA_VariableNode *outputArguments =
-        getArgumentsVariableNode(server, method, UA_STRING("OutputArguments"));
-
-    /* Allocate the output arguments array */
-    size_t outputArgsSize = 0;
-    if(outputArguments)
-        outputArgsSize = outputArguments->value.data.value.value.arrayLength;
-    result->outputArguments = (UA_Variant*)
-        UA_Array_new(outputArgsSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    if(!result->outputArguments) {
-        result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-    result->outputArgumentsSize = outputArgsSize;
-
-    /* Release the output arguments node */
-    UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)outputArguments);
-
-    UA_UNLOCK(server->serviceMutex);
-    /* Call the method */
-    result->statusCode = method->method(server, &session->sessionId, session->sessionHandle,
-                                        &method->nodeId, method->context,
-                                        &object->nodeId, object->context,
-                                        request->inputArgumentsSize, request->inputArguments,
-                                        result->outputArgumentsSize, result->outputArguments);
-    UA_LOCK(server->serviceMutex);
-    /* TODO: Verify Output matches the argument definition */
-}
-
-static void
-Operation_CallMethod(UA_Server *server, UA_Session *session, void *context,
-                     const UA_CallMethodRequest *request, UA_CallMethodResult *result) {
-    /* Get the method node */
-    const UA_MethodNode *method = (const UA_MethodNode*)
-        UA_Nodestore_getNode(server->nsCtx, &request->methodId);
-    if(!method) {
-        result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        return;
-    }
-
-    /* Get the object node */
-    const UA_ObjectNode *object = (const UA_ObjectNode*)
-        UA_Nodestore_getNode(server->nsCtx, &request->objectId);
-    if(!object) {
-        result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)method);
-        return;
-    }
-
-    /* Continue with method and object as context */
-    callWithMethodAndObject(server, session, request, result, method, object);
-
-    /* Release the method and object node */
-    UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)method);
-    UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)object);
-}
-
-void Service_Call(UA_Server *server, UA_Session *session,
-                  const UA_CallRequest *request,
-                  UA_CallResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing CallRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxNodesPerMethodCall != 0 &&
-       request->methodsToCallSize > server->config.maxNodesPerMethodCall) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_CallMethod, NULL,
-                                           &request->methodsToCallSize, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]);
-}
-
-UA_CallMethodResult UA_EXPORT
-UA_Server_call(UA_Server *server, const UA_CallMethodRequest *request) {
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    UA_LOCK(server->serviceMutex);
-    Operation_CallMethod(server, &server->adminSession, NULL, request, &result);
-    UA_UNLOCK(server->serviceMutex);
-    return result;
-}
-
-#endif /* UA_ENABLE_METHODCALLS */
diff --git a/ext/open62541/src/server/ua_services_monitoreditem.c b/ext/open62541/src/server/ua_services_monitoreditem.c
deleted file mode 100644
index 047621f..0000000
--- a/ext/open62541/src/server/ua_services_monitoreditem.c
+++ /dev/null
@@ -1,579 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH
- *    Copyright 2017 (c) Mattias Bornhager
- *    Copyright 2017 (c) Henrik Norrman
- *    Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-#include "ua_subscription.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */
-
-static UA_StatusCode
-setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon,
-                         UA_MonitoringMode monitoringMode,
-                         const UA_MonitoringParameters *params,
-                         const UA_DataType* dataType) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-        /* Event MonitoredItem */
-#ifndef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        return UA_STATUSCODE_BADNOTSUPPORTED;
-#else
-        if(params->filter.encoding != UA_EXTENSIONOBJECT_DECODED &&
-           params->filter.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE)
-            return UA_STATUSCODE_BADEVENTFILTERINVALID;
-        if(params->filter.content.decoded.type != &UA_TYPES[UA_TYPES_EVENTFILTER])
-            return UA_STATUSCODE_BADEVENTFILTERINVALID;
-        UA_EventFilter_clear(&mon->filter.eventFilter);
-        retval = UA_EventFilter_copy((UA_EventFilter *)params->filter.content.decoded.data,
-                                     &mon->filter.eventFilter);
-#endif
-    } else {
-        /* DataChange MonitoredItem */
-        if(params->filter.encoding != UA_EXTENSIONOBJECT_DECODED &&
-           params->filter.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) {
-            /* Default: Look for status and value */
-            UA_DataChangeFilter_clear(&mon->filter.dataChangeFilter);
-            mon->filter.dataChangeFilter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-        } else if(params->filter.content.decoded.type == &UA_TYPES[UA_TYPES_DATACHANGEFILTER]) {
-            UA_DataChangeFilter *filter = (UA_DataChangeFilter *)params->filter.content.decoded.data;
-            // TODO implement EURange to support UA_DEADBANDTYPE_PERCENT
-            switch(filter->deadbandType) {
-            case UA_DEADBANDTYPE_NONE:
-                break;
-            case UA_DEADBANDTYPE_ABSOLUTE:
-                if(!dataType || !UA_DataType_isNumeric(dataType))
-                    return UA_STATUSCODE_BADFILTERNOTALLOWED;
-                break;
-            case UA_DEADBANDTYPE_PERCENT:
-                return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED;
-            default:
-                return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED;
-            }
-            retval = UA_DataChangeFilter_copy(filter, &mon->filter.dataChangeFilter);
-        } else {
-            return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED;
-        }
-    }
-
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* <-- The point of no return --> */
-
-    /* Unregister the callback */
-    UA_MonitoredItem_unregisterSampleCallback(server, mon);
-
-    /* Remove the old samples */
-    UA_ByteString_deleteMembers(&mon->lastSampledValue);
-    UA_Variant_deleteMembers(&mon->lastValue);
-
-    /* ClientHandle */
-    mon->clientHandle = params->clientHandle;
-
-    /* SamplingInterval */
-    UA_Double samplingInterval = params->samplingInterval;
-
-    if(mon->attributeId == UA_ATTRIBUTEID_VALUE) {
-        const UA_VariableNode *vn = (const UA_VariableNode *)
-            UA_Nodestore_getNode(server->nsCtx, &mon->monitoredNodeId);
-        if(vn) {
-            if(vn->nodeClass == UA_NODECLASS_VARIABLE &&
-               samplingInterval < vn->minimumSamplingInterval)
-                samplingInterval = vn->minimumSamplingInterval;
-            UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node *)vn);
-        }
-    }
-
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.samplingIntervalLimits,
-                               samplingInterval, mon->samplingInterval);
-    if(samplingInterval != samplingInterval) /* Check for nan */
-        mon->samplingInterval = server->config.samplingIntervalLimits.min;
-
-    /* QueueSize */
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.queueSizeLimits,
-                               params->queueSize, mon->maxQueueSize);
-
-    /* DiscardOldest */
-    mon->discardOldest = params->discardOldest;
-
-    /* Register sample callback if reporting is enabled */
-    mon->monitoringMode = monitoringMode;
-    if(monitoringMode == UA_MONITORINGMODE_SAMPLING ||
-       monitoringMode == UA_MONITORINGMODE_REPORTING)
-        return UA_MonitoredItem_registerSampleCallback(server, mon);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static const UA_String binaryEncoding = {sizeof("Default Binary") - 1, (UA_Byte *)"Default Binary"};
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-static UA_StatusCode
-UA_Server_addMonitoredItemToNodeEditNodeCallback(UA_Server *server, UA_Session *session,
-                                                 UA_Node *node, void *data) {
-    /* data is the MonitoredItem */
-    /* SLIST_INSERT_HEAD */
-    ((UA_MonitoredItem *)data)->next = ((UA_ObjectNode *)node)->monitoredItemQueue;
-    ((UA_ObjectNode *)node)->monitoredItemQueue = (UA_MonitoredItem *)data;
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-/* Thread-local variables to pass additional arguments into the operation */
-struct createMonContext {
-    UA_Subscription *sub;
-    UA_TimestampsToReturn timestampsToReturn;
-
-    /* If sub is NULL, use local callbacks */
-    UA_Server_DataChangeNotificationCallback dataChangeCallback;
-    void *context;
-};
-
-static void
-Operation_CreateMonitoredItem(UA_Server *server, UA_Session *session, struct createMonContext *cmc,
-                              const UA_MonitoredItemCreateRequest *request,
-                              UA_MonitoredItemCreateResult *result) {
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Check available capacity */
-    if(cmc->sub &&
-       (((server->config.maxMonitoredItems != 0) &&
-         (server->numMonitoredItems >= server->config.maxMonitoredItems)) ||
-        ((server->config.maxMonitoredItemsPerSubscription != 0) &&
-         (cmc->sub->monitoredItemsSize >= server->config.maxMonitoredItemsPerSubscription)))) {
-        result->statusCode = UA_STATUSCODE_BADTOOMANYMONITOREDITEMS;
-        return;
-    }
-
-    /* Make an example read to get errors in the itemToMonitor. Allow return
-     * codes "good" and "uncertain", as well as a list of statuscodes that might
-     * be repaired inside the data source. */
-    UA_DataValue v = UA_Server_readWithSession(server, session, &request->itemToMonitor,
-                                               cmc->timestampsToReturn);
-    if(v.hasStatus && (v.status >> 30) > 1 &&
-       v.status != UA_STATUSCODE_BADRESOURCEUNAVAILABLE &&
-       v.status != UA_STATUSCODE_BADCOMMUNICATIONERROR &&
-       v.status != UA_STATUSCODE_BADWAITINGFORINITIALDATA &&
-       v.status != UA_STATUSCODE_BADUSERACCESSDENIED &&
-       v.status != UA_STATUSCODE_BADNOTREADABLE &&
-       v.status != UA_STATUSCODE_BADINDEXRANGENODATA) {
-        result->statusCode = v.status;
-        UA_DataValue_deleteMembers(&v);
-        return;
-    }
-
-    /* Check if the encoding is supported */
-    if(request->itemToMonitor.dataEncoding.name.length > 0 &&
-       (!UA_String_equal(&binaryEncoding, &request->itemToMonitor.dataEncoding.name) ||
-        request->itemToMonitor.dataEncoding.namespaceIndex != 0)) {
-        result->statusCode = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED;
-        UA_DataValue_deleteMembers(&v);
-        return;
-    }
-
-    /* Check if the encoding is set for a value */
-    if(request->itemToMonitor.attributeId != UA_ATTRIBUTEID_VALUE &&
-       request->itemToMonitor.dataEncoding.name.length > 0) {
-        result->statusCode = UA_STATUSCODE_BADDATAENCODINGINVALID;
-        UA_DataValue_deleteMembers(&v);
-        return;
-    }
-
-    /* Allocate the MonitoredItem */
-    size_t nmsize = sizeof(UA_MonitoredItem);
-    if(!cmc->sub)
-        nmsize = sizeof(UA_LocalMonitoredItem);
-    UA_MonitoredItem *newMon = (UA_MonitoredItem*)UA_malloc(nmsize);
-    if(!newMon) {
-        result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-        UA_DataValue_deleteMembers(&v);
-        return;
-    }
-
-    /* Initialize the MonitoredItem */
-    UA_MonitoredItem_init(newMon, cmc->sub);
-    newMon->attributeId = request->itemToMonitor.attributeId;
-    newMon->timestampsToReturn = cmc->timestampsToReturn;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    retval |= UA_NodeId_copy(&request->itemToMonitor.nodeId, &newMon->monitoredNodeId);
-    retval |= UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange);
-    retval |= setMonitoredItemSettings(server, newMon, request->monitoringMode,
-                                       &request->requestedParameters, v.value.type);
-    UA_DataValue_deleteMembers(&v);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "Subscription %u | Could not create a MonitoredItem "
-                            "with StatusCode %s", cmc->sub ? cmc->sub->subscriptionId : 0,
-                            UA_StatusCode_name(retval));
-        result->statusCode = retval;
-        UA_MonitoredItem_delete(server, newMon);
-        return;
-    }
-
-    /* Add to the subscriptions or the local MonitoredItems */
-    if(cmc->sub) {
-        newMon->monitoredItemId = ++cmc->sub->lastMonitoredItemId;
-        UA_Subscription_addMonitoredItem(server, cmc->sub, newMon);
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        if(newMon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-            /* Insert the monitored item into the node's queue */
-            UA_Server_editNode(server, NULL, &newMon->monitoredNodeId,
-                               UA_Server_addMonitoredItemToNodeEditNodeCallback, newMon);
-        }
-#endif
-    } else {
-        //TODO support events for local monitored items
-        UA_LocalMonitoredItem *localMon = (UA_LocalMonitoredItem*)newMon;
-        localMon->context = cmc->context;
-        localMon->callback.dataChangeCallback = cmc->dataChangeCallback;
-        newMon->monitoredItemId = ++server->lastLocalMonitoredItemId;
-        LIST_INSERT_HEAD(&server->localMonitoredItems, newMon, listEntry);
-    }
-
-    /* Register MonitoredItem in userland */
-    if(server->config.monitoredItemRegisterCallback) {
-        void *targetContext = NULL;
-        UA_Server_getNodeContext(server, request->itemToMonitor.nodeId, &targetContext);
-        UA_UNLOCK(server->serviceMutex);
-        server->config.monitoredItemRegisterCallback(server, &session->sessionId,
-                                                     session->sessionHandle,
-                                                     &request->itemToMonitor.nodeId,
-                                                     targetContext, newMon->attributeId, false);
-        UA_LOCK(server->serviceMutex);
-        newMon->registered = true;
-    }
-
-    UA_LOG_INFO_SESSION(&server->config.logger, session,
-                        "Subscription %u | MonitoredItem %i | "
-                        "Created the MonitoredItem",
-                        cmc->sub ? cmc->sub->subscriptionId : 0,
-                        newMon->monitoredItemId);
-
-    /* Create the first sample */
-    if(request->monitoringMode == UA_MONITORINGMODE_REPORTING &&
-       newMon->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER)
-        monitoredItem_sampleCallback(server, newMon);
-
-    /* Prepare the response */
-    result->revisedSamplingInterval = newMon->samplingInterval;
-    result->revisedQueueSize = newMon->maxQueueSize;
-    result->monitoredItemId = newMon->monitoredItemId;
-}
-
-void
-Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
-                             const UA_CreateMonitoredItemsRequest *request,
-                             UA_CreateMonitoredItemsResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing CreateMonitoredItemsRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxMonitoredItemsPerCall != 0 &&
-       request->itemsToCreateSize > server->config.maxMonitoredItemsPerCall) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    /* Check if the timestampstoreturn is valid */
-    struct createMonContext cmc;
-    cmc.timestampsToReturn = request->timestampsToReturn;
-    if(cmc.timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID;
-        return;
-    }
-
-    /* Find the subscription */
-    cmc.sub = UA_Session_getSubscriptionById(session, request->subscriptionId);
-    if(!cmc.sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    /* Reset the subscription lifetime */
-    cmc.sub->currentLifetimeCount = 0;
-
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_CreateMonitoredItem, &cmc,
-                                           &request->itemsToCreateSize, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]);
-}
-
-UA_MonitoredItemCreateResult
-UA_Server_createDataChangeMonitoredItem(UA_Server *server,
-                                        UA_TimestampsToReturn timestampsToReturn,
-                                        const UA_MonitoredItemCreateRequest item,
-                                        void *monitoredItemContext,
-                                        UA_Server_DataChangeNotificationCallback callback) {
-    struct createMonContext cmc;
-    cmc.sub = NULL;
-    cmc.context = monitoredItemContext;
-    cmc.dataChangeCallback = callback;
-    cmc.timestampsToReturn = timestampsToReturn;
-
-    UA_MonitoredItemCreateResult result;
-    UA_MonitoredItemCreateResult_init(&result);
-    UA_LOCK(server->serviceMutex);
-    Operation_CreateMonitoredItem(server, &server->adminSession, &cmc, &item, &result);
-    UA_UNLOCK(server->serviceMutex);
-    return result;
-}
-
-static void
-Operation_ModifyMonitoredItem(UA_Server *server, UA_Session *session, UA_Subscription *sub,
-                              const UA_MonitoredItemModifyRequest *request,
-                              UA_MonitoredItemModifyResult *result) {
-    /* Get the MonitoredItem */
-    UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(sub, request->monitoredItemId);
-    if(!mon) {
-        result->statusCode = UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
-        return;
-    }
-
-    /* Read the current value to test if filters are possible.
-     * Can return an empty value (v.value.type == NULL). */
-    UA_ReadValueId rvid;
-    UA_ReadValueId_init(&rvid);
-    rvid.nodeId = mon->monitoredNodeId;
-    rvid.attributeId = mon->attributeId;
-    rvid.indexRange = mon->indexRange;
-    UA_DataValue v = UA_Server_readWithSession(server, session, &rvid, mon->timestampsToReturn);
-    UA_StatusCode retval = setMonitoredItemSettings(server, mon, mon->monitoringMode,
-                                                    &request->requestedParameters,
-                                                    v.value.type);
-    UA_DataValue_deleteMembers(&v);
-    if(retval != UA_STATUSCODE_GOOD) {
-        result->statusCode = retval;
-        return;
-    }
-
-    result->revisedSamplingInterval = mon->samplingInterval;
-    result->revisedQueueSize = mon->maxQueueSize;
-
-    /* Remove some notifications if the queue is now too small */
-    UA_MonitoredItem_ensureQueueSpace(server, mon);
-}
-
-void
-Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session,
-                             const UA_ModifyMonitoredItemsRequest *request,
-                             UA_ModifyMonitoredItemsResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing ModifyMonitoredItemsRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxMonitoredItemsPerCall != 0 &&
-       request->itemsToModifySize > server->config.maxMonitoredItemsPerCall) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    /* Check if the timestampstoreturn is valid */
-    if(request->timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID;
-        return;
-    }
-
-    /* Get the subscription */
-    UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId);
-    if(!sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */
-
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                  (UA_ServiceOperation)Operation_ModifyMonitoredItem, sub,
-                  &request->itemsToModifySize, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST],
-                  &response->resultsSize, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]);
-}
-
-struct setMonitoringContext {
-    UA_Subscription *sub;
-    UA_MonitoringMode monitoringMode;
-};
-
-static void
-Operation_SetMonitoringMode(UA_Server *server, UA_Session *session,
-                            struct setMonitoringContext *smc,
-                            const UA_UInt32 *monitoredItemId, UA_StatusCode *result) {
-    UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(smc->sub, *monitoredItemId);
-    if(!mon) {
-        *result = UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
-        return;
-    }
-    UA_Subscription *sub = mon->subscription;
-
-    /* Check if the MonitoringMode is valid or not */
-    if(smc->monitoringMode > UA_MONITORINGMODE_REPORTING) {
-        *result = UA_STATUSCODE_BADMONITORINGMODEINVALID;
-        return;
-    }
-
-    /* Nothing has changed */
-    if(mon->monitoringMode == smc->monitoringMode)
-        return;
-
-    mon->monitoringMode = smc->monitoringMode;
-
-    /* When reporting is enabled, put all notifications that were already
-     * sampled into the global queue of the subscription. When sampling is
-     * enabled, remove all notifications from the global queue. !!! This needs
-     * to be the same operation as in UA_Notification_enqueue !!! */
-    if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) {
-        UA_Notification *notification;
-        TAILQ_FOREACH(notification, &mon->queue, listEntry) {
-            TAILQ_INSERT_TAIL(&sub->notificationQueue, notification, globalEntry);
-            ++sub->notificationQueueSize;
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-            if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-                ++sub->eventNotifications;
-            } else
-#endif
-            {
-                ++sub->dataChangeNotifications;
-            }
-        }
-        /* Register the sampling callback with an interval */
-        *result = UA_MonitoredItem_registerSampleCallback(server, mon);
-    } else if(mon->monitoringMode == UA_MONITORINGMODE_SAMPLING) {
-        UA_Notification *notification;
-        TAILQ_FOREACH(notification, &mon->queue, listEntry) {
-            TAILQ_REMOVE(&sub->notificationQueue, notification, globalEntry);
-            TAILQ_NEXT(notification, globalEntry) = UA_SUBSCRIPTION_QUEUE_SENTINEL;
-            --sub->notificationQueueSize;
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-            if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-                --sub->eventNotifications;
-            } else
-#endif
-            {
-                --sub->dataChangeNotifications;
-            }
-        }
-        /* Register the sampling callback with an interval */
-        *result = UA_MonitoredItem_registerSampleCallback(server, mon);
-    } else {
-        /* UA_MONITORINGMODE_DISABLED */
-        UA_MonitoredItem_unregisterSampleCallback(server, mon);
-
-        /* Setting the mode to DISABLED or SAMPLING causes all queued Notifications to be deleted */
-        UA_Notification *notification, *notification_tmp;
-        TAILQ_FOREACH_SAFE(notification, &mon->queue, listEntry, notification_tmp) {
-            UA_Notification_dequeue(server, notification);
-            UA_Notification_delete(notification);
-        }
-
-        /* Initialize lastSampledValue */
-        UA_ByteString_deleteMembers(&mon->lastSampledValue);
-        UA_Variant_deleteMembers(&mon->lastValue);
-    }
-}
-
-void
-Service_SetMonitoringMode(UA_Server *server, UA_Session *session,
-                          const UA_SetMonitoringModeRequest *request,
-                          UA_SetMonitoringModeResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing SetMonitoringMode");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxMonitoredItemsPerCall != 0 &&
-       request->monitoredItemIdsSize > server->config.maxMonitoredItemsPerCall) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    /* Get the subscription */
-    struct setMonitoringContext smc;
-    smc.sub = UA_Session_getSubscriptionById(session, request->subscriptionId);
-    if(!smc.sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    smc.sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */
-
-    smc.monitoringMode = request->monitoringMode;
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                  (UA_ServiceOperation)Operation_SetMonitoringMode, &smc,
-                  &request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_UINT32],
-                  &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-static void
-Operation_DeleteMonitoredItem(UA_Server *server, UA_Session *session, UA_Subscription *sub,
-                              const UA_UInt32 *monitoredItemId, UA_StatusCode *result) {
-    *result = UA_Subscription_deleteMonitoredItem(server, sub, *monitoredItemId);
-}
-
-void
-Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session,
-                             const UA_DeleteMonitoredItemsRequest *request,
-                             UA_DeleteMonitoredItemsResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing DeleteMonitoredItemsRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxMonitoredItemsPerCall != 0 &&
-       request->monitoredItemIdsSize > server->config.maxMonitoredItemsPerCall) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    /* Get the subscription */
-    UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId);
-    if(!sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Reset the subscription lifetime */
-    sub->currentLifetimeCount = 0;
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                  (UA_ServiceOperation)Operation_DeleteMonitoredItem, sub,
-                  &request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_UINT32],
-                  &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-UA_StatusCode
-UA_Server_deleteMonitoredItem(UA_Server *server, UA_UInt32 monitoredItemId) {
-    UA_LOCK(server->serviceMutex);
-    UA_MonitoredItem *mon;
-    LIST_FOREACH(mon, &server->localMonitoredItems, listEntry) {
-        if(mon->monitoredItemId != monitoredItemId)
-            continue;
-        LIST_REMOVE(mon, listEntry);
-        UA_MonitoredItem_delete(server, mon);
-        UA_UNLOCK(server->serviceMutex);
-        return UA_STATUSCODE_GOOD;
-    }
-    UA_UNLOCK(server->serviceMutex);
-    return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
diff --git a/ext/open62541/src/server/ua_services_nodemanagement.c b/ext/open62541/src/server/ua_services_nodemanagement.c
deleted file mode 100644
index 5f5aed9..0000000
--- a/ext/open62541/src/server/ua_services_nodemanagement.c
+++ /dev/null
@@ -1,2227 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2016 (c) LEvertz
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Christian von Arnim
- *    Copyright 2017 (c) Henrik Norrman
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-
-#define UA_LOG_NODEID_WRAP(NODEID, LOG) {   \
-    UA_String nodeIdStr = UA_STRING_NULL;   \
-    UA_NodeId_toString(NODEID, &nodeIdStr); \
-    LOG;                                    \
-    UA_String_deleteMembers(&nodeIdStr);    \
-}
-
-/*********************/
-/* Edit Node Context */
-/*********************/
-
-UA_StatusCode
-UA_Server_getNodeContext(UA_Server *server, UA_NodeId nodeId,
-                         void **nodeContext) {
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &nodeId);
-    if(!node)
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-    *nodeContext = node->context;
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setDeconstructedNode(UA_Server *server, UA_Session *session,
-                     UA_Node *node, void *context) {
-    node->constructed = false;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setConstructedNodeContext(UA_Server *server, UA_Session *session,
-                          UA_Node *node, void *context) {
-    node->context = context;
-    node->constructed = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-editNodeContext(UA_Server *server, UA_Session* session,
-                UA_Node* node, void *context) {
-    node->context = context;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Server_setNodeContext(UA_Server *server, UA_NodeId nodeId,
-                         void *nodeContext) {
-    return UA_Server_editNode(server, &server->adminSession, &nodeId,
-                              (UA_EditNodeCallback)editNodeContext, nodeContext);
-}
-
-/**********************/
-/* Consistency Checks */
-/**********************/
-
-#define UA_PARENT_REFERENCES_COUNT 2
-
-const UA_NodeId parentReferences[UA_PARENT_REFERENCES_COUNT] = {
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}},
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT}}
-};
-
-/* Check if the requested parent node exists, has the right node class and is
- * referenced with an allowed (hierarchical) reference type. For "type" nodes,
- * only hasSubType references are allowed. */
-static UA_StatusCode
-checkParentReference(UA_Server *server, UA_Session *session, UA_NodeClass nodeClass,
-                     const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId) {
-    /* Objects do not need a parent (e.g. mandatory/optional modellingrules) */
-    /* Also, there are some variables which do not have parents, e.g. EnumStrings, EnumValues */
-    if((nodeClass == UA_NODECLASS_OBJECT || nodeClass == UA_NODECLASS_VARIABLE) &&
-       UA_NodeId_isNull(parentNodeId) && UA_NodeId_isNull(referenceTypeId))
-        return UA_STATUSCODE_GOOD;
-
-    /* See if the parent exists */
-    const UA_Node *parent = UA_Nodestore_getNode(server->nsCtx, parentNodeId);
-    if(!parent) {
-        UA_LOG_NODEID_WRAP(parentNodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: Parent node %.*s not found",
-                            (int)nodeIdStr.length, nodeIdStr.data));
-        return UA_STATUSCODE_BADPARENTNODEIDINVALID;
-    }
-
-    UA_NodeClass parentNodeClass = parent->nodeClass;
-    UA_Nodestore_releaseNode(server->nsCtx, parent);
-
-    /* Check the referencetype exists */
-    const UA_ReferenceTypeNode *referenceType = (const UA_ReferenceTypeNode*)
-        UA_Nodestore_getNode(server->nsCtx, referenceTypeId);
-    if(!referenceType) {
-        UA_LOG_NODEID_WRAP(referenceTypeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: Reference type %.*s to the parent not found",
-                           (int)nodeIdStr.length, nodeIdStr.data));
-        return UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
-    }
-
-    /* Check if the referencetype is a reference type node */
-    if(referenceType->nodeClass != UA_NODECLASS_REFERENCETYPE) {
-        UA_LOG_NODEID_WRAP(referenceTypeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: Reference type %.*s to the parent is not a ReferenceTypeNode",
-                           (int)nodeIdStr.length, nodeIdStr.data));
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)referenceType);
-        return UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
-    }
-
-    UA_Boolean referenceTypeIsAbstract = referenceType->isAbstract;
-    UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)referenceType);
-    /* Check that the reference type is not abstract */
-    if(referenceTypeIsAbstract == true) {
-        UA_LOG_NODEID_WRAP(referenceTypeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: Abstract reference type %.*s to the parent not allowed",
-                           (int)nodeIdStr.length, nodeIdStr.data));
-        return UA_STATUSCODE_BADREFERENCENOTALLOWED;
-    }
-
-    /* Check hassubtype relation for type nodes */
-    if(nodeClass == UA_NODECLASS_DATATYPE ||
-       nodeClass == UA_NODECLASS_VARIABLETYPE ||
-       nodeClass == UA_NODECLASS_OBJECTTYPE ||
-       nodeClass == UA_NODECLASS_REFERENCETYPE) {
-        /* type needs hassubtype reference to the supertype */
-        if(!UA_NodeId_equal(referenceTypeId, &subtypeId)) {
-            UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Type nodes need to have a HasSubType "
-                                "reference to the parent");
-            return UA_STATUSCODE_BADREFERENCENOTALLOWED;
-        }
-        /* supertype needs to be of the same node type  */
-        if(parentNodeClass != nodeClass) {
-            UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Type nodes needs to be of the same node "
-                                "type as their parent");
-            return UA_STATUSCODE_BADPARENTNODEIDINVALID;
-        }
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Test if the referencetype is hierarchical */
-    if(!isNodeInTree(server->nsCtx, referenceTypeId,
-                     &hierarchicalReferences, &subtypeId, 1)) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: Reference type to the parent is not hierarchical");
-        return UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-typeCheckVariableNode(UA_Server *server, UA_Session *session,
-                      const UA_VariableNode *node,
-                      const UA_VariableTypeNode *vt) {
-    /* The value might come from a datasource, so we perform a
-     * regular read. */
-    UA_DataValue value;
-    UA_DataValue_init(&value);
-    UA_StatusCode retval = readValueAttribute(server, session, node, &value);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_NodeId baseDataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
-
-    /* Check the datatype against the vt */
-    /* If the node does not have any value and the dataType is BaseDataType,
-     * then it's also fine. This is the default for empty nodes. */
-    if(!compatibleDataType(server, &node->dataType, &vt->dataType, false) &&
-       (value.hasValue || !UA_NodeId_equal(&node->dataType, &baseDataType))) {
-        UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                              "AddNodes: The value of %.*s is incompatible with "
-                              "the datatype of the VariableType",
-                              (int)nodeIdStr.length, nodeIdStr.data));
-        UA_DataValue_deleteMembers(&value);
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-    }
-
-    /* Check valueRank against array dimensions */
-    if(!compatibleValueRankArrayDimensions(server, session, node->valueRank,
-                                           node->arrayDimensionsSize)) {
-        UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: The value rank of %.*s is incomatible "
-                           "with its array dimensions", (int)nodeIdStr.length, nodeIdStr.data));
-        UA_DataValue_deleteMembers(&value);
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-    }
-
-    /* Check valueRank against the vt */
-    if(!compatibleValueRanks(node->valueRank, vt->valueRank)) {
-        UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: The value rank of %.*s is incomatible "
-                           "with the value rank of the VariableType",
-                           (int)nodeIdStr.length, nodeIdStr.data));
-        UA_DataValue_deleteMembers(&value);
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-    }
-
-    /* Check array dimensions against the vt */
-    if(!compatibleArrayDimensions(vt->arrayDimensionsSize, vt->arrayDimensions,
-                                  node->arrayDimensionsSize, node->arrayDimensions)) {
-        UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: The array dimensions of %.*s are "
-                           "incomatible with the array dimensions of the VariableType",
-                           (int)nodeIdStr.length, nodeIdStr.data));
-        UA_DataValue_deleteMembers(&value);
-        return UA_STATUSCODE_BADTYPEMISMATCH;
-    }
-
-    /* Typecheck the value */
-    if(value.hasValue && value.value.data) {
-        /* If the type-check failed write the same value again. The
-         * write-service tries to convert to the correct type... */
-        if(!compatibleValue(server, session, &node->dataType, node->valueRank,
-                            node->arrayDimensionsSize, node->arrayDimensions,
-                            &value.value, NULL)) {
-            retval = writeWithWriteValue(server, &node->nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], &value.value);
-        }
-
-        UA_DataValue_deleteMembers(&value);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                               "AddNodes: The value of of %.*s is incomatible with the "
-                               "variable definition", (int)nodeIdStr.length, nodeIdStr.data));
-        }
-    }
-
-    return retval;
-}
-
-/********************/
-/* Instantiate Node */
-/********************/
-
-static const UA_NodeId baseDataVariableType =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEDATAVARIABLETYPE}};
-static const UA_NodeId baseObjectType =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEOBJECTTYPE}};
-static const UA_NodeId hasTypeDefinition =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASTYPEDEFINITION}};
-
-/* Use attributes from the variable type wherever required. Reload the node if
- * changes were made. */
-static UA_StatusCode
-useVariableTypeAttributes(UA_Server *server, UA_Session *session,
-                          const UA_VariableNode **node_ptr,
-                          const UA_VariableTypeNode *vt) {
-    const UA_VariableNode *node = *node_ptr;
-    UA_Boolean modified = false;
-
-    /* If no value is set, see if the vt provides one and copy it. This needs to
-     * be done before copying the datatype from the vt, as setting the datatype
-     * triggers a typecheck. */
-    UA_DataValue orig;
-    UA_DataValue_init(&orig);
-    UA_StatusCode retval = readValueAttribute(server, session, node, &orig);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    if(orig.value.type) {
-        /* A value is present */
-        UA_DataValue_deleteMembers(&orig);
-    } else {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                             "AddNodes: No value given; Copy the value "
-                             "from the TypeDefinition");
-        UA_WriteValue v;
-        UA_WriteValue_init(&v);
-        retval = readValueAttribute(server, session, (const UA_VariableNode*)vt, &v.value);
-        if(retval == UA_STATUSCODE_GOOD && v.value.hasValue) {
-            v.nodeId = node->nodeId;
-            v.attributeId = UA_ATTRIBUTEID_VALUE;
-            retval = writeWithSession(server, session, &v);
-            modified = true;
-        }
-        UA_DataValue_deleteMembers(&v.value);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* If no datatype is given, use the datatype of the vt */
-    if(UA_NodeId_isNull(&node->dataType)) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session, "AddNodes: "
-                            "No datatype given; Copy the datatype attribute "
-                            "from the TypeDefinition");
-        UA_WriteValue v;
-        UA_WriteValue_init(&v);
-        v.nodeId = node->nodeId;
-        v.attributeId = UA_ATTRIBUTEID_DATATYPE;
-        v.value.hasValue = true;
-        UA_Variant_setScalar(&v.value.value, (void*)(uintptr_t)&vt->dataType,
-                             &UA_TYPES[UA_TYPES_NODEID]);
-        retval = writeWithSession(server, session, &v);
-        modified = true;
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* Use the ArrayDimensions of the vt */
-    if(node->arrayDimensionsSize == 0 && vt->arrayDimensionsSize > 0) {
-        UA_WriteValue v;
-        UA_WriteValue_init(&v);
-        v.nodeId = node->nodeId;
-        v.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
-        v.value.hasValue = true;
-        UA_Variant_setArray(&v.value.value, vt->arrayDimensions,
-                            vt->arrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]);
-        retval = writeWithSession(server, session, &v);
-        modified = true;
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* If the node was modified, update the pointer to the new version */
-    if(modified) {
-        const UA_VariableNode *updated = (const UA_VariableNode*)
-            UA_Nodestore_getNode(server->nsCtx, &node->nodeId);
-
-        if(!updated)
-            return UA_STATUSCODE_BADINTERNALERROR;
-
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)node);
-        *node_ptr = updated;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Search for an instance of "browseName" in node searchInstance. Used during
- * copyChildNodes to find overwritable/mergable nodes. Does not touch
- * outInstanceNodeId if no child is found. */
-static UA_StatusCode
-findChildByBrowsename(UA_Server *server, UA_Session *session,
-                      const UA_NodeId *searchInstance,
-                      const UA_QualifiedName *browseName,
-                      UA_NodeId *outInstanceNodeId) {
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = *searchInstance;
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES);
-    bd.includeSubtypes = true;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-    bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD;
-    bd.resultMask = UA_BROWSERESULTMASK_BROWSENAME;
-
-    UA_BrowseResult br;
-    UA_BrowseResult_init(&br);
-    UA_UInt32 maxrefs = 0;
-    Operation_Browse(server, session, &maxrefs, &bd, &br);
-    if(br.statusCode != UA_STATUSCODE_GOOD)
-        return br.statusCode;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        UA_ReferenceDescription *rd = &br.references[i];
-        if(rd->browseName.namespaceIndex == browseName->namespaceIndex &&
-           UA_String_equal(&rd->browseName.name, &browseName->name)) {
-            retval = UA_NodeId_copy(&rd->nodeId.nodeId, outInstanceNodeId);
-            break;
-        }
-    }
-
-    UA_BrowseResult_deleteMembers(&br);
-    return retval;
-}
-
-static const UA_NodeId mandatoryId =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_MODELLINGRULE_MANDATORY}};
-static const UA_NodeId hasModellingRuleId =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASMODELLINGRULE}};
-
-static UA_Boolean
-isMandatoryChild(UA_Server *server, UA_Session *session,
-                 const UA_NodeId *childNodeId) {
-    /* Get the child */
-    const UA_Node *child = UA_Nodestore_getNode(server->nsCtx, childNodeId);
-    if(!child)
-        return false;
-
-    /* Look for the reference making the child mandatory */
-    for(size_t i = 0; i < child->referencesSize; ++i) {
-        UA_NodeReferenceKind *refs = &child->references[i];
-        if(!UA_NodeId_equal(&hasModellingRuleId, &refs->referenceTypeId))
-            continue;
-        if(refs->isInverse)
-            continue;
-        for(size_t j = 0; j < refs->targetIdsSize; ++j) {
-            if(UA_NodeId_equal(&mandatoryId, &refs->targetIds[j].nodeId)) {
-                UA_Nodestore_releaseNode(server->nsCtx, child);
-                return true;
-            }
-        }
-    }
-
-    UA_Nodestore_releaseNode(server->nsCtx, child);
-    return false;
-}
-
-static UA_StatusCode
-copyAllChildren(UA_Server *server, UA_Session *session,
-                const UA_NodeId *source, const UA_NodeId *destination);
-
-static UA_StatusCode
-recursiveTypeCheckAddChildren(UA_Server *server, UA_Session *session,
-                              const UA_Node **node, const UA_Node *type);
-
-static void
-Operation_addReference(UA_Server *server, UA_Session *session, void *context,
-                       const UA_AddReferencesItem *item, UA_StatusCode *retval);
-
-static UA_StatusCode
-copyChild(UA_Server *server, UA_Session *session, const UA_NodeId *destinationNodeId,
-          const UA_ReferenceDescription *rd) {
-    /* Is there an existing child with the browsename? */
-    UA_NodeId existingChild = UA_NODEID_NULL;
-    UA_StatusCode retval = findChildByBrowsename(server, session, destinationNodeId,
-                                                 &rd->browseName, &existingChild);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Have a child with that browseName. Deep-copy missing members. */
-    if(!UA_NodeId_isNull(&existingChild)) {
-        if(rd->nodeClass == UA_NODECLASS_VARIABLE ||
-           rd->nodeClass == UA_NODECLASS_OBJECT)
-            retval = copyAllChildren(server, session, &rd->nodeId.nodeId, &existingChild);
-        UA_NodeId_deleteMembers(&existingChild);
-        return retval;
-    }
-
-    /* Is the child mandatory? If not, ask callback whether child should be instantiated.
-     * If not, skip. */
-    if(!isMandatoryChild(server, session, &rd->nodeId.nodeId)) {
-        if(!server->config.nodeLifecycle.createOptionalChild)
-            return UA_STATUSCODE_GOOD;
-
-        UA_UNLOCK(server->serviceMutex);
-        retval = server->config.nodeLifecycle.createOptionalChild(server,
-                                                                 &session->sessionId,
-                                                                 session->sessionHandle,
-                                                                 &rd->nodeId.nodeId,
-                                                                 destinationNodeId,
-                                                                 &rd->referenceTypeId);
-        UA_LOCK(server->serviceMutex);
-        if(retval == UA_FALSE) {
-            return UA_STATUSCODE_GOOD;
-        }
-    }
-
-    /* Child is a method -> create a reference */
-    if(rd->nodeClass == UA_NODECLASS_METHOD) {
-        UA_AddReferencesItem newItem;
-        UA_AddReferencesItem_init(&newItem);
-        newItem.sourceNodeId = *destinationNodeId;
-        newItem.referenceTypeId = rd->referenceTypeId;
-        newItem.isForward = true;
-        newItem.targetNodeId = rd->nodeId;
-        newItem.targetNodeClass = UA_NODECLASS_METHOD;
-        Operation_addReference(server, session, NULL, &newItem, &retval);
-        return retval;
-    }
-
-    /* Child is a variable or object */
-    if(rd->nodeClass == UA_NODECLASS_VARIABLE ||
-       rd->nodeClass == UA_NODECLASS_OBJECT) {
-        /* Make a copy of the node */
-        UA_Node *node;
-        retval = UA_Nodestore_getNodeCopy(server->nsCtx, &rd->nodeId.nodeId, &node);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        /* Remove the context of the copied node */
-        node->context = NULL;
-        node->constructed = false;
-
-        /* Reset the NodeId (random numeric id will be assigned in the nodestore) */
-        UA_NodeId_deleteMembers(&node->nodeId);
-        node->nodeId.namespaceIndex = destinationNodeId->namespaceIndex;
-
-        if (server->config.nodeLifecycle.generateChildNodeId) {
-            UA_UNLOCK(server->serviceMutex);
-            retval = server->config.nodeLifecycle.generateChildNodeId(server,
-                                                                      &session->sessionId, session->sessionHandle,
-                                                                      &rd->nodeId.nodeId,
-                                                                      destinationNodeId,
-                                                                      &rd->referenceTypeId,
-                                                                      &node->nodeId);
-            UA_LOCK(server->serviceMutex);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_Nodestore_deleteNode(server->nsCtx, node);
-                return retval;
-            }
-        }
-
-
-        /* Remove references, they are re-created from scratch in addnode_finish */
-        /* TODO: Be more clever in removing references that are re-added during
-         * addnode_finish. That way, we can call addnode_finish also on children that were
-         * manually added by the user during addnode_begin and addnode_finish. */
-        /* For now we keep all the modelling rule references and delete all others */
-        UA_NodeId modellingRuleReferenceId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE);
-        UA_Node_deleteReferencesSubset(node, 1, &modellingRuleReferenceId);
-
-        /* Add the node to the nodestore */
-        UA_NodeId newNodeId;
-        retval = UA_Nodestore_insertNode(server->nsCtx, node, &newNodeId);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        /* Add the node references */
-        retval = AddNode_addRefs(server, session, &newNodeId, destinationNodeId,
-                                 &rd->referenceTypeId, &rd->typeDefinition.nodeId);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_Nodestore_removeNode(server->nsCtx, &newNodeId);
-            return retval;
-        }
-
-        /* For the new child, recursively copy the members of the original. No
-         * typechecking is performed here. Assuming that the original is
-         * consistent. */
-        retval = copyAllChildren(server, session, &rd->nodeId.nodeId, &newNodeId);
-    }
-
-    return retval;
-}
-
-/* Copy any children of Node sourceNodeId to another node destinationNodeId. */
-static UA_StatusCode
-copyAllChildren(UA_Server *server, UA_Session *session,
-                const UA_NodeId *source, const UA_NodeId *destination) {
-    /* Browse to get all children of the source */
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = *source;
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES);
-    bd.includeSubtypes = true;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-    bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD;
-    bd.resultMask = UA_BROWSERESULTMASK_REFERENCETYPEID | UA_BROWSERESULTMASK_NODECLASS |
-        UA_BROWSERESULTMASK_BROWSENAME | UA_BROWSERESULTMASK_TYPEDEFINITION;
-
-    UA_BrowseResult br;
-    UA_BrowseResult_init(&br);
-    UA_UInt32 maxrefs = 0;
-    Operation_Browse(server, session, &maxrefs, &bd, &br);
-    if(br.statusCode != UA_STATUSCODE_GOOD)
-        return br.statusCode;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        UA_ReferenceDescription *rd = &br.references[i];
-        retval = copyChild(server, session, destination, rd);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    UA_BrowseResult_deleteMembers(&br);
-    return retval;
-}
-
-static UA_StatusCode
-addTypeChildren(UA_Server *server, UA_Session *session,
-                const UA_Node *node, const UA_Node *type) {
-    /* Get the hierarchy of the type and all its supertypes */
-    UA_NodeId *hierarchy = NULL;
-    size_t hierarchySize = 0;
-    UA_StatusCode retval = getParentTypeAndInterfaceHierarchy(server, &type->nodeId,
-                                                              &hierarchy, &hierarchySize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    UA_assert(hierarchySize < 1000);
-
-    /* Copy members of the type and supertypes (and instantiate them) */
-    for(size_t i = 0; i < hierarchySize; ++i) {
-        retval = copyAllChildren(server, session, &hierarchy[i], &node->nodeId);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-    }
-
-    UA_Array_delete(hierarchy, hierarchySize, &UA_TYPES[UA_TYPES_NODEID]);
-    return retval;
-}
-
-static UA_StatusCode
-addRef(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId,
-       const UA_NodeId *referenceTypeId, const UA_NodeId *parentNodeId,
-       UA_Boolean forward) {
-    UA_AddReferencesItem ref_item;
-    UA_AddReferencesItem_init(&ref_item);
-    ref_item.sourceNodeId = *nodeId;
-    ref_item.referenceTypeId = *referenceTypeId;
-    ref_item.isForward = forward;
-    ref_item.targetNodeId.nodeId = *parentNodeId;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    Operation_addReference(server, session, NULL, &ref_item, &retval);
-    return retval;
-}
-
-/************/
-/* Add Node */
-/************/
-
-static const UA_NodeId hasSubtype = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}};
-
-UA_StatusCode
-AddNode_addRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId,
-                const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
-                const UA_NodeId *typeDefinitionId) {
-    /* Get the node */
-    const UA_Node *type = NULL;
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId);
-    if(!node)
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-
-    /* Use the typeDefinition as parent for type-nodes */
-    if(node->nodeClass == UA_NODECLASS_VARIABLETYPE ||
-       node->nodeClass == UA_NODECLASS_OBJECTTYPE ||
-       node->nodeClass == UA_NODECLASS_REFERENCETYPE ||
-       node->nodeClass == UA_NODECLASS_DATATYPE) {
-        if(UA_NodeId_equal(referenceTypeId, &UA_NODEID_NULL))
-            referenceTypeId = &hasSubtype;
-        const UA_Node *parentNode = UA_Nodestore_getNode(server->nsCtx, parentNodeId);
-        if(parentNode) {
-            if(parentNode->nodeClass == node->nodeClass)
-                typeDefinitionId = parentNodeId;
-            UA_Nodestore_releaseNode(server->nsCtx, parentNode);
-        }
-    }
-
-    /* Check parent reference. Objects may have no parent. */
-    UA_StatusCode retval = checkParentReference(server, session, node->nodeClass,
-                                                parentNodeId, referenceTypeId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: The parent reference for %.*s is invalid "
-                            "with status code %s",
-                            (int)nodeIdStr.length, nodeIdStr.data,
-                            UA_StatusCode_name(retval)));
-        goto cleanup;
-    }
-
-    /* Replace empty typeDefinition with the most permissive default */
-    if((node->nodeClass == UA_NODECLASS_VARIABLE ||
-        node->nodeClass == UA_NODECLASS_OBJECT) &&
-       UA_NodeId_isNull(typeDefinitionId)) {
-        UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: No TypeDefinition for %.*s; Use the default "
-                            "TypeDefinition for the Variable/Object",
-                            (int)nodeIdStr.length, nodeIdStr.data));
-        if(node->nodeClass == UA_NODECLASS_VARIABLE)
-            typeDefinitionId = &baseDataVariableType;
-        else
-            typeDefinitionId = &baseObjectType;
-    }
-
-    /* Get the node type. There must be a typedefinition for variables, objects
-     * and type-nodes. See the above checks. */
-    if(!UA_NodeId_isNull(typeDefinitionId)) {
-        /* Get the type node */
-        type = UA_Nodestore_getNode(server->nsCtx, typeDefinitionId);
-        if(!type) {
-            UA_LOG_NODEID_WRAP(typeDefinitionId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Node type %.*s not found",
-                                (int)nodeIdStr.length, nodeIdStr.data));
-            retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-            goto cleanup;
-        }
-
-        UA_Boolean typeOk = false;
-        switch(node->nodeClass) {
-            case UA_NODECLASS_DATATYPE:
-                typeOk = type->nodeClass == UA_NODECLASS_DATATYPE;
-                break;
-            case UA_NODECLASS_METHOD:
-                typeOk = type->nodeClass == UA_NODECLASS_METHOD;
-                break;
-            case UA_NODECLASS_OBJECT:
-                typeOk = type->nodeClass == UA_NODECLASS_OBJECTTYPE;
-                break;
-            case UA_NODECLASS_OBJECTTYPE:
-                typeOk = type->nodeClass == UA_NODECLASS_OBJECTTYPE;
-                break;
-            case UA_NODECLASS_REFERENCETYPE:
-                typeOk = type->nodeClass == UA_NODECLASS_REFERENCETYPE;
-                break;
-            case UA_NODECLASS_VARIABLE:
-                typeOk = type->nodeClass == UA_NODECLASS_VARIABLETYPE;
-                break;
-            case UA_NODECLASS_VARIABLETYPE:
-                typeOk = type->nodeClass == UA_NODECLASS_VARIABLETYPE;
-                break;
-            case UA_NODECLASS_VIEW:
-                typeOk = type->nodeClass == UA_NODECLASS_VIEW;
-                break;
-            default:
-                typeOk = false;
-        }
-        if(!typeOk) {
-            UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Type for %.*s does not match node class",
-                                (int)nodeIdStr.length, nodeIdStr.data));
-            retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-            goto cleanup;
-        }
-
-        /* See if the type has the correct node class. For type-nodes, we know
-         * that type has the same nodeClass from checkParentReference. */
-        if(node->nodeClass == UA_NODECLASS_VARIABLE) {
-            if(((const UA_VariableTypeNode*)type)->isAbstract) {
-                /* Get subtypes of the parent reference types */
-                UA_NodeId *parentTypeHierarchy = NULL;
-                size_t parentTypeHierarchySize = 0;
-                retval |= referenceSubtypes(server, &parentReferences[0],
-                                            &parentTypeHierarchySize, &parentTypeHierarchy);
-                retval |= referenceSubtypes(server, &parentReferences[1],
-                                            &parentTypeHierarchySize, &parentTypeHierarchy);
-                if(retval != UA_STATUSCODE_GOOD) {
-                    UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize,
-                                    &UA_TYPES[UA_TYPES_NODEID]);
-                    goto cleanup;
-                }
-
-                /* Abstract variable is allowed if parent is a children of a
-                 * base data variable. An abstract variable may be part of an
-                 * object type which again is below BaseObjectType */
-                const UA_NodeId variableTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
-                const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
-                if(!isNodeInTree(server->nsCtx, parentNodeId, &variableTypes,
-                                 parentTypeHierarchy, parentTypeHierarchySize) &&
-                   !isNodeInTree(server->nsCtx, parentNodeId, &objectTypes,
-                                 parentTypeHierarchy, parentTypeHierarchySize)) {
-                    UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                        "AddNodes: Type of variable node %.*s must "
-                                        "be VariableType and not cannot be abstract",
-                                        (int)nodeIdStr.length, nodeIdStr.data));
-                    retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-                }
-                UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize,
-                                &UA_TYPES[UA_TYPES_NODEID]);
-                if(retval != UA_STATUSCODE_GOOD)
-                    goto cleanup;
-            }
-        }
-
-        if(node->nodeClass == UA_NODECLASS_OBJECT) {
-            if(((const UA_ObjectTypeNode*)type)->isAbstract) {
-                /* Get subtypes of the parent reference types */
-                UA_NodeId *parentTypeHierarchy = NULL;
-                size_t parentTypeHierarchySize = 0;
-                retval |= referenceSubtypes(server, &parentReferences[0],
-                                            &parentTypeHierarchySize, &parentTypeHierarchy);
-                retval |= referenceSubtypes(server, &parentReferences[1],
-                                            &parentTypeHierarchySize, &parentTypeHierarchy);
-                if(retval != UA_STATUSCODE_GOOD) {
-                    UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize,
-                                    &UA_TYPES[UA_TYPES_NODEID]);
-                    goto cleanup;
-                }
-
-                /* Object node created of an abstract ObjectType. Only allowed
-                 * if within BaseObjectType folder or if it's an event (subType of BaseEventType) */
-                const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
-                UA_Boolean isInBaseObjectType = isNodeInTree(server->nsCtx, parentNodeId, &objectTypes,
-                                                             parentTypeHierarchy, parentTypeHierarchySize);
-
-                const UA_NodeId eventTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-                UA_Boolean isInBaseEventType = isNodeInTree(server->nsCtx, &type->nodeId, &eventTypes, &hasSubtype, 1);
-
-                if(!isInBaseObjectType && !(isInBaseEventType && UA_NodeId_isNull(parentNodeId))) {
-                    UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                        "AddNodes: Type of object node %.*s must "
-                                        "be ObjectType and not be abstract",
-                                        (int)nodeIdStr.length, nodeIdStr.data));
-                    retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-                }
-                UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize,
-                                &UA_TYPES[UA_TYPES_NODEID]);
-                if(retval != UA_STATUSCODE_GOOD)
-                    goto cleanup;
-            }
-        }
-    }
-
-    /* Add reference to the parent */
-    if(!UA_NodeId_isNull(parentNodeId)) {
-        if(UA_NodeId_isNull(referenceTypeId)) {
-            UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Reference to parent of %.*s cannot be null",
-                                (int)nodeIdStr.length, nodeIdStr.data));
-            retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-            goto cleanup;
-        }
-
-        retval = addRef(server, session, &node->nodeId, referenceTypeId, parentNodeId, false);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Adding reference to parent of %.*s failed",
-                                (int)nodeIdStr.length, nodeIdStr.data));
-            goto cleanup;
-        }
-    }
-
-    /* Add a hasTypeDefinition reference */
-    if(node->nodeClass == UA_NODECLASS_VARIABLE ||
-       node->nodeClass == UA_NODECLASS_OBJECT) {
-        UA_assert(type != NULL); /* see above */
-        retval = addRef(server, session, &node->nodeId, &hasTypeDefinition, &type->nodeId, true);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                "AddNodes: Adding a reference to the type "
-                                "definition of %.*s failed with error code %s",
-                                (int)nodeIdStr.length, nodeIdStr.data,
-                                UA_StatusCode_name(retval)));
-        }
-    }
-
- cleanup:
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    if(type)
-        UA_Nodestore_releaseNode(server->nsCtx, type);
-    return retval;
-}
-
-/* Create the node and add it to the nodestore. But don't typecheck and add
- * references so far */
-UA_StatusCode
-AddNode_raw(UA_Server *server, UA_Session *session, void *nodeContext,
-            const UA_AddNodesItem *item, UA_NodeId *outNewNodeId) {
-    /* Do not check access for server */
-    if(session != &server->adminSession && server->config.accessControl.allowAddNode) {
-        UA_UNLOCK(server->serviceMutex)
-        if (!server->config.accessControl.allowAddNode(server, &server->config.accessControl,
-                                                       &session->sessionId, session->sessionHandle, item)) {
-            UA_LOCK(server->serviceMutex);
-            return UA_STATUSCODE_BADUSERACCESSDENIED;
-        }
-        UA_LOCK(server->serviceMutex);
-    }
-
-    /* Check the namespaceindex */
-    if(item->requestedNewNodeId.nodeId.namespaceIndex >= server->namespacesSize) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: Namespace invalid");
-        return UA_STATUSCODE_BADNODEIDINVALID;
-    }
-
-    if(item->nodeAttributes.encoding != UA_EXTENSIONOBJECT_DECODED &&
-       item->nodeAttributes.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: Node attributes invalid");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Create a node */
-    UA_Node *node = UA_Nodestore_newNode(server->nsCtx, item->nodeClass);
-    if(!node) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: Node could not create a node "
-                            "in the nodestore");
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-
-    /* Fill the node attributes */
-    node->context = nodeContext;
-    UA_StatusCode retval = UA_NodeId_copy(&item->requestedNewNodeId.nodeId, &node->nodeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto create_error;
-
-    retval = UA_QualifiedName_copy(&item->browseName, &node->browseName);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto create_error;
-
-    retval = UA_Node_setAttributes(node, item->nodeAttributes.content.decoded.data,
-                                   item->nodeAttributes.content.decoded.type);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto create_error;
-
-    /* Add the node to the nodestore */
-    retval = UA_Nodestore_insertNode(server->nsCtx, node, outNewNodeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "AddNodes: Node could not add the new node "
-                            "to the nodestore with error code %s",
-                            UA_StatusCode_name(retval));
-    return retval;
-
-create_error:
-    UA_LOG_INFO_SESSION(&server->config.logger, session,
-                        "AddNodes: Node could not create a node "
-                        "with error code %s", UA_StatusCode_name(retval));
-    UA_Nodestore_deleteNode(server->nsCtx, node);
-    return retval;
-}
-
-/* Prepare the node, then add it to the nodestore */
-static UA_StatusCode
-Operation_addNode_begin(UA_Server *server, UA_Session *session, void *nodeContext,
-                        const UA_AddNodesItem *item, const UA_NodeId *parentNodeId,
-                        const UA_NodeId *referenceTypeId, UA_NodeId *outNewNodeId) {
-    /* Create a temporary NodeId if none is returned */
-    UA_NodeId newId;
-    if(!outNewNodeId) {
-        UA_NodeId_init(&newId);
-        outNewNodeId = &newId;
-    }
-
-    /* Create the node and add it to the nodestore */
-    UA_StatusCode retval = AddNode_raw(server, session, nodeContext, item, outNewNodeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Typecheck and add references to parent and type definition */
-    retval = AddNode_addRefs(server, session, outNewNodeId, parentNodeId,
-                             referenceTypeId, &item->typeDefinition.nodeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        deleteNode(server, *outNewNodeId, true);
-
-    if(outNewNodeId == &newId)
-        UA_NodeId_deleteMembers(&newId);
-    return retval;
-}
-
-static UA_StatusCode
-recursiveTypeCheckAddChildren(UA_Server *server, UA_Session *session,
-                              const UA_Node **nodeptr, const UA_Node *type) {
-    UA_assert(type != NULL);
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    const UA_Node *node = *nodeptr;
-
-    /* Use attributes from the type. The value and value constraints are the
-     * same for the variable and variabletype attribute structs. */
-    if(node->nodeClass == UA_NODECLASS_VARIABLE ||
-       node->nodeClass == UA_NODECLASS_VARIABLETYPE) {
-        retval = useVariableTypeAttributes(server, session, (const UA_VariableNode**)nodeptr,
-                                           (const UA_VariableTypeNode*)type);
-        node = *nodeptr; /* If the node was replaced */
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                               "AddNodes: Using attributes for %.*s from the variable type "
-                               "failed with error code %s", (int)nodeIdStr.length,
-                               nodeIdStr.data, UA_StatusCode_name(retval)));
-            return retval;
-        }
-
-        /* Check NodeClass for 'hasSubtype'. UA_NODECLASS_VARIABLE not allowed to have subtype */
-        if((node->nodeClass == UA_NODECLASS_VARIABLE) && (UA_NodeId_equal(
-                &node->references->referenceTypeId, &hasSubtype))) {
-            UA_LOG_INFO_SESSION(&server->config.logger, session,
-                                            "AddNodes: VariableType not allowed to have HasSubType");
-            return UA_STATUSCODE_BADREFERENCENOTALLOWED;
-        }
-
-        /* Check if all attributes hold the constraints of the type now. The initial
-         * attributes must type-check. The constructor might change the attributes
-         * again. Then, the changes are type-checked by the normal write service. */
-        retval = typeCheckVariableNode(server, session, (const UA_VariableNode*)node,
-                                       (const UA_VariableTypeNode*)type);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                               "AddNodes: Type-checking the variable node %.*s "
-                               "failed with error code %s", (int)nodeIdStr.length,
-                               nodeIdStr.data, UA_StatusCode_name(retval)));
-            return retval;
-        }
-    }
-
-    /* Add (mandatory) child nodes from the type definition */
-    if(node->nodeClass == UA_NODECLASS_VARIABLE ||
-       node->nodeClass == UA_NODECLASS_OBJECT) {
-        retval = addTypeChildren(server, session, node, type);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                               "AddNodes: Adding child nodes of  %.*s failed with error code %s",
-                               (int)nodeIdStr.length, nodeIdStr.data, UA_StatusCode_name(retval)));
-        }
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-findDefaultInstanceBrowseNameNode(UA_Server *server,
-                    UA_NodeId startingNode, UA_NodeId *foundId){
-
-    UA_NodeId_init(foundId);
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = UA_QUALIFIEDNAME(0, "DefaultInstanceBrowseName");
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = startingNode;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-    UA_BrowsePathResult bpr =
-            translateBrowsePathToNodeIds(server, &bp);
-    UA_StatusCode retval = bpr.statusCode;
-    if (retval == UA_STATUSCODE_GOOD &&
-        bpr.targetsSize > 0) {
-        retval = UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, foundId);
-    }
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return retval;
-}
-
-/* Check if we got a valid browse name for the new node.
- * For object nodes the BrowseName may only be null if the parent type has a
- * 'DefaultInstanceBrowseName' property.
- * */
-static UA_StatusCode
-checkValidBrowseName(UA_Server *server, UA_Session *session,
-                     const UA_Node *node, const UA_Node *type) {
-
-    UA_assert(type != NULL);
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    if(node->nodeClass != UA_NODECLASS_OBJECT) {
-        /* nodes other than Objects must have a browseName */
-        if (UA_QualifiedName_isNull(&node->browseName))
-            return UA_STATUSCODE_BADBROWSENAMEINVALID;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* If the object node already has a browse name we are done here. */
-    if(!UA_QualifiedName_isNull(&node->browseName))
-        return UA_STATUSCODE_GOOD;
-
-    /* at this point we have an object with an empty browse name.
-     * Check the type node if it has a DefaultInstanceBrowseName property
-     */
-
-    UA_NodeId defaultBrowseNameNode;
-    retval = findDefaultInstanceBrowseNameNode(server, type->nodeId, &defaultBrowseNameNode);
-    if (retval != UA_STATUSCODE_GOOD) {
-        if (retval == UA_STATUSCODE_BADNOMATCH)
-            /* the DefaultBrowseName property is not found, return the corresponding status code */
-            return UA_STATUSCODE_BADBROWSENAMEINVALID;
-        return retval;
-    }
-
-    UA_Variant defaultBrowseName;
-    retval = readWithReadValue(server, &defaultBrowseNameNode, UA_ATTRIBUTEID_VALUE, &defaultBrowseName);
-    if (retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_QualifiedName *defaultValue = (UA_QualifiedName *) defaultBrowseName.data;
-    retval = writeWithWriteValue(server, &node->nodeId, UA_ATTRIBUTEID_BROWSENAME, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], defaultValue);
-    UA_Variant_clear(&defaultBrowseName);
-
-    return retval;
-}
-
-/* Construct children first */
-static UA_StatusCode
-recursiveCallConstructors(UA_Server *server, UA_Session *session,
-                          const UA_Node *node, const UA_Node *type) {
-    if(node->constructed)
-        return UA_STATUSCODE_GOOD;
-    
-    /* Construct the children */
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = node->nodeId;
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES);
-    bd.includeSubtypes = true;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-
-    UA_BrowseResult br;
-    UA_BrowseResult_init(&br);
-    UA_UInt32 maxrefs = 0;
-    Operation_Browse(server, session, &maxrefs, &bd, &br);
-    if(br.statusCode != UA_STATUSCODE_GOOD)
-        return br.statusCode;
-
-    /* Call the constructor for every unconstructed node */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        UA_ReferenceDescription *rd = &br.references[i];
-        const UA_Node *target = UA_Nodestore_getNode(server->nsCtx, &rd->nodeId.nodeId);
-        if(!target)
-            continue;
-        if(target->constructed) {
-            UA_Nodestore_releaseNode(server->nsCtx, target);
-            continue;
-        }
-
-        const UA_Node *targetType = NULL;
-        if(node->nodeClass == UA_NODECLASS_VARIABLE ||
-           node->nodeClass == UA_NODECLASS_OBJECT) {
-            targetType = getNodeType(server, target);
-            if(!targetType) {
-                UA_Nodestore_releaseNode(server->nsCtx, target);
-                retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-                break;
-            }
-        }
-        retval = recursiveCallConstructors(server, session, target, targetType);
-        UA_Nodestore_releaseNode(server->nsCtx, target);
-        if(targetType)
-            UA_Nodestore_releaseNode(server->nsCtx, targetType);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-    }
-
-    UA_BrowseResult_deleteMembers(&br);
-
-    /* If a child could not be constructed or the node is already constructed */
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Get the node type constructor */
-    const UA_NodeTypeLifecycle *lifecycle = NULL;
-    if(type && node->nodeClass == UA_NODECLASS_OBJECT) {
-        const UA_ObjectTypeNode *ot = (const UA_ObjectTypeNode*)type;
-        lifecycle = &ot->lifecycle;
-    } else if(type && node->nodeClass == UA_NODECLASS_VARIABLE) {
-        const UA_VariableTypeNode *vt = (const UA_VariableTypeNode*)type;
-        lifecycle = &vt->lifecycle;
-    }
-
-    /* Call the global constructor */
-    void *context = node->context;
-    if(server->config.nodeLifecycle.constructor) {
-        UA_UNLOCK(server->serviceMutex);
-        retval = server->config.nodeLifecycle.constructor(server, &session->sessionId,
-                                                          session->sessionHandle,
-                                                          &node->nodeId, &context);
-        UA_LOCK(server->serviceMutex);
-    }
-
-    /* Call the type constructor */
-    if(retval == UA_STATUSCODE_GOOD && lifecycle && lifecycle->constructor) {
-        UA_UNLOCK(server->serviceMutex)
-        retval = lifecycle->constructor(server, &session->sessionId,
-                                        session->sessionHandle, &type->nodeId,
-                                        type->context, &node->nodeId, &context);
-        UA_LOCK(server->serviceMutex);
-    }
-
-    if(retval != UA_STATUSCODE_GOOD)
-        goto fail1;
-
-    /* Set the context *and* mark the node as constructed */
-    if(retval == UA_STATUSCODE_GOOD)
-        retval = UA_Server_editNode(server, &server->adminSession, &node->nodeId,
-                                    (UA_EditNodeCallback)setConstructedNodeContext,
-                                    context);
-
-    /* All good, return */
-    if(retval == UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Fail. Call the destructors. */
-    if(lifecycle && lifecycle->destructor) {
-        UA_UNLOCK(server->serviceMutex);
-        lifecycle->destructor(server, &session->sessionId,
-                              session->sessionHandle, &type->nodeId,
-                              type->context, &node->nodeId, &context);
-        UA_LOCK(server->serviceMutex)
-    }
-
-
- fail1:
-    if(server->config.nodeLifecycle.destructor) {
-        UA_UNLOCK(server->serviceMutex);
-        server->config.nodeLifecycle.destructor(server, &session->sessionId,
-                                                session->sessionHandle,
-                                                &node->nodeId, context);
-        UA_LOCK(server->serviceMutex);
-    }
-
-    return retval;
-}
-
-static void
-recursiveDeconstructNode(UA_Server *server, UA_Session *session,
-                         size_t hierarchicalReferencesSize,
-                         UA_ExpandedNodeId *hierarchicalReferences,
-                         const UA_Node *node);
-
-static void
-recursiveDeleteNode(UA_Server *server, UA_Session *session,
-                    size_t hierarchicalReferencesSize,
-                    UA_ExpandedNodeId *hierarchicalReferences,
-                    const UA_Node *node, UA_Boolean removeTargetRefs);
-
-/* Children, references, type-checking, constructors. */
-UA_StatusCode
-AddNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    /* Get the node */
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId);
-    if(!node)
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-
-    const UA_Node *type = NULL;
-
-    /* Instantiate variables and objects */
-    if(node->nodeClass == UA_NODECLASS_VARIABLE ||
-       node->nodeClass == UA_NODECLASS_VARIABLETYPE ||
-       node->nodeClass == UA_NODECLASS_OBJECT) {
-        /* Get the type node */
-        type = getNodeType(server, node);
-        if(!type) {
-            if(server->bootstrapNS0)
-                goto constructor;
-            UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                               "AddNodes: Node type for %.*s not found",
-                               (int)nodeIdStr.length, nodeIdStr.data));
-            retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
-            goto cleanup;
-        }
-
-        retval = checkValidBrowseName(server, session, node, type);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-
-        retval = recursiveTypeCheckAddChildren(server, session, &node, type);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-    }
-
-    /* Call the constructor(s) */
- constructor:
-    retval = recursiveCallConstructors(server, session, node, type);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session,
-                           "AddNodes: Calling the node constructor(s) of %.*s failed "
-                           "with status code %s", (int)nodeIdStr.length,
-                           nodeIdStr.data, UA_StatusCode_name(retval)));
-    }
-
- cleanup:
-    if(type)
-        UA_Nodestore_releaseNode(server->nsCtx, type);
-    if(retval != UA_STATUSCODE_GOOD) {
-        recursiveDeconstructNode(server, session, 0, NULL, node);
-        recursiveDeleteNode(server, session, 0, NULL, node, true);
-    }
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    return retval;
-}
-
-static void
-Operation_addNode(UA_Server *server, UA_Session *session, void *nodeContext,
-                  const UA_AddNodesItem *item, UA_AddNodesResult *result) {
-    result->statusCode =
-        Operation_addNode_begin(server, session, nodeContext, item, &item->parentNodeId.nodeId,
-                                &item->referenceTypeId, &result->addedNodeId);
-    if(result->statusCode != UA_STATUSCODE_GOOD)
-        return;
-
-    /* AddNodes_finish */
-    result->statusCode = AddNode_finish(server, session, &result->addedNodeId);
-
-    /* If finishing failed, the node was deleted */
-    if(result->statusCode != UA_STATUSCODE_GOOD)
-        UA_NodeId_deleteMembers(&result->addedNodeId);
-}
-
-void
-Service_AddNodes(UA_Server *server, UA_Session *session,
-                 const UA_AddNodesRequest *request,
-                 UA_AddNodesResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing AddNodesRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxNodesPerNodeManagement != 0 &&
-       request->nodesToAddSize > server->config.maxNodesPerNodeManagement) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                                           (UA_ServiceOperation)Operation_addNode, NULL,
-                                           &request->nodesToAddSize, &UA_TYPES[UA_TYPES_ADDNODESITEM],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_ADDNODESRESULT]);
-}
-
-UA_StatusCode
-addNode(UA_Server *server, const UA_NodeClass nodeClass,
-        const UA_NodeId *requestedNewNodeId,
-        const UA_NodeId *parentNodeId,
-        const UA_NodeId *referenceTypeId,
-        const UA_QualifiedName browseName,
-        const UA_NodeId *typeDefinition,
-        const UA_NodeAttributes *attr,
-        const UA_DataType *attributeType,
-        void *nodeContext, UA_NodeId *outNewNodeId) {
-    /* Create the AddNodesItem */
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.nodeClass = nodeClass;
-    item.requestedNewNodeId.nodeId = *requestedNewNodeId;
-    item.browseName = browseName;
-    item.parentNodeId.nodeId = *parentNodeId;
-    item.referenceTypeId = *referenceTypeId;
-    item.typeDefinition.nodeId = *typeDefinition;
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.type = attributeType;
-    item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr;
-
-    /* Call the normal addnodes service */
-    UA_AddNodesResult result;
-    UA_AddNodesResult_init(&result);
-    Operation_addNode(server, &server->adminSession, nodeContext, &item, &result);
-    if(outNewNodeId)
-        *outNewNodeId = result.addedNodeId;
-    else
-        UA_NodeId_deleteMembers(&result.addedNodeId);
-    return result.statusCode;
-}
-
-UA_StatusCode
-__UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass,
-                    const UA_NodeId *requestedNewNodeId,
-                    const UA_NodeId *parentNodeId,
-                    const UA_NodeId *referenceTypeId,
-                    const UA_QualifiedName browseName,
-                    const UA_NodeId *typeDefinition,
-                    const UA_NodeAttributes *attr,
-                    const UA_DataType *attributeType,
-                    void *nodeContext, UA_NodeId *outNewNodeId) {
-    UA_LOCK(server->serviceMutex)
-    UA_StatusCode  reval = addNode(server, nodeClass, requestedNewNodeId, parentNodeId,
-            referenceTypeId, browseName, typeDefinition, attr, attributeType, nodeContext, outNewNodeId);
-    UA_UNLOCK(server->serviceMutex);
-    return reval;
-}
-
-UA_StatusCode
-UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass,
-                        const UA_NodeId requestedNewNodeId,
-                        const UA_NodeId parentNodeId,
-                        const UA_NodeId referenceTypeId,
-                        const UA_QualifiedName browseName,
-                        const UA_NodeId typeDefinition,
-                        const void *attr, const UA_DataType *attributeType,
-                        void *nodeContext, UA_NodeId *outNewNodeId) {
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.nodeClass = nodeClass;
-    item.requestedNewNodeId.nodeId = requestedNewNodeId;
-    item.browseName = browseName;
-    item.typeDefinition.nodeId = typeDefinition;
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.type = attributeType;
-    item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr;
-
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = Operation_addNode_begin(server, &server->adminSession, nodeContext, &item,
-                                   &parentNodeId, &referenceTypeId, outNewNodeId);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-UA_StatusCode
-UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId) {
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = AddNode_finish(server, &server->adminSession, &nodeId);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-/****************/
-/* Delete Nodes */
-/****************/
-
-static void
-Operation_deleteReference(UA_Server *server, UA_Session *session, void *context,
-                          const UA_DeleteReferencesItem *item, UA_StatusCode *retval);
-
-/* Remove references to this node (in the other nodes) */
-static void
-removeIncomingReferences(UA_Server *server, UA_Session *session,
-                         const UA_Node *node) {
-    UA_DeleteReferencesItem item;
-    UA_DeleteReferencesItem_init(&item);
-    item.targetNodeId.nodeId = node->nodeId;
-    item.deleteBidirectional = false;
-    UA_StatusCode dummy;
-    for(size_t i = 0; i < node->referencesSize; ++i) {
-        UA_NodeReferenceKind *refs = &node->references[i];
-        item.isForward = refs->isInverse;
-        item.referenceTypeId = refs->referenceTypeId;
-        for(size_t j = 0; j < refs->targetIdsSize; ++j) {
-            item.sourceNodeId = refs->targetIds[j].nodeId;
-            Operation_deleteReference(server, session, NULL, &item, &dummy);
-        }
-    }
-}
-
-/* A node can only be deleted if it has at most one incoming hierarchical
- * reference. If hierarchicalReferences is NULL, always remove. */
-static UA_Boolean
-multipleHierarchies(size_t hierarchicalRefsSize, UA_ExpandedNodeId *hierarchicalRefs,
-                    const UA_Node *node) {
-    if(!hierarchicalRefs)
-        return false;
-
-    size_t incomingRefs = 0;
-    for(size_t i = 0; i < node->referencesSize; i++) {
-        const UA_NodeReferenceKind *k = &node->references[i];
-        if(!k->isInverse)
-            continue;
-
-        UA_Boolean hierarchical = false;
-        for(size_t j = 0; j < hierarchicalRefsSize; j++) {
-            if(UA_NodeId_equal(&hierarchicalRefs[j].nodeId,
-                               &k->referenceTypeId)) {
-                hierarchical = true;
-                break;
-            }
-        }
-        if(!hierarchical)
-            continue;
-
-        incomingRefs += k->targetIdsSize;
-        if(incomingRefs > 1)
-            return true;
-    }
-
-    return false;
-}
-
-/* Recursively call the destructors of this node and all child nodes.
- * Deconstructs the parent before its children. */
-static void
-recursiveDeconstructNode(UA_Server *server, UA_Session *session,
-                         size_t hierarchicalRefsSize,
-                         UA_ExpandedNodeId *hierarchicalRefs,
-                         const UA_Node *node) {
-    /* Was the constructor called for the node? */
-    if(!node->constructed)
-        return;
-
-    /* Call the type-level destructor */
-    void *context = node->context; /* No longer needed after this function */
-    if(node->nodeClass == UA_NODECLASS_OBJECT ||
-       node->nodeClass == UA_NODECLASS_VARIABLE) {
-        const UA_Node *type = getNodeType(server, node);
-        if(type) {
-            const UA_NodeTypeLifecycle *lifecycle;
-            if(node->nodeClass == UA_NODECLASS_OBJECT)
-                lifecycle = &((const UA_ObjectTypeNode*)type)->lifecycle;
-            else
-                lifecycle = &((const UA_VariableTypeNode*)type)->lifecycle;
-            if(lifecycle->destructor)
-                lifecycle->destructor(server,
-                                      &session->sessionId, session->sessionHandle,
-                                      &type->nodeId, type->context,
-                                      &node->nodeId, &context);
-            UA_Nodestore_releaseNode(server->nsCtx, type);
-        }
-    }
-
-    /* Call the global destructor */
-    if(server->config.nodeLifecycle.destructor)
-        server->config.nodeLifecycle.destructor(server, &session->sessionId,
-                                                session->sessionHandle,
-                                                &node->nodeId, context);
-
-    /* Set the constructed flag to false */
-    UA_Server_editNode(server, &server->adminSession, &node->nodeId,
-                       (UA_EditNodeCallback)setDeconstructedNode, context);
-
-    /* Browse to get all children of the node */
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = node->nodeId;
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES);
-    bd.includeSubtypes = true;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-
-    UA_BrowseResult br;
-    UA_BrowseResult_init(&br);
-    UA_UInt32 maxrefs = 0;
-    Operation_Browse(server, session, &maxrefs, &bd, &br);
-    if(br.statusCode != UA_STATUSCODE_GOOD)
-        return;
-
-    /* Deconstruct every child node */
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        UA_ReferenceDescription *rd = &br.references[i];
-        const UA_Node *child = UA_Nodestore_getNode(server->nsCtx, &rd->nodeId.nodeId);
-        if(!child)
-            continue;
-        /* Only delete child nodes that have no other parent */
-        if(!multipleHierarchies(hierarchicalRefsSize, hierarchicalRefs, child))
-            recursiveDeconstructNode(server, session, hierarchicalRefsSize,
-                                     hierarchicalRefs, child);
-        UA_Nodestore_releaseNode(server->nsCtx, child);
-    }
-
-    UA_BrowseResult_deleteMembers(&br);
-}
-
-static void
-recursiveDeleteNode(UA_Server *server, UA_Session *session,
-                    size_t hierarchicalRefsSize,
-                    UA_ExpandedNodeId *hierarchicalRefs,
-                    const UA_Node *node, UA_Boolean removeTargetRefs) {
-    /* Browse to get all children of the node */
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = node->nodeId;
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES);
-    bd.includeSubtypes = true;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-
-    UA_BrowseResult br;
-    UA_BrowseResult_init(&br);
-    UA_UInt32 maxrefs = 0;
-    Operation_Browse(server, session, &maxrefs, &bd, &br);
-    if(br.statusCode != UA_STATUSCODE_GOOD)
-        return;
-
-    /* Remove every child */
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        UA_ReferenceDescription *rd = &br.references[i];
-        /* Check for self-reference to avoid endless loop */
-        if(UA_NodeId_equal(&node->nodeId, &rd->nodeId.nodeId))
-            continue;
-        const UA_Node *child = UA_Nodestore_getNode(server->nsCtx, &rd->nodeId.nodeId);
-        if(!child)
-            continue;
-        /* Only delete child nodes that have no other parent */
-        if(!multipleHierarchies(hierarchicalRefsSize, hierarchicalRefs, child))
-            recursiveDeleteNode(server, session, hierarchicalRefsSize,
-                                hierarchicalRefs, child, true);
-        UA_Nodestore_releaseNode(server->nsCtx, child);
-    }
-
-    UA_BrowseResult_deleteMembers(&br);
-
-    if(removeTargetRefs)
-        removeIncomingReferences(server, session, node);
-
-    UA_Nodestore_removeNode(server->nsCtx, &node->nodeId);
-}
-
-static void
-deleteNodeOperation(UA_Server *server, UA_Session *session, void *context,
-                    const UA_DeleteNodesItem *item, UA_StatusCode *result) {
-    /* Do not check access for server */
-    if(session != &server->adminSession && server->config.accessControl.allowDeleteNode) {
-        UA_UNLOCK(server->serviceMutex);
-        if ( !server->config.accessControl.allowDeleteNode(server, &server->config.accessControl,
-                &session->sessionId, session->sessionHandle, item)) {
-            UA_LOCK(server->serviceMutex);
-            *result = UA_STATUSCODE_BADUSERACCESSDENIED;
-            return;
-        }
-        UA_LOCK(server->serviceMutex);
-    }
-
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &item->nodeId);
-    if(!node) {
-        *result = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        return;
-    }
-
-    if(UA_Node_hasSubTypeOrInstances(node)) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "Delete Nodes: Cannot delete a type node "
-                            "with active instances or subtypes");
-        UA_Nodestore_releaseNode(server->nsCtx, node);
-        *result = UA_STATUSCODE_BADINTERNALERROR;
-        return;
-    }
-
-    /* TODO: Check if the information model consistency is violated */
-    /* TODO: Check if the node is a mandatory child of a parent */
-
-    /* A node can be referenced with hierarchical references from several
-     * parents in the information model. (But not in a circular way.) The
-     * hierarchical references are checked to see if a node can be deleted.
-     * Getting the type hierarchy can fail in case of low RAM. In that case the
-     * nodes are always deleted. */
-    UA_ExpandedNodeId *hierarchicalRefs = NULL;
-    size_t hierarchicalRefsSize = 0;
-    UA_NodeId hr = UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES);
-    browseRecursive(server, 1, &hr, 1, &subtypeId, UA_BROWSEDIRECTION_FORWARD, true,
-                    &hierarchicalRefsSize, &hierarchicalRefs);
-    if(!hierarchicalRefs) {
-        UA_LOG_WARNING_SESSION(&server->config.logger, session,
-                               "Delete Nodes: Cannot test for hierarchical "
-                               "references. Deleting the node and all child nodes.");
-    }
-    recursiveDeconstructNode(server, session, hierarchicalRefsSize, hierarchicalRefs, node);
-    recursiveDeleteNode(server, session, hierarchicalRefsSize, hierarchicalRefs, node,
-                        item->deleteTargetReferences);
-    UA_Array_delete(hierarchicalRefs, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-}
-
-void Service_DeleteNodes(UA_Server *server, UA_Session *session,
-                         const UA_DeleteNodesRequest *request,
-                         UA_DeleteNodesResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing DeleteNodesRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxNodesPerNodeManagement != 0 &&
-       request->nodesToDeleteSize > server->config.maxNodesPerNodeManagement) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                                           (UA_ServiceOperation)deleteNodeOperation,
-                                           NULL, &request->nodesToDeleteSize,
-                                           &UA_TYPES[UA_TYPES_DELETENODESITEM],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-UA_StatusCode
-UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId,
-                     UA_Boolean deleteReferences) {
-    UA_LOCK(server->serviceMutex)
-    UA_StatusCode retval = deleteNode(server, nodeId, deleteReferences);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-UA_StatusCode
-deleteNode(UA_Server *server, const UA_NodeId nodeId,
-                     UA_Boolean deleteReferences) {
-    UA_DeleteNodesItem item;
-    item.deleteTargetReferences = deleteReferences;
-    item.nodeId = nodeId;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    deleteNodeOperation(server, &server->adminSession, NULL, &item, &retval);
-    return retval;
-}
-
-/******************/
-/* Add References */
-/******************/
-
-static UA_StatusCode
-addOneWayReference(UA_Server *server, UA_Session *session,
-             UA_Node *node, const UA_AddReferencesItem *item) {
-    return UA_Node_addReference(node, item);
-}
-
-static UA_StatusCode
-deleteOneWayReference(UA_Server *server, UA_Session *session, UA_Node *node,
-                      const UA_DeleteReferencesItem *item) {
-    return UA_Node_deleteReference(node, item);
-}
-
-static void
-Operation_addReference(UA_Server *server, UA_Session *session, void *context,
-                       const UA_AddReferencesItem *item, UA_StatusCode *retval) {
-    /* Do not check access for server */
-    if(session != &server->adminSession && server->config.accessControl.allowAddReference) {
-        UA_UNLOCK(server->serviceMutex);
-        if (!server->config.accessControl.
-                allowAddReference(server, &server->config.accessControl,
-                                  &session->sessionId, session->sessionHandle, item)) {
-            UA_LOCK(server->serviceMutex);
-            *retval = UA_STATUSCODE_BADUSERACCESSDENIED;
-            return;
-        }
-        UA_LOCK(server->serviceMutex);
-    }
-
-    /* Currently no expandednodeids are allowed */
-    if(item->targetServerUri.length > 0) {
-        *retval = UA_STATUSCODE_BADNOTIMPLEMENTED;
-        return;
-    }
-
-    /* Add the first direction */
-    *retval = UA_Server_editNode(server, session, &item->sourceNodeId,
-                                 (UA_EditNodeCallback)addOneWayReference,
-                                 /* cast away const because callback uses const anyway */
-                                 (UA_AddReferencesItem *)(uintptr_t)item);
-    UA_Boolean firstExisted = false;
-    if(*retval == UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED) {
-        *retval = UA_STATUSCODE_GOOD;
-        firstExisted = true;
-    } else if(*retval != UA_STATUSCODE_GOOD)
-        return;
-
-    /* Add the second direction */
-    UA_AddReferencesItem secondItem;
-    UA_AddReferencesItem_init(&secondItem);
-    secondItem.sourceNodeId = item->targetNodeId.nodeId;
-    secondItem.referenceTypeId = item->referenceTypeId;
-    secondItem.isForward = !item->isForward;
-    secondItem.targetNodeId.nodeId = item->sourceNodeId;
-    /* keep default secondItem.targetNodeClass = UA_NODECLASS_UNSPECIFIED */
-    *retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId,
-                                 (UA_EditNodeCallback)addOneWayReference, &secondItem);
-
-    /* remove reference if the second direction failed */
-    UA_Boolean secondExisted = false;
-    if(*retval == UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED) {
-        *retval = UA_STATUSCODE_GOOD;
-        secondExisted = true;
-    } else if(*retval != UA_STATUSCODE_GOOD && !firstExisted) {
-        UA_DeleteReferencesItem deleteItem;
-        deleteItem.sourceNodeId = item->sourceNodeId;
-        deleteItem.referenceTypeId = item->referenceTypeId;
-        deleteItem.isForward = item->isForward;
-        deleteItem.targetNodeId = item->targetNodeId;
-        deleteItem.deleteBidirectional = false;
-        /* ignore returned status code */
-        UA_Server_editNode(server, session, &item->sourceNodeId,
-                           (UA_EditNodeCallback)deleteOneWayReference, &deleteItem);
-    }
-
-    /* Calculate common duplicate reference not allowed result and set bad result
-     * if BOTH directions already existed */
-    if(firstExisted && secondExisted)
-        *retval = UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED;
-}
-
-void Service_AddReferences(UA_Server *server, UA_Session *session,
-                           const UA_AddReferencesRequest *request,
-                           UA_AddReferencesResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing AddReferencesRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxNodesPerNodeManagement != 0 &&
-       request->referencesToAddSize > server->config.maxNodesPerNodeManagement) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                                           (UA_ServiceOperation)Operation_addReference,
-                                           NULL, &request->referencesToAddSize,
-                                           &UA_TYPES[UA_TYPES_ADDREFERENCESITEM],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-UA_StatusCode
-UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
-                       const UA_NodeId refTypeId,
-                       const UA_ExpandedNodeId targetId,
-                       UA_Boolean isForward) {
-    UA_AddReferencesItem item;
-    UA_AddReferencesItem_init(&item);
-    item.sourceNodeId = sourceId;
-    item.referenceTypeId = refTypeId;
-    item.isForward = isForward;
-    item.targetNodeId = targetId;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_LOCK(server->serviceMutex);
-    Operation_addReference(server, &server->adminSession, NULL, &item, &retval);
-    UA_UNLOCK(server->serviceMutex)
-    return retval;
-}
-
-/*********************/
-/* Delete References */
-/*********************/
-
-static void
-Operation_deleteReference(UA_Server *server, UA_Session *session, void *context,
-                          const UA_DeleteReferencesItem *item, UA_StatusCode *retval) {
-    /* Do not check access for server */
-    if(session != &server->adminSession && server->config.accessControl.allowDeleteReference) {
-        UA_UNLOCK(server->serviceMutex);
-        if (!server->config.accessControl.
-                allowDeleteReference(server, &server->config.accessControl,
-                                     &session->sessionId, session->sessionHandle, item)){
-            UA_LOCK(server->serviceMutex);
-            *retval = UA_STATUSCODE_BADUSERACCESSDENIED;
-            return;
-        }
-        UA_LOCK(server->serviceMutex)
-    }
-
-    // TODO: Check consistency constraints, remove the references.
-    *retval = UA_Server_editNode(server, session, &item->sourceNodeId,
-                                 (UA_EditNodeCallback)deleteOneWayReference,
-                                 /* cast away const qualifier because callback uses it anyway */
-                                 (UA_DeleteReferencesItem *)(uintptr_t)item);
-    if(*retval != UA_STATUSCODE_GOOD)
-        return;
-
-    if(!item->deleteBidirectional || item->targetNodeId.serverIndex != 0)
-        return;
-
-    UA_DeleteReferencesItem secondItem;
-    UA_DeleteReferencesItem_init(&secondItem);
-    secondItem.isForward = !item->isForward;
-    secondItem.sourceNodeId = item->targetNodeId.nodeId;
-    secondItem.targetNodeId.nodeId = item->sourceNodeId;
-    secondItem.referenceTypeId = item->referenceTypeId;
-    *retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId,
-                                 (UA_EditNodeCallback)deleteOneWayReference,
-                                 &secondItem);
-}
-
-void
-Service_DeleteReferences(UA_Server *server, UA_Session *session,
-                         const UA_DeleteReferencesRequest *request,
-                         UA_DeleteReferencesResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing DeleteReferencesRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    if(server->config.maxNodesPerNodeManagement != 0 &&
-       request->referencesToDeleteSize > server->config.maxNodesPerNodeManagement) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                                           (UA_ServiceOperation)Operation_deleteReference,
-                                           NULL, &request->referencesToDeleteSize,
-                                           &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-UA_StatusCode
-UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId,
-                          const UA_NodeId referenceTypeId, UA_Boolean isForward,
-                          const UA_ExpandedNodeId targetNodeId,
-                          UA_Boolean deleteBidirectional) {
-    UA_DeleteReferencesItem item;
-    item.sourceNodeId = sourceNodeId;
-    item.referenceTypeId = referenceTypeId;
-    item.isForward = isForward;
-    item.targetNodeId = targetNodeId;
-    item.deleteBidirectional = deleteBidirectional;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_LOCK(server->serviceMutex);
-    Operation_deleteReference(server, &server->adminSession, NULL, &item, &retval);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-/**********************/
-/* Set Value Callback */
-/**********************/
-
-static UA_StatusCode
-setValueCallback(UA_Server *server, UA_Session *session,
-                 UA_VariableNode *node, const UA_ValueCallback *callback) {
-    if(node->nodeClass != UA_NODECLASS_VARIABLE)
-        return UA_STATUSCODE_BADNODECLASSINVALID;
-    node->value.data.callback = *callback;
-    return UA_STATUSCODE_GOOD;
-}
-
-
-
-UA_StatusCode
-UA_Server_setVariableNode_valueCallback(UA_Server *server,
-                                        const UA_NodeId nodeId,
-                                        const UA_ValueCallback callback) {
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = UA_Server_editNode(server, &server->adminSession, &nodeId,
-                                              (UA_EditNodeCallback)setValueCallback,
-                                              /* cast away const because callback uses const anyway */
-                                              (UA_ValueCallback *)(uintptr_t) &callback);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-/***************************************************/
-/* Special Handling of Variables with Data Sources */
-/***************************************************/
-
-UA_StatusCode
-UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                                    const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
-                                    const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
-                                    const UA_VariableAttributes attr, const UA_DataSource dataSource,
-                                    void *nodeContext, UA_NodeId *outNewNodeId) {
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.nodeClass = UA_NODECLASS_VARIABLE;
-    item.requestedNewNodeId.nodeId = requestedNewNodeId;
-    item.browseName = browseName;
-    UA_ExpandedNodeId typeDefinitionId;
-    UA_ExpandedNodeId_init(&typeDefinitionId);
-    typeDefinitionId.nodeId = typeDefinition;
-    item.typeDefinition = typeDefinitionId;
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)&attr;
-    item.nodeAttributes.content.decoded.type = &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES];
-    UA_NodeId newNodeId;
-    if(!outNewNodeId) {
-        newNodeId = UA_NODEID_NULL;
-        outNewNodeId = &newNodeId;
-    }
-
-    UA_LOCK(server->serviceMutex);
-    /* Create the node and add it to the nodestore */
-    UA_StatusCode retval = AddNode_raw(server, &server->adminSession, nodeContext,
-                                       &item, outNewNodeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Set the data source */
-    retval = setVariableNode_dataSource(server, *outNewNodeId, dataSource);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Typecheck and add references to parent and type definition */
-    retval = AddNode_addRefs(server, &server->adminSession, outNewNodeId, &parentNodeId,
-                             &referenceTypeId, &typeDefinition);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Call the constructors */
-    retval = AddNode_finish(server, &server->adminSession, outNewNodeId);
-
- cleanup:
-    UA_UNLOCK(server->serviceMutex);
-    if(outNewNodeId == &newNodeId)
-        UA_NodeId_deleteMembers(&newNodeId);
-
-    return retval;
-}
-
-static UA_StatusCode
-setDataSource(UA_Server *server, UA_Session *session,
-              UA_VariableNode* node, const UA_DataSource *dataSource) {
-    if(node->nodeClass != UA_NODECLASS_VARIABLE)
-        return UA_STATUSCODE_BADNODECLASSINVALID;
-    if(node->valueSource == UA_VALUESOURCE_DATA)
-        UA_DataValue_deleteMembers(&node->value.data.value);
-    node->value.dataSource = *dataSource;
-    node->valueSource = UA_VALUESOURCE_DATASOURCE;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId,
-                                     const UA_DataSource dataSource) {
-    return UA_Server_editNode(server, &server->adminSession, &nodeId,
-                              (UA_EditNodeCallback)setDataSource,
-                              /* casting away const because callback casts it back anyway */
-                              (UA_DataSource *) (uintptr_t)&dataSource);
-}
-
-UA_StatusCode
-UA_Server_setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId,
-                                     const UA_DataSource dataSource) {
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = setVariableNode_dataSource(server, nodeId, dataSource);
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-/************************************/
-/* Special Handling of Method Nodes */
-/************************************/
-
-#ifdef UA_ENABLE_METHODCALLS
-
-static const UA_NodeId hasproperty = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASPROPERTY}};
-static const UA_NodeId propertytype = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_PROPERTYTYPE}};
-
-static UA_StatusCode
-UA_Server_addMethodNodeEx_finish(UA_Server *server, const UA_NodeId nodeId, UA_MethodCallback method,
-                                 const size_t inputArgumentsSize, const UA_Argument *inputArguments,
-                                 const UA_NodeId inputArgumentsRequestedNewNodeId,
-                                 UA_NodeId *inputArgumentsOutNewNodeId,
-                                 const size_t outputArgumentsSize, const UA_Argument *outputArguments,
-                                 const UA_NodeId outputArgumentsRequestedNewNodeId,
-                                 UA_NodeId *outputArgumentsOutNewNodeId) {
-    /* Browse to see which argument nodes exist */
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = nodeId;
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    bd.includeSubtypes = false;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-    bd.nodeClassMask = UA_NODECLASS_VARIABLE;
-    bd.resultMask = UA_BROWSERESULTMASK_BROWSENAME;
-
-    UA_BrowseResult br;
-    UA_BrowseResult_init(&br);
-    UA_UInt32 maxrefs = 0;
-    Operation_Browse(server, &server->adminSession, &maxrefs, &bd, &br);
-
-    UA_StatusCode retval = br.statusCode;
-    if(retval != UA_STATUSCODE_GOOD) {
-        deleteNode(server, nodeId, true);
-        UA_BrowseResult_deleteMembers(&br);
-        return retval;
-    }
-
-    /* Filter out the argument nodes */
-    UA_NodeId inputArgsId = UA_NODEID_NULL;
-    UA_NodeId outputArgsId = UA_NODEID_NULL;
-    const UA_QualifiedName inputArgsName = UA_QUALIFIEDNAME(0, "InputArguments");
-    const UA_QualifiedName outputArgsName = UA_QUALIFIEDNAME(0, "OutputArguments");
-    for(size_t i = 0; i < br.referencesSize; i++) {
-        UA_ReferenceDescription *rd = &br.references[i];
-        if(rd->browseName.namespaceIndex == 0 &&
-           UA_String_equal(&rd->browseName.name, &inputArgsName.name))
-            inputArgsId = rd->nodeId.nodeId;
-        else if(rd->browseName.namespaceIndex == 0 &&
-                UA_String_equal(&rd->browseName.name, &outputArgsName.name))
-            outputArgsId = rd->nodeId.nodeId;
-    }
-
-    /* Add the Input Arguments VariableNode */
-    if(inputArgumentsSize > 0 && UA_NodeId_isNull(&inputArgsId)) {
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        char *name = "InputArguments";
-        attr.displayName = UA_LOCALIZEDTEXT("", name);
-        attr.dataType = UA_TYPES[UA_TYPES_ARGUMENT].typeId;
-        attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-        UA_UInt32 inputArgsSize32 = (UA_UInt32)inputArgumentsSize;
-        attr.arrayDimensions = &inputArgsSize32;
-        attr.arrayDimensionsSize = 1;
-        UA_Variant_setArray(&attr.value, (void *)(uintptr_t)inputArguments,
-                            inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
-        retval = addNode(server, UA_NODECLASS_VARIABLE, &inputArgumentsRequestedNewNodeId,
-                         &nodeId, &hasproperty, UA_QUALIFIEDNAME(0, name),
-                         &propertytype, (const UA_NodeAttributes*)&attr,
-                         &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],
-                         NULL, &inputArgsId);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto error;
-    }
-
-    /* Add the Output Arguments VariableNode */
-    if(outputArgumentsSize > 0 && UA_NodeId_isNull(&outputArgsId)) {
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        char *name = "OutputArguments";
-        attr.displayName = UA_LOCALIZEDTEXT("", name);
-        attr.dataType = UA_TYPES[UA_TYPES_ARGUMENT].typeId;
-        attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-        UA_UInt32 outputArgsSize32 = (UA_UInt32)outputArgumentsSize;
-        attr.arrayDimensions = &outputArgsSize32;
-        attr.arrayDimensionsSize = 1;
-        UA_Variant_setArray(&attr.value, (void *)(uintptr_t)outputArguments,
-                            outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
-        retval = addNode(server, UA_NODECLASS_VARIABLE, &outputArgumentsRequestedNewNodeId,
-                         &nodeId, &hasproperty, UA_QUALIFIEDNAME(0, name),
-                         &propertytype, (const UA_NodeAttributes*)&attr,
-                         &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],
-                         NULL, &outputArgsId);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto error;
-    }
-
-    retval = setMethodNode_callback(server, nodeId, method);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    /* Call finish to add the parent reference */
-    retval = AddNode_finish(server, &server->adminSession, &nodeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-    if(inputArgumentsOutNewNodeId != NULL) {
-        UA_NodeId_copy(&inputArgsId, inputArgumentsOutNewNodeId);
-    }
-    if(outputArgumentsOutNewNodeId != NULL) {
-        UA_NodeId_copy(&outputArgsId, outputArgumentsOutNewNodeId);
-    }
-    UA_BrowseResult_deleteMembers(&br);
-    return retval;
-
-error:
-    deleteNode(server, nodeId, true);
-    deleteNode(server, inputArgsId, true);
-    deleteNode(server, outputArgsId, true);
-    UA_BrowseResult_deleteMembers(&br);
-
-    return retval;
-}
-
-UA_StatusCode
-UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId,
-                               UA_MethodCallback method,
-                               size_t inputArgumentsSize, const UA_Argument* inputArguments,
-                               size_t outputArgumentsSize, const UA_Argument* outputArguments) {
-    UA_LOCK(server->serviceMutex)
-    UA_StatusCode retval = UA_Server_addMethodNodeEx_finish(server, nodeId, method,
-                                            inputArgumentsSize, inputArguments, UA_NODEID_NULL, NULL,
-                                            outputArgumentsSize, outputArguments, UA_NODEID_NULL, NULL);
-    UA_UNLOCK(server->serviceMutex)
-    return retval;
-}
-
-UA_StatusCode
-UA_Server_addMethodNodeEx(UA_Server *server, const UA_NodeId requestedNewNodeId,
-                          const UA_NodeId parentNodeId,
-                          const UA_NodeId referenceTypeId,
-                          const UA_QualifiedName browseName,
-                          const UA_MethodAttributes attr, UA_MethodCallback method,
-                          size_t inputArgumentsSize, const UA_Argument *inputArguments,
-                          const UA_NodeId inputArgumentsRequestedNewNodeId,
-                          UA_NodeId *inputArgumentsOutNewNodeId,
-                          size_t outputArgumentsSize, const UA_Argument *outputArguments,
-                          const UA_NodeId outputArgumentsRequestedNewNodeId,
-                          UA_NodeId *outputArgumentsOutNewNodeId,
-                          void *nodeContext, UA_NodeId *outNewNodeId) {
-    UA_AddNodesItem item;
-    UA_AddNodesItem_init(&item);
-    item.nodeClass = UA_NODECLASS_METHOD;
-    item.requestedNewNodeId.nodeId = requestedNewNodeId;
-    item.browseName = browseName;
-    item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)&attr;
-    item.nodeAttributes.content.decoded.type = &UA_TYPES[UA_TYPES_METHODATTRIBUTES];
-
-    UA_NodeId newId;
-    if(!outNewNodeId) {
-        UA_NodeId_init(&newId);
-        outNewNodeId = &newId;
-    }
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retval = Operation_addNode_begin(server, &server->adminSession,
-                                                   nodeContext, &item, &parentNodeId,
-                                                   &referenceTypeId, outNewNodeId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_UNLOCK(server->serviceMutex);
-        return retval;
-    }
-
-    retval = UA_Server_addMethodNodeEx_finish(server, *outNewNodeId, method,
-                                              inputArgumentsSize, inputArguments,
-                                              inputArgumentsRequestedNewNodeId,
-                                              inputArgumentsOutNewNodeId,
-                                              outputArgumentsSize, outputArguments,
-                                              outputArgumentsRequestedNewNodeId,
-                                              outputArgumentsOutNewNodeId);
-    UA_UNLOCK(server->serviceMutex);
-    if(outNewNodeId == &newId)
-        UA_NodeId_deleteMembers(&newId);
-    return retval;
-}
-
-static UA_StatusCode
-editMethodCallback(UA_Server *server, UA_Session* session,
-                   UA_Node* node, void* handle) {
-    if(node->nodeClass != UA_NODECLASS_METHOD)
-        return UA_STATUSCODE_BADNODECLASSINVALID;
-    UA_MethodNode *mnode = (UA_MethodNode*) node;
-    mnode->method = (UA_MethodCallback)(uintptr_t)handle;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-setMethodNode_callback(UA_Server *server,
-                                 const UA_NodeId methodNodeId,
-                                 UA_MethodCallback methodCallback) {
-    return UA_Server_editNode(server, &server->adminSession, &methodNodeId,
-                                              (UA_EditNodeCallback)editMethodCallback,
-                                              (void*)(uintptr_t)methodCallback);
-}
-
-UA_StatusCode
-UA_Server_setMethodNode_callback(UA_Server *server,
-                                 const UA_NodeId methodNodeId,
-                                 UA_MethodCallback methodCallback) {
-    UA_LOCK(server->serviceMutex);
-    UA_StatusCode retVal = setMethodNode_callback(server, methodNodeId, methodCallback);
-    UA_UNLOCK(server->serviceMutex);
-    return retVal;
-}
-
-#endif
-
-/************************/
-/* Lifecycle Management */
-/************************/
-
-static UA_StatusCode
-setNodeTypeLifecycle(UA_Server *server, UA_Session *session,
-                     UA_Node* node, UA_NodeTypeLifecycle *lifecycle) {
-    if(node->nodeClass == UA_NODECLASS_OBJECTTYPE) {
-        UA_ObjectTypeNode *ot = (UA_ObjectTypeNode*)node;
-        ot->lifecycle = *lifecycle;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    if(node->nodeClass == UA_NODECLASS_VARIABLETYPE) {
-        UA_VariableTypeNode *vt = (UA_VariableTypeNode*)node;
-        vt->lifecycle = *lifecycle;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    return UA_STATUSCODE_BADNODECLASSINVALID;
-}
-
-UA_StatusCode
-UA_Server_setNodeTypeLifecycle(UA_Server *server, UA_NodeId nodeId,
-                               UA_NodeTypeLifecycle lifecycle) {
-    return UA_Server_editNode(server, &server->adminSession, &nodeId,
-                              (UA_EditNodeCallback)setNodeTypeLifecycle,
-                              &lifecycle);
-}
diff --git a/ext/open62541/src/server/ua_services_securechannel.c b/ext/open62541/src/server/ua_services_securechannel.c
deleted file mode 100644
index f86b19e..0000000
--- a/ext/open62541/src/server/ua_services_securechannel.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-#include "ua_securechannel_manager.h"
-
-void
-Service_OpenSecureChannel(UA_Server *server, UA_SecureChannel *channel,
-                          const UA_OpenSecureChannelRequest *request,
-                          UA_OpenSecureChannelResponse *response) {
-    if(request->requestType == UA_SECURITYTOKENREQUESTTYPE_RENEW) {
-        /* Renew the channel */
-        response->responseHeader.serviceResult =
-            UA_SecureChannelManager_renew(&server->secureChannelManager,
-                                          channel, request, response);
-
-        /* Logging */
-        if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) {
-            UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel,
-                                 "SecureChannel renewed");
-        } else {
-            UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel,
-                                 "Renewing SecureChannel failed");
-        }
-        return;
-    }
-
-    /* Must be ISSUE or RENEW */
-    if(request->requestType != UA_SECURITYTOKENREQUESTTYPE_ISSUE) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        return;
-    }
-
-    /* Open the channel */
-    response->responseHeader.serviceResult =
-        UA_SecureChannelManager_open(&server->secureChannelManager, channel,
-                                     request, response);
-
-    /* Logging */
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                            "Opened SecureChannel");
-    } else {
-        UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                            "Opening a SecureChannel failed");
-    }
-}
-
-/* The server does not send a CloseSecureChannel response */
-void
-Service_CloseSecureChannel(UA_Server *server, UA_SecureChannel *channel) {
-    UA_LOG_INFO_CHANNEL(&server->config.logger, channel, "CloseSecureChannel");
-    UA_SecureChannelManager_close(&server->secureChannelManager,
-                                  channel->securityToken.channelId);
-}
diff --git a/ext/open62541/src/server/ua_services_session.c b/ext/open62541/src/server/ua_services_session.c
deleted file mode 100644
index c62f0d4..0000000
--- a/ext/open62541/src/server/ua_services_session.c
+++ /dev/null
@@ -1,530 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#include "ua_services.h"
-#include "ua_server_internal.h"
-#include "ua_session_manager.h"
-
-static UA_StatusCode
-signCreateSessionResponse(UA_Server *server, UA_SecureChannel *channel,
-                          const UA_CreateSessionRequest *request,
-                          UA_CreateSessionResponse *response) {
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-
-    const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
-    UA_SignatureData *signatureData = &response->serverSignature;
-
-    /* Prepare the signature */
-    size_t signatureSize = securityPolicy->certificateSigningAlgorithm.
-        getLocalSignatureSize(securityPolicy, channel->channelContext);
-    UA_StatusCode retval = UA_String_copy(&securityPolicy->certificateSigningAlgorithm.uri,
-                                          &signatureData->algorithm);
-    retval |= UA_ByteString_allocBuffer(&signatureData->signature, signatureSize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Allocate a temp buffer */
-    size_t dataToSignSize = request->clientCertificate.length + request->clientNonce.length;
-    UA_ByteString dataToSign;
-    retval = UA_ByteString_allocBuffer(&dataToSign, dataToSignSize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval; /* signatureData->signature is cleaned up with the response */
-
-    /* Sign the signature */
-    memcpy(dataToSign.data, request->clientCertificate.data, request->clientCertificate.length);
-    memcpy(dataToSign.data + request->clientCertificate.length,
-           request->clientNonce.data, request->clientNonce.length);
-    retval = securityPolicy->certificateSigningAlgorithm.
-        sign(securityPolicy, channel->channelContext, &dataToSign, &signatureData->signature);
-
-    /* Clean up */
-    UA_ByteString_deleteMembers(&dataToSign);
-    return retval;
-}
-
-void
-Service_CreateSession(UA_Server *server, UA_SecureChannel *channel,
-                      const UA_CreateSessionRequest *request,
-                      UA_CreateSessionResponse *response) {
-    if(!channel) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        return;
-    }
-
-    if(!channel->connection) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-        return;
-    }
-
-    UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel, "Trying to create session");
-
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-        /* Compare the clientCertificate with the remoteCertificate of the channel.
-         * Both the clientCertificate of this request and the remoteCertificate
-         * of the channel may contain a partial or a complete certificate chain.
-         * The compareCertificate function of the channelModule will compare the
-         * first certificate of each chain. The end certificate shall be located
-         * first in the chain according to the OPC UA specification Part 6 (1.04),
-         * chapter 6.2.3.*/
-        UA_StatusCode retval = channel->securityPolicy->channelModule.
-            compareCertificate(channel->channelContext, &request->clientCertificate);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                                   "The client certificate did not validate");
-            response->responseHeader.serviceResult = UA_STATUSCODE_BADCERTIFICATEINVALID;
-            return;
-        }
-    }
-
-    if(channel->securityToken.channelId == 0) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSECURECHANNELIDINVALID;
-        return;
-    }
-
-    if(!UA_ByteString_equal(&channel->securityPolicy->policyUri,
-                            &UA_SECURITY_POLICY_NONE_URI) &&
-       request->clientNonce.length < 32) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNONCEINVALID;
-        return;
-    }
-
-    /* TODO: Compare application URI with certificate uri (decode certificate) */
-    UA_CertificateVerification *cv = channel->securityPolicy->certificateVerification;
-    if(cv && cv->verifyApplicationURI) {
-        response->responseHeader.serviceResult =
-            cv->verifyApplicationURI(cv->context, &request->clientCertificate,
-                                     &request->clientDescription.applicationUri);
-        if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                                   "The client's ApplicationURI did not match the certificate");
-            return;
-        }
-    }
-
-    UA_Session *newSession = NULL;
-    response->responseHeader.serviceResult =
-        UA_SessionManager_createSession(&server->sessionManager, channel, request, &newSession);
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING_CHANNEL(&server->config.logger, channel,
-                               "Processing CreateSessionRequest failed");
-        return;
-    }
-
-    UA_assert(newSession != NULL);
-
-    /* Allocate the response */
-    response->serverEndpoints = (UA_EndpointDescription *)
-        UA_Array_new(server->config.endpointsSize,
-                     &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-    if(!response->serverEndpoints) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        UA_SessionManager_removeSession(&server->sessionManager,
-                                        &newSession->header.authenticationToken);
-        return;
-    }
-    response->serverEndpointsSize = server->config.endpointsSize;
-
-    /* Copy the server's endpointdescriptions into the response */
-    for(size_t i = 0; i < server->config.endpointsSize; ++i)
-        response->responseHeader.serviceResult |=
-            UA_EndpointDescription_copy(&server->config.endpoints[i],
-                                        &response->serverEndpoints[i]);
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_SessionManager_removeSession(&server->sessionManager,
-                                        &newSession->header.authenticationToken);
-        return;
-    }
-
-    /* Mirror back the endpointUrl */
-    for(size_t i = 0; i < response->serverEndpointsSize; ++i) {
-        UA_String_deleteMembers(&response->serverEndpoints[i].endpointUrl);
-        response->responseHeader.serviceResult |=
-            UA_String_copy(&request->endpointUrl,
-                           &response->serverEndpoints[i].endpointUrl);
-    }
-
-    /* Attach the session to the channel. But don't activate for now. */
-    UA_Session_attachToSecureChannel(newSession, channel);
-
-    /* Fill the session information */
-    newSession->maxResponseMessageSize = request->maxResponseMessageSize;
-    newSession->maxRequestMessageSize =
-        channel->connection->config.maxMessageSize;
-    response->responseHeader.serviceResult |=
-        UA_ApplicationDescription_copy(&request->clientDescription,
-                                       &newSession->clientDescription);
-
-    /* Prepare the response */
-    response->sessionId = newSession->sessionId;
-    response->revisedSessionTimeout = (UA_Double)newSession->timeout;
-    response->authenticationToken = newSession->header.authenticationToken;
-    response->responseHeader.serviceResult |=
-        UA_String_copy(&request->sessionName, &newSession->sessionName);
-
-    UA_ByteString_init(&response->serverCertificate);
-
-    if(server->config.endpointsSize > 0)
-       for(size_t i = 0; i < response->serverEndpointsSize; ++i) {
-          if(response->serverEndpoints[i].securityMode==channel->securityMode &&
-             UA_ByteString_equal(&response->serverEndpoints[i].securityPolicyUri,
-                                 &channel->securityPolicy->policyUri) &&
-             UA_String_equal(&response->serverEndpoints[i].endpointUrl,
-                             &request->endpointUrl))
-          {
-             response->responseHeader.serviceResult |=
-                 UA_ByteString_copy(&response->serverEndpoints[i].serverCertificate,
-                                    &response->serverCertificate);
-          }
-       }
-
-    /* Create a session nonce */
-    response->responseHeader.serviceResult |= UA_Session_generateNonce(newSession);
-    response->responseHeader.serviceResult |=
-        UA_ByteString_copy(&newSession->serverNonce, &response->serverNonce);
-
-    /* Sign the signature */
-    response->responseHeader.serviceResult |=
-       signCreateSessionResponse(server, channel, request, response);
-
-    /* Failure -> remove the session */
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_SessionManager_removeSession(&server->sessionManager,
-                                        &newSession->header.authenticationToken);
-        return;
-    }
-
-    UA_LOG_INFO_CHANNEL(&server->config.logger, channel,
-                        "Session " UA_PRINTF_GUID_FORMAT " created",
-                        UA_PRINTF_GUID_DATA(newSession->sessionId.identifier.guid));
-}
-
-static UA_StatusCode
-checkSignature(const UA_Server *server, const UA_SecureChannel *channel,
-               UA_Session *session, const UA_ActivateSessionRequest *request) {
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-
-    /* Check for zero signature length in client signature */
-    if(request->clientSignature.signature.length == 0) {
-        return UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
-    }
-
-    if(!channel->securityPolicy)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-    const UA_ByteString *localCertificate = &securityPolicy->localCertificate;
-
-    size_t dataToVerifySize = localCertificate->length + session->serverNonce.length;
-
-    UA_ByteString dataToVerify;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&dataToVerify, dataToVerifySize);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    memcpy(dataToVerify.data, localCertificate->data, localCertificate->length);
-    memcpy(dataToVerify.data + localCertificate->length,
-           session->serverNonce.data, session->serverNonce.length);
-
-    retval = securityPolicy->certificateSigningAlgorithm.verify(securityPolicy, channel->channelContext, &dataToVerify,
-                                                                &request->clientSignature.signature);
-    UA_ByteString_deleteMembers(&dataToVerify);
-    return retval;
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-static UA_StatusCode
-decryptPassword(UA_SecurityPolicy *securityPolicy, void *tempChannelContext,
-                const UA_ByteString *serverNonce, UA_UserNameIdentityToken *userToken) {
-    UA_SecurityPolicyEncryptionAlgorithm *asymEnc =
-        &securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm;
-    if(!UA_String_equal(&userToken->encryptionAlgorithm, &asymEnc->uri))
-        return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-    UA_UInt32 tokenSecretLength;
-    UA_ByteString decryptedTokenSecret, tokenServerNonce;
-    if(UA_ByteString_copy(&userToken->password, &decryptedTokenSecret) != UA_STATUSCODE_GOOD)
-        return UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-
-    UA_StatusCode retval = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-    if(asymEnc->decrypt(securityPolicy, tempChannelContext,
-                        &decryptedTokenSecret) != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    memcpy(&tokenSecretLength, decryptedTokenSecret.data, sizeof(UA_UInt32));
-
-    /* The decrypted data must be large enough to include the Encrypted Token
-     * Secret Format and the length field must indicate enough data to include
-     * the server nonce. */
-    if(decryptedTokenSecret.length < sizeof(UA_UInt32) + serverNonce->length ||
-       decryptedTokenSecret.length < sizeof(UA_UInt32) + tokenSecretLength ||
-       tokenSecretLength < serverNonce->length)
-        goto cleanup;
-
-    /* If the Encrypted Token Secret contains padding, the padding must be
-     * zeroes according to the 1.04.1 specification errata, chapter 3. */
-    for(size_t i = sizeof(UA_UInt32) + tokenSecretLength; i < decryptedTokenSecret.length; i++) {
-        if(decryptedTokenSecret.data[i] != 0)
-            goto cleanup;
-    }
-
-    /* The server nonce must match according to the 1.04.1 specification errata,
-     * chapter 3. */
-    tokenServerNonce.length = serverNonce->length;
-    tokenServerNonce.data = &decryptedTokenSecret.data[sizeof(UA_UInt32) + tokenSecretLength - serverNonce->length];
-    if(!UA_ByteString_equal(serverNonce, &tokenServerNonce))
-        goto cleanup;
-
-    /* The password was decrypted successfully. Replace usertoken with the
-     * decrypted password. The encryptionAlgorithm and policyId fields are left
-     * in the UserToken as an indication for the AccessControl plugin that
-     * evaluates the decrypted content. */
-    memcpy(userToken->password.data, &decryptedTokenSecret.data[sizeof(UA_UInt32)],
-           tokenSecretLength - serverNonce->length);
-    userToken->password.length = tokenSecretLength - serverNonce->length;
-    retval = UA_STATUSCODE_GOOD;
-
- cleanup:
-    UA_ByteString_deleteMembers(&decryptedTokenSecret);
-    return retval;
-}
-#endif
-
-/* TODO: Check all of the following:
- *
- * Part 4, §5.6.3: When the ActivateSession Service is called for the first time
- * then the Server shall reject the request if the SecureChannel is not same as
- * the one associated with the CreateSession request. Subsequent calls to
- * ActivateSession may be associated with different SecureChannels. If this is
- * the case then the Server shall verify that the Certificate the Client used to
- * create the new SecureChannel is the same as the Certificate used to create
- * the original SecureChannel. In addition, the Server shall verify that the
- * Client supplied a UserIdentityToken that is identical to the token currently
- * associated with the Session. Once the Server accepts the new SecureChannel it
- * shall reject requests sent via the old SecureChannel. */
-
-void
-Service_ActivateSession(UA_Server *server, UA_SecureChannel *channel,
-                        UA_Session *session, const UA_ActivateSessionRequest *request,
-                        UA_ActivateSessionResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Execute ActivateSession");
-
-    if(session->validTill < UA_DateTime_nowMonotonic()) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "ActivateSession: SecureChannel %i wants "
-                            "to activate, but the session has timed out",
-                            channel->securityToken.channelId);
-        response->responseHeader.serviceResult =
-            UA_STATUSCODE_BADSESSIONIDINVALID;
-        return;
-    }
-
-    /* Check if the signature corresponds to the ServerNonce that was last sent
-     * to the client */
-    response->responseHeader.serviceResult = checkSignature(server, channel, session, request);
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "Signature check failed with status code %s",
-                            UA_StatusCode_name(response->responseHeader.serviceResult));
-        return;
-    }
-
-    /* Find the matching endpoint */
-    const UA_EndpointDescription *ed = NULL;
-    for(size_t i = 0; ed == NULL && i < server->config.endpointsSize; ++i) {
-        const UA_EndpointDescription *e = &server->config.endpoints[i];
-
-        /* Match the Security Mode */
-        if(e->securityMode != channel->securityMode)
-            continue;
-
-        /* Match the SecurityPolicy */
-        if(!UA_String_equal(&e->securityPolicyUri, &channel->securityPolicy->policyUri))
-            continue;
-
-        /* Match the UserTokenType */
-        for(size_t j = 0; j < e->userIdentityTokensSize; j++) {
-            const UA_UserTokenPolicy *u = &e->userIdentityTokens[j];
-            if(u->tokenType == UA_USERTOKENTYPE_ANONYMOUS) {
-                /* Part 4, Section 5.6.3.2, Table 17: A NULL or empty
-                 * UserIdentityToken should be treated as Anonymous */
-                if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN] &&
-                   request->userIdentityToken.encoding != UA_EXTENSIONOBJECT_ENCODED_NOBODY)
-                    continue;
-            } else if(u->tokenType == UA_USERTOKENTYPE_USERNAME) {
-                if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN])
-                    continue;
-            } else if(u->tokenType == UA_USERTOKENTYPE_CERTIFICATE) {
-                if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN])
-                    continue;
-            } else if(u->tokenType == UA_USERTOKENTYPE_ISSUEDTOKEN) {
-                if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN])
-                    continue;
-            } else {
-                response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-                return;
-            }
-
-            /* Match found */
-            ed = e;
-            break;
-        }
-
-    }
-
-    /* No matching endpoint found */
-    if(!ed) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-        return;
-    }
-
-#ifdef UA_ENABLE_ENCRYPTION
-    /* If it is a UserNameIdentityToken, decrypt the password if encrypted */
-    if((request->userIdentityToken.encoding == UA_EXTENSIONOBJECT_DECODED) &&
-       (request->userIdentityToken.content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN])) {
-       UA_UserNameIdentityToken *userToken = (UA_UserNameIdentityToken *)
-           request->userIdentityToken.content.decoded.data;
-
-       /* Find the UserTokenPolicy */
-       UA_Byte tokenIndex = 0;
-       for(; tokenIndex < ed->userIdentityTokensSize; tokenIndex++) {
-           if(ed->userIdentityTokens[tokenIndex].tokenType != UA_USERTOKENTYPE_USERNAME)
-               continue;
-           if(UA_String_equal(&userToken->policyId, &ed->userIdentityTokens[tokenIndex].policyId))
-               break;
-       }
-       if(tokenIndex == ed->userIdentityTokensSize) {
-           response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-           return;
-       }
-
-       /* Get the SecurityPolicy. If the userTokenPolicy doesn't specify a
-        * security policy the security policy of the secure channel is used. */
-       UA_SecurityPolicy* securityPolicy;
-       if(ed->userIdentityTokens[tokenIndex].securityPolicyUri.data == NULL)
-           securityPolicy = UA_SecurityPolicy_getSecurityPolicyByUri(server, &ed->securityPolicyUri);
-       else
-           securityPolicy = UA_SecurityPolicy_getSecurityPolicyByUri(server, &ed->userIdentityTokens[tokenIndex].securityPolicyUri);
-       if(!securityPolicy) {
-          response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
-          return;
-       }
-
-       /* Encrypted password? */
-       if(!UA_String_equal(&securityPolicy->policyUri, &UA_SECURITY_POLICY_NONE_URI)) {
-           /* Test if the encryption algorithm is correctly specified */
-           if(!UA_String_equal(&userToken->encryptionAlgorithm,
-                               &securityPolicy->asymmetricModule.cryptoModule.
-                               encryptionAlgorithm.uri)) {
-               response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID;
-               return;
-           }
-
-           /* Create a temporary channel context if a different SecurityPolicy is
-            * used for the password from the SecureChannel */
-           void *tempChannelContext = channel->channelContext;
-           if(securityPolicy != channel->securityPolicy) {
-               /* TODO: This is a hack. We use our own certificate to create a
-                * channel context. Because the client does not provide one in a
-                * #None SecureChannel. We should not need a ChannelContext at all
-                * for asymmetric decryption where the remote certificate is not
-                * used. */
-               response->responseHeader.serviceResult =
-                   securityPolicy->channelModule.newContext(securityPolicy,
-                                                            &securityPolicy->localCertificate,
-                                                            &tempChannelContext);
-               if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-                   UA_LOG_WARNING_SESSION(&server->config.logger, session, "ActivateSession: "
-                                          "Failed to create a context for the SecurityPolicy %.*s",
-                                          (int)securityPolicy->policyUri.length,
-                                          securityPolicy->policyUri.data);
-                   return;
-               }
-           }
-
-           /* Decrypt */
-           response->responseHeader.serviceResult =
-               decryptPassword(securityPolicy, tempChannelContext, &session->serverNonce, userToken);
-
-           /* Remove the temporary channel context */
-           if(securityPolicy != channel->securityPolicy)
-               securityPolicy->channelModule.deleteContext(tempChannelContext);
-       }
-
-       if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-           UA_LOG_INFO_SESSION(&server->config.logger, session, "ActivateSession: "
-                               "Failed to decrypt the password with the status code %s",
-                               UA_StatusCode_name(response->responseHeader.serviceResult));
-       }
-
-    }
-#endif
-
-    /* Callback into userland access control */
-    response->responseHeader.serviceResult =
-        server->config.accessControl.activateSession(server, &server->config.accessControl,
-                                                     ed, &channel->remoteCertificate,
-                                                     &session->sessionId,
-                                                     &request->userIdentityToken,
-                                                     &session->sessionHandle);
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "ActivateSession: The AccessControl plugin "
-                            "denied the access with the status code %s",
-                            UA_StatusCode_name(response->responseHeader.serviceResult));
-        return;
-    }
-
-    if(session->header.channel && session->header.channel != channel) {
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "ActivateSession: Detach from old channel");
-        /* Detach the old SecureChannel and attach the new */
-        UA_Session_detachFromSecureChannel(session);
-        UA_Session_attachToSecureChannel(session, channel);
-    }
-
-    /* Activate the session */
-    session->activated = true;
-    UA_Session_updateLifetime(session);
-
-    /* Generate a new session nonce for the next time ActivateSession is called */
-    response->responseHeader.serviceResult = UA_Session_generateNonce(session);
-    response->responseHeader.serviceResult |=
-        UA_ByteString_copy(&session->serverNonce, &response->serverNonce);
-    if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
-        UA_Session_detachFromSecureChannel(session);
-        session->activated = false;
-        UA_LOG_INFO_SESSION(&server->config.logger, session,
-                            "ActivateSession: Could not generate a server nonce");
-        return;
-    }
-
-    UA_LOG_INFO_SESSION(&server->config.logger, session,
-                        "ActivateSession: Session activated");
-}
-
-void
-Service_CloseSession(UA_Server *server, UA_Session *session,
-                     const UA_CloseSessionRequest *request,
-                     UA_CloseSessionResponse *response) {
-    UA_LOG_INFO_SESSION(&server->config.logger, session, "CloseSession");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    response->responseHeader.serviceResult =
-        UA_SessionManager_removeSession(&server->sessionManager,
-                                        &session->header.authenticationToken);
-}
diff --git a/ext/open62541/src/server/ua_services_subscription.c b/ext/open62541/src/server/ua_services_subscription.c
deleted file mode 100644
index 94923df..0000000
--- a/ext/open62541/src/server/ua_services_subscription.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH
- *    Copyright 2017 (c) Mattias Bornhager
- *    Copyright 2017 (c) Henrik Norrman
- *    Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-#include "ua_subscription.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */
-
-static UA_StatusCode
-setSubscriptionSettings(UA_Server *server, UA_Subscription *subscription,
-                        UA_Double requestedPublishingInterval,
-                        UA_UInt32 requestedLifetimeCount,
-                        UA_UInt32 requestedMaxKeepAliveCount,
-                        UA_UInt32 maxNotificationsPerPublish, UA_Byte priority) {
-    /* deregister the callback if required */
-    Subscription_unregisterPublishCallback(server, subscription);
-
-    /* re-parameterize the subscription */
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.publishingIntervalLimits,
-                               requestedPublishingInterval, subscription->publishingInterval);
-    /* check for nan*/
-    if(requestedPublishingInterval != requestedPublishingInterval)
-        subscription->publishingInterval = server->config.publishingIntervalLimits.min;
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.keepAliveCountLimits,
-                               requestedMaxKeepAliveCount, subscription->maxKeepAliveCount);
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.lifeTimeCountLimits,
-                               requestedLifetimeCount, subscription->lifeTimeCount);
-    if(subscription->lifeTimeCount < 3 * subscription->maxKeepAliveCount)
-        subscription->lifeTimeCount = 3 * subscription->maxKeepAliveCount;
-    subscription->notificationsPerPublish = maxNotificationsPerPublish;
-    if(maxNotificationsPerPublish == 0 ||
-       maxNotificationsPerPublish > server->config.maxNotificationsPerPublish)
-        subscription->notificationsPerPublish = server->config.maxNotificationsPerPublish;
-    subscription->priority = priority;
-
-    UA_StatusCode retval = Subscription_registerPublishCallback(server, subscription);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, subscription->session,
-                             "Subscription %u | Could not register publish callback with error code %s",
-                             subscription->subscriptionId, UA_StatusCode_name(retval));
-    }
-    return retval;
-}
-
-void
-Service_CreateSubscription(UA_Server *server, UA_Session *session,
-                           const UA_CreateSubscriptionRequest *request,
-                           UA_CreateSubscriptionResponse *response) {
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Check limits for the number of subscriptions */
-    if(((server->config.maxSubscriptions != 0) &&
-        (server->numSubscriptions >= server->config.maxSubscriptions)) ||
-       ((server->config.maxSubscriptionsPerSession != 0) &&
-        (session->numSubscriptions >= server->config.maxSubscriptionsPerSession))) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS;
-        return;
-    }
-
-    /* Create the subscription */
-    UA_Subscription *newSubscription = UA_Subscription_new(session, response->subscriptionId);
-    if(!newSubscription) {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                             "Processing CreateSubscriptionRequest failed");
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-
-    UA_Session_addSubscription(server, session, newSubscription); /* Also assigns the subscription id */
-
-    /* Set the subscription parameters */
-    newSubscription->publishingEnabled = request->publishingEnabled;
-    UA_StatusCode retval = setSubscriptionSettings(server, newSubscription, request->requestedPublishingInterval,
-                                                   request->requestedLifetimeCount, request->requestedMaxKeepAliveCount,
-                                                   request->maxNotificationsPerPublish, request->priority);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        response->responseHeader.serviceResult = retval;
-        return;
-    }
-
-    newSubscription->currentKeepAliveCount = newSubscription->maxKeepAliveCount; /* set settings first */
-
-    /* Prepare the response */
-    response->subscriptionId = newSubscription->subscriptionId;
-    response->revisedPublishingInterval = newSubscription->publishingInterval;
-    response->revisedLifetimeCount = newSubscription->lifeTimeCount;
-    response->revisedMaxKeepAliveCount = newSubscription->maxKeepAliveCount;
-
-    UA_LOG_INFO_SESSION(&server->config.logger, session, "Subscription %u | "
-                        "Created the Subscription with a publishing interval of %.2f ms",
-                        response->subscriptionId, newSubscription->publishingInterval);
-}
-
-void
-Service_ModifySubscription(UA_Server *server, UA_Session *session,
-                           const UA_ModifySubscriptionRequest *request,
-                           UA_ModifySubscriptionResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing ModifySubscriptionRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId);
-    if(!sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    UA_StatusCode retval = setSubscriptionSettings(server, sub, request->requestedPublishingInterval,
-                                                   request->requestedLifetimeCount, request->requestedMaxKeepAliveCount,
-                                                   request->maxNotificationsPerPublish, request->priority);
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        response->responseHeader.serviceResult = retval;
-        return;
-    }
-
-    sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */
-    response->revisedPublishingInterval = sub->publishingInterval;
-    response->revisedLifetimeCount = sub->lifeTimeCount;
-    response->revisedMaxKeepAliveCount = sub->maxKeepAliveCount;
-}
-
-static void
-Operation_SetPublishingMode(UA_Server *Server, UA_Session *session,
-                            const UA_Boolean *publishingEnabled, const UA_UInt32 *subscriptionId,
-                            UA_StatusCode *result) {
-    UA_Subscription *sub = UA_Session_getSubscriptionById(session, *subscriptionId);
-    if(!sub) {
-        *result = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */
-    sub->publishingEnabled = *publishingEnabled; /* Set the publishing mode */
-}
-
-void
-Service_SetPublishingMode(UA_Server *server, UA_Session *session,
-                          const UA_SetPublishingModeRequest *request,
-                          UA_SetPublishingModeResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing SetPublishingModeRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    UA_Boolean publishingEnabled = request->publishingEnabled; /* request is const */
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_SetPublishingMode,
-                                           &publishingEnabled,
-                                           &request->subscriptionIdsSize, &UA_TYPES[UA_TYPES_UINT32],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-}
-
-/* TODO: Unify with senderror in ua_server_binary.c */
-static void
-subscriptionSendError(UA_SecureChannel *channel, UA_UInt32 requestHandle,
-                      UA_UInt32 requestId, UA_StatusCode error) {
-    UA_PublishResponse err_response;
-    UA_PublishResponse_init(&err_response);
-    err_response.responseHeader.requestHandle = requestHandle;
-    err_response.responseHeader.timestamp = UA_DateTime_now();
-    err_response.responseHeader.serviceResult = error;
-    UA_SecureChannel_sendSymmetricMessage(channel, requestId, UA_MESSAGETYPE_MSG,
-                                          &err_response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-}
-
-void
-Service_Publish(UA_Server *server, UA_Session *session,
-                const UA_PublishRequest *request, UA_UInt32 requestId) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing PublishRequest");
-
-    /* Return an error if the session has no subscription */
-    if(LIST_EMPTY(&session->serverSubscriptions)) {
-        subscriptionSendError(session->header.channel, request->requestHeader.requestHandle,
-                              requestId, UA_STATUSCODE_BADNOSUBSCRIPTION);
-        return;
-    }
-
-    /* Handle too many subscriptions to free resources before trying to allocate
-     * resources for the new publish request. If the limit has been reached the
-     * oldest publish request shall be responded */
-    if((server->config.maxPublishReqPerSession != 0) &&
-       (session->numPublishReq >= server->config.maxPublishReqPerSession)) {
-        if(!UA_Subscription_reachedPublishReqLimit(server, session)) {
-            subscriptionSendError(session->header.channel, requestId,
-                                  request->requestHeader.requestHandle,
-                                  UA_STATUSCODE_BADINTERNALERROR);
-            return;
-        }
-    }
-
-    /* Allocate the response to store it in the retransmission queue */
-    UA_PublishResponseEntry *entry = (UA_PublishResponseEntry *)
-        UA_malloc(sizeof(UA_PublishResponseEntry));
-    if(!entry) {
-        subscriptionSendError(session->header.channel, requestId,
-                              request->requestHeader.requestHandle,
-                              UA_STATUSCODE_BADOUTOFMEMORY);
-        return;
-    }
-
-    /* Prepare the response */
-    entry->requestId = requestId;
-    UA_PublishResponse *response = &entry->response;
-    UA_PublishResponse_init(response);
-    response->responseHeader.requestHandle = request->requestHeader.requestHandle;
-
-    /* Allocate the results array to acknowledge the acknowledge */
-    if(request->subscriptionAcknowledgementsSize > 0) {
-        response->results = (UA_StatusCode *)
-            UA_Array_new(request->subscriptionAcknowledgementsSize,
-                         &UA_TYPES[UA_TYPES_STATUSCODE]);
-        if(!response->results) {
-            UA_free(entry);
-            subscriptionSendError(session->header.channel, requestId,
-                                  request->requestHeader.requestHandle,
-                                  UA_STATUSCODE_BADOUTOFMEMORY);
-            return;
-        }
-        response->resultsSize = request->subscriptionAcknowledgementsSize;
-    }
-
-    /* Delete Acknowledged Subscription Messages */
-    for(size_t i = 0; i < request->subscriptionAcknowledgementsSize; ++i) {
-        UA_SubscriptionAcknowledgement *ack = &request->subscriptionAcknowledgements[i];
-        UA_Subscription *sub = UA_Session_getSubscriptionById(session, ack->subscriptionId);
-        if(!sub) {
-            response->results[i] = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-            UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                                 "Cannot process acknowledgements subscription %u",
-                                 ack->subscriptionId);
-            continue;
-        }
-        /* Remove the acked transmission from the retransmission queue */
-        response->results[i] = UA_Subscription_removeRetransmissionMessage(sub, ack->sequenceNumber);
-    }
-
-    /* Queue the publish response. It will be dequeued in a repeated publish
-     * callback. This can also be triggered right now for a late
-     * subscription. */
-    UA_Session_queuePublishReq(session, entry, false);
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Queued a publication message");
-
-    /* If there are late subscriptions, the new publish request is used to
-     * answer them immediately. However, a single subscription that generates
-     * many notifications must not "starve" other late subscriptions. Therefore
-     * we keep track of the last subscription that got preferential treatment.
-     * We start searching for late subscriptions **after** the last one. */
-
-    UA_Subscription *immediate = NULL;
-    if(session->lastSeenSubscriptionId > 0) {
-        LIST_FOREACH(immediate, &session->serverSubscriptions, listEntry) {
-            if(immediate->subscriptionId == session->lastSeenSubscriptionId) {
-                immediate = LIST_NEXT(immediate, listEntry);
-                break;
-            }
-        }
-    }
-
-    /* If no entry was found, start at the beginning and don't restart  */
-    UA_Boolean found = false;
-    if(!immediate)
-        immediate = LIST_FIRST(&session->serverSubscriptions);
-    else
-        found = true;
-
- repeat:
-    while(immediate) {
-        if(immediate->state == UA_SUBSCRIPTIONSTATE_LATE) {
-            session->lastSeenSubscriptionId = immediate->subscriptionId;
-            UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                                 "Subscription %u | Response on a late subscription",
-                                 immediate->subscriptionId);
-            UA_Subscription_publish(server, immediate);
-            return;
-        }
-        immediate = LIST_NEXT(immediate, listEntry);
-    }
-
-    /* Restart at the beginning of the list */
-    if(found) {
-        immediate = LIST_FIRST(&session->serverSubscriptions);
-        found = false;
-        goto repeat;
-    }
-
-    /* No late subscription this time */
-    session->lastSeenSubscriptionId = 0;
-}
-
-static void
-Operation_DeleteSubscription(UA_Server *server, UA_Session *session, void *_,
-                             const UA_UInt32 *subscriptionId, UA_StatusCode *result) {
-    *result = UA_Session_deleteSubscription(server, session, *subscriptionId);
-    if(*result == UA_STATUSCODE_GOOD) {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                             "Subscription %u | Subscription deleted",
-                             *subscriptionId);
-    } else {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                             "Deleting Subscription with Id %u failed with error code %s",
-                             *subscriptionId, UA_StatusCode_name(*result));
-    }
-}
-
-void
-Service_DeleteSubscriptions(UA_Server *server, UA_Session *session,
-                            const UA_DeleteSubscriptionsRequest *request,
-                            UA_DeleteSubscriptionsResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing DeleteSubscriptionsRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                  (UA_ServiceOperation)Operation_DeleteSubscription, NULL,
-                  &request->subscriptionIdsSize, &UA_TYPES[UA_TYPES_UINT32],
-                  &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-
-    /* The session has at least one subscription */
-    if(LIST_FIRST(&session->serverSubscriptions))
-        return;
-
-    /* Send remaining publish responses if the last subscription was removed */
-    UA_Subscription_answerPublishRequestsNoSubscription(server, session);
-}
-
-void
-Service_Republish(UA_Server *server, UA_Session *session,
-                  const UA_RepublishRequest *request,
-                  UA_RepublishResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing RepublishRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Get the subscription */
-    UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId);
-    if(!sub) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-        return;
-    }
-
-    /* Reset the subscription lifetime */
-    sub->currentLifetimeCount = 0;
-
-    /* Find the notification in the retransmission queue  */
-    UA_NotificationMessageEntry *entry;
-    TAILQ_FOREACH(entry, &sub->retransmissionQueue, listEntry) {
-        if(entry->message.sequenceNumber == request->retransmitSequenceNumber)
-            break;
-    }
-    if(!entry) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADMESSAGENOTAVAILABLE;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_NotificationMessage_copy(&entry->message, &response->notificationMessage);
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
diff --git a/ext/open62541/src/server/ua_services_view.c b/ext/open62541/src/server/ua_services_view.c
deleted file mode 100644
index 15dcd65..0000000
--- a/ext/open62541/src/server/ua_services_view.c
+++ /dev/null
@@ -1,1240 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) LEvertz
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015 (c) Ecosmos
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) pschoppe
- *    Copyright 2017 (c) Julian Grothoff
- *    Copyright 2017 (c) Henrik Norrman
- */
-
-#include "ua_server_internal.h"
-#include "ua_services.h"
-#include "ziptree.h"
-
-/********************/
-/* Browse Recursive */
-/********************/
-
-/* A RefTree holds a single array for both the NodeIds encountered during
- * recursive browsing and the entries for a tree-structure to check for
- * duplicates. Once the (recursive) browse has finished, the tree-structure part
- * can be simply cut away. A single realloc operation (with some pointer
- * repairing) can be used to increase the capacity of the RefTree.
- *
- * If an ExpandedNodeId is encountered, it has to be processed right away.
- * Remote ExpandedNodeId are not put into the tree, since it is not possible to
- * recurse into them anyway.
- *
- * The layout of the results array is as follows:
- *
- * | Targets [ExpandedNodeId] | Tree [RefEntry] | */
-
-#define UA_BROWSE_INITIAL_SIZE 16
-
-typedef struct RefEntry {
-    ZIP_ENTRY(RefEntry) zipfields;
-    const UA_ExpandedNodeId *target;
-    UA_UInt32 targetHash; /* Hash of the target nodeid */
-} RefEntry;
- 
-static enum ZIP_CMP
-cmpTarget(const void *a, const void *b) {
-    const RefEntry *aa = (const RefEntry*)a;
-    const RefEntry *bb = (const RefEntry*)b;
-    if(aa->targetHash < bb->targetHash)
-        return ZIP_CMP_LESS;
-    if(aa->targetHash > bb->targetHash)
-        return ZIP_CMP_MORE;
-    return (enum ZIP_CMP)UA_ExpandedNodeId_order(aa->target, bb->target);
-}
-
-ZIP_HEAD(RefHead, RefEntry);
-typedef struct RefHead RefHead;
-ZIP_PROTTYPE(RefHead, RefEntry, RefEntry)
-ZIP_IMPL(RefHead, RefEntry, zipfields, RefEntry, zipfields, cmpTarget)
-
-typedef struct {
-    UA_ExpandedNodeId *targets;
-    RefHead head;
-    size_t capacity; /* available space */
-    size_t size;     /* used space */
-} RefTree;
-
-static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT
-RefTree_init(RefTree *rt) {
-    size_t space = (sizeof(UA_ExpandedNodeId) + sizeof(RefEntry)) * UA_BROWSE_INITIAL_SIZE;
-    rt->targets = (UA_ExpandedNodeId*)UA_malloc(space);
-    if(!rt->targets)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    rt->capacity = UA_BROWSE_INITIAL_SIZE;
-    rt->size = 0;
-    ZIP_INIT(&rt->head);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-RefTree_clear(RefTree *rt) {
-    for(size_t i = 0; i < rt->size; i++)
-        UA_ExpandedNodeId_deleteMembers(&rt->targets[i]);
-    UA_free(rt->targets);
-}
-
-/* Double the capacity of the reftree */
-static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT
-RefTree_double(RefTree *rt) {
-    size_t capacity = rt->capacity * 2;
-    UA_assert(capacity > 0);
-    size_t space = (sizeof(UA_ExpandedNodeId) + sizeof(RefEntry)) * capacity;
-    UA_ExpandedNodeId *newTargets = (UA_ExpandedNodeId*)UA_realloc(rt->targets, space);
-    if(!newTargets)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Repair the pointers for the realloced array+tree  */
-    uintptr_t arraydiff = (uintptr_t)newTargets - (uintptr_t)rt->targets;
-    RefEntry *reArray = (RefEntry*)
-        ((uintptr_t)newTargets + (capacity * sizeof(UA_ExpandedNodeId)));
-    uintptr_t entrydiff = (uintptr_t)reArray -
-        ((uintptr_t)rt->targets + (rt->capacity * sizeof(UA_ExpandedNodeId)));
-    RefEntry *oldReArray = (RefEntry*)
-        ((uintptr_t)newTargets + (rt->capacity * sizeof(UA_ExpandedNodeId)));
-    memmove(reArray, oldReArray, rt->size * sizeof(RefEntry));
-    for(size_t i = 0; i < rt->size; i++) {
-        if(reArray[i].zipfields.zip_left)
-            *(uintptr_t*)&reArray[i].zipfields.zip_left += entrydiff;
-        if(reArray[i].zipfields.zip_right)
-            *(uintptr_t*)&reArray[i].zipfields.zip_right += entrydiff;
-        *(uintptr_t*)&reArray[i].target += arraydiff;
-    }
-
-    rt->head.zip_root = (RefEntry*)((uintptr_t)rt->head.zip_root + entrydiff);
-    rt->capacity = capacity;
-    rt->targets = newTargets;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT
-RefTree_add(RefTree *rt, const UA_ExpandedNodeId *target) {
-    UA_StatusCode s = UA_STATUSCODE_GOOD;
-    if(rt->capacity <= rt->size) {
-        s = RefTree_double(rt);
-        if(s != UA_STATUSCODE_GOOD)
-            return s;
-    }
-    s = UA_ExpandedNodeId_copy(target, &rt->targets[rt->size]);
-    if(s != UA_STATUSCODE_GOOD)
-        return s;
-    RefEntry *re = (RefEntry*)((uintptr_t)rt->targets +
-                               (sizeof(UA_ExpandedNodeId) * rt->capacity) +
-                               (sizeof(RefEntry) * rt->size));
-    re->target = &rt->targets[rt->size];
-    re->targetHash = UA_ExpandedNodeId_hash(target);
-    ZIP_INSERT(RefHead, &rt->head, re, ZIP_FFS32(UA_UInt32_random()));
-    rt->size++;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_Boolean
-relevantReference(const UA_NodeId *refType, size_t relevantRefsSize,
-                  const UA_NodeId *relevantRefs) {
-    if(!relevantRefs)
-        return true;
-    for(size_t i = 0; i < relevantRefsSize; i++) {
-        if(UA_NodeId_equal(refType, &relevantRefs[i]))
-            return true;
-    }
-    return false;
-}
-
-static UA_StatusCode
-addRelevantReferences(UA_Server *server, RefTree *rt, const UA_NodeId *nodeId,
-                      size_t refTypesSize, const UA_NodeId *refTypes,
-                      UA_BrowseDirection browseDirection) {
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId);
-    if(!node)
-        return UA_STATUSCODE_BADNODEIDUNKNOWN;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < node->referencesSize; i++) {
-        UA_NodeReferenceKind *rk = &node->references[i];
-
-        /* Reference in the right direction? */
-        if(rk->isInverse && browseDirection == UA_BROWSEDIRECTION_FORWARD)
-            continue;
-        if(!rk->isInverse && browseDirection == UA_BROWSEDIRECTION_INVERSE)
-            continue;
-
-        /* Is the reference part of the hierarchy of references we look for? */
-        if(!relevantReference(&rk->referenceTypeId, refTypesSize, refTypes))
-            continue;
-
-        for(size_t k = 0; k < rk->targetIdsSize; k++) {
-            retval = RefTree_add(rt ,&rk->targetIds[k]);
-            if(retval != UA_STATUSCODE_GOOD)
-                goto cleanup;
-        }
-    }
-
- cleanup:
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    return retval;
-}
-
-UA_StatusCode
-browseRecursive(UA_Server *server,
-                size_t startNodesSize, const UA_NodeId *startNodes,
-                size_t refTypesSize, const UA_NodeId *refTypes,
-                UA_BrowseDirection browseDirection, UA_Boolean includeStartNodes,
-                size_t *resultsSize, UA_ExpandedNodeId **results) {
-    RefTree rt;
-    UA_StatusCode retval = RefTree_init(&rt);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Add the start nodes? */
-    UA_ExpandedNodeId en = UA_EXPANDEDNODEID_NULL;
-    for(size_t i = 0; i < startNodesSize && retval == UA_STATUSCODE_GOOD; i++) {
-        if(includeStartNodes) {
-            en.nodeId = startNodes[i];
-            retval = RefTree_add(&rt, &en);
-        } else {
-            retval = addRelevantReferences(server, &rt, &startNodes[i],
-                                           refTypesSize, refTypes, browseDirection);
-        }
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        RefTree_clear(&rt);
-        return retval;
-    }
-
-    /* Loop over the targets we have so far. This recurses, as new targets are
-     * added to rt. */
-    for(size_t i = 0; i < rt.size; i++) {
-        /* Dont recurse into remote nodes */
-        if(rt.targets[i].serverIndex > 0)
-            continue;
-        if(rt.targets[i].namespaceUri.data != NULL)
-            continue;
-
-        retval = addRelevantReferences(server, &rt, &rt.targets[i].nodeId,
-                                       refTypesSize, refTypes, browseDirection);
-        if(retval != UA_STATUSCODE_GOOD) {
-            RefTree_clear(&rt);
-            return retval;
-        }
-    }
-
-    if(rt.size > 0) {
-        *results = rt.targets;
-        *resultsSize = rt.size;
-    } else {
-        RefTree_clear(&rt);
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Only if IncludeSubtypes is selected */
-UA_StatusCode
-referenceSubtypes(UA_Server *server, const UA_NodeId *refType,
-                  size_t *refTypesSize, UA_NodeId **refTypes) {
-    /* Leave refTypes == NULL */
-    if(UA_NodeId_isNull(refType))
-        return UA_STATUSCODE_GOOD;
-
-    /* Browse recursive for the hierarchy of sub-references */
-    UA_ExpandedNodeId *rt = NULL;
-    size_t rtSize = 0;
-    UA_NodeId hasSubtype = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
-    UA_StatusCode retval = browseRecursive(server, 1, refType, 1, &hasSubtype,
-                                           UA_BROWSEDIRECTION_FORWARD, true, &rtSize, &rt);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_assert(rtSize > 0);
-
-    /* Allocate space (realloc if non-NULL) */
-    UA_NodeId *newRt = NULL;
-    if(!*refTypes) {
-        newRt = (UA_NodeId*)UA_malloc(rtSize * UA_TYPES[UA_TYPES_NODEID].memSize);
-    } else {
-        newRt = (UA_NodeId*)UA_realloc(*refTypes, (*refTypesSize + rtSize) *
-                                           UA_TYPES[UA_TYPES_NODEID].memSize);
-    }
-    if(!newRt) {
-        UA_Array_delete(rt, rtSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    *refTypes = newRt;
-
-    /* Move NodeIds */
-    for(size_t i = 0; i < rtSize; i++) {
-        (*refTypes)[*refTypesSize + i] = rt[i].nodeId;
-        UA_NodeId_init(&rt[i].nodeId);
-    }
-    *refTypesSize += rtSize;
-    UA_Array_delete(rt, rtSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Server_browseRecursive(UA_Server *server, const UA_BrowseDescription *bd,
-                          size_t *resultsSize, UA_ExpandedNodeId **results) {
-    /* Set the list of relevant reference types */
-    UA_LOCK(server->serviceMutex);
-    UA_NodeId *refTypes = NULL;
-    size_t refTypesSize = 0;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(!UA_NodeId_isNull(&bd->referenceTypeId)) {
-        if(!bd->includeSubtypes) {
-            refTypes = (UA_NodeId*)(uintptr_t)&bd->referenceTypeId;
-            refTypesSize = 1;
-        } else {
-            retval = referenceSubtypes(server, &bd->referenceTypeId,
-                                       &refTypesSize, &refTypes);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_UNLOCK(server->serviceMutex);
-                return retval;
-            }
-        }
-    }
-
-    /* Browse */
-    retval = browseRecursive(server, 1, &bd->nodeId, refTypesSize, refTypes,
-                             bd->browseDirection, false, resultsSize, results);
-
-    /* Clean up */
-    if(refTypes && bd->includeSubtypes)
-        UA_Array_delete(refTypes, refTypesSize, &UA_TYPES[UA_TYPES_NODEID]);
-
-    UA_UNLOCK(server->serviceMutex);
-    return retval;
-}
-
-/**********/
-/* Browse */
-/**********/
-
-typedef struct {
-    size_t size;
-    size_t capacity;
-    UA_ReferenceDescription *descr;
-} RefResult;
-
-static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT
-RefResult_init(RefResult *rr) {
-    memset(rr, 0, sizeof(RefResult));
-    rr->descr = (UA_ReferenceDescription*)
-        UA_Array_new(UA_BROWSE_INITIAL_SIZE, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]);
-    if(!rr->descr)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    rr->capacity = UA_BROWSE_INITIAL_SIZE;
-    rr->size = 0;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT
-RefResult_double(RefResult *rr) {
-    size_t newSize = rr->capacity * 2;
-    UA_ReferenceDescription *rd = (UA_ReferenceDescription*)
-        UA_realloc(rr->descr, newSize * sizeof(UA_ReferenceDescription));
-    if(!rd)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    memset(&rd[rr->size], 0, sizeof(UA_ReferenceDescription) * (newSize - rr->size));
-    rr->descr = rd;
-    rr->capacity = newSize;
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-RefResult_clear(RefResult *rr) {
-    UA_assert(rr->descr != NULL);
-    for(size_t i = 0; i < rr->size; i++)
-        UA_ReferenceDescription_clear(&rr->descr[i]);
-    UA_free(rr->descr);
-}
-
-struct ContinuationPoint {
-    ContinuationPoint *next;
-    UA_ByteString identifier;
-    UA_BrowseDescription browseDescription;
-    UA_UInt32 maxReferences;
-
-    size_t relevantReferencesSize;
-    UA_NodeId *relevantReferences;
-
-    /* The last point in the node references? */
-    size_t referenceKindIndex;
-    size_t targetIndex;
-};
-
-ContinuationPoint *
-ContinuationPoint_clear(ContinuationPoint *cp) {
-    UA_ByteString_deleteMembers(&cp->identifier);
-    UA_BrowseDescription_deleteMembers(&cp->browseDescription);
-    UA_Array_delete(cp->relevantReferences, cp->relevantReferencesSize,
-                    &UA_TYPES[UA_TYPES_NODEID]);
-    return cp->next;
-}
-
-/* Target node on top of the stack */
-static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT
-addReferenceDescription(UA_Server *server, RefResult *rr, const UA_NodeReferenceKind *ref,
-                        UA_UInt32 mask, const UA_ExpandedNodeId *nodeId, const UA_Node *curr) {
-    /* Ensure capacity is left */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(rr->size >= rr->capacity) {
-        retval = RefResult_double(rr);
-        if(retval != UA_STATUSCODE_GOOD)
-           return retval;
-    }
-
-    UA_ReferenceDescription *descr = &rr->descr[rr->size];
-
-    /* Fields without access to the actual node */
-    retval = UA_ExpandedNodeId_copy(nodeId, &descr->nodeId);
-    if(mask & UA_BROWSERESULTMASK_REFERENCETYPEID)
-        retval |= UA_NodeId_copy(&ref->referenceTypeId, &descr->referenceTypeId);
-    if(mask & UA_BROWSERESULTMASK_ISFORWARD)
-        descr->isForward = !ref->isInverse;
-
-    /* Remote references (ExpandedNodeId) are not further looked up here */
-    if(!curr) {
-        UA_ReferenceDescription_deleteMembers(descr);
-        return retval;
-    }
-    
-    /* Fields that require the actual node */
-    if(mask & UA_BROWSERESULTMASK_NODECLASS)
-        retval |= UA_NodeClass_copy(&curr->nodeClass, &descr->nodeClass);
-    if(mask & UA_BROWSERESULTMASK_BROWSENAME)
-        retval |= UA_QualifiedName_copy(&curr->browseName, &descr->browseName);
-    if(mask & UA_BROWSERESULTMASK_DISPLAYNAME)
-        retval |= UA_LocalizedText_copy(&curr->displayName, &descr->displayName);
-    if(mask & UA_BROWSERESULTMASK_TYPEDEFINITION) {
-        if(curr->nodeClass == UA_NODECLASS_OBJECT ||
-           curr->nodeClass == UA_NODECLASS_VARIABLE) {
-            const UA_Node *type = getNodeType(server, curr);
-            if(type) {
-                retval |= UA_NodeId_copy(&type->nodeId, &descr->typeDefinition.nodeId);
-                UA_Nodestore_releaseNode(server->nsCtx, type);
-            }
-        }
-    }
-
-    if(retval == UA_STATUSCODE_GOOD)
-        rr->size++; /* Increase the counter */
-    else
-        UA_ReferenceDescription_deleteMembers(descr);
-    return retval;
-}
-
-static UA_Boolean
-matchClassMask(const UA_Node *node, UA_UInt32 nodeClassMask) {
-    if(nodeClassMask != UA_NODECLASS_UNSPECIFIED &&
-       (node->nodeClass & nodeClassMask) == 0)
-        return false;
-    return true;
-}
-
-/* Returns whether the node / continuationpoint is done */
-static UA_StatusCode
-browseReferences(UA_Server *server, const UA_Node *node,
-                 ContinuationPoint *cp, RefResult *rr, UA_Boolean *done) {
-    UA_assert(cp != NULL);
-    const UA_BrowseDescription *bd= &cp->browseDescription;
-
-    size_t referenceKindIndex = cp->referenceKindIndex;
-    size_t targetIndex = cp->targetIndex;
-
-    /* Loop over the node's references */
-    const UA_Node *target = NULL;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(; referenceKindIndex < node->referencesSize; ++referenceKindIndex) {
-        UA_NodeReferenceKind *rk = &node->references[referenceKindIndex];
-
-        /* Reference in the right direction? */
-        if(rk->isInverse && bd->browseDirection == UA_BROWSEDIRECTION_FORWARD)
-            continue;
-        if(!rk->isInverse && bd->browseDirection == UA_BROWSEDIRECTION_INVERSE)
-            continue;
-
-        /* Is the reference part of the hierarchy of references we look for? */
-        if(!relevantReference(&rk->referenceTypeId, cp->relevantReferencesSize,
-                              cp->relevantReferences))
-            continue;
-
-        /* Loop over the targets */
-        for(; targetIndex < rk->targetIdsSize; ++targetIndex) {
-            target = NULL;
-
-            /* Get the node if it is not a remote reference */
-            if(rk->targetIds[targetIndex].serverIndex == 0 &&
-               rk->targetIds[targetIndex].namespaceUri.data == NULL) {
-                target = UA_Nodestore_getNode(server->nsCtx, &rk->targetIds[targetIndex].nodeId);
-
-                /* Test if the node class matches */
-                if(target && !matchClassMask(target, bd->nodeClassMask)) {
-                    if(target)
-                        UA_Nodestore_releaseNode(server->nsCtx, target);
-                    continue;
-                }
-            }
-
-            /* A match! Did we reach maxrefs? */
-            if(rr->size >= cp->maxReferences) {
-                cp->referenceKindIndex = referenceKindIndex;
-                cp->targetIndex = targetIndex;
-                if(target)
-                    UA_Nodestore_releaseNode(server->nsCtx, target);
-                return UA_STATUSCODE_GOOD;
-            }
-
-            /* Copy the node description. Target is on top of the stack */
-            retval = addReferenceDescription(server, rr, rk, bd->resultMask,
-                                             &rk->targetIds[targetIndex], target);
-            UA_Nodestore_releaseNode(server->nsCtx, target);
-            if(retval != UA_STATUSCODE_GOOD)
-                return retval;
-        }
-
-        targetIndex = 0; /* Start at index 0 for the next reference kind */
-    }
-
-    /* The node is done */
-    *done = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Results for a single browsedescription. This is the inner loop for both
- * Browse and BrowseNext. The ContinuationPoint contains all the data used.
- * Including the BrowseDescription. Returns whether there are remaining
- * references. */
-static UA_Boolean
-browseWithContinuation(UA_Server *server, UA_Session *session,
-                       ContinuationPoint *cp, UA_BrowseResult *result) {
-    const UA_BrowseDescription *descr = &cp->browseDescription;
-
-    /* Is the browsedirection valid? */
-    if(descr->browseDirection != UA_BROWSEDIRECTION_BOTH &&
-       descr->browseDirection != UA_BROWSEDIRECTION_FORWARD &&
-       descr->browseDirection != UA_BROWSEDIRECTION_INVERSE) {
-        result->statusCode = UA_STATUSCODE_BADBROWSEDIRECTIONINVALID;
-        return true;
-    }
-
-    /* Is the reference type valid? */
-    if(!UA_NodeId_isNull(&descr->referenceTypeId)) {
-        const UA_Node *reftype = UA_Nodestore_getNode(server->nsCtx, &descr->referenceTypeId);
-        if(!reftype) {
-            result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
-            return true;
-        }
-
-        UA_Boolean isRef = (reftype->nodeClass == UA_NODECLASS_REFERENCETYPE);
-        UA_Nodestore_releaseNode(server->nsCtx, reftype);
-
-        if(!isRef) {
-            result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
-            return true;
-        }
-    }
-
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &descr->nodeId);
-    if(!node) {
-        result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
-        return true;
-    }
-
-    RefResult rr;
-    result->statusCode = RefResult_init(&rr);
-    if(result->statusCode != UA_STATUSCODE_GOOD) {
-        UA_Nodestore_releaseNode(server->nsCtx, node);
-        return true;
-    }
-
-    /* Browse the references */
-    UA_Boolean done = false;
-    result->statusCode = browseReferences(server, node, cp, &rr, &done);
-    UA_Nodestore_releaseNode(server->nsCtx, node);
-    if(result->statusCode != UA_STATUSCODE_GOOD) {
-        RefResult_clear(&rr);
-        return true;
-    }
-
-    /* Move results */
-    if(rr.size > 0) {
-        result->references = rr.descr;
-        result->referencesSize = rr.size;
-    } else {
-        /* No relevant references, return array of length zero */
-        RefResult_clear(&rr);
-        result->references = (UA_ReferenceDescription*)UA_EMPTY_ARRAY_SENTINEL;
-    }
-
-    return done;
-}
-
-/* Start to browse with no previous cp */
-void
-Operation_Browse(UA_Server *server, UA_Session *session, const UA_UInt32 *maxrefs,
-                 const UA_BrowseDescription *descr, UA_BrowseResult *result) {
-    /* Stack-allocate a temporary cp */
-    UA_STACKARRAY(ContinuationPoint, cp, 1);
-    memset(cp, 0, sizeof(ContinuationPoint));
-    cp->maxReferences = *maxrefs;
-    cp->browseDescription = *descr; /* Shallow copy. Deep-copy later if we persist the cp. */
-
-    /* How many references can we return at most? */
-    if(cp->maxReferences == 0) {
-        if(server->config.maxReferencesPerNode != 0) {
-            cp->maxReferences = server->config.maxReferencesPerNode;
-        } else {
-            cp->maxReferences = UA_INT32_MAX;
-        }
-    } else {
-        if(server->config.maxReferencesPerNode != 0 &&
-           cp->maxReferences > server->config.maxReferencesPerNode) {
-            cp->maxReferences= server->config.maxReferencesPerNode;
-        }
-    }
-
-    /* Get the list of relevant reference types */
-    if(!UA_NodeId_isNull(&descr->referenceTypeId)) {
-        if(!descr->includeSubtypes) {
-            cp->relevantReferences = (UA_NodeId*)(uintptr_t)&descr->referenceTypeId;
-            cp->relevantReferencesSize = 1;
-        } else {
-            result->statusCode =
-                referenceSubtypes(server, &descr->referenceTypeId,
-                                  &cp->relevantReferencesSize, &cp->relevantReferences);
-            if(result->statusCode != UA_STATUSCODE_GOOD)
-                return;
-        }
-    }
-
-    UA_Boolean done = browseWithContinuation(server, session, cp, result);
-
-    /* Exit early if done or an error occurred */
-    if(done || result->statusCode != UA_STATUSCODE_GOOD) {
-        if(descr->includeSubtypes)
-            UA_Array_delete(cp->relevantReferences, cp->relevantReferencesSize,
-                            &UA_TYPES[UA_TYPES_NODEID]);
-        return;
-    }
-
-    /* Persist the new continuation point */
-
-    ContinuationPoint *cp2 = NULL;
-    UA_Guid *ident = NULL;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    /* Enough space for the continuation point? */
-    if(session->availableContinuationPoints <= 0) {
-        retval = UA_STATUSCODE_BADNOCONTINUATIONPOINTS;
-        goto cleanup;
-    }
-
-    /* Allocate and fill the data structure */
-    cp2 = (ContinuationPoint*)UA_malloc(sizeof(ContinuationPoint));
-    if(!cp2) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto cleanup;
-    }
-    memset(cp2, 0, sizeof(ContinuationPoint));
-    cp2->referenceKindIndex = cp->referenceKindIndex;
-    cp2->targetIndex = cp->targetIndex;
-    cp2->maxReferences = cp->maxReferences;
-
-    if(descr->includeSubtypes) {
-        cp2->relevantReferences = cp->relevantReferences;
-        cp2->relevantReferencesSize = cp->relevantReferencesSize;
-    } else {
-        retval = UA_Array_copy(cp->relevantReferences, cp->relevantReferencesSize,
-                               (void**)&cp2->relevantReferences, &UA_TYPES[UA_TYPES_NODEID]);
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-        cp2->relevantReferencesSize = cp->relevantReferencesSize;
-    }
-
-    /* Copy the description */
-    retval = UA_BrowseDescription_copy(descr, &cp2->browseDescription);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Create a random bytestring via a Guid */
-    ident = UA_Guid_new();
-    if(!ident) {
-        retval = UA_STATUSCODE_BADOUTOFMEMORY;
-        goto cleanup;
-    }
-    *ident = UA_Guid_random();
-    cp2->identifier.data = (UA_Byte*)ident;
-    cp2->identifier.length = sizeof(UA_Guid);
-
-    /* Return the cp identifier */
-    retval = UA_ByteString_copy(&cp2->identifier, &result->continuationPoint);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Attach the cp to the session */
-    cp2->next = session->continuationPoints;
-    session->continuationPoints = cp2;
-    --session->availableContinuationPoints;
-    return;
-
- cleanup:
-    if(cp2) {
-        ContinuationPoint_clear(cp2);
-        UA_free(cp2);
-    }
-    UA_BrowseResult_deleteMembers(result);
-    result->statusCode = retval;
-}
-
-void Service_Browse(UA_Server *server, UA_Session *session,
-                    const UA_BrowseRequest *request, UA_BrowseResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing BrowseRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Test the number of operations in the request */
-    if(server->config.maxNodesPerBrowse != 0 &&
-       request->nodesToBrowseSize > server->config.maxNodesPerBrowse) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    /* No views supported at the moment */
-    if(!UA_NodeId_isNull(&request->view.viewId)) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADVIEWIDUNKNOWN;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Browse,
-                                           &request->requestedMaxReferencesPerNode,
-                                           &request->nodesToBrowseSize, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSERESULT]);
-}
-
-UA_BrowseResult
-UA_Server_browse(UA_Server *server, UA_UInt32 maxReferences,
-                 const UA_BrowseDescription *bd) {
-    UA_BrowseResult result;
-    UA_BrowseResult_init(&result);
-    UA_LOCK(server->serviceMutex);
-    Operation_Browse(server, &server->adminSession, &maxReferences, bd, &result);
-    UA_UNLOCK(server->serviceMutex);
-    return result;
-}
-
-static void
-Operation_BrowseNext(UA_Server *server, UA_Session *session,
-                     const UA_Boolean *releaseContinuationPoints,
-                     const UA_ByteString *continuationPoint, UA_BrowseResult *result) {
-    /* Find the continuation point */
-    ContinuationPoint **prev = &session->continuationPoints, *cp;
-    while((cp = *prev)) {
-        if(UA_ByteString_equal(&cp->identifier, continuationPoint))
-            break;
-        prev = &cp->next;
-    }
-    if(!cp) {
-        result->statusCode = UA_STATUSCODE_BADCONTINUATIONPOINTINVALID;
-        return;
-    }
-
-    /* Remove the cp */
-    if(*releaseContinuationPoints) {
-        *prev = ContinuationPoint_clear(cp);
-        UA_free(cp);
-        ++session->availableContinuationPoints;
-        return;
-    }
-
-    /* Continue browsing */
-    UA_Boolean done = browseWithContinuation(server, session, cp, result);
-
-    if(done) {
-        /* Remove the cp if there are no references left */
-        *prev = ContinuationPoint_clear(cp);
-        UA_free(cp);
-        ++session->availableContinuationPoints;
-    } else {
-        /* Return the cp identifier */
-        UA_StatusCode retval = UA_ByteString_copy(&cp->identifier, &result->continuationPoint);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_BrowseResult_deleteMembers(result);
-            result->statusCode = retval;
-        }
-    }
-}
-
-void
-Service_BrowseNext(UA_Server *server, UA_Session *session,
-                   const UA_BrowseNextRequest *request,
-                   UA_BrowseNextResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing BrowseNextRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    UA_Boolean releaseContinuationPoints = request->releaseContinuationPoints; /* request is const */
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_BrowseNext,
-                                           &releaseContinuationPoints,
-                                           &request->continuationPointsSize, &UA_TYPES[UA_TYPES_BYTESTRING],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSERESULT]);
-}
-
-UA_BrowseResult
-UA_Server_browseNext(UA_Server *server, UA_Boolean releaseContinuationPoint,
-                     const UA_ByteString *continuationPoint) {
-    UA_BrowseResult result;
-    UA_BrowseResult_init(&result);
-    UA_LOCK(server->serviceMutex);
-    Operation_BrowseNext(server, &server->adminSession, &releaseContinuationPoint,
-                         continuationPoint, &result);
-    UA_UNLOCK(server->serviceMutex);
-    return result;
-}
-
-/***********************/
-/* TranslateBrowsePath */
-/***********************/
-
-static void
-walkBrowsePathElementReferenceTargets(UA_BrowsePathResult *result, size_t *targetsSize,
-                                      UA_NodeId **next, size_t *nextSize, size_t *nextCount,
-                                      UA_UInt32 elemDepth, const UA_NodeReferenceKind *rk) {
-    /* Loop over the targets */
-    for(size_t i = 0; i < rk->targetIdsSize; i++) {
-        UA_ExpandedNodeId *targetId = &rk->targetIds[i];
-
-        /* Does the reference point to an external server? Then add to the
-         * targets with the right path depth. */
-        if(targetId->serverIndex != 0) {
-            UA_BrowsePathTarget *tempTargets =
-                (UA_BrowsePathTarget*)UA_realloc(result->targets,
-                             sizeof(UA_BrowsePathTarget) * (*targetsSize) * 2);
-            if(!tempTargets) {
-                result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-                return;
-            }
-            result->targets = tempTargets;
-            (*targetsSize) *= 2;
-            result->statusCode = UA_ExpandedNodeId_copy(targetId,
-                       &result->targets[result->targetsSize].targetId);
-            result->targets[result->targetsSize].remainingPathIndex = elemDepth;
-            continue;
-        }
-
-        /* Can we store the node in the array of candidates for deep-search? */
-        if(*nextSize <= *nextCount) {
-            UA_NodeId *tempNext =
-                (UA_NodeId*)UA_realloc(*next, sizeof(UA_NodeId) * (*nextSize) * 2);
-            if(!tempNext) {
-                result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-                return;
-            }
-            *next = tempNext;
-            (*nextSize) *= 2;
-        }
-
-        /* Add the node to the next array for the following path element */
-        result->statusCode = UA_NodeId_copy(&targetId->nodeId,
-                                            &(*next)[*nextCount]);
-        if(result->statusCode != UA_STATUSCODE_GOOD)
-            return;
-        ++(*nextCount);
-    }
-}
-
-static void
-walkBrowsePathElement(UA_Server *server, UA_Session *session, UA_UInt32 nodeClassMask,
-                      UA_BrowsePathResult *result, size_t *targetsSize,
-                      const UA_RelativePathElement *elem, UA_UInt32 elemDepth,
-                      const UA_QualifiedName *targetName,
-                      const UA_NodeId *current, const size_t currentCount,
-                      UA_NodeId **next, size_t *nextSize, size_t *nextCount) {
-    /* Return all references? */
-    UA_Boolean all_refs = UA_NodeId_isNull(&elem->referenceTypeId);
-    if(!all_refs) {
-        const UA_Node *rootRef = UA_Nodestore_getNode(server->nsCtx, &elem->referenceTypeId);
-        if(!rootRef)
-            return;
-        UA_Boolean match = (rootRef->nodeClass == UA_NODECLASS_REFERENCETYPE);
-        UA_Nodestore_releaseNode(server->nsCtx, rootRef);
-        if(!match)
-            return;
-    }
-
-    /* Iterate over all nodes at the current depth-level */
-    for(size_t i = 0; i < currentCount; ++i) {
-        /* Get the node */
-        const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &current[i]);
-        if(!node) {
-            /* If we cannot find the node at depth 0, the starting node does not exist */
-            if(elemDepth == 0)
-                result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
-            continue;
-        }
-
-        /* Test whether the node fits the class mask */
-        if(!matchClassMask(node, nodeClassMask)) {
-            UA_Nodestore_releaseNode(server->nsCtx, node);
-            continue;
-        }
-
-        /* Test whether the node has the target name required in the previous
-         * path element */
-        if(targetName && (targetName->namespaceIndex != node->browseName.namespaceIndex ||
-                          !UA_String_equal(&targetName->name, &node->browseName.name))) {
-            UA_Nodestore_releaseNode(server->nsCtx, node);
-            continue;
-        }
-
-        /* Loop over the nodes references */
-        for(size_t r = 0; r < node->referencesSize &&
-                result->statusCode == UA_STATUSCODE_GOOD; ++r) {
-            UA_NodeReferenceKind *rk = &node->references[r];
-
-            /* Does the direction of the reference match? */
-            if(rk->isInverse != elem->isInverse)
-                continue;
-
-            /* Is the node relevant? */
-            if(!all_refs) {
-                if(!elem->includeSubtypes && !UA_NodeId_equal(&rk->referenceTypeId, &elem->referenceTypeId))
-                    continue;
-                if(!isNodeInTree(server->nsCtx, &rk->referenceTypeId, &elem->referenceTypeId, &subtypeId, 1))
-                    continue;
-            }
-
-            /* Walk over the reference targets */
-            walkBrowsePathElementReferenceTargets(result, targetsSize, next, nextSize,
-                                                  nextCount, elemDepth, rk);
-        }
-
-        UA_Nodestore_releaseNode(server->nsCtx, node);
-    }
-}
-
-/* This assumes that result->targets has enough room for all currentCount elements */
-static void
-addBrowsePathTargets(UA_Server *server, UA_Session *session, UA_UInt32 nodeClassMask,
-                     UA_BrowsePathResult *result, const UA_QualifiedName *targetName,
-                     UA_NodeId *current, size_t currentCount) {
-    for(size_t i = 0; i < currentCount; i++) {
-        const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &current[i]);
-        if(!node) {
-            UA_NodeId_deleteMembers(&current[i]);
-            continue;
-        }
-
-        /* Test whether the node fits the class mask */
-        UA_Boolean skip = !matchClassMask(node, nodeClassMask);
-
-        /* Test whether the node has the target name required in the
-         * previous path element */
-        if(targetName->namespaceIndex != node->browseName.namespaceIndex ||
-           !UA_String_equal(&targetName->name, &node->browseName.name))
-            skip = true;
-
-        UA_Nodestore_releaseNode(server->nsCtx, node);
-
-        if(skip) {
-            UA_NodeId_deleteMembers(&current[i]);
-            continue;
-        }
-
-        /* Move the nodeid to the target array */
-        UA_BrowsePathTarget_init(&result->targets[result->targetsSize]);
-        result->targets[result->targetsSize].targetId.nodeId = current[i];
-        result->targets[result->targetsSize].remainingPathIndex = UA_UINT32_MAX;
-        ++result->targetsSize;
-    }
-}
-
-static void
-walkBrowsePath(UA_Server *server, UA_Session *session, const UA_BrowsePath *path,
-               UA_UInt32 nodeClassMask, UA_BrowsePathResult *result, size_t targetsSize,
-               UA_NodeId **current, size_t *currentSize, size_t *currentCount,
-               UA_NodeId **next, size_t *nextSize, size_t *nextCount) {
-    UA_assert(*currentCount == 1);
-    UA_assert(*nextCount == 0);
-
-    /* Points to the targetName of the _previous_ path element */
-    const UA_QualifiedName *targetName = NULL;
-
-    /* Iterate over path elements */
-    UA_assert(path->relativePath.elementsSize > 0);
-    for(UA_UInt32 i = 0; i < path->relativePath.elementsSize; ++i) {
-        walkBrowsePathElement(server, session, nodeClassMask, result, &targetsSize,
-                              &path->relativePath.elements[i], i, targetName,
-                              *current, *currentCount, next, nextSize, nextCount);
-
-        /* Clean members of current */
-        for(size_t j = 0; j < *currentCount; j++)
-            UA_NodeId_deleteMembers(&(*current)[j]);
-        *currentCount = 0;
-
-        /* When no targets are left or an error occurred. None of next's
-         * elements will be copied to result->targets */
-        if(*nextCount == 0 || result->statusCode != UA_STATUSCODE_GOOD) {
-            UA_assert(*currentCount == 0);
-            UA_assert(*nextCount == 0);
-            return;
-        }
-
-        /* Exchange current and next for the next depth */
-        size_t tSize = *currentSize; size_t tCount = *currentCount; UA_NodeId *tT = *current;
-        *currentSize = *nextSize; *currentCount = *nextCount; *current = *next;
-        *nextSize = tSize; *nextCount = tCount; *next = tT;
-
-        /* Store the target name of the previous path element */
-        targetName = &path->relativePath.elements[i].targetName;
-    }
-
-    UA_assert(targetName != NULL);
-    UA_assert(*nextCount == 0);
-
-    /* After the last BrowsePathElement, move members from current to the
-     * result targets */
-
-    /* Realloc if more space is needed */
-    if(targetsSize < result->targetsSize + (*currentCount)) {
-        UA_BrowsePathTarget *newTargets =
-            (UA_BrowsePathTarget*)UA_realloc(result->targets, sizeof(UA_BrowsePathTarget) *
-                                             (result->targetsSize + (*currentCount)));
-        if(!newTargets) {
-            result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-            for(size_t i = 0; i < *currentCount; ++i)
-                UA_NodeId_deleteMembers(&(*current)[i]);
-            *currentCount = 0;
-            return;
-        }
-        result->targets = newTargets;
-    }
-
-    /* Move the elements of current to the targets */
-    addBrowsePathTargets(server, session, nodeClassMask, result, targetName, *current, *currentCount);
-    *currentCount = 0;
-}
-
-static void
-Operation_TranslateBrowsePathToNodeIds(UA_Server *server, UA_Session *session,
-                                       const UA_UInt32 *nodeClassMask, const UA_BrowsePath *path,
-                                       UA_BrowsePathResult *result) {
-    if(path->relativePath.elementsSize <= 0) {
-        result->statusCode = UA_STATUSCODE_BADNOTHINGTODO;
-        return;
-    }
-
-    /* RelativePath elements must not have an empty targetName */
-    for(size_t i = 0; i < path->relativePath.elementsSize; ++i) {
-        if(UA_QualifiedName_isNull(&path->relativePath.elements[i].targetName)) {
-            result->statusCode = UA_STATUSCODE_BADBROWSENAMEINVALID;
-            return;
-        }
-    }
-
-    /* Allocate memory for the targets */
-    size_t targetsSize = 10; /* When to realloc; the member count is stored in
-                              * result->targetsSize */
-    result->targets =
-        (UA_BrowsePathTarget*)UA_malloc(sizeof(UA_BrowsePathTarget) * targetsSize);
-    if(!result->targets) {
-        result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-        return;
-    }
-
-    /* Allocate memory for two temporary arrays. One with the results for the
-     * previous depth of the path. The other for the new results at the current
-     * depth. The two arrays alternate as we descend down the tree. */
-    size_t currentSize = 10; /* When to realloc */
-    size_t currentCount = 0; /* Current elements */
-    UA_NodeId *current = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * currentSize);
-    if(!current) {
-        result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-        UA_free(result->targets);
-        return;
-    }
-    size_t nextSize = 10; /* When to realloc */
-    size_t nextCount = 0; /* Current elements */
-    UA_NodeId *next = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * nextSize);
-    if(!next) {
-        result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
-        UA_free(result->targets);
-        UA_free(current);
-        return;
-    }
-
-    /* Copy the starting node into current */
-    result->statusCode = UA_NodeId_copy(&path->startingNode, &current[0]);
-    if(result->statusCode != UA_STATUSCODE_GOOD) {
-        UA_free(result->targets);
-        UA_free(current);
-        UA_free(next);
-        return;
-    }
-    currentCount = 1;
-
-    /* Walk the path elements */
-    walkBrowsePath(server, session, path, *nodeClassMask, result, targetsSize,
-                   &current, &currentSize, &currentCount,
-                   &next, &nextSize, &nextCount);
-
-    UA_assert(currentCount == 0);
-    UA_assert(nextCount == 0);
-
-    /* No results => BadNoMatch status code */
-    if(result->targetsSize == 0 && result->statusCode == UA_STATUSCODE_GOOD)
-        result->statusCode = UA_STATUSCODE_BADNOMATCH;
-
-    /* Clean up the temporary arrays and the targets */
-    UA_free(current);
-    UA_free(next);
-    if(result->statusCode != UA_STATUSCODE_GOOD) {
-        for(size_t i = 0; i < result->targetsSize; ++i)
-            UA_BrowsePathTarget_deleteMembers(&result->targets[i]);
-        UA_free(result->targets);
-        result->targets = NULL;
-        result->targetsSize = 0;
-    }
-}
-
-UA_BrowsePathResult
-translateBrowsePathToNodeIds(UA_Server *server,
-                                       const UA_BrowsePath *browsePath) {
-    UA_BrowsePathResult result;
-    UA_BrowsePathResult_init(&result);
-    UA_UInt32 nodeClassMask = 0; /* All node classes */
-    Operation_TranslateBrowsePathToNodeIds(server, &server->adminSession, &nodeClassMask,
-                                           browsePath, &result);
-    return result;
-}
-
-UA_BrowsePathResult
-UA_Server_translateBrowsePathToNodeIds(UA_Server *server,
-                                       const UA_BrowsePath *browsePath) {
-    UA_LOCK(server->serviceMutex);
-    UA_BrowsePathResult result = translateBrowsePathToNodeIds(server, browsePath);
-    UA_UNLOCK(server->serviceMutex);
-    return result;
-}
-
-void
-Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session,
-                                      const UA_TranslateBrowsePathsToNodeIdsRequest *request,
-                                      UA_TranslateBrowsePathsToNodeIdsResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing TranslateBrowsePathsToNodeIdsRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Test the number of operations in the request */
-    if(server->config.maxNodesPerTranslateBrowsePathsToNodeIds != 0 &&
-       request->browsePathsSize > server->config.maxNodesPerTranslateBrowsePathsToNodeIds) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    UA_UInt32 nodeClassMask = 0; /* All node classes */
-    response->responseHeader.serviceResult =
-        UA_Server_processServiceOperations(server, session,
-                                           (UA_ServiceOperation)Operation_TranslateBrowsePathToNodeIds,
-                                           &nodeClassMask,
-                                           &request->browsePathsSize, &UA_TYPES[UA_TYPES_BROWSEPATH],
-                                           &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]);
-}
-
-UA_BrowsePathResult
-browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin,
-                           size_t browsePathSize, const UA_QualifiedName *browsePath) {
-    /* Construct the BrowsePath */
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = origin;
-    UA_STACKARRAY(UA_RelativePathElement, rpe, browsePathSize);
-    memset(rpe, 0, sizeof(UA_RelativePathElement) * browsePathSize);
-    for(size_t j = 0; j < browsePathSize; j++) {
-        rpe[j].referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES);
-        rpe[j].includeSubtypes = true;
-        rpe[j].targetName = browsePath[j];
-    }
-    bp.relativePath.elements = rpe;
-    bp.relativePath.elementsSize = browsePathSize;
-
-    /* Browse */
-    UA_BrowsePathResult bpr;
-    UA_BrowsePathResult_init(&bpr);
-    UA_UInt32 nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE;
-    Operation_TranslateBrowsePathToNodeIds(server, &server->adminSession, &nodeClassMask, &bp, &bpr);
-    return bpr;
-}
-
-UA_BrowsePathResult
-UA_Server_browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin,
-                           size_t browsePathSize, const UA_QualifiedName *browsePath) {
-    UA_LOCK(server->serviceMutex);
-    UA_BrowsePathResult bpr = browseSimplifiedBrowsePath(server, origin, browsePathSize, browsePath);;
-    UA_UNLOCK(server->serviceMutex);
-    return bpr;
-}
-
-/************/
-/* Register */
-/************/
-
-void Service_RegisterNodes(UA_Server *server, UA_Session *session,
-                           const UA_RegisterNodesRequest *request,
-                           UA_RegisterNodesResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing RegisterNodesRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    //TODO: hang the nodeids to the session if really needed
-    if(request->nodesToRegisterSize == 0) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
-        return;
-    }
-
-    /* Test the number of operations in the request */
-    if(server->config.maxNodesPerRegisterNodes != 0 &&
-       request->nodesToRegisterSize > server->config.maxNodesPerRegisterNodes) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-
-    response->responseHeader.serviceResult =
-        UA_Array_copy(request->nodesToRegister, request->nodesToRegisterSize,
-                      (void**)&response->registeredNodeIds, &UA_TYPES[UA_TYPES_NODEID]);
-    if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD)
-        response->registeredNodeIdsSize = request->nodesToRegisterSize;
-}
-
-void Service_UnregisterNodes(UA_Server *server, UA_Session *session,
-                             const UA_UnregisterNodesRequest *request,
-                             UA_UnregisterNodesResponse *response) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Processing UnRegisterNodesRequest");
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    //TODO: remove the nodeids from the session if really needed
-    if(request->nodesToUnregisterSize == 0)
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
-
-    /* Test the number of operations in the request */
-    if(server->config.maxNodesPerRegisterNodes != 0 &&
-       request->nodesToUnregisterSize > server->config.maxNodesPerRegisterNodes) {
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS;
-        return;
-    }
-}
diff --git a/ext/open62541/src/server/ua_session.c b/ext/open62541/src/server/ua_session.c
deleted file mode 100644
index cf6ff1a..0000000
--- a/ext/open62541/src/server/ua_session.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA
- */
-
-#include "ua_session.h"
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-#include "ua_server_internal.h"
-#include "ua_subscription.h"
-#endif
-
-#define UA_SESSION_NONCELENTH 32
-
-void UA_Session_init(UA_Session *session) {
-    memset(session, 0, sizeof(UA_Session));
-    session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS;
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    SIMPLEQ_INIT(&session->responseQueue);
-#endif
-}
-
-void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server* server) {
-    UA_Session_detachFromSecureChannel(session);
-    UA_ApplicationDescription_deleteMembers(&session->clientDescription);
-    UA_NodeId_deleteMembers(&session->header.authenticationToken);
-    UA_NodeId_deleteMembers(&session->sessionId);
-    UA_String_deleteMembers(&session->sessionName);
-    UA_ByteString_deleteMembers(&session->serverNonce);
-    struct ContinuationPoint *cp, *next = session->continuationPoints;
-    while((cp = next)) {
-        next = ContinuationPoint_clear(cp);
-        UA_free(cp);
-    }
-    session->continuationPoints = NULL;
-    session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS;
-}
-
-void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel) {
-    LIST_INSERT_HEAD(&channel->sessions, &session->header, pointers);
-    session->header.channel = channel;
-}
-
-void UA_Session_detachFromSecureChannel(UA_Session *session) {
-    if(!session->header.channel)
-        return;
-    session->header.channel = NULL;
-    LIST_REMOVE(&session->header, pointers);
-}
-
-UA_StatusCode
-UA_Session_generateNonce(UA_Session *session) {
-    UA_SecureChannel *channel = session->header.channel;
-    if(!channel || !channel->securityPolicy)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Is the length of the previous nonce correct? */
-    if(session->serverNonce.length != UA_SESSION_NONCELENTH) {
-        UA_ByteString_deleteMembers(&session->serverNonce);
-        UA_StatusCode retval =
-            UA_ByteString_allocBuffer(&session->serverNonce, UA_SESSION_NONCELENTH);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    return channel->securityPolicy->symmetricModule.
-        generateNonce(channel->securityPolicy, &session->serverNonce);
-}
-
-void UA_Session_updateLifetime(UA_Session *session) {
-    session->validTill = UA_DateTime_nowMonotonic() +
-        (UA_DateTime)(session->timeout * UA_DATETIME_MSEC);
-}
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-void UA_Session_addSubscription(UA_Server *server, UA_Session *session, UA_Subscription *newSubscription) {
-    newSubscription->subscriptionId = ++session->lastSubscriptionId;
-
-    LIST_INSERT_HEAD(&session->serverSubscriptions, newSubscription, listEntry);
-    session->numSubscriptions++;
-    server->numSubscriptions++;
-}
-
-UA_StatusCode
-UA_Session_deleteSubscription(UA_Server *server, UA_Session *session,
-                              UA_UInt32 subscriptionId) {
-    UA_Subscription *sub = UA_Session_getSubscriptionById(session, subscriptionId);
-    if(!sub)
-        return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-
-    UA_Subscription_deleteMembers(server, sub);
-
-    /* Add a delayed callback to remove the subscription when the currently
-     * scheduled jobs have completed. There is no actual delayed callback. Just
-     * free the structure. */
-    sub->delayedFreePointers.callback = NULL;
-    UA_WorkQueue_enqueueDelayed(&server->workQueue, &sub->delayedFreePointers);
-
-    /* Remove from the session */
-    LIST_REMOVE(sub, listEntry);
-    UA_assert(session->numSubscriptions > 0);
-    UA_assert(server->numSubscriptions > 0);
-    session->numSubscriptions--;
-    server->numSubscriptions--;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_Subscription *
-UA_Session_getSubscriptionById(UA_Session *session, UA_UInt32 subscriptionId) {
-    UA_Subscription *sub;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        if(sub->subscriptionId == subscriptionId)
-            break;
-    }
-    return sub;
-}
-
-UA_PublishResponseEntry*
-UA_Session_dequeuePublishReq(UA_Session *session) {
-    UA_PublishResponseEntry* entry = SIMPLEQ_FIRST(&session->responseQueue);
-    if(entry) {
-        SIMPLEQ_REMOVE_HEAD(&session->responseQueue, listEntry);
-        session->numPublishReq--;
-    }
-    return entry;
-}
-
-void
-UA_Session_queuePublishReq(UA_Session *session, UA_PublishResponseEntry* entry, UA_Boolean head) {
-    if(!head)
-        SIMPLEQ_INSERT_TAIL(&session->responseQueue, entry, listEntry);
-    else
-        SIMPLEQ_INSERT_HEAD(&session->responseQueue, entry, listEntry);
-    session->numPublishReq++;
-}
-
-#endif
diff --git a/ext/open62541/src/server/ua_session.h b/ext/open62541/src/server/ua_session.h
deleted file mode 100644
index 5a1a202..0000000
--- a/ext/open62541/src/server/ua_session.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#ifndef UA_SESSION_H_
-#define UA_SESSION_H_
-
-#include <open62541/util.h>
-
-#include "ua_securechannel.h"
-
-_UA_BEGIN_DECLS
-
-#define UA_MAXCONTINUATIONPOINTS 5
-
-struct ContinuationPoint;
-typedef struct ContinuationPoint ContinuationPoint;
-
-/* Returns the next entry in the linked list */
-ContinuationPoint *
-ContinuationPoint_clear(ContinuationPoint *cp);
-
-struct UA_Subscription;
-typedef struct UA_Subscription UA_Subscription;
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-typedef struct UA_PublishResponseEntry {
-    SIMPLEQ_ENTRY(UA_PublishResponseEntry) listEntry;
-    UA_UInt32 requestId;
-    UA_PublishResponse response;
-} UA_PublishResponseEntry;
-#endif
-
-typedef struct {
-    UA_SessionHeader  header;
-    UA_ApplicationDescription clientDescription;
-    UA_String         sessionName;
-    UA_Boolean        activated;
-    void             *sessionHandle; // pointer assigned in userland-callback
-    UA_NodeId         sessionId;
-    UA_UInt32         maxRequestMessageSize;
-    UA_UInt32         maxResponseMessageSize;
-    UA_Double         timeout; // [ms]
-    UA_DateTime       validTill;
-    UA_ByteString     serverNonce;
-    UA_UInt16 availableContinuationPoints;
-    ContinuationPoint *continuationPoints;
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_UInt32 lastSubscriptionId;
-    UA_UInt32 lastSeenSubscriptionId;
-    LIST_HEAD(UA_ListOfUASubscriptions, UA_Subscription) serverSubscriptions;
-    SIMPLEQ_HEAD(UA_ListOfQueuedPublishResponses, UA_PublishResponseEntry) responseQueue;
-    UA_UInt32        numSubscriptions;
-    UA_UInt32        numPublishReq;
-    size_t           totalRetransmissionQueueSize; /* Retransmissions of all subscriptions */
-#endif
-} UA_Session;
-
-/**
- * Session Lifecycle
- * ----------------- */
-
-void UA_Session_init(UA_Session *session);
-void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server *server);
-void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel);
-void UA_Session_detachFromSecureChannel(UA_Session *session);
-UA_StatusCode UA_Session_generateNonce(UA_Session *session);
-
-/* If any activity on a session happens, the timeout is extended */
-void UA_Session_updateLifetime(UA_Session *session);
-
-/**
- * Subscription handling
- * --------------------- */
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-void
-UA_Session_addSubscription(UA_Server *server,
-                           UA_Session *session,
-                           UA_Subscription *newSubscription);
-
-UA_Subscription *
-UA_Session_getSubscriptionById(UA_Session *session,
-                               UA_UInt32 subscriptionId);
-
-UA_StatusCode
-UA_Session_deleteSubscription(UA_Server *server, UA_Session *session,
-                              UA_UInt32 subscriptionId);
-
-void
-UA_Session_queuePublishReq(UA_Session *session,
-                           UA_PublishResponseEntry* entry,
-                           UA_Boolean head);
-
-UA_PublishResponseEntry *
-UA_Session_dequeuePublishReq(UA_Session *session);
-
-#endif
-
-/**
- * Log Helper
- * ----------
- * We have to jump through some hoops to enable the use of format strings
- * without arguments since (pedantic) C99 does not allow variadic macros with
- * zero arguments. So we add a dummy argument that is not printed (%.0s is
- * string of length zero). */
-
-#define UA_LOG_SESSION_INTERNAL(LOGGER, LEVEL, SESSION, MSG, ...) do {  \
-        UA_String idString = UA_STRING_NULL;                            \
-        UA_NodeId_toString(&(SESSION)->sessionId, &idString);           \
-        UA_LOG_##LEVEL(LOGGER, UA_LOGCATEGORY_SESSION,                  \
-                       "Connection %i | SecureChannel %i | Session %.*s | " MSG "%.0s", \
-                       ((SESSION)->header.channel ?                     \
-                        ((SESSION)->header.channel->connection ?        \
-                         (int)((SESSION)->header.channel->connection->sockfd) : 0) : 0), \
-                       ((SESSION)->header.channel ?                     \
-                        (SESSION)->header.channel->securityToken.channelId : 0), \
-                       (int)idString.length, idString.data, __VA_ARGS__); \
-        UA_String_deleteMembers(&idString);                             \
-    } while(0)
-
-#if UA_LOGLEVEL <= 100
-#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...)                      \
-    UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, TRACE, SESSION, __VA_ARGS__, ""))
-#else
-#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...) do {} while(0)
-#endif
-
-#if UA_LOGLEVEL <= 200
-#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...)                      \
-    UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, DEBUG, SESSION, __VA_ARGS__, ""))
-#else
-#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...) do {} while(0)
-#endif
-
-#if UA_LOGLEVEL <= 300
-#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...)                      \
-    UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, INFO, SESSION, __VA_ARGS__, ""))
-#else
-#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...) do {} while(0)
-#endif
-
-#if UA_LOGLEVEL <= 400
-#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...)                      \
-    UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, WARNING, SESSION, __VA_ARGS__, ""))
-#else
-#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...) do {} while(0)
-#endif
-
-#if UA_LOGLEVEL <= 500
-#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...)                      \
-    UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, ERROR, SESSION, __VA_ARGS__, ""))
-#else
-#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...) do {} while(0)
-#endif
-
-#if UA_LOGLEVEL <= 600
-#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...)                      \
-    UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, FATAL, SESSION, __VA_ARGS__, ""))
-#else
-#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...) do {} while(0)
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_SESSION_H_ */
diff --git a/ext/open62541/src/server/ua_session_manager.c b/ext/open62541/src/server/ua_session_manager.c
deleted file mode 100644
index c6ceed9..0000000
--- a/ext/open62541/src/server/ua_session_manager.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include "ua_session_manager.h"
-#include "ua_server_internal.h"
-#include "ua_subscription.h"
-
-UA_StatusCode
-UA_SessionManager_init(UA_SessionManager *sm, UA_Server *server) {
-    LIST_INIT(&sm->sessions);
-    sm->currentSessionCount = 0;
-    sm->server = server;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Delayed callback to free the session memory */
-static void
-removeSessionCallback(UA_Server *server, session_list_entry *entry) {
-    UA_Session_deleteMembersCleanup(&entry->session, server);
-}
-
-static void
-removeSession(UA_SessionManager *sm, session_list_entry *sentry) {
-    UA_Server *server = sm->server;
-    UA_Session *session = &sentry->session;
-
-    /* Remove the Subscriptions */
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    UA_Subscription *sub, *tempsub;
-    LIST_FOREACH_SAFE(sub, &session->serverSubscriptions, listEntry, tempsub) {
-        UA_Session_deleteSubscription(server, session, sub->subscriptionId);
-    }
-
-    UA_PublishResponseEntry *entry;
-    while((entry = UA_Session_dequeuePublishReq(session))) {
-        UA_PublishResponse_deleteMembers(&entry->response);
-        UA_free(entry);
-    }
-#endif
-
-    /* Callback into userland access control */
-    if(server->config.accessControl.closeSession)
-        server->config.accessControl.closeSession(server, &server->config.accessControl,
-                                                  &session->sessionId, session->sessionHandle);
-
-    /* Detach the Session from the SecureChannel */
-    UA_Session_detachFromSecureChannel(session);
-
-    /* Deactivate the session */
-    sentry->session.activated = false;
-
-    /* Detach the session from the session manager and make the capacity
-     * available */
-    LIST_REMOVE(sentry, pointers);
-    UA_atomic_subUInt32(&sm->currentSessionCount, 1);
-
-    /* Add a delayed callback to remove the session when the currently
-     * scheduled jobs have completed */
-    sentry->cleanupCallback.callback = (UA_ApplicationCallback)removeSessionCallback;
-    sentry->cleanupCallback.application = sm->server;
-    sentry->cleanupCallback.data = sentry;
-    UA_WorkQueue_enqueueDelayed(&server->workQueue, &sentry->cleanupCallback);
-}
-
-void UA_SessionManager_deleteMembers(UA_SessionManager *sm) {
-    session_list_entry *current, *temp;
-    LIST_FOREACH_SAFE(current, &sm->sessions, pointers, temp) {
-        removeSession(sm, current);
-    }
-}
-
-void
-UA_SessionManager_cleanupTimedOut(UA_SessionManager *sm,
-                                  UA_DateTime nowMonotonic) {
-    session_list_entry *sentry, *temp;
-    LIST_FOREACH_SAFE(sentry, &sm->sessions, pointers, temp) {
-        /* Session has timed out? */
-        if(sentry->session.validTill >= nowMonotonic)
-            continue;
-        UA_LOG_INFO_SESSION(&sm->server->config.logger, &sentry->session,
-                            "Session has timed out");
-        removeSession(sm, sentry);
-    }
-}
-
-UA_Session *
-UA_SessionManager_getSessionByToken(UA_SessionManager *sm, const UA_NodeId *token) {
-    session_list_entry *current = NULL;
-    LIST_FOREACH(current, &sm->sessions, pointers) {
-        /* Token does not match */
-        if(!UA_NodeId_equal(&current->session.header.authenticationToken, token))
-            continue;
-
-        /* Session has timed out */
-        if(UA_DateTime_nowMonotonic() > current->session.validTill) {
-            UA_LOG_INFO_SESSION(&sm->server->config.logger, &current->session,
-                                "Client tries to use a session that has timed out");
-            return NULL;
-        }
-
-        /* Ok, return */
-        return &current->session;
-    }
-
-    /* Session not found */
-#if UA_LOGLEVEL <= 300
-    UA_String nodeIdStr = UA_STRING_NULL;
-    UA_NodeId_toString(token, &nodeIdStr);
-    UA_LOG_INFO(&sm->server->config.logger, UA_LOGCATEGORY_SESSION,
-                "Try to use Session with token %.*s but is not found",
-                (int)nodeIdStr.length, nodeIdStr.data);
-    UA_String_deleteMembers(&nodeIdStr);
-#endif
-    return NULL;
-}
-
-UA_Session *
-UA_SessionManager_getSessionById(UA_SessionManager *sm, const UA_NodeId *sessionId) {
-    session_list_entry *current = NULL;
-    LIST_FOREACH(current, &sm->sessions, pointers) {
-        /* Token does not match */
-        if(!UA_NodeId_equal(&current->session.sessionId, sessionId))
-            continue;
-
-        /* Session has timed out */
-        if(UA_DateTime_nowMonotonic() > current->session.validTill) {
-            UA_LOG_INFO_SESSION(&sm->server->config.logger, &current->session,
-                                "Client tries to use a session that has timed out");
-            return NULL;
-        }
-
-        /* Ok, return */
-        return &current->session;
-    }
-
-    /* Session not found */
-    UA_String sessionIdStr = UA_STRING_NULL;
-    UA_NodeId_toString(sessionId, &sessionIdStr);
-    UA_LOG_INFO(&sm->server->config.logger, UA_LOGCATEGORY_SESSION,
-                "Try to use Session with identifier %.*s but is not found",
-                (int)sessionIdStr.length, sessionIdStr.data);
-    UA_String_deleteMembers(&sessionIdStr);
-    return NULL;
-}
-
-/* Creates and adds a session. But it is not yet attached to a secure channel. */
-UA_StatusCode
-UA_SessionManager_createSession(UA_SessionManager *sm, UA_SecureChannel *channel,
-                                const UA_CreateSessionRequest *request, UA_Session **session) {
-    if(sm->currentSessionCount >= sm->server->config.maxSessions)
-        return UA_STATUSCODE_BADTOOMANYSESSIONS;
-
-    session_list_entry *newentry = (session_list_entry *)UA_malloc(sizeof(session_list_entry));
-    if(!newentry)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    UA_atomic_addUInt32(&sm->currentSessionCount, 1);
-    UA_Session_init(&newentry->session);
-    newentry->session.sessionId = UA_NODEID_GUID(1, UA_Guid_random());
-    newentry->session.header.authenticationToken = UA_NODEID_GUID(1, UA_Guid_random());
-
-    if(request->requestedSessionTimeout <= sm->server->config.maxSessionTimeout &&
-       request->requestedSessionTimeout > 0)
-        newentry->session.timeout = request->requestedSessionTimeout;
-    else
-        newentry->session.timeout = sm->server->config.maxSessionTimeout;
-
-    UA_Session_updateLifetime(&newentry->session);
-    LIST_INSERT_HEAD(&sm->sessions, newentry, pointers);
-    *session = &newentry->session;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_SessionManager_removeSession(UA_SessionManager *sm, const UA_NodeId *token) {
-    session_list_entry *current;
-    LIST_FOREACH(current, &sm->sessions, pointers) {
-        if(UA_NodeId_equal(&current->session.header.authenticationToken, token))
-            break;
-    }
-    if(!current)
-        return UA_STATUSCODE_BADSESSIONIDINVALID;
-
-    removeSession(sm, current);
-    return UA_STATUSCODE_GOOD;
-}
diff --git a/ext/open62541/src/server/ua_session_manager.h b/ext/open62541/src/server/ua_session_manager.h
deleted file mode 100644
index 4a24e99..0000000
--- a/ext/open62541/src/server/ua_session_manager.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_SESSION_MANAGER_H_
-#define UA_SESSION_MANAGER_H_
-
-#include <open62541/server.h>
-
-#include "open62541_queue.h"
-#include "ua_session.h"
-#include "ua_util_internal.h"
-#include "ua_workqueue.h"
-
-_UA_BEGIN_DECLS
-
-typedef struct session_list_entry {
-    UA_DelayedCallback cleanupCallback;
-    LIST_ENTRY(session_list_entry) pointers;
-    UA_Session session;
-} session_list_entry;
-
-typedef struct UA_SessionManager {
-    LIST_HEAD(session_list, session_list_entry) sessions; // doubly-linked list of sessions
-    UA_UInt32 currentSessionCount;
-    UA_Server *server;
-} UA_SessionManager;
-
-UA_StatusCode
-UA_SessionManager_init(UA_SessionManager *sm, UA_Server *server);
-
-/* Deletes all sessions */
-void UA_SessionManager_deleteMembers(UA_SessionManager *sm);
-
-/* Deletes all sessions that have timed out. Deletion is implemented via a
- * delayed callback. So all currently scheduled jobs with a pointer to the
- * session can complete. */
-void UA_SessionManager_cleanupTimedOut(UA_SessionManager *sm,
-                                       UA_DateTime nowMonotonic);
-
-UA_StatusCode
-UA_SessionManager_createSession(UA_SessionManager *sm, UA_SecureChannel *channel,
-                                const UA_CreateSessionRequest *request, UA_Session **session);
-
-UA_StatusCode
-UA_SessionManager_removeSession(UA_SessionManager *sm, const UA_NodeId *token);
-
-UA_Session *
-UA_SessionManager_getSessionByToken(UA_SessionManager *sm, const UA_NodeId *token);
-
-UA_Session *
-UA_SessionManager_getSessionById(UA_SessionManager *sm, const UA_NodeId *sessionId);
-
-_UA_END_DECLS
-
-#endif /* UA_SESSION_MANAGER_H_ */
diff --git a/ext/open62541/src/server/ua_subscription.c b/ext/open62541/src/server/ua_subscription.c
deleted file mode 100644
index 07e8cff..0000000
--- a/ext/open62541/src/server/ua_subscription.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2015 (c) Joakim L. Gilje
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) frax2222
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Ari Breitkreuz, fortiss GmbH
- *    Copyright 2017 (c) Mattias Bornhager
- *    Copyright 2018 (c) Hilscher Gesellschaft für Systemautomation mbH (Author: Martin Lang)
- */
-
-#include "ua_server_internal.h"
-#include "ua_subscription.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */
-
-UA_Subscription *
-UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionId) {
-    /* Allocate the memory */
-    UA_Subscription *newSub =
-        (UA_Subscription*)UA_calloc(1, sizeof(UA_Subscription));
-    if(!newSub)
-        return NULL;
-
-    /* Remaining members are covered by calloc zeroing out the memory */
-    newSub->session = session;
-    newSub->subscriptionId = subscriptionId;
-    newSub->state = UA_SUBSCRIPTIONSTATE_NORMAL; /* The first publish response is sent immediately */
-    /* Even if the first publish response is a keepalive the sequence number is 1.
-     * This can happen by a subscription without a monitored item (see CTT test scripts). */
-    newSub->nextSequenceNumber = 1;
-    TAILQ_INIT(&newSub->retransmissionQueue);
-    TAILQ_INIT(&newSub->notificationQueue);
-    return newSub;
-}
-
-void
-UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub) {
-    Subscription_unregisterPublishCallback(server, sub);
-
-    /* Delete monitored Items */
-    UA_MonitoredItem *mon, *tmp_mon;
-    LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, tmp_mon) {
-        LIST_REMOVE(mon, listEntry);
-        UA_LOG_INFO_SESSION(&server->config.logger, sub->session,
-                            "Subscription %u | MonitoredItem %i | "
-                            "Deleted the MonitoredItem", sub->subscriptionId,
-                            mon->monitoredItemId);
-        UA_MonitoredItem_delete(server, mon);
-    }
-    UA_assert(server->numMonitoredItems >= sub->monitoredItemsSize);
-    server->numMonitoredItems -= sub->monitoredItemsSize;
-    sub->monitoredItemsSize = 0;
-
-    /* Delete Retransmission Queue */
-    UA_NotificationMessageEntry *nme, *nme_tmp;
-    TAILQ_FOREACH_SAFE(nme, &sub->retransmissionQueue, listEntry, nme_tmp) {
-        TAILQ_REMOVE(&sub->retransmissionQueue, nme, listEntry);
-        UA_NotificationMessage_deleteMembers(&nme->message);
-        UA_free(nme);
-        --sub->session->totalRetransmissionQueueSize;
-        --sub->retransmissionQueueSize;
-    }
-    UA_assert(sub->retransmissionQueueSize == 0);
-
-    UA_LOG_INFO_SESSION(&server->config.logger, sub->session,
-                        "Subscription %u | Deleted the Subscription",
-                        sub->subscriptionId);
-}
-
-UA_MonitoredItem *
-UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemId) {
-    UA_MonitoredItem *mon;
-    LIST_FOREACH(mon, &sub->monitoredItems, listEntry) {
-        if(mon->monitoredItemId == monitoredItemId)
-            break;
-    }
-    return mon;
-}
-
-UA_StatusCode
-UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub,
-                                    UA_UInt32 monitoredItemId) {
-    /* Find the MonitoredItem */
-    UA_MonitoredItem *mon;
-    LIST_FOREACH(mon, &sub->monitoredItems, listEntry) {
-        if(mon->monitoredItemId == monitoredItemId)
-            break;
-    }
-    if(!mon)
-        return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
-
-    UA_LOG_INFO_SESSION(&server->config.logger, sub->session,
-                        "Subscription %u | MonitoredItem %i | "
-                        "Delete the MonitoredItem", sub->subscriptionId,
-                        mon->monitoredItemId);
-
-    /* Remove the MonitoredItem */
-    LIST_REMOVE(mon, listEntry);
-    UA_assert(sub->monitoredItemsSize > 0);
-    UA_assert(server->numMonitoredItems > 0);
-    sub->monitoredItemsSize--;
-    server->numMonitoredItems--;
-
-    /* Remove content and delayed free */
-    UA_MonitoredItem_delete(server, mon);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_Subscription_addMonitoredItem(UA_Server *server, UA_Subscription *sub, UA_MonitoredItem *newMon) {
-    sub->monitoredItemsSize++;
-    server->numMonitoredItems++;
-    LIST_INSERT_HEAD(&sub->monitoredItems, newMon, listEntry);
-}
-
-static void
-removeOldestRetransmissionMessage(UA_Session *session) {
-    UA_NotificationMessageEntry *oldestEntry = NULL;
-    UA_Subscription *oldestSub = NULL;
-
-    UA_Subscription *sub;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        UA_NotificationMessageEntry *first =
-            TAILQ_LAST(&sub->retransmissionQueue, ListOfNotificationMessages);
-        if(!first)
-            continue;
-        if(!oldestEntry || oldestEntry->message.publishTime > first->message.publishTime) {
-            oldestEntry = first;
-            oldestSub = sub;
-        }
-    }
-    UA_assert(oldestEntry);
-    UA_assert(oldestSub);
-
-    TAILQ_REMOVE(&oldestSub->retransmissionQueue, oldestEntry, listEntry);
-    UA_NotificationMessage_deleteMembers(&oldestEntry->message);
-    UA_free(oldestEntry);
-    --session->totalRetransmissionQueueSize;
-    --oldestSub->retransmissionQueueSize;
-}
-
-static void
-UA_Subscription_addRetransmissionMessage(UA_Server *server, UA_Subscription *sub,
-                                         UA_NotificationMessageEntry *entry) {
-    /* Release the oldest entry if there is not enough space */
-    if(server->config.maxRetransmissionQueueSize > 0 &&
-       sub->session->totalRetransmissionQueueSize >= server->config.maxRetransmissionQueueSize) {
-        UA_LOG_WARNING_SESSION(&server->config.logger, sub->session, "Subscription %u | "
-                               "Retransmission queue overflow", sub->subscriptionId);
-        removeOldestRetransmissionMessage(sub->session);
-    }
-
-    /* Add entry */
-    TAILQ_INSERT_TAIL(&sub->retransmissionQueue, entry, listEntry);
-    ++sub->session->totalRetransmissionQueueSize;
-    ++sub->retransmissionQueueSize;
-}
-
-UA_StatusCode
-UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub, UA_UInt32 sequenceNumber) {
-    /* Find the retransmission message */
-    UA_NotificationMessageEntry *entry;
-    TAILQ_FOREACH(entry, &sub->retransmissionQueue, listEntry) {
-        if(entry->message.sequenceNumber == sequenceNumber)
-            break;
-    }
-    if(!entry)
-        return UA_STATUSCODE_BADSEQUENCENUMBERUNKNOWN;
-
-    /* Remove the retransmission message */
-    TAILQ_REMOVE(&sub->retransmissionQueue, entry, listEntry);
-    --sub->session->totalRetransmissionQueueSize;
-    --sub->retransmissionQueueSize;
-    UA_NotificationMessage_deleteMembers(&entry->message);
-    UA_free(entry);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-prepareNotificationMessage(UA_Server *server, UA_Subscription *sub,
-                           UA_NotificationMessage *message, size_t notifications) {
-    UA_assert(notifications > 0);
-
-    /* Allocate an ExtensionObject for events and data */
-    message->notificationData = (UA_ExtensionObject*)
-        UA_Array_new(2, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    if(!message->notificationData)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    message->notificationDataSize = 2;
-
-    /* Pre-allocate DataChangeNotifications */
-    size_t notificationDataIdx = 0;
-    UA_DataChangeNotification *dcn = NULL;
-    if(sub->dataChangeNotifications > 0) {
-        dcn = UA_DataChangeNotification_new();
-        if(!dcn) {
-            UA_NotificationMessage_deleteMembers(message);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        message->notificationData->encoding = UA_EXTENSIONOBJECT_DECODED;
-        message->notificationData->content.decoded.data = dcn;
-        message->notificationData->content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION];
-
-        size_t dcnSize = sub->dataChangeNotifications;
-        if(dcnSize > notifications)
-            dcnSize = notifications;
-        dcn->monitoredItems = (UA_MonitoredItemNotification*)
-            UA_Array_new(dcnSize, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]);
-        if(!dcn->monitoredItems) {
-            UA_NotificationMessage_deleteMembers(message);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        dcn->monitoredItemsSize = dcnSize;
-        notificationDataIdx++;
-    }
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    UA_EventNotificationList *enl = NULL;
-    UA_StatusChangeNotification *scn = NULL;
-    /* Pre-allocate either StatusChange or EventNotifications. Sending a
-     * (single) StatusChangeNotification has priority. */
-    if(sub->statusChangeNotifications > 0) {
-        scn = UA_StatusChangeNotification_new();
-        if(!scn) {
-            UA_NotificationMessage_deleteMembers(message);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        message->notificationData[notificationDataIdx].encoding = UA_EXTENSIONOBJECT_DECODED;
-        message->notificationData[notificationDataIdx].content.decoded.data = scn;
-        message->notificationData[notificationDataIdx].content.decoded.type = &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION];
-        notificationDataIdx++;
-    } else if(sub->eventNotifications > 0) {
-        enl = UA_EventNotificationList_new();
-        if(!enl) {
-            UA_NotificationMessage_deleteMembers(message);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        message->notificationData[notificationDataIdx].encoding = UA_EXTENSIONOBJECT_DECODED;
-        message->notificationData[notificationDataIdx].content.decoded.data = enl;
-        message->notificationData[notificationDataIdx].content.decoded.type = &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST];
-
-        size_t enlSize = sub->eventNotifications;
-        if(enlSize > notifications)
-            enlSize = notifications;
-        enl->events = (UA_EventFieldList*) UA_Array_new(enlSize, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]);
-        if(!enl->events) {
-            UA_NotificationMessage_deleteMembers(message);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        enl->eventsSize = enlSize;
-        notificationDataIdx++;
-    }
-#endif
-
-    UA_assert(notificationDataIdx > 0);
-    message->notificationDataSize = notificationDataIdx;
-
-    /* <-- The point of no return --> */
-
-    size_t totalNotifications = 0; /* How many notifications were moved to the response overall? */
-    size_t dcnPos = 0; /* How many DataChangeNotifications were put into the list? */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    size_t enlPos = 0; /* How many EventNotifications were moved into the list */
-#endif
-    UA_Notification *notification, *notification_tmp;
-    TAILQ_FOREACH_SAFE(notification, &sub->notificationQueue, globalEntry, notification_tmp) {
-        if(totalNotifications >= notifications)
-            break;
-
-        UA_MonitoredItem *mon = notification->mon;
-
-        /* Remove from the queues and decrease the counters */
-        UA_Notification_dequeue(server, notification);
-
-        /* Move the content to the response */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-
-            UA_assert(enl != NULL); /* Have at least one event notification */
-
-            /* Move the content to the response */
-            UA_EventFieldList *efl = &enl->events[enlPos];
-            *efl = notification->data.event.fields;
-            UA_EventFieldList_init(&notification->data.event.fields);
-            efl->clientHandle = mon->clientHandle;
-
-            enlPos++;
-        } else
-#endif
-        {
-            UA_assert(dcn != NULL); /* Have at least one change notification */
-            /* Move the content to the response */
-            UA_MonitoredItemNotification *min = &dcn->monitoredItems[dcnPos];
-            min->clientHandle = mon->clientHandle;
-            min->value = notification->data.value;
-            UA_DataValue_init(&notification->data.value); /* Reset after the value has been moved */
-            dcnPos++;
-        }
-
-        UA_Notification_delete(notification);
-        totalNotifications++;
-    }
-
-    /* Set sizes */
-    if(dcn) {
-        dcn->monitoredItemsSize = dcnPos;
-        if(dcnPos == 0) {
-            UA_free(dcn->monitoredItems);
-            dcn->monitoredItems = NULL;
-        }
-    }
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    if(enl) {
-        enl->eventsSize = enlPos;
-        if(enlPos == 0) {
-            UA_free(enl->events);
-            enl->events = NULL;
-        }
-    }
-#endif
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/* According to OPC Unified Architecture, Part 4 5.13.1.1 i) The value 0 is
- * never used for the sequence number */
-static UA_UInt32
-UA_Subscription_nextSequenceNumber(UA_UInt32 sequenceNumber) {
-    UA_UInt32 nextSequenceNumber = sequenceNumber + 1;
-    if(nextSequenceNumber == 0)
-        nextSequenceNumber = 1;
-    return nextSequenceNumber;
-}
-
-static void
-publishCallback(UA_Server *server, UA_Subscription *sub) {
-    sub->readyNotifications = sub->notificationQueueSize;
-    UA_Subscription_publish(server, sub);
-}
-
-void
-UA_Subscription_publish(UA_Server *server, UA_Subscription *sub) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, "Subscription %u | "
-                         "Publish Callback", sub->subscriptionId);
-    /* Dequeue a response */
-    UA_PublishResponseEntry *pre = UA_Session_dequeuePublishReq(sub->session);
-    if(pre) {
-        sub->currentLifetimeCount = 0; /* Reset the LifetimeCounter */
-    } else {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session,
-                             "Subscription %u | The publish queue is empty",
-                             sub->subscriptionId);
-        ++sub->currentLifetimeCount;
-
-        if(sub->currentLifetimeCount > sub->lifeTimeCount) {
-            UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session,
-                                 "Subscription %u | End of lifetime "
-                                 "for subscription", sub->subscriptionId);
-            UA_Session_deleteSubscription(server, sub->session, sub->subscriptionId);
-            /* TODO: send a StatusChangeNotification with Bad_Timeout */
-            return;
-        }
-    }
-
-    /* If there are several late publish responses... */
-    if(sub->readyNotifications > sub->notificationQueueSize)
-        sub->readyNotifications = sub->notificationQueueSize;
-
-    /* Count the available notifications */
-    UA_UInt32 notifications = sub->readyNotifications;
-    if(!sub->publishingEnabled)
-        notifications = 0;
-
-    UA_Boolean moreNotifications = false;
-    if(notifications > sub->notificationsPerPublish) {
-        notifications = sub->notificationsPerPublish;
-        moreNotifications = true;
-    }
-
-    /* Return if no notifications and no keepalive */
-    if(notifications == 0) {
-        ++sub->currentKeepAliveCount;
-        if(sub->currentKeepAliveCount < sub->maxKeepAliveCount) {
-            if(pre)
-                UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */
-            return;
-        }
-        UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session,
-                             "Subscription %u | Sending a KeepAlive",
-                             sub->subscriptionId);
-    }
-
-    /* We want to send a response. Is the channel open? */
-    UA_SecureChannel *channel = sub->session->header.channel;
-    if(!channel || !pre) {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session,
-                             "Subscription %u | Want to send a publish response but can't. "
-                             "The subscription is late.", sub->subscriptionId);
-        sub->state = UA_SUBSCRIPTIONSTATE_LATE;
-        if(pre)
-            UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */
-        return;
-    }
-
-    /* Prepare the response */
-    UA_PublishResponse *response = &pre->response;
-    UA_NotificationMessage *message = &response->notificationMessage;
-    UA_NotificationMessageEntry *retransmission = NULL;
-    if(notifications > 0) {
-        if(server->config.enableRetransmissionQueue) {
-            /* Allocate the retransmission entry */
-            retransmission = (UA_NotificationMessageEntry*)UA_malloc(sizeof(UA_NotificationMessageEntry));
-            if(!retransmission) {
-                UA_LOG_WARNING_SESSION(&server->config.logger, sub->session,
-                                       "Subscription %u | Could not allocate memory for retransmission. "
-                                       "The subscription is late.", sub->subscriptionId);
-                sub->state = UA_SUBSCRIPTIONSTATE_LATE;
-                UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */
-                return;
-            }
-        }
-
-        /* Prepare the response */
-        UA_StatusCode retval = prepareNotificationMessage(server, sub, message, notifications);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING_SESSION(&server->config.logger, sub->session,
-                                   "Subscription %u | Could not prepare the notification message. "
-                                   "The subscription is late.", sub->subscriptionId);
-            /* If the retransmission queue is enabled a retransmission message is allocated */
-            if(retransmission)
-                UA_free(retransmission);
-            sub->state = UA_SUBSCRIPTIONSTATE_LATE;
-            UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */
-            return;
-        }
-    }
-
-    /* <-- The point of no return --> */
-
-    /* Adjust the number of ready notifications */
-    UA_assert(sub->readyNotifications >= notifications);
-    sub->readyNotifications -= notifications;
-
-    /* Set up the response */
-    response->responseHeader.timestamp = UA_DateTime_now();
-    response->subscriptionId = sub->subscriptionId;
-    response->moreNotifications = moreNotifications;
-    message->publishTime = response->responseHeader.timestamp;
-
-    /* Set sequence number to message. Started at 1 which is given
-     * during creating a new subscription. The 1 is required for
-     * initial publish response with or without an monitored item. */
-    message->sequenceNumber = sub->nextSequenceNumber;
-
-    if(notifications > 0) {
-        /* If the retransmission queue is enabled a retransmission message is allocated */
-        if(retransmission) {
-            /* Put the notification message into the retransmission queue. This
-             * needs to be done here, so that the message itself is included in the
-             * available sequence numbers for acknowledgement. */
-            retransmission->message = response->notificationMessage;
-            UA_Subscription_addRetransmissionMessage(server, sub, retransmission);
-        }
-        /* Only if a notification was created, the sequence number must be increased.
-         * For a keepalive the sequence number can be reused. */
-        sub->nextSequenceNumber = UA_Subscription_nextSequenceNumber(sub->nextSequenceNumber);
-    }
-
-    /* Get the available sequence numbers from the retransmission queue */
-    size_t available = sub->retransmissionQueueSize;
-    UA_STACKARRAY(UA_UInt32, seqNumbers, available);
-    if(available > 0) {
-        response->availableSequenceNumbers = seqNumbers;
-        response->availableSequenceNumbersSize = available;
-        size_t i = 0;
-        UA_NotificationMessageEntry *nme;
-        TAILQ_FOREACH(nme, &sub->retransmissionQueue, listEntry) {
-            response->availableSequenceNumbers[i] = nme->message.sequenceNumber;
-            ++i;
-        }
-    }
-
-    /* Send the response */
-    UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session,
-                         "Subscription %u | Sending out a publish response "
-                         "with %u notifications", sub->subscriptionId,
-                         (UA_UInt32)notifications);
-    UA_SecureChannel_sendSymmetricMessage(sub->session->header.channel, pre->requestId,
-                                          UA_MESSAGETYPE_MSG, response,
-                                          &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-
-    /* Reset subscription state to normal */
-    sub->state = UA_SUBSCRIPTIONSTATE_NORMAL;
-    sub->currentKeepAliveCount = 0;
-
-    /* Free the response */
-    UA_Array_delete(response->results, response->resultsSize, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_free(pre); /* No need for UA_PublishResponse_deleteMembers */
-
-    /* Repeat sending responses if there are more notifications to send */
-    if(moreNotifications)
-        UA_Subscription_publish(server, sub);
-}
-
-UA_Boolean
-UA_Subscription_reachedPublishReqLimit(UA_Server *server,  UA_Session *session) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Reached number of publish request limit");
-
-    /* Dequeue a response */
-    UA_PublishResponseEntry *pre = UA_Session_dequeuePublishReq(session);
-
-    /* Cannot publish without a response */
-    if(!pre) {
-        UA_LOG_FATAL_SESSION(&server->config.logger, session, "No publish requests available");
-        return false;
-    }
-
-    /* <-- The point of no return --> */
-
-    UA_PublishResponse *response = &pre->response;
-    UA_NotificationMessage *message = &response->notificationMessage;
-
-    /* Set up the response. Note that this response has no related subscription id */
-    response->responseHeader.timestamp = UA_DateTime_now();
-    response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS;
-    response->subscriptionId = 0;
-    response->moreNotifications = false;
-    message->publishTime = response->responseHeader.timestamp;
-    message->sequenceNumber = 0;
-    response->availableSequenceNumbersSize = 0;
-
-    /* Send the response */
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session,
-                         "Sending out a publish response triggered by too many publish requests");
-    UA_SecureChannel_sendSymmetricMessage(session->header.channel, pre->requestId,
-                     UA_MESSAGETYPE_MSG, response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-
-    /* Free the response */
-    UA_Array_delete(response->results, response->resultsSize, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_free(pre); /* no need for UA_PublishResponse_deleteMembers */
-
-    return true;
-}
-
-UA_StatusCode
-Subscription_registerPublishCallback(UA_Server *server, UA_Subscription *sub) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session,
-                         "Subscription %u | Register subscription "
-                         "publishing callback", sub->subscriptionId);
-
-    if(sub->publishCallbackIsRegistered)
-        return UA_STATUSCODE_GOOD;
-
-    UA_StatusCode retval =
-        UA_Server_addRepeatedCallback(server, (UA_ServerCallback)publishCallback,
-                                      sub, (UA_UInt32)sub->publishingInterval, &sub->publishCallbackId);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    sub->publishCallbackIsRegistered = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub) {
-    UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, "Subscription %u | "
-                         "Unregister subscription publishing callback", sub->subscriptionId);
-
-    if(!sub->publishCallbackIsRegistered)
-        return;
-
-    UA_Server_removeRepeatedCallback(server, sub->publishCallbackId);
-    sub->publishCallbackIsRegistered = false;
-}
-
-/* When the session has publish requests stored but the last subscription is
- * deleted... Send out empty responses */
-void
-UA_Subscription_answerPublishRequestsNoSubscription(UA_Server *server, UA_Session *session) {
-    /* No session or there are remaining subscriptions */
-    if(!session || LIST_FIRST(&session->serverSubscriptions))
-        return;
-
-    /* Send a response for every queued request */
-    UA_PublishResponseEntry *pre;
-    while((pre = UA_Session_dequeuePublishReq(session))) {
-        UA_PublishResponse *response = &pre->response;
-        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION;
-        response->responseHeader.timestamp = UA_DateTime_now();
-        UA_SecureChannel_sendSymmetricMessage(session->header.channel, pre->requestId, UA_MESSAGETYPE_MSG,
-                                              response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-        UA_PublishResponse_deleteMembers(response);
-        UA_free(pre);
-    }
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
diff --git a/ext/open62541/src/server/ua_subscription.h b/ext/open62541/src/server/ua_subscription.h
deleted file mode 100644
index 2efb336..0000000
--- a/ext/open62541/src/server/ua_subscription.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mattias Bornhager
- */
-
-#ifndef UA_SUBSCRIPTION_H_
-#define UA_SUBSCRIPTION_H_
-
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-#include <open62541/plugin/nodestore.h>
-
-#include "ua_session.h"
-#include "ua_util_internal.h"
-#include "ua_workqueue.h"
-
-_UA_BEGIN_DECLS
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-#define UA_BOUNDEDVALUE_SETWBOUNDS(BOUNDS, SRC, DST) { \
-        if(SRC > BOUNDS.max) DST = BOUNDS.max;         \
-        else if(SRC < BOUNDS.min) DST = BOUNDS.min;    \
-        else DST = SRC;                                \
-    }
-
-/* Set to the TAILQ_NEXT pointer of a notification, the sentinel that the
- * notification was not added to the global queue */
-#define UA_SUBSCRIPTION_QUEUE_SENTINEL ((UA_Notification*)0x01)
-
-/**
- * MonitoredItems create Notifications. Subscriptions collect Notifications from
- * (several) MonitoredItems and publish them to the client.
- *
- * Notifications are put into two queues at the same time. One for the
- * MonitoredItem that generated the notification. Here we can remove it if the
- * space reserved for the MonitoredItem runs full. The second queue is the
- * "global" queue for all Notifications generated in a Subscription. For
- * publication, the notifications are taken out of the "global" queue in the
- * order of their creation.
- */
-
-/*****************/
-/* MonitoredItem */
-/*****************/
-
-struct UA_MonitoredItem;
-typedef struct UA_MonitoredItem UA_MonitoredItem;
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-typedef struct UA_EventNotification {
-    UA_EventFieldList fields;
-    /* EventFilterResult currently isn't being used
-    UA_EventFilterResult result; */
-} UA_EventNotification;
-#endif
-
-typedef struct UA_Notification {
-    TAILQ_ENTRY(UA_Notification) listEntry; /* Notification list for the MonitoredItem */
-    TAILQ_ENTRY(UA_Notification) globalEntry; /* Notification list for the Subscription */
-
-    UA_MonitoredItem *mon;
-
-    /* See the monitoredItemType of the MonitoredItem */
-    union {
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        UA_EventNotification event;
-#endif
-        UA_DataValue value;
-    } data;
-} UA_Notification;
-
-/* Ensure enough space is available; Add notification to the linked lists;
- * Increase the counters */
-void UA_Notification_enqueue(UA_Server *server, UA_Subscription *sub,
-                             UA_MonitoredItem *mon, UA_Notification *n);
-
-/* Remove the notification from the MonitoredItem's queue and the Subscriptions
- * global queue. Reduce the respective counters. */
-void UA_Notification_dequeue(UA_Server *server, UA_Notification *n);
-
-/* Delete the notification. Must be dequeued first. */
-void UA_Notification_delete(UA_Notification *n);
-
-typedef TAILQ_HEAD(NotificationQueue, UA_Notification) NotificationQueue;
-
-struct UA_MonitoredItem {
-    UA_DelayedCallback delayedFreePointers;
-    LIST_ENTRY(UA_MonitoredItem) listEntry;
-    UA_Subscription *subscription; /* Local MonitoredItem if the subscription is NULL */
-    UA_UInt32 monitoredItemId;
-    UA_UInt32 clientHandle;
-    UA_Boolean registered; /* Was the MonitoredItem registered in Userland with
-                              the callback? */
-
-    /* Settings */
-    UA_TimestampsToReturn timestampsToReturn;
-    UA_MonitoringMode monitoringMode;
-    UA_NodeId monitoredNodeId;
-    UA_UInt32 attributeId;
-    UA_String indexRange;
-    UA_Double samplingInterval; // [ms]
-    UA_Boolean discardOldest;
-    union {
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        UA_EventFilter eventFilter; /* If attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER */
-#endif
-        UA_DataChangeFilter dataChangeFilter;
-    } filter;
-    UA_Variant lastValue;
-    // TODO: dataEncoding is hardcoded to UA binary
-
-    /* Sample Callback */
-    UA_UInt64 sampleCallbackId;
-    UA_ByteString lastSampledValue;
-    UA_Boolean sampleCallbackIsRegistered;
-
-    /* Notification Queue */
-    NotificationQueue queue;
-    UA_UInt32 maxQueueSize; /* The max number of enqueued notifications (not
-                             * counting overflow events) */
-    UA_UInt32 queueSize;
-    UA_UInt32 eventOverflows; /* Separate counter for the queue. Can at most
-                               * double the queue size */
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    UA_MonitoredItem *next;
-#endif
-
-#ifdef UA_ENABLE_DA
-    UA_StatusCode lastStatus;
-#endif
-};
-
-void UA_MonitoredItem_init(UA_MonitoredItem *mon, UA_Subscription *sub);
-void UA_MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem);
-void UA_MonitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem);
-UA_StatusCode UA_MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon);
-void UA_MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon);
-
-/* Remove entries until mon->maxQueueSize is reached. Sets infobits for lost
- * data if required. */
-UA_StatusCode UA_MonitoredItem_ensureQueueSpace(UA_Server *server, UA_MonitoredItem *mon);
-
-UA_StatusCode UA_MonitoredItem_removeNodeEventCallback(UA_Server *server, UA_Session *session,
-                                                       UA_Node *node, void *data);
-
-/****************/
-/* Subscription */
-/****************/
-
-typedef struct UA_NotificationMessageEntry {
-    TAILQ_ENTRY(UA_NotificationMessageEntry) listEntry;
-    UA_NotificationMessage message;
-} UA_NotificationMessageEntry;
-
-/* We use only a subset of the states defined in the standard */
-typedef enum {
-    /* UA_SUBSCRIPTIONSTATE_CLOSED */
-    /* UA_SUBSCRIPTIONSTATE_CREATING */
-    UA_SUBSCRIPTIONSTATE_NORMAL,
-    UA_SUBSCRIPTIONSTATE_LATE,
-    UA_SUBSCRIPTIONSTATE_KEEPALIVE
-} UA_SubscriptionState;
-
-typedef TAILQ_HEAD(ListOfNotificationMessages, UA_NotificationMessageEntry) ListOfNotificationMessages;
-
-struct UA_Subscription {
-    UA_DelayedCallback delayedFreePointers;
-    LIST_ENTRY(UA_Subscription) listEntry;
-    UA_Session *session;
-    UA_UInt32 subscriptionId;
-
-    /* Settings */
-    UA_UInt32 lifeTimeCount;
-    UA_UInt32 maxKeepAliveCount;
-    UA_Double publishingInterval; /* in ms */
-    UA_UInt32 notificationsPerPublish;
-    UA_Boolean publishingEnabled;
-    UA_UInt32 priority;
-
-    /* Runtime information */
-    UA_SubscriptionState state;
-    UA_UInt32 nextSequenceNumber;
-    UA_UInt32 currentKeepAliveCount;
-    UA_UInt32 currentLifetimeCount;
-
-    /* Publish Callback */
-    UA_UInt64 publishCallbackId;
-    UA_Boolean publishCallbackIsRegistered;
-
-    /* MonitoredItems */
-    UA_UInt32 lastMonitoredItemId; /* increase the identifiers */
-    LIST_HEAD(, UA_MonitoredItem) monitoredItems;
-    UA_UInt32 monitoredItemsSize;
-
-    /* Global list of notifications from the MonitoredItems */
-    NotificationQueue notificationQueue;
-    UA_UInt32 notificationQueueSize; /* Total queue size */
-    UA_UInt32 dataChangeNotifications;
-    UA_UInt32 eventNotifications;
-    UA_UInt32 statusChangeNotifications;
-
-    /* Notifications to be sent out now (already late). In a regular publish
-     * callback, all queued notifications are sent out. In a late publish
-     * response, only the notifications left from the last regular publish
-     * callback are sent. */
-    UA_UInt32 readyNotifications;
-
-    /* Retransmission Queue */
-    ListOfNotificationMessages retransmissionQueue;
-    size_t retransmissionQueueSize;
-};
-
-UA_Subscription * UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionId);
-void UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub);
-UA_StatusCode Subscription_registerPublishCallback(UA_Server *server, UA_Subscription *sub);
-void Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub);
-void UA_Subscription_addMonitoredItem(UA_Server *server, UA_Subscription *sub, UA_MonitoredItem *newMon);
-UA_MonitoredItem * UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemId);
-
-UA_StatusCode
-UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub,
-                                    UA_UInt32 monitoredItemId);
-
-void UA_Subscription_publish(UA_Server *server, UA_Subscription *sub);
-UA_StatusCode UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub,
-                                                          UA_UInt32 sequenceNumber);
-void UA_Subscription_answerPublishRequestsNoSubscription(UA_Server *server, UA_Session *session);
-UA_Boolean UA_Subscription_reachedPublishReqLimit(UA_Server *server,  UA_Session *session);
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-
-_UA_END_DECLS
-
-#endif /* UA_SUBSCRIPTION_H_ */
diff --git a/ext/open62541/src/server/ua_subscription_datachange.c b/ext/open62541/src/server/ua_subscription_datachange.c
deleted file mode 100644
index 08c5a9f..0000000
--- a/ext/open62541/src/server/ua_subscription_datachange.c
+++ /dev/null
@@ -1,379 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH
- *    Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- */
-
-#include "ua_server_internal.h"
-#include "ua_subscription.h"
-#include "ua_types_encoding_binary.h"
-
-#ifdef UA_ENABLE_DA
-#include <math.h> // fabs
-#endif
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */
-
-#define UA_VALUENCODING_MAXSTACK 512
-
-#define ABS_SUBTRACT_TYPE_INDEPENDENT(a,b) ((a)>(b)?(a)-(b):(b)-(a))
-
-static UA_Boolean
-outOfDeadBand(const void *data1, const void *data2,
-              const UA_DataType *type, const UA_Double deadbandValue) {
-    if(type == &UA_TYPES[UA_TYPES_BOOLEAN]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Boolean*)data1, *(const UA_Boolean*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_SBYTE]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_SByte*)data1, *(const UA_SByte*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_BYTE]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Byte*)data1, *(const UA_Byte*)data2) <= deadbandValue)
-                return false;
-    } else if(type == &UA_TYPES[UA_TYPES_INT16]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Int16*)data1, *(const UA_Int16*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_UINT16]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_UInt16*)data1, *(const UA_UInt16*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_INT32]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Int32*)data1, *(const UA_Int32*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_UINT32]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_UInt32*)data1, *(const UA_UInt32*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_INT64]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Int64*)data1, *(const UA_Int64*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_UINT64]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_UInt64*)data1, *(const UA_UInt64*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_FLOAT]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Float*)data1, *(const UA_Float*)data2) <= deadbandValue)
-            return false;
-    } else if(type == &UA_TYPES[UA_TYPES_DOUBLE]) {
-        if(ABS_SUBTRACT_TYPE_INDEPENDENT(*(const UA_Double*)data1, *(const UA_Double*)data2) <= deadbandValue)
-            return false;
-    }
-    return true;
-}
-
-static UA_INLINE UA_Boolean
-updateNeededForFilteredValue(const UA_Variant *value, const UA_Variant *oldValue,
-                             const UA_Double deadbandValue) {
-    if(value->arrayLength != oldValue->arrayLength)
-        return true;
-
-    if(value->type != oldValue->type)
-        return true;
-
-    size_t length = 1;
-    if(!UA_Variant_isScalar(value))
-        length = value->arrayLength;
-    uintptr_t data = (uintptr_t)value->data;
-    for(size_t i = 0; i < length; ++i) {
-        if(outOfDeadBand((const void*)data, oldValue->data, value->type, deadbandValue))
-            return true;
-        data += value->type->memSize;
-    }
-
-    return false;
-}
-
-#ifdef UA_ENABLE_DA
-static UA_Boolean
-updateNeededForStatusCode(const UA_DataValue *value, const UA_MonitoredItem *mon) {
-    if(UA_Variant_isScalar(&value->value) && value->status != mon->lastStatus)
-        return true;
-    return false;
-}
-#endif
-
-
-/* When a change is detected, encoding contains the heap-allocated binary
- * encoded value. The default for changed is false. */
-static UA_StatusCode
-detectValueChangeWithFilter(UA_Server *server, UA_Session *session, UA_MonitoredItem *mon,
-                            UA_DataValue *value, UA_ByteString *encoding, UA_Boolean *changed) {
-    if(UA_DataType_isNumeric(value->value.type) &&
-       (mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUE ||
-        mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP)) {
-        if(mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_ABSOLUTE) {
-            if(!updateNeededForFilteredValue(&value->value, &mon->lastValue,
-                                             mon->filter.dataChangeFilter.deadbandValue))
-                return UA_STATUSCODE_GOOD;
-        }
-#ifdef UA_ENABLE_DA
-        else if(mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_PERCENT) {
-            /* Browse for the percent range */
-            UA_QualifiedName qn = UA_QUALIFIEDNAME(0, "EURange");
-            UA_BrowsePathResult bpr = browseSimplifiedBrowsePath(server, mon->monitoredNodeId, 1, &qn);
-            if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-                  UA_BrowsePathResult_deleteMembers(&bpr);
-                  return UA_STATUSCODE_GOOD;
-            }
-
-            /* Read the range */
-            UA_ReadValueId rvi;
-            UA_ReadValueId_init(&rvi);
-            rvi.nodeId = bpr.targets->targetId.nodeId;
-            rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-            UA_DataValue rangeVal = UA_Server_readWithSession(server, session, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-            if(!UA_Variant_isScalar(&rangeVal.value) || rangeVal.value.type != &UA_TYPES[UA_TYPES_RANGE]) {
-                UA_DataValue_clear(&rangeVal);
-                return UA_STATUSCODE_GOOD;
-            }
-
-            /* Compute the max change */
-            UA_Range* euRange = (UA_Range*)rangeVal.value.data;
-            UA_Double maxDist = (mon->filter.dataChangeFilter.deadbandValue/100.0) * (euRange->high - euRange->low);
-            UA_DataValue_clear(&rangeVal);
-
-            /* Relevant change? */
-            if(!updateNeededForFilteredValue(&value->value, &mon->lastValue, maxDist) &&
-               !updateNeededForStatusCode(value, mon))
-                return UA_STATUSCODE_GOOD;
-        }
-#endif
-    }
-
-    /* Stack-allocate some memory for the value encoding. We might heap-allocate
-     * more memory if needed. This is just enough for scalars and small
-     * structures. */
-    UA_STACKARRAY(UA_Byte, stackValueEncoding, UA_VALUENCODING_MAXSTACK);
-    UA_ByteString valueEncoding;
-    valueEncoding.data = stackValueEncoding;
-    valueEncoding.length = UA_VALUENCODING_MAXSTACK;
-
-    /* Encode the value */
-    UA_Byte *bufPos = valueEncoding.data;
-    const UA_Byte *bufEnd = &valueEncoding.data[valueEncoding.length];
-    UA_StatusCode retval = UA_encodeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE],
-                                           &bufPos, &bufEnd, NULL, NULL);
-    if(retval == UA_STATUSCODE_BADENCODINGERROR) {
-        size_t binsize = UA_calcSizeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE]);
-        if(binsize == 0)
-            return UA_STATUSCODE_BADENCODINGERROR;
-
-        if(binsize > UA_VALUENCODING_MAXSTACK) {
-            retval = UA_ByteString_allocBuffer(&valueEncoding, binsize);
-            if(retval == UA_STATUSCODE_GOOD) {
-                bufPos = valueEncoding.data;
-                bufEnd = &valueEncoding.data[valueEncoding.length];
-                retval = UA_encodeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE],
-                                         &bufPos, &bufEnd, NULL, NULL);
-            }
-        }
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        if(valueEncoding.data != stackValueEncoding)
-            UA_ByteString_deleteMembers(&valueEncoding);
-        return retval;
-    }
-
-    /* Has the value changed? */
-    valueEncoding.length = (uintptr_t)bufPos - (uintptr_t)valueEncoding.data;
-    *changed = (!mon->lastSampledValue.data ||
-                !UA_String_equal(&valueEncoding, &mon->lastSampledValue));
-
-    /* No change */
-    if(!(*changed)) {
-        if(valueEncoding.data != stackValueEncoding)
-            UA_ByteString_deleteMembers(&valueEncoding);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Change detected. Copy encoding on the heap if necessary. */
-    if(valueEncoding.data == stackValueEncoding)
-        return UA_ByteString_copy(&valueEncoding, encoding);
-
-    *encoding = valueEncoding;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Has this sample changed from the last one? The method may allocate additional
- * space for the encoding buffer. Detect the change in encoding->data. */
-static UA_StatusCode
-    detectValueChange(UA_Server *server, UA_Session *session, UA_MonitoredItem *mon,
-                  UA_DataValue value, UA_ByteString *encoding, UA_Boolean *changed) {
-    UA_LOCK_ASSERT(server->serviceMutex, 1);
-
-    /* Apply Filter */
-    if(mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUS)
-        value.hasValue = false;
-
-    value.hasServerTimestamp = false;
-    value.hasServerPicoseconds = false;
-    if(mon->filter.dataChangeFilter.trigger < UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP) {
-        value.hasSourceTimestamp = false;
-        value.hasSourcePicoseconds = false;
-    }
-
-    /* Detect the value change */
-    return detectValueChangeWithFilter(server, session, mon, &value, encoding, changed);
-}
-
-/* movedValue returns whether the sample was moved to the notification. The
- * default is false. */
-static UA_StatusCode
-sampleCallbackWithValue(UA_Server *server, UA_Session *session,
-                        UA_Subscription *sub, UA_MonitoredItem *mon,
-                        UA_DataValue *value, UA_Boolean *movedValue) {
-    UA_assert(mon->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER);
-
-    /* Contains heap-allocated binary encoding of the value if a change was detected */
-    UA_ByteString binValueEncoding = UA_BYTESTRING_NULL;
-
-    /* Has the value changed? Allocates memory in binValueEncoding if necessary.
-     * value is edited internally so we make a shallow copy. */
-    UA_Boolean changed = false;
-    UA_StatusCode retval = detectValueChange(server, session, mon, *value, &binValueEncoding, &changed);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING_SESSION(&server->config.logger, session, "Subscription %u | "
-                               "MonitoredItem %i | Value change detection failed with StatusCode %s",
-                               sub ? sub->subscriptionId : 0, mon->monitoredItemId,
-                               UA_StatusCode_name(retval));
-        return retval;
-    }
-    if(!changed) {
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Subscription %u | "
-                             "MonitoredItem %i | The value has not changed",
-                             sub ? sub->subscriptionId : 0, mon->monitoredItemId);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* The MonitoredItem is attached to a subscription (not server-local).
-     * Prepare a notification and enqueue it. */
-    if(sub) {
-        /* Allocate a new notification */
-        UA_Notification *newNotification = (UA_Notification *)UA_malloc(sizeof(UA_Notification));
-        if(!newNotification) {
-            UA_ByteString_deleteMembers(&binValueEncoding);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-
-        if(value->value.storageType == UA_VARIANT_DATA) {
-            newNotification->data.value = *value; /* Move the value to the notification */
-            *movedValue = true;
-        } else { /* => (value->value.storageType == UA_VARIANT_DATA_NODELETE) */
-            retval = UA_DataValue_copy(value, &newNotification->data.value);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_ByteString_deleteMembers(&binValueEncoding);
-                UA_free(newNotification);
-                return retval;
-            }
-        }
-
-        /* <-- Point of no return --> */
-
-        UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Subscription %u | "
-                             "MonitoredItem %i | Enqueue a new notification",
-                             sub ? sub->subscriptionId : 0, mon->monitoredItemId);
-
-        newNotification->mon = mon;
-        UA_Notification_enqueue(server, sub, mon, newNotification);
-    }
-
-    /* Store the encoding for comparison */
-    UA_ByteString_deleteMembers(&mon->lastSampledValue);
-    mon->lastSampledValue = binValueEncoding;
-
-    /* Store the value for filter comparison (we don't want to decode
-     * lastSampledValue in every iteration). Don't test the return code here. If
-     * this fails, lastValue is empty and a notification will be forced for the
-     * next deadband comparison. */
-    if((mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_NONE ||
-        mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_ABSOLUTE ||
-        mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_PERCENT) &&
-       (mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUS ||
-        mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUE ||
-        mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP)) {
-        UA_Variant_deleteMembers(&mon->lastValue);
-        UA_Variant_copy(&value->value, &mon->lastValue);
-#ifdef UA_ENABLE_DA
-        UA_StatusCode_deleteMembers(&mon->lastStatus);
-        UA_StatusCode_copy(&value->status, &mon->lastStatus);
-#endif
-    }
-
-    /* Call the local callback if the MonitoredItem is not attached to a
-     * subscription. Do this at the very end. Because the callback might delete
-     * the subscription. */
-    if(!sub) {
-        UA_LocalMonitoredItem *localMon = (UA_LocalMonitoredItem*) mon;
-        void *nodeContext = NULL;
-        UA_Server_getNodeContext(server, mon->monitoredNodeId, &nodeContext);
-        UA_UNLOCK(server->serviceMutex);
-        localMon->callback.dataChangeCallback(server, mon->monitoredItemId,
-                                              localMon->context,
-                                              &mon->monitoredNodeId,
-                                              nodeContext, mon->attributeId,
-                                              value);
-        UA_LOCK(server->serviceMutex);
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_MonitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem)
-{
-    UA_LOCK(server->serviceMutex);
-    monitoredItem_sampleCallback(server, monitoredItem);
-    UA_UNLOCK(server->serviceMutex)
-}
-
-void
-monitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
-    UA_Subscription *sub = monitoredItem->subscription;
-    UA_Session *session = &server->adminSession;
-    if(sub)
-        session = sub->session;
-
-    UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Subscription %u | "
-                         "MonitoredItem %i | Sample callback called",
-                         sub ? sub->subscriptionId : 0, monitoredItem->monitoredItemId);
-
-    UA_assert(monitoredItem->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER);
-
-    /* Get the node */
-    const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &monitoredItem->monitoredNodeId);
-
-    /* Sample the value. The sample can still point into the node. */
-    UA_DataValue value;
-    UA_DataValue_init(&value);
-    if(node) {
-        UA_ReadValueId rvid;
-        UA_ReadValueId_init(&rvid);
-        rvid.nodeId = monitoredItem->monitoredNodeId;
-        rvid.attributeId = monitoredItem->attributeId;
-        rvid.indexRange = monitoredItem->indexRange;
-        ReadWithNode(node, server, session, monitoredItem->timestampsToReturn, &rvid, &value);
-    } else {
-        value.hasStatus = true;
-        value.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
-    }
-
-    /* Operate on the sample */
-    UA_Boolean movedValue = false;
-    UA_StatusCode retval = sampleCallbackWithValue(server, session, sub, monitoredItem, &value, &movedValue);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING_SESSION(&server->config.logger, session, "Subscription %u | "
-                               "MonitoredItem %i | Sampling returned the statuscode %s",
-                               sub ? sub->subscriptionId : 0, monitoredItem->monitoredItemId,
-                               UA_StatusCode_name(retval));
-    }
-
-    /* Delete the sample if it was not moved to the notification. */
-    if(!movedValue)
-        UA_DataValue_deleteMembers(&value); /* Does nothing for UA_VARIANT_DATA_NODELETE */
-    if(node)
-        UA_Nodestore_releaseNode(server->nsCtx, node);
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
diff --git a/ext/open62541/src/server/ua_subscription_events.c b/ext/open62541/src/server/ua_subscription_events.c
deleted file mode 100644
index 24911eb..0000000
--- a/ext/open62541/src/server/ua_subscription_events.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH
- */
-
-#include "ua_server_internal.h"
-#include "ua_subscription.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-
-UA_StatusCode
-UA_MonitoredItem_removeNodeEventCallback(UA_Server *server, UA_Session *session,
-                                         UA_Node *node, void *data) {
-    UA_assert(node->nodeClass == UA_NODECLASS_OBJECT);
-    UA_ObjectNode *on = (UA_ObjectNode*)node;
-    UA_MonitoredItem *remove = (UA_MonitoredItem*)data;
-
-    if(!on->monitoredItemQueue)
-        return UA_STATUSCODE_GOOD;
-
-    /* Edge case that it's the first element */
-    if(on->monitoredItemQueue == remove) {
-        on->monitoredItemQueue = remove->next;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    UA_MonitoredItem *prev = on->monitoredItemQueue;
-    UA_MonitoredItem *entry = prev->next;
-    for(; entry != NULL; prev = entry, entry = entry->next) {
-        if(entry == remove) {
-            prev->next = entry->next;
-            return UA_STATUSCODE_GOOD;
-        }
-    }
-
-    return UA_STATUSCODE_BADNOTFOUND;
-}
-
-/* We use a 16-Byte ByteString as an identifier */
-static UA_StatusCode
-generateEventId(UA_ByteString *generatedId) {
-    generatedId->data = (UA_Byte *) UA_malloc(16 * sizeof(UA_Byte));
-    if(!generatedId->data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    generatedId->length = 16;
-
-    UA_UInt32 *ids = (UA_UInt32*)generatedId->data;
-    ids[0] = UA_UInt32_random();
-    ids[1] = UA_UInt32_random();
-    ids[2] = UA_UInt32_random();
-    ids[3] = UA_UInt32_random();
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Server_createEvent(UA_Server *server, const UA_NodeId eventType,
-                      UA_NodeId *outNodeId) {
-    UA_LOCK(server->serviceMutex);
-    if(!outNodeId) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                     "outNodeId must not be NULL. The event's NodeId must be returned "
-                     "so it can be triggered.");
-        UA_UNLOCK(server->serviceMutex);
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    /* Make sure the eventType is a subtype of BaseEventType */
-    UA_NodeId hasSubtypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
-    UA_NodeId baseEventTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-    if(!isNodeInTree(server->nsCtx, &eventType, &baseEventTypeId, &hasSubtypeId, 1)) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                     "Event type must be a subtype of BaseEventType!");
-        UA_UNLOCK(server->serviceMutex);
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    /* Create an ObjectNode which represents the event */
-    UA_QualifiedName name;
-    // set a dummy name. This is not used.
-    name = UA_QUALIFIEDNAME(0,"E");
-    UA_NodeId newNodeId = UA_NODEID_NULL;
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    UA_StatusCode retval = addNode(server, UA_NODECLASS_OBJECT,
-                                   &UA_NODEID_NULL, /* Set a random unused NodeId */
-                                   &UA_NODEID_NULL, /* No parent */
-                                   &UA_NODEID_NULL, /* No parent reference */
-                                   name,            /* an event does not have a name */
-                                   &eventType,      /* the type of the event */
-                                   (const UA_NodeAttributes*)&oAttr, /* default attributes are fine */
-                                   &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],
-                                   NULL,           /* no node context */
-                                   &newNodeId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                     "Adding event failed. StatusCode %s", UA_StatusCode_name(retval));
-        return retval;
-    }
-
-    /* Find the eventType variable */
-    name = UA_QUALIFIEDNAME(0, "EventType");
-    UA_BrowsePathResult bpr = browseSimplifiedBrowsePath(server, newNodeId, 1, &name);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        retval = bpr.statusCode;
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        deleteNode(server, newNodeId, true);
-        UA_NodeId_deleteMembers(&newNodeId);
-        UA_UNLOCK(server->serviceMutex);
-        return retval;
-    }
-
-    /* Set the EventType */
-    UA_Variant value;
-    UA_Variant_init(&value);
-    UA_Variant_setScalar(&value, (void*)(uintptr_t)&eventType, &UA_TYPES[UA_TYPES_NODEID]);
-    retval = writeWithWriteValue(server, &bpr.targets[0].targetId.nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], &value);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    if(retval != UA_STATUSCODE_GOOD) {
-        deleteNode(server, newNodeId, true);
-        UA_NodeId_deleteMembers(&newNodeId);
-        UA_UNLOCK(server->serviceMutex);
-        return retval;
-    }
-
-    *outNodeId = newNodeId;
-    UA_UNLOCK(server->serviceMutex);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_Boolean
-isValidEvent(UA_Server *server, const UA_NodeId *validEventParent,
-             const UA_NodeId *eventId) {
-    /* find the eventType variableNode */
-    UA_QualifiedName findName = UA_QUALIFIEDNAME(0, "EventType");
-    UA_BrowsePathResult bpr = browseSimplifiedBrowsePath(server, *eventId, 1, &findName);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return false;
-    }
-    
-    /* Get the EventType Property Node */
-    UA_Variant tOutVariant;
-    UA_Variant_init(&tOutVariant);
-
-    /* Read the Value of EventType Property Node (the Value should be a NodeId) */
-    UA_StatusCode retval =
-            readWithReadValue(server, &bpr.targets[0].targetId.nodeId, UA_ATTRIBUTEID_VALUE, &tOutVariant);
-    if(retval != UA_STATUSCODE_GOOD ||
-       !UA_Variant_hasScalarType(&tOutVariant, &UA_TYPES[UA_TYPES_NODEID])) {
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return false;
-    }
-
-    const UA_NodeId *tEventType = (UA_NodeId*)tOutVariant.data;
-
-    /* Make sure the EventType is not a Subtype of CondtionType
-     * First check for filter set using UaExpert
-     * (ConditionId Clause won't be present in Events, which are not Conditions)
-     * Second check for Events which are Conditions or Alarms (Part 9 not supported yet) */
-    UA_NodeId conditionTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_CONDITIONTYPE);
-    UA_NodeId hasSubtypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
-    if(UA_NodeId_equal(validEventParent, &conditionTypeId) ||
-       isNodeInTree(server->nsCtx, tEventType, &conditionTypeId, &hasSubtypeId, 1)) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                     "Alarms and Conditions are not supported yet!");
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        UA_Variant_deleteMembers(&tOutVariant);
-        return false;
-    }
-
-    /* check whether Valid Event other than Conditions */
-    UA_NodeId baseEventTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-    UA_Boolean isSubtypeOfBaseEvent = isNodeInTree(server->nsCtx, tEventType,
-                                                   &baseEventTypeId, &hasSubtypeId, 1);
-
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    UA_Variant_deleteMembers(&tOutVariant);
-    return isSubtypeOfBaseEvent;
-}
-
-/* Part 4: 7.4.4.5 SimpleAttributeOperand
- * The clause can point to any attribute of nodes. Either a child of the event
- * node and also the event type. */
-static UA_StatusCode
-resolveSimpleAttributeOperand(UA_Server *server, UA_Session *session, const UA_NodeId *origin,
-                              const UA_SimpleAttributeOperand *sao, UA_Variant *value) {
-    /* Prepare the ReadValueId */
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.indexRange = sao->indexRange;
-    rvi.attributeId = sao->attributeId;
-
-    /* If this list (browsePath) is empty the Node is the instance of the
-     * TypeDefinition. */
-    if(sao->browsePathSize == 0) {
-        rvi.nodeId = sao->typeDefinitionId;
-        UA_DataValue v = UA_Server_readWithSession(server, session, &rvi,
-                                                   UA_TIMESTAMPSTORETURN_NEITHER);
-        if(v.status == UA_STATUSCODE_GOOD && v.hasValue)
-            *value = v.value;
-        return v.status;
-    }
-
-    /* Resolve the browse path */
-    UA_BrowsePathResult bpr =
-        browseSimplifiedBrowsePath(server, *origin, sao->browsePathSize,
-                                             sao->browsePath);
-    if(bpr.targetsSize == 0 && bpr.statusCode == UA_STATUSCODE_GOOD)
-        bpr.statusCode = UA_STATUSCODE_BADNOTFOUND;
-    if(bpr.statusCode != UA_STATUSCODE_GOOD) {
-        UA_StatusCode retval = bpr.statusCode;
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return retval;
-    }
-
-    /* Read the first matching element. Move the value to the output. */
-    rvi.nodeId = bpr.targets[0].targetId.nodeId;
-    UA_DataValue v = UA_Server_readWithSession(server, session, &rvi,
-                                               UA_TIMESTAMPSTORETURN_NEITHER);
-    if(v.status == UA_STATUSCODE_GOOD && v.hasValue)
-        *value = v.value;
-
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return v.status;
-}
-
-/* Filters the given event with the given filter and writes the results into a
- * notification */
-static UA_StatusCode
-UA_Server_filterEvent(UA_Server *server, UA_Session *session,
-                      const UA_NodeId *eventNode, UA_EventFilter *filter,
-                      UA_EventNotification *notification) {
-    if (filter->selectClausesSize == 0)
-        return UA_STATUSCODE_BADEVENTFILTERINVALID;
-
-    UA_EventFieldList_init(&notification->fields);
-    /* EventFilterResult isn't being used currently
-    UA_EventFilterResult_init(&notification->result); */
-
-    notification->fields.eventFields = (UA_Variant *)
-        UA_Array_new(filter->selectClausesSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    if(!notification->fields.eventFields) {
-        /* EventFilterResult currently isn't being used
-        UA_EventFiterResult_deleteMembers(&notification->result); */
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    notification->fields.eventFieldsSize = filter->selectClausesSize;
-
-    /* EventFilterResult currently isn't being used
-    notification->result.selectClauseResultsSize = filter->selectClausesSize;
-    notification->result.selectClauseResults = (UA_StatusCode *)
-        UA_Array_new(filter->selectClausesSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-    if(!notification->result->selectClauseResults) {
-        UA_EventFieldList_deleteMembers(&notification->fields);
-        UA_EventFilterResult_deleteMembers(&notification->result);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    */
-
-    /* Apply the filter */
-
-    /* Check if the browsePath is BaseEventType, in which case nothing more
-     * needs to be checked */
-    UA_NodeId baseEventTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-    for(size_t i = 0; i < filter->selectClausesSize; i++) {
-        if(!UA_NodeId_equal(&filter->selectClauses[i].typeDefinitionId, &baseEventTypeId) &&
-           !isValidEvent(server, &filter->selectClauses[i].typeDefinitionId, eventNode)) {
-            UA_Variant_init(&notification->fields.eventFields[i]);
-            /* EventFilterResult currently isn't being used
-            notification->result.selectClauseResults[i] = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; */
-            continue;
-        }
-
-        /* TODO: Put the result into the selectClausResults */
-        resolveSimpleAttributeOperand(server, session, eventNode,
-                                      &filter->selectClauses[i],
-                                      &notification->fields.eventFields[i]);
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-eventSetStandardFields(UA_Server *server, const UA_NodeId *event,
-                       const UA_NodeId *origin, UA_ByteString *outEventId) {
-    /* Set the SourceNode */
-    UA_StatusCode retval;
-    UA_QualifiedName name = UA_QUALIFIEDNAME(0, "SourceNode");
-    UA_BrowsePathResult bpr = browseSimplifiedBrowsePath(server, *event, 1, &name);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        retval = bpr.statusCode;
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return retval;
-    }
-    UA_Variant value;
-    UA_Variant_init(&value);
-    UA_Variant_setScalarCopy(&value, origin, &UA_TYPES[UA_TYPES_NODEID]);
-    retval = writeWithWriteValue(server, &bpr.targets[0].targetId.nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], &value);
-    UA_Variant_deleteMembers(&value);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Set the ReceiveTime */
-    name = UA_QUALIFIEDNAME(0, "ReceiveTime");
-    bpr = browseSimplifiedBrowsePath(server, *event, 1, &name);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        retval = bpr.statusCode;
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return retval;
-    }
-    UA_DateTime rcvTime = UA_DateTime_now();
-    UA_Variant_setScalar(&value, &rcvTime, &UA_TYPES[UA_TYPES_DATETIME]);
-    retval = writeWithWriteValue(server, &bpr.targets[0].targetId.nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], &value);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Set the EventId */
-    UA_ByteString eventId = UA_BYTESTRING_NULL;
-    retval = generateEventId(&eventId);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    name = UA_QUALIFIEDNAME(0, "EventId");
-    bpr = browseSimplifiedBrowsePath(server, *event, 1, &name);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
-        retval = bpr.statusCode;
-        UA_ByteString_deleteMembers(&eventId);
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return retval;
-    }
-    UA_Variant_init(&value);
-    UA_Variant_setScalar(&value, &eventId, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    retval = writeWithWriteValue(server, &bpr.targets[0].targetId.nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], &value);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ByteString_deleteMembers(&eventId);
-        return retval;
-    }
-
-    /* Return the EventId */
-    if(outEventId)
-        *outEventId = eventId;
-    else
-        UA_ByteString_deleteMembers(&eventId);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Filters an event according to the filter specified by mon and then adds it to
- * mons notification queue */
-static UA_StatusCode
-UA_Event_addEventToMonitoredItem(UA_Server *server, const UA_NodeId *event,
-                                 UA_MonitoredItem *mon) {
-    UA_Notification *notification = (UA_Notification *) UA_malloc(sizeof(UA_Notification));
-    if(!notification)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Get the session */
-    UA_Subscription *sub = mon->subscription;
-    UA_Session *session = sub->session;
-
-    /* Apply the filter */
-    UA_StatusCode retval = UA_Server_filterEvent(server, session, event,
-                                                 &mon->filter.eventFilter,
-                                                 &notification->data.event);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(notification);
-        return retval;
-    }
-
-    /* Enqueue the notification */
-    notification->mon = mon;
-    UA_Notification_enqueue(server, mon->subscription, mon, notification);
-    return UA_STATUSCODE_GOOD;
-}
-
-static const UA_NodeId objectsFolderId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_OBJECTSFOLDER}};
-static const UA_NodeId parentReferences_events[2] =
-    {{0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_ORGANIZES}},
-     {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT}}};
-
-UA_StatusCode
-UA_Server_triggerEvent(UA_Server *server, const UA_NodeId eventNodeId, const UA_NodeId origin,
-                       UA_ByteString *outEventId, const UA_Boolean deleteEventNode) {
-    UA_LOCK(server->serviceMutex);
-    /* Check that the origin node exists */
-    const UA_Node *originNode = UA_Nodestore_getNode(server->nsCtx, &origin);
-    if(!originNode) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                     "Origin node for event does not exist.");
-        UA_UNLOCK(server->serviceMutex);
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-    UA_Nodestore_releaseNode(server->nsCtx, originNode);
-
-    /* Make sure the origin is in the ObjectsFolder (TODO: or in the ViewsFolder) */
-    if(!isNodeInTree(server->nsCtx, &origin, &objectsFolderId,
-                     parentReferences_events, 2)) {
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND,
-                     "Node for event must be in ObjectsFolder!");
-        UA_UNLOCK(server->serviceMutex);
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    }
-
-    UA_StatusCode retval = eventSetStandardFields(server, &eventNodeId, &origin, outEventId);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Events: Could not set the standard event fields with StatusCode %s",
-                       UA_StatusCode_name(retval));
-        UA_UNLOCK(server->serviceMutex);
-        return retval;
-    }
-
-    /* Get the parents */
-    UA_ExpandedNodeId *parents = NULL;
-    size_t parentsSize = 0;
-    retval = browseRecursive(server, 1, &origin, 2, parentReferences_events,
-                             UA_BROWSEDIRECTION_INVERSE, true, &parentsSize, &parents);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                       "Events: Could not create the list of nodes listening on the "
-                       "event with StatusCode %s", UA_StatusCode_name(retval));
-        UA_UNLOCK(server->serviceMutex);
-        return retval;
-    }
-
-    /* Add the event to each node's monitored items */
-    for(size_t i = 0; i < parentsSize; i++) {
-        const UA_ObjectNode *node = (const UA_ObjectNode*)
-            UA_Nodestore_getNode(server->nsCtx, &parents[i].nodeId);
-        if(!node)
-            continue;
-        if(node->nodeClass != UA_NODECLASS_OBJECT) {
-            UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)node);
-            continue;
-        }
-        UA_MonitoredItem *monIter = node->monitoredItemQueue;
-        for(; monIter != NULL; monIter = monIter->next) {
-            retval = UA_Event_addEventToMonitoredItem(server, &eventNodeId, monIter);
-            if(retval != UA_STATUSCODE_GOOD)
-                UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                               "Events: Could not add the event to a listening node with StatusCode %s",
-                               UA_StatusCode_name(retval));
-        }
-        UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)node);
-    }
-    UA_Array_delete(parents, parentsSize, &UA_TYPES[UA_TYPES_NODEID]);
-
-    /* Delete the node representation of the event */
-    if(deleteEventNode) {
-        retval = deleteNode(server, eventNodeId, true);
-        if(retval != UA_STATUSCODE_GOOD) {
-            UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                           "Attempt to remove event using deleteNode failed. StatusCode %s",
-                           UA_StatusCode_name(retval));
-            UA_UNLOCK(server->serviceMutex);
-            return retval;
-        }
-    }
-    UA_UNLOCK(server->serviceMutex);
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS_EVENTS */
diff --git a/ext/open62541/src/server/ua_subscription_monitoreditem.c b/ext/open62541/src/server/ua_subscription_monitoreditem.c
deleted file mode 100644
index 21ab945..0000000
--- a/ext/open62541/src/server/ua_subscription_monitoreditem.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH
- *    Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA
- *    Copyright 2018 (c) Fabian Arndt, Root-Core
- */
-
-#include "ua_server_internal.h"
-#include "ua_subscription.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */
-
-/****************/
-/* Notification */
-/****************/
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-
-static const UA_NodeId overflowEventType =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE}};
-static const UA_NodeId simpleOverflowEventType =
-    {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE}};
-
-static UA_Boolean
-UA_Notification_isOverflowEvent(UA_Server *server, UA_Notification *n) {
-    UA_MonitoredItem *mon = n->mon;
-    if(mon->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER)
-        return false;
-
-    UA_EventFieldList *efl = &n->data.event.fields;
-    if(efl->eventFieldsSize >= 1 &&
-       efl->eventFields[0].type == &UA_TYPES[UA_TYPES_NODEID] &&
-       isNodeInTree(server->nsCtx, (const UA_NodeId *)efl->eventFields[0].data,
-                    &overflowEventType, &subtypeId, 1)) {
-        return true;
-    }
-
-    return false;
-}
-
-/* The specification states in Part 4 5.12.1.5 that an EventQueueOverflowEvent
- * "is generated when the first Event has to be discarded [...] without
- * discarding any other event". So only generate one for all deleted events. */
-static UA_StatusCode
-createEventOverflowNotification(UA_Server *server, UA_Subscription *sub,
-                                UA_MonitoredItem *mon, UA_Notification *indicator) {
-    /* Avoid two redundant overflow events in a row */
-    if(UA_Notification_isOverflowEvent(server, indicator))
-        return UA_STATUSCODE_GOOD;
-
-    /* A notification is inserted into the queue which includes only the
-     * NodeId of the overflowEventType. It is up to the client to check for
-     * possible overflows. */
-
-    /* Allocate the notification */
-    UA_Notification *overflowNotification = (UA_Notification *)
-        UA_malloc(sizeof(UA_Notification));
-    if(!overflowNotification)
-        return UA_STATUSCODE_BADOUTOFMEMORY;;
-
-    /* Set the notification fields */
-    overflowNotification->mon = mon;
-    UA_EventFieldList_init(&overflowNotification->data.event.fields);
-    overflowNotification->data.event.fields.eventFields = UA_Variant_new();
-    if(!overflowNotification->data.event.fields.eventFields) {
-        UA_free(overflowNotification);
-        return UA_STATUSCODE_BADOUTOFMEMORY;;
-    }
-    overflowNotification->data.event.fields.eventFieldsSize = 1;
-    UA_StatusCode retval =
-        UA_Variant_setScalarCopy(overflowNotification->data.event.fields.eventFields,
-                                 &simpleOverflowEventType, &UA_TYPES[UA_TYPES_NODEID]);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_EventFieldList_deleteMembers(&overflowNotification->data.event.fields);
-        UA_free(overflowNotification);
-        return retval;
-    }
-
-    /* Insert before the "indicator notification". This is either first in the
-     * queue (if the oldest notification was removed) or before the new event
-     * that remains the last element of the queue. */
-    TAILQ_INSERT_BEFORE(indicator, overflowNotification, listEntry);
-    ++mon->eventOverflows;
-    ++mon->queueSize;
-
-    TAILQ_NEXT(overflowNotification, globalEntry) = UA_SUBSCRIPTION_QUEUE_SENTINEL;
-    if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) {
-        TAILQ_INSERT_BEFORE(indicator, overflowNotification, globalEntry);
-        ++sub->notificationQueueSize;
-        ++sub->eventNotifications;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-/* !!! The enqueue and dequeue operations need to match the reporting
- * disable/enable logic in Operation_SetMonitoringMode !!! */
-
-void
-UA_Notification_enqueue(UA_Server *server, UA_Subscription *sub,
-                        UA_MonitoredItem *mon, UA_Notification *n) {
-    /* Add to the MonitoredItem */
-    TAILQ_INSERT_TAIL(&mon->queue, n, listEntry);
-    ++mon->queueSize;
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER &&
-       UA_Notification_isOverflowEvent(server, n))
-        ++mon->eventOverflows;
-#endif
-
-    /* Add to the subscription if reporting is enabled */
-    TAILQ_NEXT(n, globalEntry) = UA_SUBSCRIPTION_QUEUE_SENTINEL;
-    if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) {
-        TAILQ_INSERT_TAIL(&sub->notificationQueue, n, globalEntry);
-        ++sub->notificationQueueSize;
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-            ++sub->eventNotifications;
-        } else
-#endif
-        {
-            ++sub->dataChangeNotifications;
-        }
-    }
-
-    /* Ensure enough space is available in the MonitoredItem. Do this only after
-     * adding the new Notification. */
-    UA_MonitoredItem_ensureQueueSpace(server, mon);
-}
-
-void
-UA_Notification_dequeue(UA_Server *server, UA_Notification *n) {
-    UA_MonitoredItem *mon = n->mon;
-    UA_Subscription *sub = mon->subscription;
-
-    /* Remove from the MonitoredItem queue */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER &&
-       UA_Notification_isOverflowEvent(server, n))
-            --mon->eventOverflows;
-#endif
-    TAILQ_REMOVE(&mon->queue, n, listEntry);
-    --mon->queueSize;
-
-    /* Remove from the subscription's queue */
-    if(TAILQ_NEXT(n, globalEntry) != UA_SUBSCRIPTION_QUEUE_SENTINEL) {
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-        if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-            --sub->eventNotifications;
-        } else
-#endif
-        {
-            --sub->dataChangeNotifications;
-        }
-        TAILQ_REMOVE(&sub->notificationQueue, n, globalEntry);
-        --sub->notificationQueueSize;
-    }
-}
-
-void
-UA_Notification_delete(UA_Notification *n) {
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    UA_MonitoredItem *mon = n->mon;
-    if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-        UA_EventFieldList_deleteMembers(&n->data.event.fields);
-        /* EventFilterResult currently isn't being used
-         * UA_EventFilterResult_delete(notification->data.event->result); */
-    } else
-#endif
-    {
-        UA_DataValue_deleteMembers(&n->data.value);
-    }
-    UA_free(n);
-}
-
-/*****************/
-/* MonitoredItem */
-/*****************/
-
-void
-UA_MonitoredItem_init(UA_MonitoredItem *mon, UA_Subscription *sub) {
-    memset(mon, 0, sizeof(UA_MonitoredItem));
-    mon->subscription = sub;
-    TAILQ_INIT(&mon->queue);
-}
-
-void
-UA_MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) {
-    /* Remove the sampling callback */
-    UA_MonitoredItem_unregisterSampleCallback(server, monitoredItem);
-
-    /* Remove the queued notifications if attached to a subscription (not a
-     * local MonitoredItem) */
-    if(monitoredItem->subscription) {
-        UA_Notification *notification, *notification_tmp;
-        TAILQ_FOREACH_SAFE(notification, &monitoredItem->queue,
-                           listEntry, notification_tmp) {
-            /* Remove the item from the queues and free the memory */
-            UA_Notification_dequeue(server, notification);
-            UA_Notification_delete(notification);
-        }
-    }
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    if(monitoredItem->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-        /* Remove the monitored item from the node queue */
-        UA_Server_editNode(server, NULL, &monitoredItem->monitoredNodeId,
-                           UA_MonitoredItem_removeNodeEventCallback, monitoredItem);
-        UA_EventFilter_clear(&monitoredItem->filter.eventFilter);
-    } else
-#endif
-    {
-        /* UA_DataChangeFilter does not hold dynamic content we need to free */
-        /* UA_DataChangeFilter_clear(&monitoredItem->filter.dataChangeFilter); */
-    }
-
-    /* Deregister MonitoredItem in userland */
-    if(server->config.monitoredItemRegisterCallback && monitoredItem->registered) {
-        /* Get the session context. Local MonitoredItems don't have a subscription. */
-        UA_Session *session = NULL;
-        if(monitoredItem->subscription)
-            session = monitoredItem->subscription->session;
-        if(!session)
-            session = &server->adminSession;
-
-        /* Get the node context */
-        void *targetContext = NULL;
-        UA_Server_getNodeContext(server, monitoredItem->monitoredNodeId, &targetContext);
-
-        /* Deregister */
-        server->config.monitoredItemRegisterCallback(server, &session->sessionId,
-                                                     session->sessionHandle,
-                                                     &monitoredItem->monitoredNodeId,
-                                                     targetContext, monitoredItem->attributeId, true);
-    }
-
-    /* Remove the monitored item */
-    if(monitoredItem->listEntry.le_prev != NULL)
-        LIST_REMOVE(monitoredItem, listEntry);
-    UA_String_deleteMembers(&monitoredItem->indexRange);
-    UA_ByteString_deleteMembers(&monitoredItem->lastSampledValue);
-    UA_Variant_deleteMembers(&monitoredItem->lastValue);
-    UA_NodeId_deleteMembers(&monitoredItem->monitoredNodeId);
-
-    /* No actual callback, just remove the structure */
-    monitoredItem->delayedFreePointers.callback = NULL;
-    UA_WorkQueue_enqueueDelayed(&server->workQueue, &monitoredItem->delayedFreePointers);
-}
-
-UA_StatusCode
-UA_MonitoredItem_ensureQueueSpace(UA_Server *server, UA_MonitoredItem *mon) {
-    /* Assert: The eventoverflow are counted in the queue size; There can be
-     * only one eventoverflow more than normal entries */
-    UA_assert(mon->queueSize >= mon->eventOverflows);
-    UA_assert(mon->eventOverflows <= mon->queueSize - mon->eventOverflows + 1);
-
-    /* Nothing to do */
-    if(mon->queueSize - mon->eventOverflows <= mon->maxQueueSize)
-        return UA_STATUSCODE_GOOD;
-
-#ifdef __clang_analyzer__
-    return UA_STATUSCODE_GOOD;
-#endif
-    
-    /* Remove notifications until the queue size is reached */
-    UA_Subscription *sub = mon->subscription;
-    while(mon->queueSize - mon->eventOverflows > mon->maxQueueSize) {
-        /* At least two notifications that are not eventOverflows in the queue */
-        UA_assert(mon->queueSize - mon->eventOverflows >= 2);
-
-        /* Select the next notification to delete. Skip over overflow events. */
-        UA_Notification *del = NULL;
-        if(mon->discardOldest) {
-            /* Remove the oldest */
-            del = TAILQ_FIRST(&mon->queue);
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-            while(UA_Notification_isOverflowEvent(server, del))
-                del = TAILQ_NEXT(del, listEntry); /* skip overflow events */
-#endif
-        } else {
-            /* Remove the second newest (to keep the up-to-date notification).
-             * The last entry is not an OverflowEvent -- we just added it. */
-            del = TAILQ_LAST(&mon->queue, NotificationQueue);
-            del = TAILQ_PREV(del, NotificationQueue, listEntry);
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-            while(UA_Notification_isOverflowEvent(server, del))
-                del = TAILQ_PREV(del, NotificationQueue, listEntry); /* skip overflow events */
-#endif
-        }
-
-        UA_assert(del); /* There must have been one entry that can be deleted */
-
-        /* If reporting is activated (entries are also in the subscriptions
-         * global queue): Move the entry after del in the per-MonitoredItem
-         * queue right after del in the global queue. (It is already right after
-         * del in the per-MonitoredItem queue.) This is required so we don't
-         * starve MonitoredItems with a high sampling interval by always
-         * removing their first appearance in the gloal queue for the
-         * Subscription. */
-        if(TAILQ_NEXT(del, globalEntry) != UA_SUBSCRIPTION_QUEUE_SENTINEL) {
-            UA_Notification *after_del = TAILQ_NEXT(del, listEntry);
-            UA_assert(after_del); /* There must be one remaining element after del */
-            TAILQ_REMOVE(&sub->notificationQueue, after_del, globalEntry);
-            TAILQ_INSERT_AFTER(&sub->notificationQueue, del, after_del, globalEntry);
-        }
-
-        /* Delete the notification */
-        UA_Notification_dequeue(server, del);
-        UA_Notification_delete(del);
-    }
-
-    /* Get the element where the overflow shall be announced (infobits or
-     * overflowevent) */
-    UA_Notification *indicator;
-    if(mon->discardOldest)
-        indicator = TAILQ_FIRST(&mon->queue);
-    else
-        indicator = TAILQ_LAST(&mon->queue, NotificationQueue);
-    UA_assert(indicator);
-
-    /* Create an overflow notification */
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) {
-        return createEventOverflowNotification(server, sub, mon, indicator);
-    } else
-#endif
-    {
-        /* Set the infobits of a datachange notification */
-        if(mon->maxQueueSize > 1) {
-            /* Add the infobits either to the newest or the new last entry */
-            indicator->data.value.hasStatus = true;
-            indicator->data.value.status |=
-                (UA_STATUSCODE_INFOTYPE_DATAVALUE | UA_STATUSCODE_INFOBITS_OVERFLOW);
-        }
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon) {
-    if(mon->sampleCallbackIsRegistered)
-        return UA_STATUSCODE_GOOD;
-
-    /* Only DataChange MonitoredItems have a callback with a sampling interval */
-    if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER)
-        return UA_STATUSCODE_GOOD;
-
-    UA_StatusCode retval =
-        UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_MonitoredItem_sampleCallback,
-                                      mon, mon->samplingInterval, &mon->sampleCallbackId);
-    if(retval == UA_STATUSCODE_GOOD)
-        mon->sampleCallbackIsRegistered = true;
-    return retval;
-}
-
-void
-UA_MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon) {
-    if(!mon->sampleCallbackIsRegistered)
-        return;
-    UA_Server_removeRepeatedCallback(server, mon->sampleCallbackId);
-    mon->sampleCallbackIsRegistered = false;
-}
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
diff --git a/ext/open62541/src/ua_connection.c b/ext/open62541/src/ua_connection.c
deleted file mode 100644
index 269ebd1..0000000
--- a/ext/open62541/src/ua_connection.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2016-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- */
-
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_connection_internal.h"
-#include "ua_securechannel.h"
-#include "ua_types_encoding_binary.h"
-#include "ua_util_internal.h"
-
-void UA_Connection_deleteMembers(UA_Connection *connection) {
-    UA_ByteString_deleteMembers(&connection->incompleteChunk);
-}
-
-UA_StatusCode
-UA_Connection_processHELACK(UA_Connection *connection,
-                            const UA_ConnectionConfig *localConfig,
-                            const UA_ConnectionConfig *remoteConfig) {
-    connection->config = *remoteConfig;
-
-    /* The lowest common version is used by both sides */
-    if(connection->config.protocolVersion > localConfig->protocolVersion)
-        connection->config.protocolVersion = localConfig->protocolVersion;
-
-    /* Can we receive the max send size? */
-    if(connection->config.sendBufferSize > localConfig->recvBufferSize)
-        connection->config.sendBufferSize = localConfig->recvBufferSize;
-
-    /* Can we send the max receive size? */
-    if(connection->config.recvBufferSize > localConfig->sendBufferSize)
-        connection->config.recvBufferSize = localConfig->sendBufferSize;
-
-    /* Chunks of at least 8192 bytes must be permissible.
-     * See Part 6, Clause 6.7.1 */
-    if(connection->config.recvBufferSize < 8192 ||
-       connection->config.sendBufferSize < 8192 ||
-       (connection->config.maxMessageSize != 0 &&
-        connection->config.maxMessageSize < 8192))
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    connection->state = UA_CONNECTION_ESTABLISHED;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Hides some errors before sending them to a client according to the
- * standard. */
-static void
-hideErrors(UA_TcpErrorMessage *const error) {
-    switch(error->error) {
-    case UA_STATUSCODE_BADCERTIFICATEUNTRUSTED:
-    case UA_STATUSCODE_BADCERTIFICATEREVOKED:
-        error->error = UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-        error->reason = UA_STRING_NULL;
-        break;
-        // TODO: Check if these are all cases that need to be covered.
-    default:
-        break;
-    }
-}
-
-void
-UA_Connection_sendError(UA_Connection *connection, UA_TcpErrorMessage *error) {
-    hideErrors(error);
-
-    UA_TcpMessageHeader header;
-    header.messageTypeAndChunkType = UA_MESSAGETYPE_ERR + UA_CHUNKTYPE_FINAL;
-    // Header + ErrorMessage (error + reasonLength_field + length)
-    header.messageSize = 8 + (4 + 4 + (UA_UInt32)error->reason.length);
-
-    /* Get the send buffer from the network layer */
-    UA_ByteString msg = UA_BYTESTRING_NULL;
-    UA_StatusCode retval = connection->getSendBuffer(connection, header.messageSize, &msg);
-    if(retval != UA_STATUSCODE_GOOD)
-        return;
-
-    /* Encode and send the response */
-    UA_Byte *bufPos = msg.data;
-    const UA_Byte *bufEnd = &msg.data[msg.length];
-    UA_TcpMessageHeader_encodeBinary(&header, &bufPos, bufEnd);
-    UA_TcpErrorMessage_encodeBinary(error, &bufPos, bufEnd);
-    msg.length = header.messageSize;
-    connection->send(connection, &msg);
-}
-
-static UA_StatusCode
-bufferIncompleteChunk(UA_Connection *connection, const UA_Byte *pos,
-                      const UA_Byte *end) {
-    UA_assert(connection->incompleteChunk.length == 0);
-    UA_assert(pos < end);
-    size_t length = (uintptr_t)end - (uintptr_t)pos;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&connection->incompleteChunk, length);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    memcpy(connection->incompleteChunk.data, pos, length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-processChunk(UA_Connection *connection, void *application,
-             UA_Connection_processChunk processCallback,
-             const UA_Byte **posp, const UA_Byte *end, UA_Boolean *done) {
-    const UA_Byte *pos = *posp;
-    const size_t remaining = (uintptr_t)end - (uintptr_t)pos;
-
-    /* At least 8 byte needed for the header. Wait for the next chunk. */
-    if(remaining < 8) {
-        *done = true;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Check the message type */
-    UA_MessageType msgtype = (UA_MessageType)
-        ((UA_UInt32)pos[0] + ((UA_UInt32)pos[1] << 8) + ((UA_UInt32)pos[2] << 16));
-    if(msgtype != UA_MESSAGETYPE_MSG && msgtype != UA_MESSAGETYPE_ERR &&
-       msgtype != UA_MESSAGETYPE_OPN && msgtype != UA_MESSAGETYPE_HEL &&
-       msgtype != UA_MESSAGETYPE_ACK && msgtype != UA_MESSAGETYPE_CLO) {
-        /* The message type is not recognized */
-        return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-    }
-
-    UA_Byte isFinal = pos[3];
-    if(isFinal != 'C' && isFinal != 'F' && isFinal != 'A') {
-        /* The message type is not recognized */
-        return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-    }
-
-    UA_UInt32 chunk_length = 0;
-    UA_ByteString temp = { 8, (UA_Byte*)(uintptr_t)pos }; /* At least 8 byte left */
-    size_t temp_offset = 4;
-    /* Decoding the UInt32 cannot fail */
-    UA_UInt32_decodeBinary(&temp, &temp_offset, &chunk_length);
-
-    /* The message size is not allowed */
-    if(chunk_length < 16 || chunk_length > connection->config.recvBufferSize)
-        return UA_STATUSCODE_BADTCPMESSAGETOOLARGE;
-
-    /* Have an the complete chunk */
-    if(chunk_length > remaining) {
-        *done = true;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Process the chunk; forward the position pointer */
-    temp.length = chunk_length;
-    *posp += chunk_length;
-    *done = false;
-    return processCallback(application, connection, &temp);
-}
-
-UA_StatusCode
-UA_Connection_processChunks(UA_Connection *connection, void *application,
-                            UA_Connection_processChunk processCallback,
-                            const UA_ByteString *packet) {
-    const UA_Byte *pos = packet->data;
-    const UA_Byte *end = &packet->data[packet->length];
-    UA_ByteString appended = connection->incompleteChunk;
-
-    /* Prepend the incomplete last chunk. This is usually done in the
-     * networklayer. But we test for a buffered incomplete chunk here again to
-     * work around "lazy" network layers. */
-    if(appended.length > 0) {
-        connection->incompleteChunk = UA_BYTESTRING_NULL;
-        UA_Byte *t = (UA_Byte*)UA_realloc(appended.data, appended.length + packet->length);
-        if(!t) {
-            UA_ByteString_deleteMembers(&appended);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        memcpy(&t[appended.length], pos, packet->length);
-        appended.data = t;
-        appended.length += packet->length;
-        pos = t;
-        end = &t[appended.length];
-    }
-
-    UA_assert(connection->incompleteChunk.length == 0);
-
-    /* Loop over the received chunks. pos is increased with each chunk. */
-    UA_Boolean done = false;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    while(!done) {
-        retval = processChunk(connection, application, processCallback, &pos, end, &done);
-        /* If an irrecoverable error happens: do not buffer incomplete chunk */
-        if(retval != UA_STATUSCODE_GOOD)
-            goto cleanup;
-    }
-
-    if(end > pos)
-        retval = bufferIncompleteChunk(connection, pos, end);
-
- cleanup:
-    UA_ByteString_deleteMembers(&appended);
-    return retval;
-}
-
-/* In order to know whether a chunk was processed, we insert an redirection into
- * the callback. */
-struct completeChunkTrampolineData {
-    UA_Boolean called;
-    void *application;
-    UA_Connection_processChunk processCallback;
-};
-
-static UA_StatusCode
-completeChunkTrampoline(void *application, UA_Connection *connection,
-                        UA_ByteString *chunk) {
-    struct completeChunkTrampolineData *data =
-        (struct completeChunkTrampolineData*)application;
-    data->called = true;
-    return data->processCallback(data->application, connection, chunk);
-}
-
-UA_StatusCode
-UA_Connection_receiveChunksBlocking(UA_Connection *connection, void *application,
-                                    UA_Connection_processChunk processCallback,
-                                    UA_UInt32 timeout) {
-    UA_DateTime now = UA_DateTime_nowMonotonic();
-    UA_DateTime maxDate = now + (timeout * UA_DATETIME_MSEC);
-
-    struct completeChunkTrampolineData data;
-    data.called = false;
-    data.application = application;
-    data.processCallback = processCallback;
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    while(true) {
-        /* Listen for messages to arrive */
-        UA_ByteString packet = UA_BYTESTRING_NULL;
-        retval = connection->recv(connection, &packet, timeout);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-
-        /* Try to process one complete chunk */
-        retval = UA_Connection_processChunks(connection, &data,
-                                             completeChunkTrampoline, &packet);
-        connection->releaseRecvBuffer(connection, &packet);
-        if(data.called)
-            break;
-
-        /* We received a message. But the chunk is incomplete. Compute the
-         * remaining timeout. */
-        now = UA_DateTime_nowMonotonic();
-
-        /* >= avoid timeout to be set to 0 */
-        if(now >= maxDate)
-            return UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-        /* round always to upper value to avoid timeout to be set to 0
-         * if(maxDate - now) < (UA_DATETIME_MSEC/2) */
-        timeout = (UA_UInt32)(((maxDate - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC);
-    }
-    return retval;
-}
-
-UA_StatusCode
-UA_Connection_receiveChunksNonBlocking(UA_Connection *connection, void *application,
-                                    UA_Connection_processChunk processCallback) {
-    struct completeChunkTrampolineData data;
-    data.called = false;
-    data.application = application;
-    data.processCallback = processCallback;
-
-    /* Listen for messages to arrive */
-    UA_ByteString packet = UA_BYTESTRING_NULL;
-    UA_StatusCode retval = connection->recv(connection, &packet, 1);
-
-    if((retval != UA_STATUSCODE_GOOD) && (retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT))
-        return retval;
-
-    /* Try to process one complete chunk */
-    retval = UA_Connection_processChunks(connection, &data, completeChunkTrampoline, &packet);
-    connection->releaseRecvBuffer(connection, &packet);
-
-    return retval;
-}
-
-void UA_Connection_detachSecureChannel(UA_Connection *connection) {
-    UA_SecureChannel *channel = connection->channel;
-    if(channel)
-        /* only replace when the channel points to this connection */
-        UA_atomic_cmpxchg((void**)&channel->connection, connection, NULL);
-    UA_atomic_xchg((void**)&connection->channel, NULL);
-}
-
-// TODO: Return an error code
-void
-UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *channel) {
-    if(UA_atomic_cmpxchg((void**)&channel->connection, NULL, connection) == NULL)
-        UA_atomic_xchg((void**)&connection->channel, (void*)channel);
-}
diff --git a/ext/open62541/src/ua_connection_internal.h b/ext/open62541/src/ua_connection_internal.h
deleted file mode 100644
index 3cef035..0000000
--- a/ext/open62541/src/ua_connection_internal.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Florian Palm
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#ifndef UA_CONNECTION_INTERNAL_H_
-#define UA_CONNECTION_INTERNAL_H_
-
-#include <open62541/plugin/network.h>
-#include <open62541/transport_generated.h>
-
-_UA_BEGIN_DECLS
-
-/* Process the remote configuration in the HEL/ACK handshake. The connection
- * config is initialized with the local settings. */
-UA_StatusCode
-UA_Connection_processHELACK(UA_Connection *connection,
-                            const UA_ConnectionConfig *localConfig,
-                            const UA_ConnectionConfig *remoteConfig);
-
-/* The application can be the client or the server */
-typedef UA_StatusCode (*UA_Connection_processChunk)(void *application,
-                                                    UA_Connection *connection,
-                                                    UA_ByteString *chunk);
-
-/* The network layer may receive several chunks in one packet since TCP is a
- * streaming protocol. The last chunk in the packet may be only partial. This
- * method calls the processChunk callback on all full chunks that were received.
- * The last incomplete chunk is buffered in the connection for the next
- * iteration.
- *
- * The packet itself is not edited in this method. But possibly in the callback
- * that is executed on complete chunks.
- *
- * @param connection The connection
- * @param application The client or server application
- * @param processCallback The function pointer for processing each chunk
- * @param packet The received packet.
- * @return Returns UA_STATUSCODE_GOOD or an error code. When an error occurs,
- *         the current buffer in the connection are
- *         freed. */
-UA_StatusCode
-UA_Connection_processChunks(UA_Connection *connection, void *application,
-                            UA_Connection_processChunk processCallback,
-                            const UA_ByteString *packet);
-
-/* Try to receive at least one complete chunk on the connection. This blocks the
- * current thread up to the given timeout.
- *
- * @param connection The connection
- * @param application The client or server application
- * @param processCallback The function pointer for processing each chunk
- * @param timeout The timeout (in milliseconds) the method will block at most.
- * @return Returns UA_STATUSCODE_GOOD or an error code. When an timeout occurs,
- *         UA_STATUSCODE_GOODNONCRITICALTIMEOUT is returned. */
-UA_StatusCode
-UA_Connection_receiveChunksBlocking(UA_Connection *connection, void *application,
-                                    UA_Connection_processChunk processCallback,
-                                    UA_UInt32 timeout);
-
-UA_StatusCode
-UA_Connection_receiveChunksNonBlocking(UA_Connection *connection, void *application,
-                                       UA_Connection_processChunk processCallback);
-
-/* When a fatal error occurs the Server shall send an Error Message to the
- * Client and close the socket. When a Client encounters one of these errors, it
- * shall also close the socket but does not send an Error Message. After the
- * socket is closed a Client shall try to reconnect automatically using the
- * mechanisms described in [...]. */
-void
-UA_Connection_sendError(UA_Connection *connection,
-                        UA_TcpErrorMessage *error);
-
-void UA_Connection_detachSecureChannel(UA_Connection *connection);
-void UA_Connection_attachSecureChannel(UA_Connection *connection,
-                                       UA_SecureChannel *channel);
-
-_UA_END_DECLS
-
-#endif /* UA_CONNECTION_INTERNAL_H_ */
diff --git a/ext/open62541/src/ua_securechannel.c b/ext/open62541/src/ua_securechannel.c
deleted file mode 100644
index 8340441..0000000
--- a/ext/open62541/src/ua_securechannel.c
+++ /dev/null
@@ -1,1525 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2016-2017 (c) Florian Palm
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Oleksiy Vasylyev
- *    Copyright 2016 (c) TorbenD
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#include "ua_securechannel.h"
-
-#include <open62541/plugin/securitypolicy.h>
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/transport_generated_handling.h>
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_types_encoding_binary.h"
-#include "ua_util_internal.h"
-
-#define UA_BITMASK_MESSAGETYPE 0x00ffffffu
-#define UA_BITMASK_CHUNKTYPE 0xff000000u
-#define UA_ASYMMETRIC_ALG_SECURITY_HEADER_FIXED_LENGTH 12
-#define UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH 4
-#define UA_SEQUENCE_HEADER_LENGTH 8
-#define UA_SECUREMH_AND_SYMALGH_LENGTH              \
-    (UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + \
-    UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH)
-
-const UA_ByteString UA_SECURITY_POLICY_NONE_URI =
-    {47, (UA_Byte *)"http://opcfoundation.org/UA/SecurityPolicy#None"};
-
-#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-UA_StatusCode decrypt_verifySignatureFailure;
-UA_StatusCode sendAsym_sendFailure;
-UA_StatusCode processSym_seqNumberFailure;
-#endif
-
-void
-UA_SecureChannel_init(UA_SecureChannel *channel) {
-    /* Linked lists are also initialized by zeroing out */
-    memset(channel, 0, sizeof(UA_SecureChannel));
-    channel->state = UA_SECURECHANNELSTATE_FRESH;
-    TAILQ_INIT(&channel->messages);
-}
-
-UA_StatusCode
-UA_SecureChannel_setSecurityPolicy(UA_SecureChannel *channel,
-                                   const UA_SecurityPolicy *securityPolicy,
-                                   const UA_ByteString *remoteCertificate) {
-    /* Is a policy already configured? */
-    if(channel->securityPolicy) {
-        UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                     "Security policy already configured");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    UA_StatusCode retval;
-    if(securityPolicy->certificateVerification != NULL) {
-        retval = securityPolicy->certificateVerification->
-            verifyCertificate(securityPolicy->certificateVerification->context,
-                              remoteCertificate);
-
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    } else {
-        UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY,
-                       "Security policy None is used to create SecureChannel. Accepting all certificates");
-    }
-
-    retval = securityPolicy->channelModule.
-        newContext(securityPolicy, remoteCertificate, &channel->channelContext);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_ByteString_copy(remoteCertificate, &channel->remoteCertificate);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_ByteString remoteCertificateThumbprint = {20, channel->remoteCertificateThumbprint};
-    retval = securityPolicy->asymmetricModule.
-        makeCertificateThumbprint(securityPolicy, &channel->remoteCertificate,
-                                  &remoteCertificateThumbprint);
-
-    if(retval == UA_STATUSCODE_GOOD)
-        channel->securityPolicy = securityPolicy;
-
-    return retval;
-}
-
-static void
-deleteMessage(UA_Message *me) {
-    UA_ChunkPayload *cp;
-    while((cp = SIMPLEQ_FIRST(&me->chunkPayloads))) {
-        if(cp->copied)
-            UA_ByteString_deleteMembers(&cp->bytes);
-        SIMPLEQ_REMOVE_HEAD(&me->chunkPayloads, pointers);
-        UA_free(cp);
-    }
-    UA_free(me);
-}
-
-static void
-deleteLatestMessage(UA_SecureChannel *channel, UA_UInt32 requestId) {
-    UA_Message *me = TAILQ_LAST(&channel->messages, UA_MessageQueue);
-    if(!me)
-        return;
-    if(me->requestId != requestId)
-        return;
-
-    TAILQ_REMOVE(&channel->messages, me, pointers);
-    deleteMessage(me);
-}
-
-void
-UA_SecureChannel_deleteMessages(UA_SecureChannel *channel) {
-    UA_Message *me, *me_tmp;
-    TAILQ_FOREACH_SAFE(me, &channel->messages, pointers, me_tmp) {
-        TAILQ_REMOVE(&channel->messages, me, pointers);
-        deleteMessage(me);
-    }
-}
-
-void
-UA_SecureChannel_deleteMembers(UA_SecureChannel *channel) {
-    /* Delete members */
-    UA_ByteString_deleteMembers(&channel->remoteCertificate);
-    UA_ByteString_deleteMembers(&channel->localNonce);
-    UA_ByteString_deleteMembers(&channel->remoteNonce);
-    UA_ChannelSecurityToken_deleteMembers(&channel->securityToken);
-    UA_ChannelSecurityToken_deleteMembers(&channel->nextSecurityToken);
-
-    /* Delete the channel context for the security policy */
-    if(channel->securityPolicy) {
-        channel->securityPolicy->channelModule.deleteContext(channel->channelContext);
-        channel->securityPolicy = NULL;
-    }
-
-    /* Remove the buffered messages */
-    UA_SecureChannel_deleteMessages(channel);
-
-    UA_SecureChannel_init(channel);
-}
-
-void
-UA_SecureChannel_close(UA_SecureChannel *channel) {
-    /* Set the status to closed */
-    channel->state = UA_SECURECHANNELSTATE_CLOSED;
-
-    /* Detach from the connection and close the connection */
-    if(channel->connection) {
-        if(channel->connection->state != UA_CONNECTION_CLOSED)
-            channel->connection->close(channel->connection);
-        UA_Connection_detachSecureChannel(channel->connection);
-    }
-
-    /* Remove session pointers (not the sessions) and NULL the pointers back to
-     * the SecureChannel in the Session */
-    UA_SessionHeader *sh, *temp;
-    LIST_FOREACH_SAFE(sh, &channel->sessions, pointers, temp) {
-        sh->channel = NULL;
-        LIST_REMOVE(sh, pointers);
-    }
-}
-
-UA_StatusCode
-UA_SecureChannel_generateLocalNonce(UA_SecureChannel *channel) {
-    if(!channel->securityPolicy)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Is the length of the previous nonce correct? */
-    size_t nonceLength = channel->securityPolicy->symmetricModule.secureChannelNonceLength;
-    if(channel->localNonce.length != nonceLength) {
-        UA_ByteString_deleteMembers(&channel->localNonce);
-        UA_StatusCode retval = UA_ByteString_allocBuffer(&channel->localNonce, nonceLength);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    return channel->securityPolicy->symmetricModule.
-        generateNonce(channel->securityPolicy, &channel->localNonce);
-}
-
-static UA_StatusCode
-UA_SecureChannel_generateLocalKeys(const UA_SecureChannel *const channel,
-                                   const UA_SecurityPolicy *const securityPolicy) {
-    UA_LOG_TRACE_CHANNEL(securityPolicy->logger, channel, "Generating new local keys");
-    const UA_SecurityPolicyChannelModule *channelModule = &securityPolicy->channelModule;
-    const UA_SecurityPolicySymmetricModule *symmetricModule = &securityPolicy->symmetricModule;
-    const UA_SecurityPolicyCryptoModule *const cryptoModule =
-        &securityPolicy->symmetricModule.cryptoModule;
-
-    /* Symmetric key length */
-    size_t encryptionKeyLength =
-        cryptoModule->encryptionAlgorithm.getLocalKeyLength(securityPolicy, channel->channelContext);
-    size_t encryptionBlockSize =
-        cryptoModule->encryptionAlgorithm.getLocalBlockSize(securityPolicy, channel->channelContext);
-    size_t signingKeyLength =
-        cryptoModule->signatureAlgorithm.getLocalKeyLength(securityPolicy, channel->channelContext);
-    const size_t bufSize = encryptionBlockSize + signingKeyLength + encryptionKeyLength;
-    UA_STACKARRAY(UA_Byte, bufBytes, bufSize);
-    UA_ByteString buffer = {bufSize, bufBytes};
-
-    /* Local keys */
-    UA_StatusCode retval = symmetricModule->generateKey(securityPolicy, &channel->remoteNonce,
-                                                        &channel->localNonce, &buffer);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    const UA_ByteString localSigningKey = {signingKeyLength, buffer.data};
-    const UA_ByteString localEncryptingKey = {encryptionKeyLength,
-                                              buffer.data + signingKeyLength};
-    const UA_ByteString localIv = {encryptionBlockSize,
-                                   buffer.data + signingKeyLength +
-                                   encryptionKeyLength};
-
-    retval = channelModule->setLocalSymSigningKey(channel->channelContext, &localSigningKey);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = channelModule->setLocalSymEncryptingKey(channel->channelContext, &localEncryptingKey);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = channelModule->setLocalSymIv(channel->channelContext, &localIv);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    return retval;
-}
-
-static UA_StatusCode
-UA_SecureChannel_generateRemoteKeys(const UA_SecureChannel *const channel,
-                                    const UA_SecurityPolicy *const securityPolicy) {
-    UA_LOG_TRACE_CHANNEL(securityPolicy->logger, channel, "Generating new remote keys");
-    const UA_SecurityPolicyChannelModule *channelModule = &securityPolicy->channelModule;
-    const UA_SecurityPolicySymmetricModule *symmetricModule = &securityPolicy->symmetricModule;
-    const UA_SecurityPolicyCryptoModule *const cryptoModule =
-        &securityPolicy->symmetricModule.cryptoModule;
-
-    /* Symmetric key length */
-    size_t encryptionKeyLength =
-        cryptoModule->encryptionAlgorithm.getRemoteKeyLength(securityPolicy, channel->channelContext);
-    size_t encryptionBlockSize =
-        cryptoModule->encryptionAlgorithm.getRemoteBlockSize(securityPolicy, channel->channelContext);
-    size_t signingKeyLength =
-        cryptoModule->signatureAlgorithm.getRemoteKeyLength(securityPolicy, channel->channelContext);
-    const size_t bufSize = encryptionBlockSize + signingKeyLength + encryptionKeyLength;
-    UA_STACKARRAY(UA_Byte, bufBytes, bufSize);
-    UA_ByteString buffer = {bufSize, bufBytes};
-
-    /* Remote keys */
-    UA_StatusCode retval = symmetricModule->generateKey(securityPolicy, &channel->localNonce,
-                                                        &channel->remoteNonce, &buffer);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    const UA_ByteString remoteSigningKey = {signingKeyLength, buffer.data};
-    const UA_ByteString remoteEncryptingKey = {encryptionKeyLength,
-                                               buffer.data + signingKeyLength};
-    const UA_ByteString remoteIv = {encryptionBlockSize,
-                                    buffer.data + signingKeyLength +
-                                    encryptionKeyLength};
-
-    retval = channelModule->setRemoteSymSigningKey(channel->channelContext, &remoteSigningKey);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = channelModule->setRemoteSymEncryptingKey(channel->channelContext, &remoteEncryptingKey);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = channelModule->setRemoteSymIv(channel->channelContext, &remoteIv);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    return retval;
-}
-
-UA_StatusCode
-UA_SecureChannel_generateNewKeys(UA_SecureChannel *channel) {
-    UA_StatusCode retval =
-        UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL,
-            "Could not generate a local key");
-        return retval;
-    }
-
-    retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL,
-            "Could not generate a remote key");
-        return retval;
-    }
-
-    return retval;
-}
-
-UA_SessionHeader *
-UA_SecureChannel_getSession(UA_SecureChannel *channel,
-                            const UA_NodeId *authenticationToken) {
-    UA_SessionHeader *sh;
-    LIST_FOREACH(sh, &channel->sessions, pointers) {
-        if(UA_NodeId_equal(&sh->authenticationToken, authenticationToken))
-            break;
-    }
-    return sh;
-}
-
-UA_StatusCode
-UA_SecureChannel_revolveTokens(UA_SecureChannel *channel) {
-    if(channel->nextSecurityToken.tokenId == 0) // no security token issued
-        return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN;
-
-    //FIXME: not thread-safe ???? Why is this not thread safe?
-    UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken);
-    UA_ChannelSecurityToken_copy(&channel->securityToken, &channel->previousSecurityToken);
-
-    UA_ChannelSecurityToken_deleteMembers(&channel->securityToken);
-    UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &channel->securityToken);
-
-    UA_ChannelSecurityToken_deleteMembers(&channel->nextSecurityToken);
-    UA_ChannelSecurityToken_init(&channel->nextSecurityToken);
-
-    /* remote keys are generated later on */
-    return UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy);
-}
-/***************************/
-/* Send Asymmetric Message */
-/***************************/
-
-static size_t
-calculateAsymAlgSecurityHeaderLength(const UA_SecureChannel *channel) {
-    size_t asymHeaderLength = UA_ASYMMETRIC_ALG_SECURITY_HEADER_FIXED_LENGTH +
-                              channel->securityPolicy->policyUri.length;
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return asymHeaderLength;
-
-    /* OPN is always encrypted even if the mode is sign only */
-    asymHeaderLength += 20; /* Thumbprints are always 20 byte long */
-    asymHeaderLength += channel->securityPolicy->localCertificate.length;
-    return asymHeaderLength;
-}
-
-static UA_StatusCode
-prependHeadersAsym(UA_SecureChannel *const channel, UA_Byte *header_pos,
-                   const UA_Byte *buf_end, size_t totalLength,
-                   size_t securityHeaderLength, UA_UInt32 requestId,
-                   size_t *const finalLength) {
-    UA_StatusCode retval;
-    size_t dataToEncryptLength =
-        totalLength - (UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength);
-
-    UA_SecureConversationMessageHeader respHeader;
-    respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL;
-    respHeader.messageHeader.messageSize = (UA_UInt32)
-        (totalLength +
-         UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(channel->securityPolicy,
-                                                                       channel->channelContext,
-                                                                       dataToEncryptLength));
-    respHeader.secureChannelId = channel->securityToken.channelId;
-    retval = UA_encodeBinary(&respHeader,
-                             &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER],
-                             &header_pos, &buf_end, NULL, NULL);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_AsymmetricAlgorithmSecurityHeader asymHeader;
-    UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader);
-    asymHeader.securityPolicyUri = channel->securityPolicy->policyUri;
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-        asymHeader.senderCertificate = channel->securityPolicy->localCertificate;
-        asymHeader.receiverCertificateThumbprint.length = 20;
-        asymHeader.receiverCertificateThumbprint.data = channel->remoteCertificateThumbprint;
-    }
-    retval = UA_encodeBinary(&asymHeader,
-                             &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER],
-                             &header_pos, &buf_end, NULL, NULL);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    UA_SequenceHeader seqHeader;
-    seqHeader.requestId = requestId;
-    seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1);
-    retval = UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER],
-                             &header_pos, &buf_end, NULL, NULL);
-
-    *finalLength = respHeader.messageHeader.messageSize;
-
-    return retval;
-}
-
-static void
-hideBytesAsym(const UA_SecureChannel *channel, UA_Byte **buf_start,
-              const UA_Byte **buf_end) {
-    *buf_start += UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH;
-    *buf_start += calculateAsymAlgSecurityHeaderLength(channel);
-    *buf_start += UA_SEQUENCE_HEADER_LENGTH;
-
-#ifdef UA_ENABLE_ENCRYPTION
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return;
-
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-
-    /* Hide bytes for signature and padding */
-    size_t potentialEncryptMaxSize = (size_t)(*buf_end - *buf_start) + UA_SEQUENCE_HEADER_LENGTH;
-    *buf_end -= securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm.
-        getLocalSignatureSize(securityPolicy, channel->channelContext);
-    *buf_end -= 2; /* padding byte and extraPadding byte */
-
-    /* Add some overhead length due to RSA implementations adding a signature themselves */
-    *buf_end -= UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy,
-                                                                              channel->channelContext,
-                                                                              potentialEncryptMaxSize);
-#endif
-}
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-static void
-padChunkAsym(UA_SecureChannel *channel, const UA_ByteString *const buf,
-             size_t securityHeaderLength, UA_Byte **buf_pos) {
-    const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
-
-    /* Also pad if the securityMode is SIGN_ONLY, since we are using
-     * asymmetric communication to exchange keys and thus need to encrypt. */
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return;
-
-    const UA_Byte *buf_body_start =
-        &buf->data[UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH +
-                   UA_SEQUENCE_HEADER_LENGTH + securityHeaderLength];
-    const size_t bytesToWrite =
-        (uintptr_t)*buf_pos - (uintptr_t)buf_body_start + UA_SEQUENCE_HEADER_LENGTH;
-
-    /* Compute the padding length */
-    size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm.
-        getRemotePlainTextBlockSize(securityPolicy, channel->channelContext);
-    size_t signatureSize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm.
-        getLocalSignatureSize(securityPolicy, channel->channelContext);
-    size_t paddingBytes = 1;
-    if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm.
-        getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048)
-        ++paddingBytes; /* extra padding */
-    size_t totalPaddingSize =
-        (plainTextBlockSize - ((bytesToWrite + signatureSize + paddingBytes) % plainTextBlockSize));
-
-    /* Write the padding. This is <= because the paddingSize byte also has to be written */
-    UA_Byte paddingSize = (UA_Byte)(totalPaddingSize & 0xffu);
-    for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) {
-        **buf_pos = paddingSize;
-        ++*buf_pos;
-    }
-
-    /* Write the extra padding byte if required */
-    if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm.
-       getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048) {
-        UA_Byte extraPaddingSize = (UA_Byte)(totalPaddingSize >> 8u);
-        **buf_pos = extraPaddingSize;
-        ++*buf_pos;
-    }
-}
-
-static UA_StatusCode
-signAndEncryptAsym(UA_SecureChannel *const channel, size_t preSignLength,
-                   UA_ByteString *buf, size_t securityHeaderLength,
-                   size_t totalLength) {
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-
-    const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
-    
-    /* Sign message */
-    const UA_ByteString dataToSign = {preSignLength, buf->data};
-    size_t sigsize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm.
-        getLocalSignatureSize(securityPolicy, channel->channelContext);
-    UA_ByteString signature = {sigsize, buf->data + preSignLength};
-    UA_StatusCode retval = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm.
-        sign(securityPolicy, channel->channelContext, &dataToSign, &signature);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Specification part 6, 6.7.4: The OpenSecureChannel Messages are
-     * signed and encrypted if the SecurityMode is not None (even if the
-     * SecurityMode is SignOnly). */
-    size_t unencrypted_length =
-        UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength;
-    UA_ByteString dataToEncrypt = {totalLength - unencrypted_length,
-                                   &buf->data[unencrypted_length]};
-    return securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm.
-        encrypt(securityPolicy, channel->channelContext, &dataToEncrypt);
-}
-
-#endif /* UA_ENABLE_ENCRYPTION */
-
-/* Sends an OPN message using asymmetric encryption if defined */
-UA_StatusCode
-UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel,
-                                          UA_UInt32 requestId, const void *content,
-                                          const UA_DataType *contentType) {
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_INVALID)
-        return UA_STATUSCODE_BADSECURITYMODEREJECTED;
-
-    const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
-    UA_Connection *connection = channel->connection;
-    if(!connection)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Allocate the message buffer */
-    UA_ByteString buf = UA_BYTESTRING_NULL;
-    UA_StatusCode retval =
-        connection->getSendBuffer(connection, connection->config.sendBufferSize, &buf);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Restrict buffer to the available space for the payload */
-    UA_Byte *buf_pos = buf.data;
-    const UA_Byte *buf_end = &buf.data[buf.length];
-    hideBytesAsym(channel, &buf_pos, &buf_end);
-
-    /* Encode the message type and content */
-    UA_NodeId typeId = UA_NODEID_NUMERIC(0, contentType->binaryEncodingId);
-    retval |= UA_encodeBinary(&typeId, &UA_TYPES[UA_TYPES_NODEID],
-                              &buf_pos, &buf_end, NULL, NULL);
-    retval |= UA_encodeBinary(content, contentType,
-                              &buf_pos, &buf_end, NULL, NULL);
-    if(retval != UA_STATUSCODE_GOOD) {
-        connection->releaseSendBuffer(connection, &buf);
-        return retval;
-    }
-
-    const size_t securityHeaderLength = calculateAsymAlgSecurityHeaderLength(channel);
-
-    /* Add padding to the chunk */
-#ifdef UA_ENABLE_ENCRYPTION
-    padChunkAsym(channel, &buf, securityHeaderLength, &buf_pos);
-#endif
-
-    /* The total message length */
-    size_t pre_sig_length = (uintptr_t)buf_pos - (uintptr_t)buf.data;
-    size_t total_length = pre_sig_length;
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        total_length += securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm.
-            getLocalSignatureSize(securityPolicy, channel->channelContext);
-
-    /* The total message length is known here which is why we encode the headers
-     * at this step and not earlier. */
-    size_t finalLength = 0;
-    retval = prependHeadersAsym(channel, buf.data, buf_end, total_length,
-                                securityHeaderLength, requestId, &finalLength);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-
-#ifdef UA_ENABLE_ENCRYPTION
-    retval = signAndEncryptAsym(channel, pre_sig_length, &buf, securityHeaderLength, total_length);
-    if(retval != UA_STATUSCODE_GOOD)
-        goto error;
-#endif
-
-    /* Send the message, the buffer is freed in the network layer */
-    buf.length = finalLength;
-    retval = connection->send(connection, &buf);
-#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-    retval |= sendAsym_sendFailure;
-#endif
-    return retval;
-
-error:
-    connection->releaseSendBuffer(connection, &buf);
-    return retval;
-}
-
-/**************************/
-/* Send Symmetric Message */
-/**************************/
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-static UA_UInt16
-calculatePaddingSym(const UA_SecurityPolicy *securityPolicy, const void *channelContext,
-                    size_t bytesToWrite, UA_Byte *paddingSize, UA_Byte *extraPaddingSize) {
-    size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule.
-        encryptionAlgorithm.getLocalBlockSize(securityPolicy, channelContext);
-    size_t signatureSize = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm.
-        getLocalSignatureSize(securityPolicy, channelContext);
-
-    size_t padding = (encryptionBlockSize -
-                      ((bytesToWrite + signatureSize + 1) % encryptionBlockSize));
-    *paddingSize = (UA_Byte)padding;
-    *extraPaddingSize = (UA_Byte)(padding >> 8u);
-    return (UA_UInt16)padding;
-}
-
-static void
-padChunkSym(UA_MessageContext *messageContext, size_t bodyLength) {
-    if(messageContext->channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return;
-
-    /* The bytes for the padding and signature were removed from buf_end before
-     * encoding the payload. So we don't have to check if there is enough
-     * space. */
-
-    size_t bytesToWrite = bodyLength + UA_SEQUENCE_HEADER_LENGTH;
-    UA_Byte paddingSize = 0;
-    UA_Byte extraPaddingSize = 0;
-    UA_UInt16 totalPaddingSize =
-        calculatePaddingSym(messageContext->channel->securityPolicy,
-                            messageContext->channel->channelContext,
-                            bytesToWrite, &paddingSize, &extraPaddingSize);
-
-    /* This is <= because the paddingSize byte also has to be written. */
-    for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) {
-        *messageContext->buf_pos = paddingSize;
-        ++(messageContext->buf_pos);
-    }
-    if(extraPaddingSize > 0) {
-        *messageContext->buf_pos = extraPaddingSize;
-        ++(messageContext->buf_pos);
-    }
-}
-
-static UA_StatusCode
-signChunkSym(UA_MessageContext *const messageContext, size_t preSigLength) {
-    const UA_SecureChannel *channel = messageContext->channel;
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
-       channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-    UA_ByteString dataToSign = messageContext->messageBuffer;
-    dataToSign.length = preSigLength;
-    UA_ByteString signature;
-    signature.length = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm.
-        getLocalSignatureSize(securityPolicy, channel->channelContext);
-    signature.data = messageContext->buf_pos;
-
-    return securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm.
-        sign(securityPolicy, channel->channelContext, &dataToSign, &signature);
-}
-
-static UA_StatusCode
-encryptChunkSym(UA_MessageContext *const messageContext, size_t totalLength) {
-    const UA_SecureChannel *channel = messageContext->channel;
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        return UA_STATUSCODE_GOOD;
-        
-    UA_ByteString dataToEncrypt;
-    dataToEncrypt.data = messageContext->messageBuffer.data + UA_SECUREMH_AND_SYMALGH_LENGTH;
-    dataToEncrypt.length = totalLength - UA_SECUREMH_AND_SYMALGH_LENGTH;
-
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-    return securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.
-        encrypt(securityPolicy, channel->channelContext, &dataToEncrypt);
-}
-
-#endif /* UA_ENABLE_ENCRYPTION */
-
-static void
-setBufPos(UA_MessageContext *mc) {
-    /* Forward the data pointer so that the payload is encoded after the
-     * message header */
-    mc->buf_pos = &mc->messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH];
-    mc->buf_end = &mc->messageBuffer.data[mc->messageBuffer.length];
-
-#ifdef UA_ENABLE_ENCRYPTION
-    const UA_SecureChannel *channel = mc->channel;
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-
-    /* Reserve space for the message footer at the end of the chunk if the chunk
-     * is signed and/or encrypted. The footer includes the fields PaddingSize,
-     * Padding, ExtraPadding and Signature. The padding fields are only present
-     * if the chunk is encrypted. */
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        mc->buf_end -= securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm.
-            getLocalSignatureSize(securityPolicy, channel->channelContext);
-
-    /* The size of the padding depends on the amount of data that shall be sent
-     * and is unknown at this point. Reserve space for the PaddingSize byte,
-     * the maximum amount of Padding which equals the block size of the
-     * symmetric encryption algorithm and last 1 byte for the ExtraPaddingSize
-     * field that is present if the encryption key is larger than 2048 bits.
-     * The actual padding size is later calculated by the function
-     * calculatePaddingSym(). */
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
-        /* PaddingSize and ExtraPaddingSize fields */
-        size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule.
-            encryptionAlgorithm.getLocalBlockSize(securityPolicy, channel->channelContext);
-        mc->buf_end -= 1 + ((encryptionBlockSize >> 8u) ? 1 : 0);
-
-        /* Reduce the message body size with the remainder of the operation
-         * maxEncryptedDataSize modulo EncryptionBlockSize to get a whole
-         * number of blocks to encrypt later. Also reserve one byte for
-         * padding (1 <= paddingSize <= encryptionBlockSize). */
-        size_t maxEncryptDataSize = mc->messageBuffer.length -
-            UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH -
-            UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH;
-        mc->buf_end -= (maxEncryptDataSize % encryptionBlockSize) + 1;
-    }
-#endif
-}
-
-static UA_StatusCode
-checkLimitsSym(UA_MessageContext *const messageContext, size_t *const bodyLength) {
-    /* Will this chunk surpass the capacity of the SecureChannel for the message? */
-    UA_Connection *const connection = messageContext->channel->connection;
-    if(!connection)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_Byte *buf_body_start = messageContext->messageBuffer.data + UA_SECURE_MESSAGE_HEADER_LENGTH;
-    const UA_Byte *buf_body_end = messageContext->buf_pos;
-    *bodyLength = (uintptr_t)buf_body_end - (uintptr_t)buf_body_start;
-    messageContext->messageSizeSoFar += *bodyLength;
-    messageContext->chunksSoFar++;
-
-    if(messageContext->messageSizeSoFar > connection->config.maxMessageSize &&
-       connection->config.maxMessageSize != 0)
-        return UA_STATUSCODE_BADRESPONSETOOLARGE;
-
-    if(messageContext->chunksSoFar > connection->config.maxChunkCount &&
-       connection->config.maxChunkCount != 0)
-        return UA_STATUSCODE_BADRESPONSETOOLARGE;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-encodeHeadersSym(UA_MessageContext *const messageContext, size_t totalLength) {
-    UA_SecureChannel *channel = messageContext->channel;
-    UA_Byte *header_pos = messageContext->messageBuffer.data;
-
-    UA_SecureConversationMessageHeader respHeader;
-    respHeader.secureChannelId = channel->securityToken.channelId;
-    respHeader.messageHeader.messageTypeAndChunkType = messageContext->messageType;
-    respHeader.messageHeader.messageSize = (UA_UInt32)totalLength;
-    if(messageContext->final)
-        respHeader.messageHeader.messageTypeAndChunkType += UA_CHUNKTYPE_FINAL;
-    else
-        respHeader.messageHeader.messageTypeAndChunkType += UA_CHUNKTYPE_INTERMEDIATE;
-
-    UA_StatusCode res =
-        UA_encodeBinary(&respHeader, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER],
-                        &header_pos, &messageContext->buf_end, NULL, NULL);
-
-    UA_SymmetricAlgorithmSecurityHeader symSecHeader;
-    symSecHeader.tokenId = channel->securityToken.tokenId;
-    res |= UA_encodeBinary(&symSecHeader.tokenId,
-                           &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER],
-                           &header_pos, &messageContext->buf_end, NULL, NULL);
-
-    UA_SequenceHeader seqHeader;
-    seqHeader.requestId = messageContext->requestId;
-    seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1);
-    res |= UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER],
-                           &header_pos, &messageContext->buf_end, NULL, NULL);
-
-    return res;
-}
-
-static UA_StatusCode
-sendSymmetricChunk(UA_MessageContext *messageContext) {
-    UA_SecureChannel *const channel = messageContext->channel;
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-    UA_Connection *const connection = channel->connection;
-    if(!connection)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    size_t bodyLength = 0;
-    UA_StatusCode res = checkLimitsSym(messageContext, &bodyLength);
-    if(res != UA_STATUSCODE_GOOD)
-        goto error;
-
-    /* Add padding */
-#ifdef UA_ENABLE_ENCRYPTION
-    padChunkSym(messageContext, bodyLength);
-#endif
-
-    /* The total message length */
-    size_t pre_sig_length = (uintptr_t)(messageContext->buf_pos) -
-        (uintptr_t)messageContext->messageBuffer.data;
-    size_t total_length = pre_sig_length;
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
-        total_length += securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm.
-            getLocalSignatureSize(securityPolicy, channel->channelContext);
-    /* Space for the padding and the signature have been reserved in setBufPos() */
-    UA_assert(total_length <= connection->config.sendBufferSize);
-
-    /* For giving the buffer to the network layer */
-    messageContext->messageBuffer.length = total_length;
-
-    UA_assert(res == UA_STATUSCODE_GOOD);
-    res = encodeHeadersSym(messageContext, total_length);
-    if(res != UA_STATUSCODE_GOOD)
-        goto error;
-
-#ifdef UA_ENABLE_ENCRYPTION
-    res = signChunkSym(messageContext, pre_sig_length);
-    if(res != UA_STATUSCODE_GOOD)
-        goto error;
-
-    res = encryptChunkSym(messageContext, total_length);
-    if(res != UA_STATUSCODE_GOOD)
-        goto error;
-#endif
-
-    /* Send the chunk, the buffer is freed in the network layer */
-    return connection->send(channel->connection, &messageContext->messageBuffer);
-
-error:
-    connection->releaseSendBuffer(channel->connection, &messageContext->messageBuffer);
-    return res;
-}
-
-/* Callback from the encoding layer. Send the chunk and replace the buffer. */
-static UA_StatusCode
-sendSymmetricEncodingCallback(void *data, UA_Byte **buf_pos, const UA_Byte **buf_end) {
-    /* Set buf values from encoding in the messagecontext */
-    UA_MessageContext *mc = (UA_MessageContext *)data;
-    mc->buf_pos = *buf_pos;
-    mc->buf_end = *buf_end;
-
-    /* Send out */
-    UA_StatusCode retval = sendSymmetricChunk(mc);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Set a new buffer for the next chunk */
-    UA_Connection *connection = mc->channel->connection;
-    if(!connection)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    retval = connection->getSendBuffer(connection, connection->config.sendBufferSize,
-                                       &mc->messageBuffer);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Hide bytes for header, padding and signature */
-    setBufPos(mc);
-    *buf_pos = mc->buf_pos;
-    *buf_end = mc->buf_end;
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_MessageContext_begin(UA_MessageContext *mc, UA_SecureChannel *channel,
-                        UA_UInt32 requestId, UA_MessageType messageType) {
-    UA_Connection *connection = channel->connection;
-    if(!connection)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(messageType != UA_MESSAGETYPE_MSG && messageType != UA_MESSAGETYPE_CLO)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Create the chunking info structure */
-    mc->channel = channel;
-    mc->requestId = requestId;
-    mc->chunksSoFar = 0;
-    mc->messageSizeSoFar = 0;
-    mc->final = false;
-    mc->messageBuffer = UA_BYTESTRING_NULL;
-    mc->messageType = messageType;
-
-    /* Allocate the message buffer */
-    UA_StatusCode retval =
-        connection->getSendBuffer(connection, connection->config.sendBufferSize,
-                                  &mc->messageBuffer);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Hide bytes for header, padding and signature */
-    setBufPos(mc);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_MessageContext_encode(UA_MessageContext *mc, const void *content,
-                         const UA_DataType *contentType) {
-    UA_StatusCode retval = UA_encodeBinary(content, contentType, &mc->buf_pos, &mc->buf_end,
-                                           sendSymmetricEncodingCallback, mc);
-    if(retval != UA_STATUSCODE_GOOD && mc->messageBuffer.length > 0)
-        UA_MessageContext_abort(mc);
-    return retval;
-}
-
-UA_StatusCode
-UA_MessageContext_finish(UA_MessageContext *mc) {
-    mc->final = true;
-    return sendSymmetricChunk(mc);
-}
-
-void
-UA_MessageContext_abort(UA_MessageContext *mc) {
-    UA_Connection *connection = mc->channel->connection;
-    connection->releaseSendBuffer(connection, &mc->messageBuffer);
-}
-
-UA_StatusCode
-UA_SecureChannel_sendSymmetricMessage(UA_SecureChannel *channel, UA_UInt32 requestId,
-                                      UA_MessageType messageType, void *payload,
-                                      const UA_DataType *payloadType) {
-    if(!channel || !channel->connection || !payload || !payloadType)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    if(channel->connection->state == UA_CONNECTION_CLOSED)
-        return UA_STATUSCODE_BADCONNECTIONCLOSED;
-
-    UA_MessageContext mc;
-    UA_StatusCode retval = UA_MessageContext_begin(&mc, channel, requestId, messageType);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Assert's required for clang-analyzer */
-    UA_assert(mc.buf_pos == &mc.messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]);
-    UA_assert(mc.buf_end <= &mc.messageBuffer.data[mc.messageBuffer.length]);
-
-    UA_NodeId typeId = UA_NODEID_NUMERIC(0, payloadType->binaryEncodingId);
-    retval = UA_MessageContext_encode(&mc, &typeId, &UA_TYPES[UA_TYPES_NODEID]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    retval = UA_MessageContext_encode(&mc, payload, payloadType);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    return UA_MessageContext_finish(&mc);
-}
-
-/*****************************/
-/* Assemble Complete Message */
-/*****************************/
-
-static UA_StatusCode
-addChunkPayload(UA_SecureChannel *channel, UA_UInt32 requestId,
-                UA_MessageType messageType, UA_ByteString *chunkPayload,
-                UA_Boolean final) {
-    UA_Message *latest = TAILQ_LAST(&channel->messages, UA_MessageQueue);
-    if(latest) {
-        if(latest->requestId != requestId) {
-            /* Start of a new message */
-            if(!latest->final)
-                return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-            latest = NULL;
-        } else {
-            if(latest->messageType != messageType) /* MessageType mismatch */
-                return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-            if(latest->final) /* Correct message, but already finalized */
-                return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-        }
-    }
-
-    /* Create a new message entry */
-    if(!latest) {
-        latest = (UA_Message *)UA_malloc(sizeof(UA_Message));
-        if(!latest)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        memset(latest, 0, sizeof(UA_Message));
-        latest->requestId = requestId;
-        latest->messageType = messageType;
-        SIMPLEQ_INIT(&latest->chunkPayloads);
-        TAILQ_INSERT_TAIL(&channel->messages, latest, pointers);
-    }
-
-    /* Test against the connection settings */
-    const UA_ConnectionConfig *config = &channel->connection->config;
-    UA_assert(config != NULL); /* clang-analyzer false positive */
-
-    if(config->maxChunkCount > 0 &&
-       config->maxChunkCount <= latest->chunkPayloadsSize)
-        return UA_STATUSCODE_BADRESPONSETOOLARGE;
-
-    if(config->maxMessageSize > 0 &&
-       config->maxMessageSize < latest->messageSize + chunkPayload->length)
-        return UA_STATUSCODE_BADRESPONSETOOLARGE;
-
-    /* Create a new chunk entry */
-    UA_ChunkPayload *cp = (UA_ChunkPayload *)UA_malloc(sizeof(UA_ChunkPayload));
-    if(!cp)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    cp->bytes = *chunkPayload;
-    cp->copied = false;
-
-    /* Add the chunk */
-    SIMPLEQ_INSERT_TAIL(&latest->chunkPayloads, cp, pointers);
-    latest->chunkPayloadsSize += 1;
-    latest->messageSize += chunkPayload->length;
-    latest->final = final;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-processMessage(UA_SecureChannel *channel, const UA_Message *message,
-               void *application, UA_ProcessMessageCallback callback) {
-    if(message->chunkPayloadsSize == 1) {
-        /* No need to combine chunks */
-        UA_ChunkPayload *cp = SIMPLEQ_FIRST(&message->chunkPayloads);
-        callback(application, channel, message->messageType, message->requestId, &cp->bytes);
-    } else {
-        /* Allocate memory */
-        UA_ByteString bytes;
-        bytes.data = (UA_Byte *)UA_malloc(message->messageSize);
-        if(!bytes.data) {
-            UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL,
-                         "Could not allocate the memory to assemble the message");
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        bytes.length = message->messageSize;
-
-        /* Assemble the full message */
-        size_t curPos = 0;
-        UA_ChunkPayload *cp;
-        SIMPLEQ_FOREACH(cp, &message->chunkPayloads, pointers) {
-            memcpy(&bytes.data[curPos], cp->bytes.data, cp->bytes.length);
-            curPos += cp->bytes.length;
-        }
-
-        /* Process the message */
-        callback(application, channel, message->messageType, message->requestId, &bytes);
-        UA_ByteString_deleteMembers(&bytes);
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_SecureChannel_processCompleteMessages(UA_SecureChannel *channel, void *application,
-                                         UA_ProcessMessageCallback callback) {
-    UA_Message *message, *tmp_message;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    TAILQ_FOREACH_SAFE(message, &channel->messages, pointers, tmp_message) {
-        /* Stop at the first incomplete message */
-        if(!message->final)
-            break;
-
-        /* Has the channel been closed (during the last message)? */
-        if(channel->state == UA_SECURECHANNELSTATE_CLOSED)
-            break;
-
-        /* Remove the current message before processing */
-        TAILQ_REMOVE(&channel->messages, message, pointers);
-
-        /* Process */
-        retval = processMessage(channel, message, application, callback);
-        if(retval != UA_STATUSCODE_GOOD)
-            break;
-
-        /* Clean up the message */
-        UA_ChunkPayload *payload;
-        while((payload = SIMPLEQ_FIRST(&message->chunkPayloads))) {
-            if(payload->copied)
-                UA_ByteString_deleteMembers(&payload->bytes);
-            SIMPLEQ_REMOVE_HEAD(&message->chunkPayloads, pointers);
-            UA_free(payload);
-        }
-        UA_free(message);
-    }
-    return retval;
-}
-
-/****************************/
-/* Process a received Chunk */
-/****************************/
-
-static UA_StatusCode
-decryptChunk(const UA_SecureChannel *const channel,
-             const UA_SecurityPolicyCryptoModule *const cryptoModule,
-             UA_MessageType const messageType, const UA_ByteString *const chunk,
-             size_t const offset, size_t *const chunkSizeAfterDecryption) {
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, "Decrypting chunk");
-
-    UA_ByteString cipherText = {chunk->length - offset, chunk->data + offset};
-    size_t sizeBeforeDecryption = cipherText.length;
-    size_t chunkSizeBeforeDecryption = *chunkSizeAfterDecryption;
-
-    /* Always decrypt opn messages if mode not none */
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT ||
-       messageType == UA_MESSAGETYPE_OPN) {
-        UA_StatusCode retval = cryptoModule->encryptionAlgorithm.
-            decrypt(channel->securityPolicy, channel->channelContext, &cipherText);
-        *chunkSizeAfterDecryption -= (sizeBeforeDecryption - cipherText.length);
-        if(retval != UA_STATUSCODE_GOOD) {
-            return retval;
-        }
-    }
-
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel,
-                         "Chunk size before and after decryption: %lu, %lu",
-                         (long unsigned int)chunkSizeBeforeDecryption,
-                         (long unsigned int)*chunkSizeAfterDecryption);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_UInt16
-decodeChunkPaddingSize(const UA_SecureChannel *const channel,
-                       const UA_SecurityPolicyCryptoModule *const cryptoModule,
-                       UA_MessageType const messageType, const UA_ByteString *const chunk,
-                       size_t const chunkSizeAfterDecryption, size_t sigsize) {
-    /* Is padding used? */
-    if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT &&
-       !(messageType == UA_MESSAGETYPE_OPN && channel->securityMode > UA_MESSAGESECURITYMODE_NONE))
-        return 0;
-
-    size_t paddingSize = chunk->data[chunkSizeAfterDecryption - sigsize - 1];
-
-    /* Extra padding size */
-    size_t keyLength = cryptoModule->encryptionAlgorithm.
-        getRemoteKeyLength(channel->securityPolicy, channel->channelContext);
-    if(keyLength > 2048) {
-        paddingSize <<= 8u;
-        paddingSize += 1;
-        paddingSize += chunk->data[chunkSizeAfterDecryption - sigsize - 2];
-    }
-
-    /* We need to add one to the padding size since the paddingSize byte itself
-     * need to be removed as well. */
-    paddingSize += 1;
-
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel,
-                         "Calculated padding size to be %lu",
-                         (long unsigned int)paddingSize);
-    return (UA_UInt16)paddingSize;
-}
-
-static UA_StatusCode
-verifyChunk(const UA_SecureChannel *const channel,
-            const UA_SecurityPolicyCryptoModule *const cryptoModule,
-            const UA_ByteString *const chunk,
-            size_t const chunkSizeAfterDecryption, size_t sigsize) {
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel,
-                         "Verifying chunk signature");
-
-    /* Verify the signature */
-    const UA_ByteString chunkDataToVerify = {chunkSizeAfterDecryption - sigsize, chunk->data};
-    const UA_ByteString signature = {sigsize, chunk->data + chunkSizeAfterDecryption - sigsize};
-    UA_StatusCode retval = cryptoModule->signatureAlgorithm.
-        verify(channel->securityPolicy, channel->channelContext, &chunkDataToVerify, &signature);
-#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-    retval |= decrypt_verifySignatureFailure;
-#endif
-
-    return retval;
-}
-
-/* Sets the payload to a pointer inside the chunk buffer. Returns the requestId
- * and the sequenceNumber */
-static UA_StatusCode
-decryptAndVerifyChunk(const UA_SecureChannel *channel,
-                      const UA_SecurityPolicyCryptoModule *cryptoModule,
-                      UA_MessageType messageType, const UA_ByteString *chunk,
-                      size_t offset, UA_UInt32 *requestId,
-                      UA_UInt32 *sequenceNumber, UA_ByteString *payload) {
-    size_t chunkSizeAfterDecryption = chunk->length;
-    UA_StatusCode retval = decryptChunk(channel, cryptoModule, messageType,
-                                        chunk, offset, &chunkSizeAfterDecryption);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Verify the chunk signature */
-    size_t sigsize = 0;
-    size_t paddingSize = 0;
-    const UA_SecurityPolicy *securityPolicy = channel->securityPolicy;
-    if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-       channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT ||
-       messageType == UA_MESSAGETYPE_OPN) {
-        sigsize = cryptoModule->signatureAlgorithm.
-            getRemoteSignatureSize(securityPolicy, channel->channelContext);
-        paddingSize = decodeChunkPaddingSize(channel, cryptoModule, messageType, chunk,
-                                             chunkSizeAfterDecryption, sigsize);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        if(offset + paddingSize + sigsize >= chunkSizeAfterDecryption)
-            return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-        retval = verifyChunk(channel, cryptoModule, chunk, chunkSizeAfterDecryption, sigsize);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-    }
-
-    /* Decode the sequence header */
-    UA_SequenceHeader sequenceHeader;
-    retval = UA_SequenceHeader_decodeBinary(chunk, &offset, &sequenceHeader);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    if(offset + paddingSize + sigsize >= chunk->length)
-        return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-
-    *requestId = sequenceHeader.requestId;
-    *sequenceNumber = sequenceHeader.sequenceNumber;
-    payload->data = chunk->data + offset;
-    payload->length = chunkSizeAfterDecryption - offset - sigsize - paddingSize;
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel,
-                         "Decrypted and verified chunk with request id %u and "
-                         "sequence number %u", *requestId, *sequenceNumber);
-    return UA_STATUSCODE_GOOD;
-}
-
-typedef UA_StatusCode
-(*UA_SequenceNumberCallback)(UA_SecureChannel *channel, UA_UInt32 sequenceNumber);
-
-static UA_StatusCode
-processSequenceNumberAsym(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) {
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel,
-                         "Sequence Number processed: %i", sequenceNumber);
-    channel->receiveSequenceNumber = sequenceNumber;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-processSequenceNumberSym(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) {
-    /* Failure mode hook for unit tests */
-#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-    if(processSym_seqNumberFailure != UA_STATUSCODE_GOOD)
-        return processSym_seqNumberFailure;
-#endif
-
-    UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel,
-                         "Sequence Number processed: %i", sequenceNumber);
-    /* Does the sequence number match? */
-    if(sequenceNumber != channel->receiveSequenceNumber + 1) {
-        /* FIXME: Remove magic numbers :( */
-        if(channel->receiveSequenceNumber + 1 > 4294966271 && sequenceNumber < 1024)
-            channel->receiveSequenceNumber = sequenceNumber - 1; /* Roll over */
-        else
-            return UA_STATUSCODE_BADSECURITYCHECKSFAILED;
-    }
-    ++channel->receiveSequenceNumber;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-checkAsymHeader(UA_SecureChannel *const channel,
-                UA_AsymmetricAlgorithmSecurityHeader *const asymHeader) {
-    const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
-
-    if(!UA_ByteString_equal(&securityPolicy->policyUri,
-                            &asymHeader->securityPolicyUri)) {
-        return UA_STATUSCODE_BADSECURITYPOLICYREJECTED;
-    }
-
-    // TODO: Verify certificate using certificate plugin. This will come with a new PR
-    /* Something like this
-    retval = certificateManager->verify(certificateStore??, &asymHeader->senderCertificate);
-    if(retval != UA_STATUSCODE_GOOD)
-    return retval;
-    */
-    UA_StatusCode retval = securityPolicy->asymmetricModule.
-        compareCertificateThumbprint(securityPolicy,
-                                     &asymHeader->receiverCertificateThumbprint);
-    if(retval != UA_STATUSCODE_GOOD) {
-        return retval;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-checkPreviousToken(UA_SecureChannel *const channel, const UA_UInt32 tokenId) {
-    if(tokenId != channel->previousSecurityToken.tokenId)
-        return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN;
-
-    UA_DateTime timeout = channel->previousSecurityToken.createdAt +
-        (UA_DateTime)((UA_Double)channel->previousSecurityToken.revisedLifetime *
-                      (UA_Double)UA_DATETIME_MSEC * 1.25);
-
-    if(timeout < UA_DateTime_nowMonotonic())
-        return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-checkSymHeader(UA_SecureChannel *const channel,
-               const UA_UInt32 tokenId, UA_Boolean allowPreviousToken) {
-
-    /* If the message uses the currently active token, check if it is still valid */
-    if(tokenId == channel->securityToken.tokenId) {
-        if(channel->state == UA_SECURECHANNELSTATE_OPEN &&
-           (channel->securityToken.createdAt +
-            (channel->securityToken.revisedLifetime * UA_DATETIME_MSEC))
-           < UA_DateTime_nowMonotonic()) {
-            UA_SecureChannel_close(channel);
-            return UA_STATUSCODE_BADSECURECHANNELCLOSED;
-        }
-    }
-
-    /* If the message uses a different token, check if it is the next token. */
-    if(tokenId != channel->securityToken.tokenId) {
-        /* If it isn't the next token, we might be dealing with a message, that
-         * still uses the old token, so check if the old one is still valid.*/
-        if(tokenId != channel->nextSecurityToken.tokenId) {
-            if(allowPreviousToken)
-                return checkPreviousToken(channel, tokenId);
-
-            return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN;
-        }
-        /* If the token is indeed the next token, revolve the tokens */
-        UA_StatusCode retval = UA_SecureChannel_revolveTokens(channel);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        /* If the message now uses the currently active token also generate
-         * new remote keys to correctly decrypt. */
-        if(channel->securityToken.tokenId == tokenId) {
-            retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy);
-            UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken);
-            return retval;
-        }
-    }
-
-    /* It is possible that the sent messages already use the new token, but
-     * the received messages still use the old token. If we receive a message
-     * with the new token, we will need to generate the keys and discard the
-     * old token now*/
-    if(channel->previousSecurityToken.tokenId != 0) {
-        UA_StatusCode retval =
-            UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy);
-        UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken);
-        return retval;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-putPayload(UA_SecureChannel *const channel, UA_UInt32 const requestId,
-           UA_MessageType const messageType, UA_ChunkType const chunkType,
-           UA_ByteString *chunkPayload) {
-    switch(chunkType) {
-    case UA_CHUNKTYPE_INTERMEDIATE:
-    case UA_CHUNKTYPE_FINAL:
-        return addChunkPayload(channel, requestId, messageType,
-                               chunkPayload, chunkType == UA_CHUNKTYPE_FINAL);
-    case UA_CHUNKTYPE_ABORT:
-        deleteLatestMessage(channel, requestId);
-        return UA_STATUSCODE_GOOD;
-    default:
-        return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-    }
-}
-
-/* The chunk body begins after the SecureConversationMessageHeader */
-static UA_StatusCode
-decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk,
-                UA_Boolean allowPreviousToken) {
-    /* Decode the MessageHeader */
-    size_t offset = 0;
-    UA_SecureConversationMessageHeader messageHeader;
-    UA_StatusCode retval =
-        UA_SecureConversationMessageHeader_decodeBinary(chunk, &offset, &messageHeader);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
-    /* The wrong ChannelId. Non-opened channels have the id zero. */
-    if(messageHeader.secureChannelId != channel->securityToken.channelId &&
-       channel->state != UA_SECURECHANNELSTATE_FRESH)
-        return UA_STATUSCODE_BADSECURECHANNELIDINVALID;
-#endif
-
-    UA_MessageType messageType = (UA_MessageType)
-        (messageHeader.messageHeader.messageTypeAndChunkType & UA_BITMASK_MESSAGETYPE);
-    UA_ChunkType chunkType = (UA_ChunkType)
-        (messageHeader.messageHeader.messageTypeAndChunkType & UA_BITMASK_CHUNKTYPE);
-    UA_UInt32 requestId = 0;
-    UA_UInt32 sequenceNumber = 0;
-    UA_ByteString chunkPayload;
-    const UA_SecurityPolicyCryptoModule *cryptoModule = NULL;
-    UA_SequenceNumberCallback sequenceNumberCallback = NULL;
-
-    switch(messageType) {
-        /* ERR message (not encrypted) */
-    case UA_MESSAGETYPE_ERR:
-        if(chunkType != UA_CHUNKTYPE_FINAL)
-            return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-        chunkPayload.length = chunk->length - offset;
-        chunkPayload.data = chunk->data + offset;
-        return putPayload(channel, requestId, messageType, chunkType, &chunkPayload);
-
-        /* MSG and CLO: Symmetric encryption */
-    case UA_MESSAGETYPE_MSG:
-    case UA_MESSAGETYPE_CLO: {
-        /* Decode and check the symmetric security header (tokenId) */
-        UA_SymmetricAlgorithmSecurityHeader symmetricSecurityHeader;
-        UA_SymmetricAlgorithmSecurityHeader_init(&symmetricSecurityHeader);
-        retval = UA_SymmetricAlgorithmSecurityHeader_decodeBinary(chunk, &offset,
-                                                                  &symmetricSecurityHeader);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
-        /* Help fuzzing by always setting the correct tokenId */
-        symmetricSecurityHeader.tokenId = channel->securityToken.tokenId;
-#endif
-
-        retval = checkSymHeader(channel, symmetricSecurityHeader.tokenId, allowPreviousToken);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        cryptoModule = &channel->securityPolicy->symmetricModule.cryptoModule;
-        sequenceNumberCallback = processSequenceNumberSym;
-        break;
-    }
-
-        /* OPN: Asymmetric encryption */
-    case UA_MESSAGETYPE_OPN: {
-        /* Chunking not allowed for OPN */
-        if(chunkType != UA_CHUNKTYPE_FINAL)
-            return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-
-        /* Decode the asymmetric algorithm security header and call the callback
-         * to perform checks. */
-        UA_AsymmetricAlgorithmSecurityHeader asymHeader;
-        UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader);
-        offset = UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH;
-        retval = UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(chunk, &offset, &asymHeader);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        retval = checkAsymHeader(channel, &asymHeader);
-        UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-
-        cryptoModule = &channel->securityPolicy->asymmetricModule.cryptoModule;
-        sequenceNumberCallback = processSequenceNumberAsym;
-        break;
-    }
-
-        /* Invalid message type */
-    default:return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID;
-    }
-
-    UA_assert(cryptoModule != NULL);
-    retval = decryptAndVerifyChunk(channel, cryptoModule, messageType, chunk, offset,
-                                   &requestId, &sequenceNumber, &chunkPayload);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Check the sequence number. Skip sequence number checking for fuzzer to
-     * improve coverage */
-    if(sequenceNumberCallback == NULL)
-        return UA_STATUSCODE_BADINTERNALERROR;
-#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
-    retval = UA_STATUSCODE_GOOD;
-#else
-    retval = sequenceNumberCallback(channel, sequenceNumber);
-#endif
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    return putPayload(channel, requestId, messageType, chunkType, &chunkPayload);
-}
-
-UA_StatusCode
-UA_SecureChannel_decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk,
-                                 UA_Boolean allowPreviousToken) {
-    /* Has the SecureChannel timed out? */
-    if(channel->state == UA_SECURECHANNELSTATE_CLOSED)
-        return UA_STATUSCODE_BADSECURECHANNELCLOSED;
-
-    /* Is the SecureChannel configured? */
-    if(!channel->connection)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_StatusCode retval = decryptAddChunk(channel, chunk, allowPreviousToken);
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_SecureChannel_close(channel);
-
-    return retval;
-}
-
-UA_StatusCode
-UA_SecureChannel_persistIncompleteMessages(UA_SecureChannel *channel) {
-    UA_Message *me;
-    TAILQ_FOREACH(me, &channel->messages, pointers) {
-        UA_ChunkPayload *cp;
-        SIMPLEQ_FOREACH(cp, &me->chunkPayloads, pointers) {
-            if(cp->copied)
-                continue;
-            UA_ByteString copy;
-            UA_StatusCode retval = UA_ByteString_copy(&cp->bytes, &copy);
-            if(retval != UA_STATUSCODE_GOOD) {
-                UA_SecureChannel_close(channel);
-                return retval;
-            }
-            cp->bytes = copy;
-            cp->copied = true;
-        }
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Functionality used by both the SecureChannel and the SecurityPolicy */
-
-size_t
-UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityPolicy *securityPolicy,
-                                                              const void *channelContext,
-                                                              size_t maxEncryptionLength) {
-    if(maxEncryptionLength == 0)
-        return 0;
-
-    size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, channelContext);
-    size_t encryptedBlockSize = securityPolicy->asymmetricModule.cryptoModule.
-        encryptionAlgorithm.getRemoteBlockSize(securityPolicy, channelContext);
-    if(plainTextBlockSize == 0)
-        return 0;
-
-    size_t maxNumberOfBlocks = maxEncryptionLength / plainTextBlockSize;
-    return maxNumberOfBlocks * (encryptedBlockSize - plainTextBlockSize);
-}
diff --git a/ext/open62541/src/ua_securechannel.h b/ext/open62541/src/ua_securechannel.h
deleted file mode 100644
index 48cc9f1..0000000
--- a/ext/open62541/src/ua_securechannel.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#ifndef UA_SECURECHANNEL_H_
-#define UA_SECURECHANNEL_H_
-
-#include <open62541/plugin/log.h>
-#include <open62541/plugin/securitypolicy.h>
-#include <open62541/transport_generated.h>
-#include <open62541/types.h>
-
-#include "open62541_queue.h"
-#include "ua_connection_internal.h"
-
-_UA_BEGIN_DECLS
-
-#define UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH 12
-#define UA_SECURE_MESSAGE_HEADER_LENGTH 24
-
-/* Thread-local variables to force failure modes during testing */
-#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
-extern UA_StatusCode decrypt_verifySignatureFailure;
-extern UA_StatusCode sendAsym_sendFailure;
-extern UA_StatusCode processSym_seqNumberFailure;
-#endif
-
-/* The Session implementation differs between client and server. Still, it is
- * expected that the Session structure begins with the SessionHeader. This is
- * the interface that will be used by the SecureChannel. The lifecycle of
- * Sessions is independent of the underlying SecureChannel. But every Session
- * can be attached to only one SecureChannel. */
-typedef struct UA_SessionHeader {
-    LIST_ENTRY(UA_SessionHeader) pointers;
-    UA_NodeId authenticationToken;
-    UA_SecureChannel *channel; /* The pointer back to the SecureChannel in the session. */
-} UA_SessionHeader;
-
-/* For chunked requests */
-typedef struct UA_ChunkPayload {
-    SIMPLEQ_ENTRY(UA_ChunkPayload) pointers;
-    UA_ByteString bytes;
-    UA_Boolean copied; /* Do the bytes point to a buffer from the network or was
-                          memory allocated for the chunk separately */
-} UA_ChunkPayload;
-
-/* Receieved messages. Process them only in order. The Chunk payload has all
- * headers and the padding stripped out. The payload begins at the
- * ExtensionObject prefix.*/
-typedef struct UA_Message {
-    TAILQ_ENTRY(UA_Message) pointers;
-    UA_UInt32 requestId;
-    UA_MessageType messageType;
-    SIMPLEQ_HEAD(pp, UA_ChunkPayload) chunkPayloads;
-    size_t chunkPayloadsSize; /* No of chunks received so far */
-    size_t messageSize; /* Total length of the chunks received so far */
-    UA_Boolean final; /* All chunks for the message have been received */
-} UA_Message;
-
-typedef enum {
-    UA_SECURECHANNELSTATE_FRESH,
-    UA_SECURECHANNELSTATE_OPEN,
-    UA_SECURECHANNELSTATE_CLOSED
-} UA_SecureChannelState;
-
-typedef TAILQ_HEAD(UA_MessageQueue, UA_Message) UA_MessageQueue;
-
-struct UA_SecureChannel {
-    UA_SecureChannelState   state;
-    UA_MessageSecurityMode  securityMode;
-    /* We use three tokens because when switching tokens the client is allowed to accept
-     * messages with the old token for up to 25% of the lifetime after the token would have timed out.
-     * For messages that are sent, the new token is already used, which is contained in the securityToken
-     * variable. The nextSecurityToken variable holds a newly issued token, that will be automatically
-     * revolved into the securityToken variable. This could be done with two variables, but would require
-     * greater changes to the current code. This could be done in the future after the client and networking
-     * structure has been reworked, which would make this easier to implement. */
-    UA_ChannelSecurityToken securityToken; /* the channelId is contained in the securityToken */
-    UA_ChannelSecurityToken nextSecurityToken;
-    UA_ChannelSecurityToken previousSecurityToken;
-
-    /* The endpoint and context of the channel */
-    const UA_SecurityPolicy *securityPolicy;
-    void *channelContext; /* For interaction with the security policy */
-    UA_Connection *connection;
-
-    /* Asymmetric encryption info */
-    UA_ByteString remoteCertificate;
-    UA_Byte remoteCertificateThumbprint[20]; /* The thumbprint of the remote certificate */
-
-    /* Symmetric encryption info */
-    UA_ByteString remoteNonce;
-    UA_ByteString localNonce;
-
-    UA_UInt32 receiveSequenceNumber;
-    UA_UInt32 sendSequenceNumber;
-
-    LIST_HEAD(, UA_SessionHeader) sessions;
-    UA_MessageQueue messages;
-};
-
-void UA_SecureChannel_init(UA_SecureChannel *channel);
-
-void UA_SecureChannel_close(UA_SecureChannel *channel);
-
-UA_StatusCode
-UA_SecureChannel_setSecurityPolicy(UA_SecureChannel *channel,
-                                   const UA_SecurityPolicy *securityPolicy,
-                                   const UA_ByteString *remoteCertificate);
-
-/* Remove (partially) received unprocessed messages */
-void UA_SecureChannel_deleteMessages(UA_SecureChannel *channel);
-
-void UA_SecureChannel_deleteMembers(UA_SecureChannel *channel);
-
-/* Generates new keys and sets them in the channel context */
-UA_StatusCode
-UA_SecureChannel_generateNewKeys(UA_SecureChannel* channel);
-
-/* Wrapper function for generating a local nonce for the supplied channel. Uses
- * the random generator of the channels security policy to allocate and generate
- * a nonce with the specified length. */
-UA_StatusCode
-UA_SecureChannel_generateLocalNonce(UA_SecureChannel *channel);
-
-UA_SessionHeader *
-UA_SecureChannel_getSession(UA_SecureChannel *channel,
-                            const UA_NodeId *authenticationToken);
-
-UA_StatusCode
-UA_SecureChannel_revolveTokens(UA_SecureChannel *channel);
-
-/**
- * Sending Messages
- * ---------------- */
-
-UA_StatusCode
-UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, UA_UInt32 requestId,
-                                          const void *content, const UA_DataType *contentType);
-
-UA_StatusCode
-UA_SecureChannel_sendSymmetricMessage(UA_SecureChannel *channel, UA_UInt32 requestId,
-                                      UA_MessageType messageType, void *payload,
-                                      const UA_DataType *payloadType);
-
-/* The MessageContext is forwarded into the encoding layer so that we can send
- * chunks before continuing to encode. This lets us reuse a fixed chunk-sized
- * messages buffer. */
-typedef struct {
-    UA_SecureChannel *channel;
-    UA_UInt32 requestId;
-    UA_UInt32 messageType;
-
-    UA_UInt16 chunksSoFar;
-    size_t messageSizeSoFar;
-
-    UA_ByteString messageBuffer;
-    UA_Byte *buf_pos;
-    const UA_Byte *buf_end;
-
-    UA_Boolean final;
-} UA_MessageContext;
-
-/* Start the context of a new symmetric message. */
-UA_StatusCode
-UA_MessageContext_begin(UA_MessageContext *mc, UA_SecureChannel *channel,
-                        UA_UInt32 requestId, UA_MessageType messageType);
-
-/* Encode the content and send out full chunks. If the return code is good, then
- * the ChunkInfo contains encoded content that has not been sent. If the return
- * code is bad, then the ChunkInfo has been cleaned up internally. */
-UA_StatusCode
-UA_MessageContext_encode(UA_MessageContext *mc, const void *content,
-                         const UA_DataType *contentType);
-
-/* Sends a symmetric message already encoded in the context. The context is
- * cleaned up, also in case of errors. */
-UA_StatusCode
-UA_MessageContext_finish(UA_MessageContext *mc);
-
-/* To be used when a failure occures when a MessageContext is open. Note that
- * the _encode and _finish methods will clean up internally. _abort can be run
- * on a MessageContext that has already been cleaned up before. */
-void
-UA_MessageContext_abort(UA_MessageContext *mc);
-
-/**
- * Receive Message
- * --------------- */
-
-/* Decrypt a chunk and add it to the message. Create a new message if necessary. */
-UA_StatusCode
-UA_SecureChannel_decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk,
-                                 UA_Boolean allowPreviousToken);
-
-/* The network buffer is about to be cleared. Copy all chunks that point into
- * the network buffer into dedicated memory. */
-UA_StatusCode
-UA_SecureChannel_persistIncompleteMessages(UA_SecureChannel *channel);
-
-typedef void
-(UA_ProcessMessageCallback)(void *application, UA_SecureChannel *channel,
-                            UA_MessageType messageType, UA_UInt32 requestId,
-                            const UA_ByteString *message);
-
-/* Process received complete messages in-order. The callback function is called
- * with the complete message body if the message is complete. The message is
- * removed afterwards.
- *
- * Symmetric callback is ERR, MSG, CLO only
- * Asymmetric callback is OPN only
- *
- * @param channel the channel the chunks were received on.
- * @param application data pointer to application specific data that gets passed
- *                    on to the callback function.
- * @param callback the callback function that gets called with the complete
- *                 message body, once a final chunk is processed.
- * @return Returns if an irrecoverable error occured. Maybe close the channel. */
-UA_StatusCode
-UA_SecureChannel_processCompleteMessages(UA_SecureChannel *channel, void *application,
-                                         UA_ProcessMessageCallback callback);
-
-/**
- * Log Helper
- * ----------
- * C99 requires at least one element for the variadic argument. If the log
- * statement has no variable arguments, supply an additional NULL. It will be
- * ignored by printf.
- *
- * We have to jump through some hoops to enable the use of format strings
- * without arguments since (pedantic) C99 does not allow variadic macros with
- * zero arguments. So we add a dummy argument that is not printed (%.0s is
- * string of length zero). */
-
-#define UA_LOG_TRACE_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...)              \
-    UA_LOG_TRACE(LOGGER, UA_LOGCATEGORY_SECURECHANNEL,                        \
-                 "Connection %i | SecureChannel %i | " MSG "%.0s",            \
-                 ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \
-                 (CHANNEL)->securityToken.channelId, __VA_ARGS__)
-
-#define UA_LOG_TRACE_CHANNEL(LOGGER, CHANNEL, ...)        \
-    UA_MACRO_EXPAND(UA_LOG_TRACE_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, ""))
-
-#define UA_LOG_DEBUG_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...)              \
-    UA_LOG_DEBUG(LOGGER, UA_LOGCATEGORY_SECURECHANNEL,                        \
-                 "Connection %i | SecureChannel %i | " MSG "%.0s",            \
-                 ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \
-                 (CHANNEL)->securityToken.channelId, __VA_ARGS__)
-
-#define UA_LOG_DEBUG_CHANNEL(LOGGER, CHANNEL, ...)        \
-    UA_MACRO_EXPAND(UA_LOG_DEBUG_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, ""))
-
-#define UA_LOG_INFO_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...)               \
-    UA_LOG_INFO(LOGGER, UA_LOGCATEGORY_SECURECHANNEL,                         \
-                 "Connection %i | SecureChannel %i | " MSG "%.0s",            \
-                 ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \
-                 (CHANNEL)->securityToken.channelId, __VA_ARGS__)
-
-#define UA_LOG_INFO_CHANNEL(LOGGER, CHANNEL, ...)        \
-    UA_MACRO_EXPAND(UA_LOG_INFO_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, ""))
-
-#define UA_LOG_WARNING_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...)            \
-    UA_LOG_WARNING(LOGGER, UA_LOGCATEGORY_SECURECHANNEL,                      \
-                 "Connection %i | SecureChannel %i | " MSG "%.0s",            \
-                 ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \
-                 (CHANNEL)->securityToken.channelId, __VA_ARGS__)
-
-#define UA_LOG_WARNING_CHANNEL(LOGGER, CHANNEL, ...)        \
-    UA_MACRO_EXPAND(UA_LOG_WARNING_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, ""))
-
-#define UA_LOG_ERROR_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...)              \
-    UA_LOG_ERROR(LOGGER, UA_LOGCATEGORY_SECURECHANNEL,                        \
-                 "Connection %i | SecureChannel %i | " MSG "%.0s",            \
-                 ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \
-                 (CHANNEL)->securityToken.channelId, __VA_ARGS__)
-
-#define UA_LOG_ERROR_CHANNEL(LOGGER, CHANNEL, ...)        \
-    UA_MACRO_EXPAND(UA_LOG_ERROR_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, ""))
-
-#define UA_LOG_FATAL_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...)              \
-    UA_LOG_FATAL(LOGGER, UA_LOGCATEGORY_SECURECHANNEL,                        \
-                 "Connection %i | SecureChannel %i | " MSG "%.0s",            \
-                 ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \
-                 (CHANNEL)->securityToken.channelId, __VA_ARGS__)
-
-#define UA_LOG_FATAL_CHANNEL(LOGGER, CHANNEL, ...)        \
-    UA_MACRO_EXPAND(UA_LOG_FATAL_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, ""))
-
-_UA_END_DECLS
-
-#endif /* UA_SECURECHANNEL_H_ */
diff --git a/ext/open62541/src/ua_timer.c b/ext/open62541/src/ua_timer.c
deleted file mode 100644
index 2956ddc..0000000
--- a/ext/open62541/src/ua_timer.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include "ua_util_internal.h"
-#include "ua_timer.h"
-
-struct UA_TimerEntry {
-    ZIP_ENTRY(UA_TimerEntry) zipfields;
-    UA_DateTime nextTime;                    /* The next time when the callback
-                                              * is to be executed */
-    UA_UInt64 interval;                      /* Interval in 100ns resolution */
-    UA_Boolean repeated;                     /* Repeated callback? */
-
-    UA_ApplicationCallback callback;
-    void *application;
-    void *data;
-
-    ZIP_ENTRY(UA_TimerEntry) idZipfields;
-    UA_UInt64 id;                            /* Id of the entry */
-};
-
-/* There may be several entries with the same nextTime in the tree. We give them
- * an absolute order by considering the memory address to break ties. Because of
- * this, the nextTime property cannot be used to lookup specific entries. */
-static enum ZIP_CMP
-cmpDateTime(const UA_DateTime *a, const UA_DateTime *b) {
-    if(*a < *b)
-        return ZIP_CMP_LESS;
-    if(*a > *b)
-        return ZIP_CMP_MORE;
-    if(a == b)
-        return ZIP_CMP_EQ;
-    if(a < b)
-        return ZIP_CMP_LESS;
-    return ZIP_CMP_MORE;
-}
-
-ZIP_PROTTYPE(UA_TimerZip, UA_TimerEntry, UA_DateTime)
-ZIP_IMPL(UA_TimerZip, UA_TimerEntry, zipfields, UA_DateTime, nextTime, cmpDateTime)
-
-/* The identifiers of entries are unique */
-static enum ZIP_CMP
-cmpId(const UA_UInt64 *a, const UA_UInt64 *b) {
-    if(*a < *b)
-        return ZIP_CMP_LESS;
-    if(*a == *b)
-        return ZIP_CMP_EQ;
-    return ZIP_CMP_MORE;
-}
-
-ZIP_PROTTYPE(UA_TimerIdZip, UA_TimerEntry, UA_UInt64)
-ZIP_IMPL(UA_TimerIdZip, UA_TimerEntry, idZipfields, UA_UInt64, id, cmpId)
-
-void
-UA_Timer_init(UA_Timer *t) {
-    memset(t, 0, sizeof(UA_Timer));
-}
-
-static UA_StatusCode
-addCallback(UA_Timer *t, UA_ApplicationCallback callback, void *application, void *data,
-            UA_DateTime nextTime, UA_UInt64 interval, UA_Boolean repeated,
-            UA_UInt64 *callbackId) {
-    /* A callback method needs to be present */
-    if(!callback)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Allocate the repeated callback structure */
-    UA_TimerEntry *te = (UA_TimerEntry*)UA_malloc(sizeof(UA_TimerEntry));
-    if(!te)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Set the repeated callback */
-    te->interval = (UA_UInt64)interval;
-    te->id = ++t->idCounter;
-    te->callback = callback;
-    te->application = application;
-    te->data = data;
-    te->repeated = repeated;
-    te->nextTime = nextTime;
-
-    /* Set the output identifier */
-    if(callbackId)
-        *callbackId = te->id;
-
-    ZIP_INSERT(UA_TimerZip, &t->root, te, ZIP_FFS32(UA_UInt32_random()));
-    ZIP_INSERT(UA_TimerIdZip, &t->idRoot, te, ZIP_RANK(te, zipfields));
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback,
-                          void *application, void *data, UA_DateTime date,
-                          UA_UInt64 *callbackId) {
-    return addCallback(t, callback, application, data, date, 0, false, callbackId);
-}
-
-/* Adding repeated callbacks: Add an entry with the "nextTime" timestamp in the
- * future. This will be picked up in the next iteration and inserted at the
- * correct place. So that the next execution takes place ät "nextTime". */
-UA_StatusCode
-UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback,
-                             void *application, void *data, UA_Double interval_ms,
-                             UA_UInt64 *callbackId) {
-    /* The interval needs to be positive */
-    if(interval_ms <= 0.0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    UA_UInt64 interval = (UA_UInt64)(interval_ms * UA_DATETIME_MSEC);
-    UA_DateTime nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)interval;
-    return addCallback(t, callback, application, data, nextTime,
-                       interval, true, callbackId);
-}
-
-UA_StatusCode
-UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId,
-                                        UA_Double interval_ms) {
-    /* The interval needs to be positive */
-    if(interval_ms <= 0.0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Remove from the sorted list */
-    UA_TimerEntry *te = ZIP_FIND(UA_TimerIdZip, &t->idRoot, &callbackId);
-    if(!te)
-        return UA_STATUSCODE_BADNOTFOUND;
-
-    /* Set the repeated callback */
-    ZIP_REMOVE(UA_TimerZip, &t->root, te);
-    te->interval = (UA_UInt64)(interval_ms * UA_DATETIME_MSEC); /* in 100ns resolution */
-    te->nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)te->interval;
-    ZIP_INSERT(UA_TimerZip, &t->root, te, ZIP_RANK(te, zipfields));
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId) {
-    UA_TimerEntry *te = ZIP_FIND(UA_TimerIdZip, &t->idRoot, &callbackId);
-    if(!te)
-        return;
-
-    ZIP_REMOVE(UA_TimerZip, &t->root, te);
-    ZIP_REMOVE(UA_TimerIdZip, &t->idRoot, te);
-    UA_free(te);
-}
-
-UA_DateTime
-UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic,
-                 UA_TimerExecutionCallback executionCallback,
-                 void *executionApplication) {
-    UA_TimerEntry *first;
-    while((first = ZIP_MIN(UA_TimerZip, &t->root)) &&
-          first->nextTime <= nowMonotonic) {
-        ZIP_REMOVE(UA_TimerZip, &t->root, first);
-
-        /* Reinsert / remove to their new position first. Because the callback
-         * can interact with the zip tree and expects the same entries in the
-         * root and idRoot trees. */
-
-        if(!first->repeated) {
-            ZIP_REMOVE(UA_TimerIdZip, &t->idRoot, first);
-            executionCallback(executionApplication, first->callback,
-                              first->application, first->data);
-            UA_free(first);
-            continue;
-        }
-
-        /* Set the time for the next execution. Prevent an infinite loop by
-         * forcing the next processing into the next iteration. */
-        first->nextTime += (UA_Int64)first->interval;
-        if(first->nextTime < nowMonotonic)
-            first->nextTime = nowMonotonic + 1;
-        ZIP_INSERT(UA_TimerZip, &t->root, first, ZIP_RANK(first, zipfields));
-        executionCallback(executionApplication, first->callback,
-                          first->application, first->data);
-    }
-
-    /* Return the timestamp of the earliest next callback */
-    first = ZIP_MIN(UA_TimerZip, &t->root);
-    return (first) ? first->nextTime : UA_INT64_MAX;
-}
-
-static void
-freeEntry(UA_TimerEntry *te, void *data) {
-    UA_free(te);
-}
-
-void
-UA_Timer_deleteMembers(UA_Timer *t) {
-    /* Free all nodes and reset the root */
-    ZIP_ITER(UA_TimerZip, &t->root, freeEntry, NULL);
-    ZIP_INIT(&t->root);
-}
diff --git a/ext/open62541/src/ua_timer.h b/ext/open62541/src/ua_timer.h
deleted file mode 100644
index 2204051..0000000
--- a/ext/open62541/src/ua_timer.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_TIMER_H_
-#define UA_TIMER_H_
-
-#include "ua_util_internal.h"
-#include "ua_workqueue.h"
-#include "ziptree.h"
-
-_UA_BEGIN_DECLS
-
-struct UA_TimerEntry;
-typedef struct UA_TimerEntry UA_TimerEntry;
-
-ZIP_HEAD(UA_TimerZip, UA_TimerEntry);
-typedef struct UA_TimerZip UA_TimerZip;
-
-ZIP_HEAD(UA_TimerIdZip, UA_TimerEntry);
-typedef struct UA_TimerIdZip UA_TimerIdZip;
-
-/* Only for a single thread. Protect by a mutex if required. */
-typedef struct {
-    UA_TimerZip root; /* The root of the time-sorted zip tree */
-    UA_TimerIdZip idRoot; /* The root of the id-sorted zip tree */
-    UA_UInt64 idCounter;
-} UA_Timer;
-
-void UA_Timer_init(UA_Timer *t);
-
-UA_StatusCode
-UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback,
-                          void *application, void *data, UA_DateTime date,
-                          UA_UInt64 *callbackId);
-
-UA_StatusCode
-UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback,
-                             void *application, void *data, UA_Double interval_ms,
-                             UA_UInt64 *callbackId);
-
-/* Change the callback interval. If this is called from within the callback. The
- * adjustment is made during the next _process call. */
-UA_StatusCode
-UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId,
-                                        UA_Double interval_ms);
-
-void
-UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId);
-
-/* Process (dispatch) the repeated callbacks that have timed out. Returns the
- * timestamp of the next scheduled repeated callback. Not thread-safe.
- * Application is a pointer to the client / server environment for the callback.
- * Dispatched is set to true when at least one callback was run / dispatched. */
-typedef void
-(*UA_TimerExecutionCallback)(void *executionApplication, UA_ApplicationCallback cb,
-                             void *callbackApplication, void *data);
-
-UA_DateTime
-UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic,
-                 UA_TimerExecutionCallback executionCallback,
-                 void *executionApplication);
-
-void UA_Timer_deleteMembers(UA_Timer *t);
-
-_UA_END_DECLS
-
-#endif /* UA_TIMER_H_ */
diff --git a/ext/open62541/src/ua_types.c b/ext/open62541/src/ua_types.c
deleted file mode 100644
index 08e32cd..0000000
--- a/ext/open62541/src/ua_types.c
+++ /dev/null
@@ -1,1264 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2016-2017 (c) Florian Palm
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2014 (c) Leon Urbas
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015 (c) Markus Graube
- *    Copyright 2015 (c) Reza Ebrahimi
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- */
-
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_util_internal.h"
-
-#include "libc_time.h"
-#include "pcg_basic.h"
-
-/* Datatype Handling
- * -----------------
- * This file contains handling functions for the builtin types and functions
- * handling of structured types and arrays. These need type descriptions in a
- * UA_DataType structure. The UA_DataType structures as well as all non-builtin
- * datatypes are autogenerated. */
-
-/* Global definition of NULL type instances. These are always zeroed out, as
- * mandated by the C/C++ standard for global values with no initializer. */
-const UA_String UA_STRING_NULL = {0, NULL};
-const UA_ByteString UA_BYTESTRING_NULL = {0, NULL};
-const UA_Guid UA_GUID_NULL = {0, 0, 0, {0,0,0,0,0,0,0,0}};
-const UA_NodeId UA_NODEID_NULL = {0, UA_NODEIDTYPE_NUMERIC, {0}};
-const UA_ExpandedNodeId UA_EXPANDEDNODEID_NULL = {{0, UA_NODEIDTYPE_NUMERIC, {0}}, {0, NULL}, 0};
-
-typedef UA_StatusCode (*UA_copySignature)(const void *src, void *dst,
-                                          const UA_DataType *type);
-typedef void (*UA_clearSignature)(void *p, const UA_DataType *type);
-
-extern const UA_copySignature copyJumpTable[UA_DATATYPEKINDS];
-extern const UA_clearSignature clearJumpTable[UA_DATATYPEKINDS];
-
-/* TODO: The standard-defined types are ordered. See if binary search is
- * more efficient. */
-const UA_DataType *
-UA_findDataType(const UA_NodeId *typeId) {
-    if(typeId->identifierType != UA_NODEIDTYPE_NUMERIC)
-        return NULL;
-
-    /* Always look in built-in types first
-     * (may contain data types from all namespaces) */
-    for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
-        if(UA_TYPES[i].typeId.identifier.numeric == typeId->identifier.numeric
-           && UA_TYPES[i].typeId.namespaceIndex == typeId->namespaceIndex)
-            return &UA_TYPES[i];
-    }
-
-    /* TODO When other namespace look in custom types, too, requires access to custom types array here! */
-    /*if(typeId->namespaceIndex != 0) {
-        size_t customTypesArraySize;
-        const UA_DataType *customTypesArray;
-        UA_getCustomTypes(&customTypesArraySize, &customTypesArray);
-        for(size_t i = 0; i < customTypesArraySize; ++i) {
-            if(customTypesArray[i].typeId.identifier.numeric == typeId->identifier.numeric
-               && customTypesArray[i].typeId.namespaceIndex == typeId->namespaceIndex)
-                return &customTypesArray[i];
-        }
-    }*/
-
-    return NULL;
-}
-
-/***************************/
-/* Random Number Generator */
-/***************************/
-
-//TODO is this safe for multithreading?
-static pcg32_random_t UA_rng = PCG32_INITIALIZER;
-
-void
-UA_random_seed(u64 seed) {
-    pcg32_srandom_r(&UA_rng, seed, (u64)UA_DateTime_now());
-}
-
-u32
-UA_UInt32_random(void) {
-    return (u32)pcg32_random_r(&UA_rng);
-}
-
-/*****************/
-/* Builtin Types */
-/*****************/
-
-UA_String
-UA_String_fromChars(const char *src) {
-    UA_String s; s.length = 0; s.data = NULL;
-    if(!src)
-        return s;
-    s.length = strlen(src);
-    if(s.length > 0) {
-        s.data = (u8*)UA_malloc(s.length);
-        if(!s.data) {
-            s.length = 0;
-            return s;
-        }
-        memcpy(s.data, src, s.length);
-    } else {
-        s.data = (u8*)UA_EMPTY_ARRAY_SENTINEL;
-    }
-    return s;
-}
-
-UA_Boolean
-UA_String_equal(const UA_String *s1, const UA_String *s2) {
-    if(s1->length != s2->length)
-        return false;
-    if(s1->length == 0)
-        return true;
-    i32 is = memcmp((char const*)s1->data,
-                    (char const*)s2->data, s1->length);
-    return (is == 0) ? true : false;
-}
-
-static UA_StatusCode
-String_copy(UA_String const *src, UA_String *dst, const UA_DataType *_) {
-    UA_StatusCode retval = UA_Array_copy(src->data, src->length, (void**)&dst->data,
-                                         &UA_TYPES[UA_TYPES_BYTE]);
-    if(retval == UA_STATUSCODE_GOOD)
-        dst->length = src->length;
-    return retval;
-}
-
-static void
-String_clear(UA_String *s, const UA_DataType *_) {
-    UA_Array_delete(s->data, s->length, &UA_TYPES[UA_TYPES_BYTE]);
-}
-
-/* QualifiedName */
-static UA_StatusCode
-QualifiedName_copy(const UA_QualifiedName *src, UA_QualifiedName *dst, const UA_DataType *_) {
-    dst->namespaceIndex = src->namespaceIndex;
-    return String_copy(&src->name, &dst->name, NULL);
-}
-
-static void
-QualifiedName_clear(UA_QualifiedName *p, const UA_DataType *_) {
-    String_clear(&p->name, NULL);
-}
-
-UA_Boolean
-UA_QualifiedName_equal(const UA_QualifiedName *qn1,
-                       const UA_QualifiedName *qn2) {
-    if(qn1 == NULL || qn2 == NULL)
-        return false;
-    if(qn1->namespaceIndex != qn2->namespaceIndex)
-        return false;
-    if(qn1->name.length != qn2->name.length)
-        return false;
-    return (memcmp((char const*)qn1->name.data,
-                   (char const*)qn2->name.data, qn1->name.length) == 0);
-}
-
-/* DateTime */
-UA_DateTimeStruct
-UA_DateTime_toStruct(UA_DateTime t) {
-    /* Calculating the the milli-, micro- and nanoseconds */
-    UA_DateTimeStruct dateTimeStruct;
-    dateTimeStruct.nanoSec  = (u16)((t % 10) * 100);
-    dateTimeStruct.microSec = (u16)((t % 10000) / 10);
-    dateTimeStruct.milliSec = (u16)((t % 10000000) / 10000);
-
-    /* Calculating the unix time with #include <time.h> */
-    long long secSinceUnixEpoch = (long long)
-        ((t - UA_DATETIME_UNIX_EPOCH) / UA_DATETIME_SEC);
-    struct mytm ts;
-    memset(&ts, 0, sizeof(struct mytm));
-    __secs_to_tm(secSinceUnixEpoch, &ts);
-    dateTimeStruct.sec    = (u16)ts.tm_sec;
-    dateTimeStruct.min    = (u16)ts.tm_min;
-    dateTimeStruct.hour   = (u16)ts.tm_hour;
-    dateTimeStruct.day    = (u16)ts.tm_mday;
-    dateTimeStruct.month  = (u16)(ts.tm_mon + 1);
-    dateTimeStruct.year   = (u16)(ts.tm_year + 1900);
-    return dateTimeStruct;
-}
-
-/* Guid */
-UA_Boolean
-UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2) {
-    if(memcmp(g1, g2, sizeof(UA_Guid)) == 0)
-        return true;
-    return false;
-}
-
-UA_Guid
-UA_Guid_random(void) {
-    UA_Guid result;
-    result.data1 = (u32)pcg32_random_r(&UA_rng);
-    u32 r = (u32)pcg32_random_r(&UA_rng);
-    result.data2 = (u16) r;
-    result.data3 = (u16) (r >> 16);
-    r = (u32)pcg32_random_r(&UA_rng);
-    result.data4[0] = (u8)r;
-    result.data4[1] = (u8)(r >> 4);
-    result.data4[2] = (u8)(r >> 8);
-    result.data4[3] = (u8)(r >> 12);
-    r = (u32)pcg32_random_r(&UA_rng);
-    result.data4[4] = (u8)r;
-    result.data4[5] = (u8)(r >> 4);
-    result.data4[6] = (u8)(r >> 8);
-    result.data4[7] = (u8)(r >> 12);
-    return result;
-}
-
-/* ByteString */
-UA_StatusCode
-UA_ByteString_allocBuffer(UA_ByteString *bs, size_t length) {
-    UA_ByteString_init(bs);
-    if(length == 0)
-        return UA_STATUSCODE_GOOD;
-    bs->data = (u8*)UA_malloc(length);
-    if(!bs->data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    bs->length = length;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* NodeId */
-static void
-NodeId_clear(UA_NodeId *p, const UA_DataType *_) {
-    switch(p->identifierType) {
-    case UA_NODEIDTYPE_STRING:
-    case UA_NODEIDTYPE_BYTESTRING:
-        String_clear(&p->identifier.string, NULL);
-        break;
-    default: break;
-    }
-}
-
-static UA_StatusCode
-NodeId_copy(UA_NodeId const *src, UA_NodeId *dst, const UA_DataType *_) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    switch(src->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-        *dst = *src;
-        return UA_STATUSCODE_GOOD;
-    case UA_NODEIDTYPE_STRING:
-        retval |= UA_String_copy(&src->identifier.string,
-                                 &dst->identifier.string);
-        break;
-    case UA_NODEIDTYPE_GUID:
-        retval |= UA_Guid_copy(&src->identifier.guid, &dst->identifier.guid);
-        break;
-    case UA_NODEIDTYPE_BYTESTRING:
-        retval |= UA_ByteString_copy(&src->identifier.byteString,
-                                     &dst->identifier.byteString);
-        break;
-    default:
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    dst->namespaceIndex = src->namespaceIndex;
-    dst->identifierType = src->identifierType;
-    return retval;
-}
-
-UA_Boolean
-UA_NodeId_isNull(const UA_NodeId *p) {
-    if(p->namespaceIndex != 0)
-        return false;
-    switch (p->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-        return (p->identifier.numeric == 0);
-    case UA_NODEIDTYPE_STRING:
-        return UA_String_equal(&p->identifier.string, &UA_STRING_NULL);
-    case UA_NODEIDTYPE_GUID:
-        return UA_Guid_equal(&p->identifier.guid, &UA_GUID_NULL);
-    case UA_NODEIDTYPE_BYTESTRING:
-        return UA_ByteString_equal(&p->identifier.byteString, &UA_BYTESTRING_NULL);
-    }
-    return false;
-}
-
-/* Absolute ordering for NodeIds */
-UA_Order
-UA_NodeId_order(const UA_NodeId *n1, const UA_NodeId *n2) {
-    /* Compare namespaceIndex */
-    if(n1->namespaceIndex < n2->namespaceIndex)
-        return UA_ORDER_LESS;
-    if(n1->namespaceIndex > n2->namespaceIndex)
-        return UA_ORDER_MORE;
-
-    /* Compare identifierType */
-    if(n1->identifierType < n2->identifierType)
-        return UA_ORDER_LESS;
-    if(n1->identifierType > n2->identifierType)
-        return UA_ORDER_MORE;
-
-    /* Compare the identifier */
-    switch(n1->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-        if(n1->identifier.numeric < n2->identifier.numeric)
-            return UA_ORDER_LESS;
-        if(n1->identifier.numeric > n2->identifier.numeric)
-            return UA_ORDER_MORE;
-        break;
-    case UA_NODEIDTYPE_GUID:
-        if(n1->identifier.guid.data1 < n2->identifier.guid.data1) {
-            return UA_ORDER_LESS;
-        } else if(n1->identifier.guid.data1 > n2->identifier.guid.data1) {
-            return UA_ORDER_MORE;
-        } else if(n1->identifier.guid.data2 < n2->identifier.guid.data2) {
-            return UA_ORDER_LESS;
-        } else if(n1->identifier.guid.data2 > n2->identifier.guid.data2) {
-            return UA_ORDER_MORE;
-        } else if(n1->identifier.guid.data3 < n2->identifier.guid.data3) {
-            return UA_ORDER_LESS;
-        } else if(n1->identifier.guid.data3 > n2->identifier.guid.data3) {
-            return UA_ORDER_MORE;
-        } else {
-            int cmp = memcmp(n1->identifier.guid.data4, n2->identifier.guid.data4, 8);
-
-            if(cmp < 0) return UA_ORDER_LESS;
-            if(cmp > 0) return UA_ORDER_MORE;
-
-        }
-
-        break;
-    case UA_NODEIDTYPE_STRING:
-    case UA_NODEIDTYPE_BYTESTRING: {
-        size_t minLength = UA_MIN(n1->identifier.string.length, n2->identifier.string.length);
-        int cmp = strncmp((const char*)n1->identifier.string.data,
-                          (const char*)n2->identifier.string.data,
-                          minLength);
-        if(cmp < 0)
-            return UA_ORDER_LESS;
-        if(cmp > 0)
-            return UA_ORDER_MORE;
-
-        if(n1->identifier.string.length < n2->identifier.string.length)
-            return UA_ORDER_LESS;
-        if(n1->identifier.string.length > n2->identifier.string.length)
-            return UA_ORDER_MORE;
-        break;
-    }
-    default:
-        break;
-    }
-
-    return UA_ORDER_EQ;
-}
-
-/* FNV non-cryptographic hash function. See
- * https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function */
-#define FNV_PRIME_32 16777619
-static u32
-fnv32(u32 fnv, const u8 *buf, size_t size) {
-    for(size_t i = 0; i < size; ++i) {
-        fnv = fnv ^ (buf[i]);
-        fnv = fnv * FNV_PRIME_32;
-    }
-    return fnv;
-}
-
-u32
-UA_NodeId_hash(const UA_NodeId *n) {
-    switch(n->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-    default:
-        // shift knuth multiplication to use highest 32 bits and after addition make sure we don't have an integer overflow
-        return (u32)((n->namespaceIndex + ((n->identifier.numeric * (u64)2654435761) >> (32))) & UINT32_C(4294967295)); /*  Knuth's multiplicative hashing */
-    case UA_NODEIDTYPE_STRING:
-    case UA_NODEIDTYPE_BYTESTRING:
-        return fnv32(n->namespaceIndex, n->identifier.string.data, n->identifier.string.length);
-    case UA_NODEIDTYPE_GUID:
-        return fnv32(n->namespaceIndex, (const u8*)&n->identifier.guid, sizeof(UA_Guid));
-    }
-}
-
-/* ExpandedNodeId */
-static void
-ExpandedNodeId_clear(UA_ExpandedNodeId *p, const UA_DataType *_) {
-    NodeId_clear(&p->nodeId, _);
-    String_clear(&p->namespaceUri, NULL);
-}
-
-static UA_StatusCode
-ExpandedNodeId_copy(UA_ExpandedNodeId const *src, UA_ExpandedNodeId *dst,
-                    const UA_DataType *_) {
-    UA_StatusCode retval = NodeId_copy(&src->nodeId, &dst->nodeId, NULL);
-    retval |= UA_String_copy(&src->namespaceUri, &dst->namespaceUri);
-    dst->serverIndex = src->serverIndex;
-    return retval;
-}
-
-UA_Order
-UA_ExpandedNodeId_order(const UA_ExpandedNodeId *n1,
-                        const UA_ExpandedNodeId *n2) {
-    if(n1->serverIndex > n2->serverIndex)
-        return UA_ORDER_MORE;
-    if(n1->serverIndex < n2->serverIndex)
-        return UA_ORDER_LESS;
-    if(n1->namespaceUri.length > 0) {
-        if(n1->namespaceUri.length > n2->namespaceUri.length)
-            return UA_ORDER_MORE;
-        if(n1->namespaceUri.length < n2->namespaceUri.length)
-            return UA_ORDER_LESS;
-        int cmp = strncmp((const char*)n1->namespaceUri.data,
-                          (const char*)n2->namespaceUri.data,
-                          n1->namespaceUri.length);
-        if(cmp < 0)
-            return UA_ORDER_LESS;
-        if(cmp > 0)
-            return UA_ORDER_MORE;
-    }
-    return UA_NodeId_order(&n1->nodeId, &n2->nodeId);
-}
-
-u32
-UA_ExpandedNodeId_hash(const UA_ExpandedNodeId *n) {
-    u32 h = UA_NodeId_hash(&n->nodeId);
-    h = fnv32(h, (const UA_Byte*)&n->serverIndex, 4);
-    return fnv32(h, n->namespaceUri.data, n->namespaceUri.length);
-}
-
-/* ExtensionObject */
-static void
-ExtensionObject_clear(UA_ExtensionObject *p, const UA_DataType *_) {
-    switch(p->encoding) {
-    case UA_EXTENSIONOBJECT_ENCODED_NOBODY:
-    case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING:
-    case UA_EXTENSIONOBJECT_ENCODED_XML:
-        NodeId_clear(&p->content.encoded.typeId, NULL);
-        String_clear(&p->content.encoded.body, NULL);
-        break;
-    case UA_EXTENSIONOBJECT_DECODED:
-        if(p->content.decoded.data)
-            UA_delete(p->content.decoded.data, p->content.decoded.type);
-        break;
-    default:
-        break;
-    }
-}
-
-static UA_StatusCode
-ExtensionObject_copy(UA_ExtensionObject const *src, UA_ExtensionObject *dst,
-                     const UA_DataType *_) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    switch(src->encoding) {
-    case UA_EXTENSIONOBJECT_ENCODED_NOBODY:
-    case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING:
-    case UA_EXTENSIONOBJECT_ENCODED_XML:
-        dst->encoding = src->encoding;
-        retval = NodeId_copy(&src->content.encoded.typeId,
-                             &dst->content.encoded.typeId, NULL);
-        retval |= UA_ByteString_copy(&src->content.encoded.body,
-                                     &dst->content.encoded.body);
-        break;
-    case UA_EXTENSIONOBJECT_DECODED:
-    case UA_EXTENSIONOBJECT_DECODED_NODELETE:
-        if(!src->content.decoded.type || !src->content.decoded.data)
-            return UA_STATUSCODE_BADINTERNALERROR;
-        dst->encoding = UA_EXTENSIONOBJECT_DECODED;
-        dst->content.decoded.type = src->content.decoded.type;
-        retval = UA_Array_copy(src->content.decoded.data, 1,
-            &dst->content.decoded.data, src->content.decoded.type);
-        break;
-    default:
-        break;
-    }
-    return retval;
-}
-
-/* Variant */
-static void
-Variant_clear(UA_Variant *p, const UA_DataType *_) {
-    if(p->storageType != UA_VARIANT_DATA)
-        return;
-    if(p->type && p->data > UA_EMPTY_ARRAY_SENTINEL) {
-        if(p->arrayLength == 0)
-            p->arrayLength = 1;
-        UA_Array_delete(p->data, p->arrayLength, p->type);
-        p->data = NULL;
-    }
-    if((void*)p->arrayDimensions > UA_EMPTY_ARRAY_SENTINEL)
-        UA_free(p->arrayDimensions);
-}
-
-static UA_StatusCode
-Variant_copy(UA_Variant const *src, UA_Variant *dst, const UA_DataType *_) {
-    size_t length = src->arrayLength;
-    if(UA_Variant_isScalar(src))
-        length = 1;
-    UA_StatusCode retval = UA_Array_copy(src->data, length,
-                                         &dst->data, src->type);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    dst->arrayLength = src->arrayLength;
-    dst->type = src->type;
-    if(src->arrayDimensions) {
-        retval = UA_Array_copy(src->arrayDimensions, src->arrayDimensionsSize,
-            (void**)&dst->arrayDimensions, &UA_TYPES[UA_TYPES_INT32]);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
-        dst->arrayDimensionsSize = src->arrayDimensionsSize;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-void
-UA_Variant_setScalar(UA_Variant *v, void * UA_RESTRICT p,
-                     const UA_DataType *type) {
-    UA_Variant_init(v);
-    v->type = type;
-    v->arrayLength = 0;
-    v->data = p;
-}
-
-UA_StatusCode
-UA_Variant_setScalarCopy(UA_Variant *v, const void *p,
-                         const UA_DataType *type) {
-    void *n = UA_malloc(type->memSize);
-    if(!n)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    UA_StatusCode retval = UA_copy(p, n, type);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_free(n);
-        //cppcheck-suppress memleak
-        return retval;
-    }
-    UA_Variant_setScalar(v, n, type);
-    //cppcheck-suppress memleak
-    return UA_STATUSCODE_GOOD;
-}
-
-void UA_Variant_setArray(UA_Variant *v, void * UA_RESTRICT array,
-                         size_t arraySize, const UA_DataType *type) {
-    UA_Variant_init(v);
-    v->data = array;
-    v->arrayLength = arraySize;
-    v->type = type;
-}
-
-UA_StatusCode
-UA_Variant_setArrayCopy(UA_Variant *v, const void *array,
-                        size_t arraySize, const UA_DataType *type) {
-    UA_Variant_init(v);
-    UA_StatusCode retval = UA_Array_copy(array, arraySize, &v->data, type);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    v->arrayLength = arraySize;
-    v->type = type;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Test if a range is compatible with a variant. If yes, the following values
- * are set:
- * - total: how many elements are in the range
- * - block: how big is each contiguous block of elements in the variant that
- *   maps into the range
- * - stride: how many elements are between the blocks (beginning to beginning)
- * - first: where does the first block begin */
-static UA_StatusCode
-computeStrides(const UA_Variant *v, const UA_NumericRange range,
-               size_t *total, size_t *block, size_t *stride, size_t *first) {
-    /* Test for max array size (64bit only) */
-#if (SIZE_MAX > 0xffffffff)
-    if(v->arrayLength > UA_UINT32_MAX)
-        return UA_STATUSCODE_BADINTERNALERROR;
-#endif
-
-    /* Test the integrity of the source variant dimensions, make dimensions
-     * vector of one dimension if none defined */
-    u32 arrayLength = (u32)v->arrayLength;
-    const u32 *dims = &arrayLength;
-    size_t dims_count = 1;
-    if(v->arrayDimensionsSize > 0) {
-        size_t elements = 1;
-        dims_count = v->arrayDimensionsSize;
-        dims = (u32*)v->arrayDimensions;
-        for(size_t i = 0; i < dims_count; ++i)
-            elements *= dims[i];
-        if(elements != v->arrayLength)
-            return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    UA_assert(dims_count > 0);
-
-    /* Test the integrity of the range and compute the max index used for every
-     * dimension. The standard says in Part 4, Section 7.22:
-     *
-     * When reading a value, the indexes may not specify a range that is within
-     * the bounds of the array. The Server shall return a partial result if some
-     * elements exist within the range. */
-    size_t count = 1;
-    UA_STACKARRAY(UA_UInt32, realmax, dims_count);
-    if(range.dimensionsSize != dims_count)
-        return UA_STATUSCODE_BADINDEXRANGENODATA;
-    for(size_t i = 0; i < dims_count; ++i) {
-        if(range.dimensions[i].min > range.dimensions[i].max)
-            return UA_STATUSCODE_BADINDEXRANGEINVALID;
-        if(range.dimensions[i].min >= dims[i])
-            return UA_STATUSCODE_BADINDEXRANGENODATA;
-
-        if(range.dimensions[i].max < dims[i])
-            realmax[i] = range.dimensions[i].max;
-        else
-            realmax[i] = dims[i] - 1;
-
-        count *= (realmax[i] - range.dimensions[i].min) + 1;
-    }
-
-    *total = count;
-
-    /* Compute the stride length and the position of the first element */
-    *block = count;           /* Assume the range describes the entire array. */
-    *stride = v->arrayLength; /* So it can be copied as a contiguous block.   */
-    *first = 0;
-    size_t running_dimssize = 1;
-    UA_Boolean found_contiguous = false;
-    for(size_t k = dims_count; k > 0;) {
-        --k;
-        size_t dimrange = 1 + realmax[k] - range.dimensions[k].min;
-        if(!found_contiguous && dimrange != dims[k]) {
-            /* Found the maximum block that can be copied contiguously */
-            found_contiguous = true;
-            *block = running_dimssize * dimrange;
-            *stride = running_dimssize * dims[k];
-        }
-        *first += running_dimssize * range.dimensions[k].min;
-        running_dimssize *= dims[k];
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Is the type string-like? */
-static UA_Boolean
-isStringLike(const UA_DataType *type) {
-    if(type == &UA_TYPES[UA_TYPES_STRING] ||
-       type == &UA_TYPES[UA_TYPES_BYTESTRING] ||
-       type == &UA_TYPES[UA_TYPES_XMLELEMENT])
-        return true;
-    return false;
-}
-
-/* Returns the part of the string that lies within the rangedimension */
-static UA_StatusCode
-copySubString(const UA_String *src, UA_String *dst,
-              const UA_NumericRangeDimension *dim) {
-    if(dim->min > dim->max)
-        return UA_STATUSCODE_BADINDEXRANGEINVALID;
-    if(dim->min >= src->length)
-        return UA_STATUSCODE_BADINDEXRANGENODATA;
-
-    size_t length;
-    if(dim->max < src->length)
-       length = dim->max - dim->min + 1;
-    else
-        length = src->length - dim->min;
-
-    UA_StatusCode retval = UA_ByteString_allocBuffer(dst, length);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    memcpy(dst->data, &src->data[dim->min], length);
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst,
-                     const UA_NumericRange range) {
-    if(!src->type)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-    UA_Boolean isScalar = UA_Variant_isScalar(src);
-    UA_Boolean stringLike = isStringLike(src->type);
-    UA_Variant arraySrc;
-
-    /* Extract the range for copying at this level. The remaining range is dealt
-     * with in the "scalar" type that may define an array by itself (string,
-     * variant, ...). */
-    UA_NumericRange thisrange, nextrange;
-    UA_NumericRangeDimension scalarThisDimension = {0,0}; /* a single entry */
-    if(isScalar) {
-        /* Replace scalar src with array of length 1 */
-        arraySrc = *src;
-        arraySrc.arrayLength = 1;
-        src = &arraySrc;
-        /* Deal with all range dimensions within the scalar */
-        thisrange.dimensions = &scalarThisDimension;
-        thisrange.dimensionsSize = 1;
-        nextrange = range;
-    } else {
-        /* Deal with as many range dimensions as possible right now */
-        size_t dims = src->arrayDimensionsSize;
-        if(dims == 0)
-            dims = 1;
-        if(dims > range.dimensionsSize)
-            return UA_STATUSCODE_BADINDEXRANGEINVALID;
-       thisrange = range;
-       thisrange.dimensionsSize = dims;
-       nextrange.dimensions = &range.dimensions[dims];
-       nextrange.dimensionsSize = range.dimensionsSize - dims;
-    }
-
-    /* Compute the strides */
-    size_t count, block, stride, first;
-    UA_StatusCode retval = computeStrides(src, thisrange, &count,
-                                          &block, &stride, &first);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    /* Allocate the array */
-    UA_Variant_init(dst);
-    dst->data = UA_Array_new(count, src->type);
-    if(!dst->data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Copy the range */
-    size_t block_count = count / block;
-    size_t elem_size = src->type->memSize;
-    uintptr_t nextdst = (uintptr_t)dst->data;
-    uintptr_t nextsrc = (uintptr_t)src->data + (elem_size * first);
-    if(nextrange.dimensionsSize == 0) {
-        /* no nextrange */
-        if(src->type->pointerFree) {
-            for(size_t i = 0; i < block_count; ++i) {
-                memcpy((void*)nextdst, (void*)nextsrc, elem_size * block);
-                nextdst += block * elem_size;
-                nextsrc += stride * elem_size;
-            }
-        } else {
-            for(size_t i = 0; i < block_count; ++i) {
-                for(size_t j = 0; j < block; ++j) {
-                    retval = UA_copy((const void*)nextsrc,
-                                     (void*)nextdst, src->type);
-                    nextdst += elem_size;
-                    nextsrc += elem_size;
-                }
-                nextsrc += (stride - block) * elem_size;
-            }
-        }
-    } else {
-        /* nextrange can only be used for variants and stringlike with remaining
-         * range of dimension 1 */
-        if(src->type != &UA_TYPES[UA_TYPES_VARIANT]) {
-            if(!stringLike)
-                retval = UA_STATUSCODE_BADINDEXRANGENODATA;
-            if(nextrange.dimensionsSize != 1)
-                retval = UA_STATUSCODE_BADINDEXRANGENODATA;
-        }
-
-        /* Copy the content */
-        for(size_t i = 0; i < block_count; ++i) {
-            for(size_t j = 0; j < block && retval == UA_STATUSCODE_GOOD; ++j) {
-                if(stringLike)
-                    retval = copySubString((const UA_String*)nextsrc,
-                                           (UA_String*)nextdst,
-                                           nextrange.dimensions);
-                else
-                    retval = UA_Variant_copyRange((const UA_Variant*)nextsrc,
-                                                  (UA_Variant*)nextdst,
-                                                  nextrange);
-                nextdst += elem_size;
-                nextsrc += elem_size;
-            }
-            nextsrc += (stride - block) * elem_size;
-        }
-    }
-
-    /* Clean up if copying failed */
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Array_delete(dst->data, count, src->type);
-        dst->data = NULL;
-        return retval;
-    }
-
-    /* Done if scalar */
-    dst->type = src->type;
-    if(isScalar)
-        return retval;
-
-    /* Copy array dimensions */
-    dst->arrayLength = count;
-    if(src->arrayDimensionsSize > 0) {
-        dst->arrayDimensions =
-            (u32*)UA_Array_new(thisrange.dimensionsSize, &UA_TYPES[UA_TYPES_UINT32]);
-        if(!dst->arrayDimensions) {
-            Variant_clear(dst, NULL);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        dst->arrayDimensionsSize = thisrange.dimensionsSize;
-        for(size_t k = 0; k < thisrange.dimensionsSize; ++k)
-            dst->arrayDimensions[k] =
-                thisrange.dimensions[k].max - thisrange.dimensions[k].min + 1;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* TODO: Allow ranges to reach inside a scalars that are array-like, e.g.
- * variant and strings. This is already possible for reading... */
-static UA_StatusCode
-Variant_setRange(UA_Variant *v, void *array, size_t arraySize,
-                 const UA_NumericRange range, UA_Boolean copy) {
-    /* Compute the strides */
-    size_t count, block, stride, first;
-    UA_StatusCode retval = computeStrides(v, range, &count,
-                                          &block, &stride, &first);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    if(count != arraySize)
-        return UA_STATUSCODE_BADINDEXRANGEINVALID;
-
-    /* Move/copy the elements */
-    size_t block_count = count / block;
-    size_t elem_size = v->type->memSize;
-    uintptr_t nextdst = (uintptr_t)v->data + (first * elem_size);
-    uintptr_t nextsrc = (uintptr_t)array;
-    if(v->type->pointerFree || !copy) {
-        for(size_t i = 0; i < block_count; ++i) {
-            memcpy((void*)nextdst, (void*)nextsrc, elem_size * block);
-            nextsrc += block * elem_size;
-            nextdst += stride * elem_size;
-        }
-    } else {
-        for(size_t i = 0; i < block_count; ++i) {
-            for(size_t j = 0; j < block; ++j) {
-                clearJumpTable[v->type->typeKind]((void*)nextdst, v->type);
-                retval |= UA_copy((void*)nextsrc, (void*)nextdst, v->type);
-                nextdst += elem_size;
-                nextsrc += elem_size;
-            }
-            nextdst += (stride - block) * elem_size;
-        }
-    }
-
-    /* If members were moved, initialize original array to prevent reuse */
-    if(!copy && !v->type->pointerFree)
-        memset(array, 0, sizeof(elem_size)*arraySize);
-
-    return retval;
-}
-
-UA_StatusCode
-UA_Variant_setRange(UA_Variant *v, void * UA_RESTRICT array,
-                    size_t arraySize, const UA_NumericRange range) {
-    return Variant_setRange(v, array, arraySize, range, false);
-}
-
-UA_StatusCode
-UA_Variant_setRangeCopy(UA_Variant *v, const void *array,
-                        size_t arraySize, const UA_NumericRange range) {
-    return Variant_setRange(v, (void*)(uintptr_t)array,
-                            arraySize, range, true);
-}
-
-/* LocalizedText */
-static void
-LocalizedText_clear(UA_LocalizedText *p, const UA_DataType *_) {
-    String_clear(&p->locale, NULL);
-    String_clear(&p->text, NULL);
-}
-
-static UA_StatusCode
-LocalizedText_copy(UA_LocalizedText const *src, UA_LocalizedText *dst,
-                   const UA_DataType *_) {
-    UA_StatusCode retval = UA_String_copy(&src->locale, &dst->locale);
-    retval |= UA_String_copy(&src->text, &dst->text);
-    return retval;
-}
-
-/* DataValue */
-static void
-DataValue_clear(UA_DataValue *p, const UA_DataType *_) {
-    Variant_clear(&p->value, NULL);
-}
-
-static UA_StatusCode
-DataValue_copy(UA_DataValue const *src, UA_DataValue *dst,
-               const UA_DataType *_) {
-    memcpy(dst, src, sizeof(UA_DataValue));
-    UA_Variant_init(&dst->value);
-    UA_StatusCode retval = Variant_copy(&src->value, &dst->value, NULL);
-    if(retval != UA_STATUSCODE_GOOD)
-        DataValue_clear(dst, NULL);
-    return retval;
-}
-
-/* DiagnosticInfo */
-static void
-DiagnosticInfo_clear(UA_DiagnosticInfo *p, const UA_DataType *_) {
-    String_clear(&p->additionalInfo, NULL);
-    if(p->hasInnerDiagnosticInfo && p->innerDiagnosticInfo) {
-        DiagnosticInfo_clear(p->innerDiagnosticInfo, NULL);
-        UA_free(p->innerDiagnosticInfo);
-    }
-}
-
-static UA_StatusCode
-DiagnosticInfo_copy(UA_DiagnosticInfo const *src, UA_DiagnosticInfo *dst,
-                    const UA_DataType *_) {
-    memcpy(dst, src, sizeof(UA_DiagnosticInfo));
-    UA_String_init(&dst->additionalInfo);
-    dst->innerDiagnosticInfo = NULL;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    if(src->hasAdditionalInfo)
-       retval = UA_String_copy(&src->additionalInfo, &dst->additionalInfo);
-    if(src->hasInnerDiagnosticInfo && src->innerDiagnosticInfo) {
-        dst->innerDiagnosticInfo = (UA_DiagnosticInfo*)UA_malloc(sizeof(UA_DiagnosticInfo));
-        if(dst->innerDiagnosticInfo) {
-            retval |= DiagnosticInfo_copy(src->innerDiagnosticInfo,
-                                          dst->innerDiagnosticInfo, NULL);
-            dst->hasInnerDiagnosticInfo = true;
-        } else {
-            dst->hasInnerDiagnosticInfo = false;
-            retval |= UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-    }
-    return retval;
-}
-
-/********************/
-/* Structured Types */
-/********************/
-
-void *
-UA_new(const UA_DataType *type) {
-    void *p = UA_calloc(1, type->memSize);
-    return p;
-}
-
-static UA_StatusCode
-copyByte(const u8 *src, u8 *dst, const UA_DataType *_) {
-    *dst = *src;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copy2Byte(const u16 *src, u16 *dst, const UA_DataType *_) {
-    *dst = *src;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copy4Byte(const u32 *src, u32 *dst, const UA_DataType *_) {
-    *dst = *src;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copy8Byte(const u64 *src, u64 *dst, const UA_DataType *_) {
-    *dst = *src;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copyGuid(const UA_Guid *src, UA_Guid *dst, const UA_DataType *_) {
-    *dst = *src;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-copyStructure(const void *src, void *dst, const UA_DataType *type) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    uintptr_t ptrs = (uintptr_t)src;
-    uintptr_t ptrd = (uintptr_t)dst;
-    const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] };
-    for(size_t i = 0; i < type->membersSize; ++i) {
-        const UA_DataTypeMember *m= &type->members[i];
-        const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex];
-        if(!m->isArray) {
-            ptrs += m->padding;
-            ptrd += m->padding;
-            retval |= copyJumpTable[mt->typeKind]((const void*)ptrs, (void*)ptrd, mt);
-            ptrs += mt->memSize;
-            ptrd += mt->memSize;
-        } else {
-            ptrs += m->padding;
-            ptrd += m->padding;
-            size_t *dst_size = (size_t*)ptrd;
-            const size_t size = *((const size_t*)ptrs);
-            ptrs += sizeof(size_t);
-            ptrd += sizeof(size_t);
-            retval |= UA_Array_copy(*(void* const*)ptrs, size, (void**)ptrd, mt);
-            if(retval == UA_STATUSCODE_GOOD)
-                *dst_size = size;
-            else
-                *dst_size = 0;
-            ptrs += sizeof(void*);
-            ptrd += sizeof(void*);
-        }
-    }
-    return retval;
-}
-
-static UA_StatusCode
-copyNotImplemented(const void *src, void *dst, const UA_DataType *type) {
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-const UA_copySignature copyJumpTable[UA_DATATYPEKINDS] = {
-    (UA_copySignature)copyByte, /* Boolean */
-    (UA_copySignature)copyByte, /* SByte */
-    (UA_copySignature)copyByte, /* Byte */
-    (UA_copySignature)copy2Byte, /* Int16 */
-    (UA_copySignature)copy2Byte, /* UInt16 */
-    (UA_copySignature)copy4Byte, /* Int32 */
-    (UA_copySignature)copy4Byte, /* UInt32 */
-    (UA_copySignature)copy8Byte, /* Int64 */
-    (UA_copySignature)copy8Byte, /* UInt64 */
-    (UA_copySignature)copy4Byte, /* Float */
-    (UA_copySignature)copy8Byte, /* Double */
-    (UA_copySignature)String_copy,
-    (UA_copySignature)copy8Byte, /* DateTime */
-    (UA_copySignature)copyGuid, /* Guid */
-    (UA_copySignature)String_copy, /* ByteString */
-    (UA_copySignature)String_copy, /* XmlElement */
-    (UA_copySignature)NodeId_copy,
-    (UA_copySignature)ExpandedNodeId_copy,
-    (UA_copySignature)copy4Byte, /* StatusCode */
-    (UA_copySignature)QualifiedName_copy,
-    (UA_copySignature)LocalizedText_copy,
-    (UA_copySignature)ExtensionObject_copy,
-    (UA_copySignature)DataValue_copy,
-    (UA_copySignature)Variant_copy,
-    (UA_copySignature)DiagnosticInfo_copy,
-    (UA_copySignature)copyNotImplemented, /* Decimal */
-    (UA_copySignature)copy4Byte, /* Enumeration */
-    (UA_copySignature)copyStructure,
-    (UA_copySignature)copyNotImplemented, /* Structure with Optional Fields */
-    (UA_copySignature)copyNotImplemented, /* Union */
-    (UA_copySignature)copyNotImplemented /* BitfieldCluster*/
-};
-
-UA_StatusCode
-UA_copy(const void *src, void *dst, const UA_DataType *type) {
-    memset(dst, 0, type->memSize); /* init */
-    UA_StatusCode retval = copyJumpTable[type->typeKind](src, dst, type);
-    if(retval != UA_STATUSCODE_GOOD)
-        UA_clear(dst, type);
-    return retval;
-}
-
-static void
-clearStructure(void *p, const UA_DataType *type) {
-    uintptr_t ptr = (uintptr_t)p;
-    const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] };
-    for(size_t i = 0; i < type->membersSize; ++i) {
-        const UA_DataTypeMember *m = &type->members[i];
-        const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex];
-        if(!m->isArray) {
-            ptr += m->padding;
-            clearJumpTable[mt->typeKind]((void*)ptr, mt);
-            ptr += mt->memSize;
-        } else {
-            ptr += m->padding;
-            size_t length = *(size_t*)ptr;
-            ptr += sizeof(size_t);
-            UA_Array_delete(*(void**)ptr, length, mt);
-            ptr += sizeof(void*);
-        }
-    }
-}
-
-static void nopClear(void *p, const UA_DataType *type) { }
-
-const
-UA_clearSignature clearJumpTable[UA_DATATYPEKINDS] = {
-    (UA_clearSignature)nopClear, /* Boolean */
-    (UA_clearSignature)nopClear, /* SByte */
-    (UA_clearSignature)nopClear, /* Byte */
-    (UA_clearSignature)nopClear, /* Int16 */
-    (UA_clearSignature)nopClear, /* UInt16 */
-    (UA_clearSignature)nopClear, /* Int32 */
-    (UA_clearSignature)nopClear, /* UInt32 */
-    (UA_clearSignature)nopClear, /* Int64 */
-    (UA_clearSignature)nopClear, /* UInt64 */
-    (UA_clearSignature)nopClear, /* Float */
-    (UA_clearSignature)nopClear, /* Double */
-    (UA_clearSignature)String_clear, /* String */
-    (UA_clearSignature)nopClear, /* DateTime */
-    (UA_clearSignature)nopClear, /* Guid */
-    (UA_clearSignature)String_clear, /* ByteString */
-    (UA_clearSignature)String_clear, /* XmlElement */
-    (UA_clearSignature)NodeId_clear,
-    (UA_clearSignature)ExpandedNodeId_clear,
-    (UA_clearSignature)nopClear, /* StatusCode */
-    (UA_clearSignature)QualifiedName_clear,
-    (UA_clearSignature)LocalizedText_clear,
-    (UA_clearSignature)ExtensionObject_clear,
-    (UA_clearSignature)DataValue_clear,
-    (UA_clearSignature)Variant_clear,
-    (UA_clearSignature)DiagnosticInfo_clear,
-    (UA_clearSignature)nopClear, /* Decimal, not implemented */
-    (UA_clearSignature)nopClear, /* Enumeration */
-    (UA_clearSignature)clearStructure,
-    (UA_clearSignature)nopClear, /* Struct with Optional Fields, not implemented*/
-    (UA_clearSignature)nopClear, /* Union, not implemented*/
-    (UA_clearSignature)nopClear /* BitfieldCluster, not implemented*/
-};
-
-void
-UA_clear(void *p, const UA_DataType *type) {
-    clearJumpTable[type->typeKind](p, type);
-    memset(p, 0, type->memSize); /* init */
-}
-
-void
-UA_delete(void *p, const UA_DataType *type) {
-    clearJumpTable[type->typeKind](p, type);
-    UA_free(p);
-}
-
-/******************/
-/* Array Handling */
-/******************/
-
-void *
-UA_Array_new(size_t size, const UA_DataType *type) {
-    if(size > UA_INT32_MAX)
-        return NULL;
-    if(size == 0)
-        return UA_EMPTY_ARRAY_SENTINEL;
-    return UA_calloc(size, type->memSize);
-}
-
-UA_StatusCode
-UA_Array_copy(const void *src, size_t size,
-              void **dst, const UA_DataType *type) {
-    if(size == 0) {
-        if(src == NULL)
-            *dst = NULL;
-        else
-            *dst= UA_EMPTY_ARRAY_SENTINEL;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    if(!type)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* calloc, so we don't have to check retval in every iteration of copying */
-    *dst = UA_calloc(size, type->memSize);
-    if(!*dst)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    if(type->pointerFree) {
-        memcpy(*dst, src, type->memSize * size);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    uintptr_t ptrs = (uintptr_t)src;
-    uintptr_t ptrd = (uintptr_t)*dst;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for(size_t i = 0; i < size; ++i) {
-        retval |= UA_copy((void*)ptrs, (void*)ptrd, type);
-        ptrs += type->memSize;
-        ptrd += type->memSize;
-    }
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Array_delete(*dst, size, type);
-        *dst = NULL;
-    }
-    return retval;
-}
-
-void
-UA_Array_delete(void *p, size_t size, const UA_DataType *type) {
-    if(!type->pointerFree) {
-        uintptr_t ptr = (uintptr_t)p;
-        for(size_t i = 0; i < size; ++i) {
-            UA_clear((void*)ptr, type);
-            ptr += type->memSize;
-        }
-    }
-    UA_free((void*)((uintptr_t)p & ~(uintptr_t)UA_EMPTY_ARRAY_SENTINEL));
-}
-
-UA_Boolean
-UA_DataType_isNumeric(const UA_DataType *type) {
-    /* All data types between UA_TYPES_BOOLEAN and UA_TYPES_DOUBLE are numeric */
-    for(size_t i = UA_TYPES_BOOLEAN; i <= UA_TYPES_DOUBLE; ++i)
-        if(&UA_TYPES[i] == type)
-            return true;
-    return false;
-}
-
-/**********************/
-/* Parse NumericRange */
-/**********************/
-
-static size_t
-readDimension(UA_Byte *buf, size_t buflen, UA_NumericRangeDimension *dim) {
-    size_t progress = UA_readNumber(buf, buflen, &dim->min);
-    if(progress == 0)
-        return 0;
-    if(buflen <= progress + 1 || buf[progress] != ':') {
-        dim->max = dim->min;
-        return progress;
-    }
-
-    ++progress;
-    size_t progress2 = UA_readNumber(&buf[progress], buflen - progress, &dim->max);
-    if(progress2 == 0)
-        return 0;
-
-    /* invalid range */
-    if(dim->min >= dim->max)
-        return 0;
-
-    return progress + progress2;
-}
-
-UA_StatusCode
-UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str) {
-    size_t idx = 0;
-    size_t dimensionsMax = 0;
-    UA_NumericRangeDimension *dimensions = NULL;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    size_t offset = 0;
-    while(true) {
-        /* alloc dimensions */
-        if(idx >= dimensionsMax) {
-            UA_NumericRangeDimension *newds;
-            size_t newdssize = sizeof(UA_NumericRangeDimension) * (dimensionsMax + 2);
-            newds = (UA_NumericRangeDimension*)UA_realloc(dimensions, newdssize);
-            if(!newds) {
-                retval = UA_STATUSCODE_BADOUTOFMEMORY;
-                break;
-            }
-            dimensions = newds;
-            dimensionsMax = dimensionsMax + 2;
-        }
-
-        /* read the dimension */
-        size_t progress = readDimension(&str->data[offset], str->length - offset,
-                                        &dimensions[idx]);
-        if(progress == 0) {
-            retval = UA_STATUSCODE_BADINDEXRANGEINVALID;
-            break;
-        }
-        offset += progress;
-        ++idx;
-
-        /* loop into the next dimension */
-        if(offset >= str->length)
-            break;
-
-        if(str->data[offset] != ',') {
-            retval = UA_STATUSCODE_BADINDEXRANGEINVALID;
-            break;
-        }
-        ++offset;
-    }
-
-    if(retval == UA_STATUSCODE_GOOD && idx > 0) {
-        range->dimensions = dimensions;
-        range->dimensionsSize = idx;
-    } else
-        UA_free(dimensions);
-
-    return retval;
-}
diff --git a/ext/open62541/src/ua_types_encoding_binary.c b/ext/open62541/src/ua_types_encoding_binary.c
deleted file mode 100644
index f652f5c..0000000
--- a/ext/open62541/src/ua_types_encoding_binary.c
+++ /dev/null
@@ -1,1764 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2017 (c) Florian Palm
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2014 (c) Leon Urbas
- *    Copyright 2015 (c) LEvertz
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- *    Copyright 2017 (c) Henrik Norrman
- */
-
-#include "ua_types_encoding_binary.h"
-
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_util_internal.h"
-
-/**
- * Type Encoding and Decoding
- * --------------------------
- * The following methods contain encoding and decoding functions for the builtin
- * data types and generic functions that operate on all types and arrays. This
- * requires the type description from a UA_DataType structure.
- *
- * Encoding Context
- * ^^^^^^^^^^^^^^^^
- * If possible, the encoding context is stored in a thread-local variable to
- * speed up encoding. If thread-local variables are not supported, the context
- * is "looped through" every method call. The ``_``-macro accesses either the
- * thread-local or the "looped through" context . */
-
-/* Part 6 §5.1.5: Decoders shall support at least 100 nesting levels */
-#define UA_ENCODING_MAX_RECURSION 100
-
-typedef struct {
-    /* Pointers to the current position and the last position in the buffer */
-    u8 *pos;
-    const u8 *end;
-
-    u8 **oldpos; /* Sentinel for a lower stacktrace exchanging the buffer */
-    u16 depth;   /* How often did we en-/decoding recurse? */
-
-    const UA_DataTypeArray *customTypes;
-    UA_exchangeEncodeBuffer exchangeBufferCallback;
-    void *exchangeBufferCallbackHandle;
-} Ctx;
-
-typedef status
-(*encodeBinarySignature)(const void *UA_RESTRICT src, const UA_DataType *type,
-                         Ctx *UA_RESTRICT ctx);
-typedef status
-(*decodeBinarySignature)(void *UA_RESTRICT dst, const UA_DataType *type,
-                         Ctx *UA_RESTRICT ctx);
-typedef size_t
-(*calcSizeBinarySignature)(const void *UA_RESTRICT p, const UA_DataType *contenttype);
-
-#define ENCODE_BINARY(TYPE) static status                               \
-    TYPE##_encodeBinary(const UA_##TYPE *UA_RESTRICT src,               \
-                        const UA_DataType *type, Ctx *UA_RESTRICT ctx)
-#define DECODE_BINARY(TYPE) static status                               \
-    TYPE##_decodeBinary(UA_##TYPE *UA_RESTRICT dst,                     \
-                        const UA_DataType *type, Ctx *UA_RESTRICT ctx)
-#define CALCSIZE_BINARY(TYPE) static size_t                             \
-    TYPE##_calcSizeBinary(const UA_##TYPE *UA_RESTRICT src,             \
-                          const UA_DataType *_)
-#define ENCODE_DIRECT(SRC, TYPE) TYPE##_encodeBinary((const UA_##TYPE*)SRC, NULL, ctx)
-#define DECODE_DIRECT(DST, TYPE) TYPE##_decodeBinary((UA_##TYPE*)DST, NULL, ctx)
-
-/* Jumptables for de-/encoding and computing the buffer length. The methods in
- * the decoding jumptable do not all clean up their allocated memory when an
- * error occurs. So a final _clear needs to be called before returning to the
- * user. */
-extern const encodeBinarySignature encodeBinaryJumpTable[UA_DATATYPEKINDS];
-extern const decodeBinarySignature decodeBinaryJumpTable[UA_DATATYPEKINDS];
-extern const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_DATATYPEKINDS];
-
-/* Breaking a message up into chunks is integrated with the encoding. When the
- * end of a buffer is reached, a callback is executed that sends the current
- * buffer as a chunk and exchanges the encoding buffer "underneath" the ongoing
- * encoding. This reduces the RAM requirements and unnecessary copying. */
-
-/* Send the current chunk and replace the buffer */
-static status exchangeBuffer(Ctx *ctx) {
-    if(!ctx->exchangeBufferCallback)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    return ctx->exchangeBufferCallback(ctx->exchangeBufferCallbackHandle,
-                                       &ctx->pos, &ctx->end);
-}
-
-/* If encoding fails, exchange the buffer and try again. */
-static status
-encodeWithExchangeBuffer(const void *ptr, const UA_DataType *type, Ctx *ctx) {
-    u8 *oldpos = ctx->pos; /* Last known good position */
-    ctx->oldpos = &oldpos;
-    status ret = encodeBinaryJumpTable[type->typeKind](ptr, type, ctx);
-    if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED && ctx->oldpos == &oldpos) {
-        ctx->pos = oldpos; /* Send the position to the last known good position
-                            * and switch */
-        ret = exchangeBuffer(ctx);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        ret = encodeBinaryJumpTable[type->typeKind](ptr, type, ctx);
-    }
-    return ret;
-}
-
-#define ENCODE_WITHEXCHANGE(VAR, TYPE) \
-    encodeWithExchangeBuffer((const void*)VAR, &UA_TYPES[TYPE], ctx)
-
-/*****************/
-/* Integer Types */
-/*****************/
-
-#if !UA_BINARY_OVERLAYABLE_INTEGER
-
-#pragma message "Integer endianness could not be detected to be little endian. Use slow generic encoding."
-
-/* These en/decoding functions are only used when the architecture isn't little-endian. */
-static void
-UA_encode16(const u16 v, u8 buf[2]) {
-    buf[0] = (u8)v;
-    buf[1] = (u8)(v >> 8);
-}
-
-static void
-UA_decode16(const u8 buf[2], u16 *v) {
-    *v = (u16)((u16)buf[0] + (((u16)buf[1]) << 8));
-}
-
-static void
-UA_encode32(const u32 v, u8 buf[4]) {
-    buf[0] = (u8)v;
-    buf[1] = (u8)(v >> 8);
-    buf[2] = (u8)(v >> 16);
-    buf[3] = (u8)(v >> 24);
-}
-
-static void
-UA_decode32(const u8 buf[4], u32 *v) {
-    *v = (u32)((u32)buf[0] + (((u32)buf[1]) << 8) +
-             (((u32)buf[2]) << 16) + (((u32)buf[3]) << 24));
-}
-
-static void
-UA_encode64(const u64 v, u8 buf[8]) {
-    buf[0] = (u8)v;
-    buf[1] = (u8)(v >> 8);
-    buf[2] = (u8)(v >> 16);
-    buf[3] = (u8)(v >> 24);
-    buf[4] = (u8)(v >> 32);
-    buf[5] = (u8)(v >> 40);
-    buf[6] = (u8)(v >> 48);
-    buf[7] = (u8)(v >> 56);
-}
-
-static void
-UA_decode64(const u8 buf[8], u64 *v) {
-    *v = (u64)((u64)buf[0] + (((u64)buf[1]) << 8) +
-             (((u64)buf[2]) << 16) + (((u64)buf[3]) << 24) +
-             (((u64)buf[4]) << 32) + (((u64)buf[5]) << 40) +
-             (((u64)buf[6]) << 48) + (((u64)buf[7]) << 56));
-}
-
-#endif /* !UA_BINARY_OVERLAYABLE_INTEGER */
-
-/* Boolean */
-/* Note that sizeof(bool) != 1 on some platforms. Overlayable integer encoding
- * is disabled in those cases. */
-ENCODE_BINARY(Boolean) {
-    if(ctx->pos + 1 > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    *ctx->pos = *(const u8*)src;
-    ++ctx->pos;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_BINARY(Boolean) {
-    if(ctx->pos + 1 > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    *dst = (*ctx->pos > 0) ? true : false;
-    ++ctx->pos;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Byte */
-ENCODE_BINARY(Byte) {
-    if(ctx->pos + sizeof(u8) > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    *ctx->pos = *(const u8*)src;
-    ++ctx->pos;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_BINARY(Byte) {
-    if(ctx->pos + sizeof(u8) > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    *dst = *ctx->pos;
-    ++ctx->pos;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* UInt16 */
-ENCODE_BINARY(UInt16) {
-    if(ctx->pos + sizeof(u16) > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-#if UA_BINARY_OVERLAYABLE_INTEGER
-    memcpy(ctx->pos, src, sizeof(u16));
-#else
-    UA_encode16(*src, ctx->pos);
-#endif
-    ctx->pos += 2;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_BINARY(UInt16) {
-    if(ctx->pos + sizeof(u16) > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-#if UA_BINARY_OVERLAYABLE_INTEGER
-    memcpy(dst, ctx->pos, sizeof(u16));
-#else
-    UA_decode16(ctx->pos, dst);
-#endif
-    ctx->pos += 2;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* UInt32 */
-ENCODE_BINARY(UInt32) {
-    if(ctx->pos + sizeof(u32) > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-#if UA_BINARY_OVERLAYABLE_INTEGER
-    memcpy(ctx->pos, src, sizeof(u32));
-#else
-    UA_encode32(*src, ctx->pos);
-#endif
-    ctx->pos += 4;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_BINARY(UInt32) {
-    if(ctx->pos + sizeof(u32) > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-#if UA_BINARY_OVERLAYABLE_INTEGER
-    memcpy(dst, ctx->pos, sizeof(u32));
-#else
-    UA_decode32(ctx->pos, dst);
-#endif
-    ctx->pos += 4;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* UInt64 */
-ENCODE_BINARY(UInt64) {
-    if(ctx->pos + sizeof(u64) > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-#if UA_BINARY_OVERLAYABLE_INTEGER
-    memcpy(ctx->pos, src, sizeof(u64));
-#else
-    UA_encode64(*src, ctx->pos);
-#endif
-    ctx->pos += 8;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_BINARY(UInt64) {
-    if(ctx->pos + sizeof(u64) > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-#if UA_BINARY_OVERLAYABLE_INTEGER
-    memcpy(dst, ctx->pos, sizeof(u64));
-#else
-    UA_decode64(ctx->pos, dst);
-#endif
-    ctx->pos += 8;
-    return UA_STATUSCODE_GOOD;
-}
-
-/************************/
-/* Floating Point Types */
-/************************/
-
-/* Can we reuse the integer encoding mechanism by casting floating point
- * values? */
-#if (UA_FLOAT_IEEE754 == 1) && (UA_LITTLE_ENDIAN == UA_FLOAT_LITTLE_ENDIAN)
-# define Float_encodeBinary UInt32_encodeBinary
-# define Float_decodeBinary UInt32_decodeBinary
-# define Double_encodeBinary UInt64_encodeBinary
-# define Double_decodeBinary UInt64_decodeBinary
-#else
-
-#include <math.h>
-
-#pragma message "No native IEEE 754 format detected. Use slow generic encoding."
-
-/* Handling of IEEE754 floating point values was taken from Beej's Guide to
- * Network Programming (http://beej.us/guide/bgnet/) and enhanced to cover the
- * edge cases +/-0, +/-inf and nan. */
-static uint64_t
-pack754(long double f, unsigned bits, unsigned expbits) {
-    unsigned significandbits = bits - expbits - 1;
-    long double fnorm;
-    long long sign;
-    if(f < 0) { sign = 1; fnorm = -f; }
-    else { sign = 0; fnorm = f; }
-    int shift = 0;
-    while(fnorm >= 2.0) { fnorm /= 2.0; ++shift; }
-    while(fnorm < 1.0) { fnorm *= 2.0; --shift; }
-    fnorm = fnorm - 1.0;
-    long long significand = (long long)(fnorm * ((float)(1LL<<significandbits) + 0.5f));
-    long long exponent = shift + ((1<<(expbits-1)) - 1);
-    return (uint64_t)((sign<<(bits-1)) | (exponent<<(bits-expbits-1)) | significand);
-}
-
-static long double
-unpack754(uint64_t i, unsigned bits, unsigned expbits) {
-    unsigned significandbits = bits - expbits - 1;
-    long double result = (long double)(i&(uint64_t)((1LL<<significandbits)-1));
-    result /= (1LL<<significandbits);
-    result += 1.0f;
-    unsigned bias = (unsigned)(1<<(expbits-1)) - 1;
-    long long shift = (long long)((i>>significandbits) & (uint64_t)((1LL<<expbits)-1)) - bias;
-    while(shift > 0) { result *= 2.0; --shift; }
-    while(shift < 0) { result /= 2.0; ++shift; }
-    result *= ((i>>(bits-1))&1)? -1.0: 1.0;
-    return result;
-}
-
-/* Float */
-#define FLOAT_NAN 0xffc00000
-#define FLOAT_INF 0x7f800000
-#define FLOAT_NEG_INF 0xff800000
-#define FLOAT_NEG_ZERO 0x80000000
-
-ENCODE_BINARY(Float) {
-    UA_Float f = *src;
-    u32 encoded;
-    /* cppcheck-suppress duplicateExpression */
-    if(f != f) encoded = FLOAT_NAN;
-    else if(f == 0.0f) encoded = signbit(f) ? FLOAT_NEG_ZERO : 0;
-    else if(f/f != f/f) encoded = f > 0 ? FLOAT_INF : FLOAT_NEG_INF;
-    else encoded = (u32)pack754(f, 32, 8);
-    return ENCODE_DIRECT(&encoded, UInt32);
-}
-
-DECODE_BINARY(Float) {
-    u32 decoded;
-    status ret = DECODE_DIRECT(&decoded, UInt32);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-    if(decoded == 0) *dst = 0.0f;
-    else if(decoded == FLOAT_NEG_ZERO) *dst = -0.0f;
-    else if(decoded == FLOAT_INF) *dst = INFINITY;
-    else if(decoded == FLOAT_NEG_INF) *dst = -INFINITY;
-    else if((decoded >= 0x7f800001 && decoded <= 0x7fffffff) ||
-       (decoded >= 0xff800001)) *dst = NAN;
-    else *dst = (UA_Float)unpack754(decoded, 32, 8);
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Double */
-#define DOUBLE_NAN 0xfff8000000000000L
-#define DOUBLE_INF 0x7ff0000000000000L
-#define DOUBLE_NEG_INF 0xfff0000000000000L
-#define DOUBLE_NEG_ZERO 0x8000000000000000L
-
-ENCODE_BINARY(Double) {
-    UA_Double d = *src;
-    u64 encoded;
-    /* cppcheck-suppress duplicateExpression */
-    if(d != d) encoded = DOUBLE_NAN;
-    else if(d == 0.0) encoded = signbit(d) ? DOUBLE_NEG_ZERO : 0;
-    else if(d/d != d/d) encoded = d > 0 ? DOUBLE_INF : DOUBLE_NEG_INF;
-    else encoded = pack754(d, 64, 11);
-    return ENCODE_DIRECT(&encoded, UInt64);
-}
-
-DECODE_BINARY(Double) {
-    u64 decoded;
-    status ret = DECODE_DIRECT(&decoded, UInt64);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-    if(decoded == 0) *dst = 0.0;
-    else if(decoded == DOUBLE_NEG_ZERO) *dst = -0.0;
-    else if(decoded == DOUBLE_INF) *dst = INFINITY;
-    else if(decoded == DOUBLE_NEG_INF) *dst = -INFINITY;
-    else if((decoded >= 0x7ff0000000000001L && decoded <= 0x7fffffffffffffffL) ||
-       (decoded >= 0xfff0000000000001L)) *dst = NAN;
-    else *dst = (UA_Double)unpack754(decoded, 64, 11);
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-/******************/
-/* Array Handling */
-/******************/
-
-static status
-Array_encodeBinaryOverlayable(uintptr_t ptr, size_t length,
-                              size_t elementMemSize, Ctx *ctx) {
-    /* Store the number of already encoded elements */
-    size_t finished = 0;
-
-    /* Loop as long as more elements remain than fit into the chunk */
-    while(ctx->end < ctx->pos + (elementMemSize * (length-finished))) {
-        size_t possible = ((uintptr_t)ctx->end - (uintptr_t)ctx->pos) / (sizeof(u8) * elementMemSize);
-        size_t possibleMem = possible * elementMemSize;
-        memcpy(ctx->pos, (void*)ptr, possibleMem);
-        ctx->pos += possibleMem;
-        ptr += possibleMem;
-        finished += possible;
-        status ret = exchangeBuffer(ctx);
-        ctx->oldpos = NULL; /* Set the sentinel so that no upper stack frame
-                             * with a saved pos attempts to exchange from an
-                             * invalid position in the old buffer. */
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    /* Encode the remaining elements */
-    memcpy(ctx->pos, (void*)ptr, elementMemSize * (length-finished));
-    ctx->pos += elementMemSize * (length-finished);
-    return UA_STATUSCODE_GOOD;
-}
-
-static status
-Array_encodeBinaryComplex(uintptr_t ptr, size_t length,
-                          const UA_DataType *type, Ctx *ctx) {
-    /* Encode every element */
-    for(size_t i = 0; i < length; ++i) {
-        status ret = encodeWithExchangeBuffer((const void*)ptr, type, ctx);
-        ptr += type->memSize;
-
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret; /* Unrecoverable fail */
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static status
-Array_encodeBinary(const void *src, size_t length,
-                   const UA_DataType *type, Ctx *ctx) {
-    /* Check and convert the array length to int32 */
-    i32 signed_length = -1;
-    if(length > UA_INT32_MAX)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    if(length > 0)
-        signed_length = (i32)length;
-    else if(src == UA_EMPTY_ARRAY_SENTINEL)
-        signed_length = 0;
-
-    /* Encode the array length */
-    status ret = ENCODE_WITHEXCHANGE(&signed_length, UA_TYPES_INT32);
-
-    /* Quit early? */
-    if(ret != UA_STATUSCODE_GOOD || length == 0)
-        return ret;
-
-    /* Encode the content */
-    if(!type->overlayable)
-        return Array_encodeBinaryComplex((uintptr_t)src, length, type, ctx);
-    return Array_encodeBinaryOverlayable((uintptr_t)src, length, type->memSize, ctx);
-}
-
-static status
-Array_decodeBinary(void *UA_RESTRICT *UA_RESTRICT dst, size_t *out_length,
-                   const UA_DataType *type, Ctx *ctx) {
-    /* Decode the length */
-    i32 signed_length;
-    status ret = DECODE_DIRECT(&signed_length, UInt32); /* Int32 */
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Return early for empty arrays */
-    if(signed_length <= 0) {
-        *out_length = 0;
-        if(signed_length < 0)
-            *dst = NULL;
-        else
-            *dst = UA_EMPTY_ARRAY_SENTINEL;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Filter out arrays that can obviously not be decoded, because the message
-     * is too small for the array length. This prevents the allocation of very
-     * long arrays for bogus messages.*/
-    size_t length = (size_t)signed_length;
-    if(ctx->pos + ((type->memSize * length) / 32) > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* Allocate memory */
-    *dst = UA_calloc(length, type->memSize);
-    if(!*dst)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    if(type->overlayable) {
-        /* memcpy overlayable array */
-        if(ctx->end < ctx->pos + (type->memSize * length)) {
-            UA_free(*dst);
-            *dst = NULL;
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-        memcpy(*dst, ctx->pos, type->memSize * length);
-        ctx->pos += type->memSize * length;
-    } else {
-        /* Decode array members */
-        uintptr_t ptr = (uintptr_t)*dst;
-        for(size_t i = 0; i < length; ++i) {
-            ret = decodeBinaryJumpTable[type->typeKind]((void*)ptr, type, ctx);
-            if(ret != UA_STATUSCODE_GOOD) {
-                /* +1 because last element is also already initialized */
-                UA_Array_delete(*dst, i+1, type);
-                *dst = NULL;
-                return ret;
-            }
-            ptr += type->memSize;
-        }
-    }
-    *out_length = length;
-    return UA_STATUSCODE_GOOD;
-}
-
-/*****************/
-/* Builtin Types */
-/*****************/
-
-ENCODE_BINARY(String) {
-    return Array_encodeBinary(src->data, src->length, &UA_TYPES[UA_TYPES_BYTE], ctx);
-}
-
-DECODE_BINARY(String) {
-    return Array_decodeBinary((void**)&dst->data, &dst->length, &UA_TYPES[UA_TYPES_BYTE], ctx);
-}
-
-/* Guid */
-ENCODE_BINARY(Guid) {
-    status ret = UA_STATUSCODE_GOOD;
-    ret |= ENCODE_DIRECT(&src->data1, UInt32);
-    ret |= ENCODE_DIRECT(&src->data2, UInt16);
-    ret |= ENCODE_DIRECT(&src->data3, UInt16);
-    if(ctx->pos + (8*sizeof(u8)) > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    memcpy(ctx->pos, src->data4, 8*sizeof(u8));
-    ctx->pos += 8;
-    return ret;
-}
-
-DECODE_BINARY(Guid) {
-    status ret = UA_STATUSCODE_GOOD;
-    ret |= DECODE_DIRECT(&dst->data1, UInt32);
-    ret |= DECODE_DIRECT(&dst->data2, UInt16);
-    ret |= DECODE_DIRECT(&dst->data3, UInt16);
-    if(ctx->pos + (8*sizeof(u8)) > ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    memcpy(dst->data4, ctx->pos, 8*sizeof(u8));
-    ctx->pos += 8;
-    return ret;
-}
-
-/* NodeId */
-#define UA_NODEIDTYPE_NUMERIC_TWOBYTE 0u
-#define UA_NODEIDTYPE_NUMERIC_FOURBYTE 1u
-#define UA_NODEIDTYPE_NUMERIC_COMPLETE 2u
-
-#define UA_EXPANDEDNODEID_SERVERINDEX_FLAG 0x40u
-#define UA_EXPANDEDNODEID_NAMESPACEURI_FLAG 0x80u
-
-/* For ExpandedNodeId, we prefill the encoding mask. */
-static status
-NodeId_encodeBinaryWithEncodingMask(UA_NodeId const *src, u8 encoding, Ctx *ctx) {
-    status ret = UA_STATUSCODE_GOOD;
-    switch(src->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-        if(src->identifier.numeric > UA_UINT16_MAX || src->namespaceIndex > UA_BYTE_MAX) {
-            encoding |= UA_NODEIDTYPE_NUMERIC_COMPLETE;
-            ret |= ENCODE_DIRECT(&encoding, Byte);
-            ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16);
-            ret |= ENCODE_DIRECT(&src->identifier.numeric, UInt32);
-        } else if(src->identifier.numeric > UA_BYTE_MAX || src->namespaceIndex > 0) {
-            encoding |= UA_NODEIDTYPE_NUMERIC_FOURBYTE;
-            ret |= ENCODE_DIRECT(&encoding, Byte);
-            u8 nsindex = (u8)src->namespaceIndex;
-            ret |= ENCODE_DIRECT(&nsindex, Byte);
-            u16 identifier16 = (u16)src->identifier.numeric;
-            ret |= ENCODE_DIRECT(&identifier16, UInt16);
-        } else {
-            encoding |= UA_NODEIDTYPE_NUMERIC_TWOBYTE;
-            ret |= ENCODE_DIRECT(&encoding, Byte);
-            u8 identifier8 = (u8)src->identifier.numeric;
-            ret |= ENCODE_DIRECT(&identifier8, Byte);
-        }
-        break;
-    case UA_NODEIDTYPE_STRING:encoding |= (u8)UA_NODEIDTYPE_STRING;
-        ret |= ENCODE_DIRECT(&encoding, Byte);
-        ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        ret = ENCODE_DIRECT(&src->identifier.string, String);
-        break;
-    case UA_NODEIDTYPE_GUID:encoding |= (u8)UA_NODEIDTYPE_GUID;
-        ret |= ENCODE_DIRECT(&encoding, Byte);
-        ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16);
-        ret |= ENCODE_DIRECT(&src->identifier.guid, Guid);
-        break;
-    case UA_NODEIDTYPE_BYTESTRING:encoding |= (u8)UA_NODEIDTYPE_BYTESTRING;
-        ret |= ENCODE_DIRECT(&encoding, Byte);
-        ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        ret = ENCODE_DIRECT(&src->identifier.byteString, String); /* ByteString */
-        break;
-    default:
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    return ret;
-}
-
-ENCODE_BINARY(NodeId) {
-    return NodeId_encodeBinaryWithEncodingMask(src, 0, ctx);
-}
-
-DECODE_BINARY(NodeId) {
-    u8 dstByte = 0, encodingByte = 0;
-    u16 dstUInt16 = 0;
-
-    /* Decode the encoding bitfield */
-    status ret = DECODE_DIRECT(&encodingByte, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Filter out the bits used only for ExpandedNodeIds */
-    encodingByte &= (u8)~(u8)(UA_EXPANDEDNODEID_SERVERINDEX_FLAG |
-                              UA_EXPANDEDNODEID_NAMESPACEURI_FLAG);
-
-    /* Decode the namespace and identifier */
-    switch(encodingByte) {
-    case UA_NODEIDTYPE_NUMERIC_TWOBYTE:
-        dst->identifierType = UA_NODEIDTYPE_NUMERIC;
-        ret = DECODE_DIRECT(&dstByte, Byte);
-        dst->identifier.numeric = dstByte;
-        dst->namespaceIndex = 0;
-        break;
-    case UA_NODEIDTYPE_NUMERIC_FOURBYTE:
-        dst->identifierType = UA_NODEIDTYPE_NUMERIC;
-        ret |= DECODE_DIRECT(&dstByte, Byte);
-        dst->namespaceIndex = dstByte;
-        ret |= DECODE_DIRECT(&dstUInt16, UInt16);
-        dst->identifier.numeric = dstUInt16;
-        break;
-    case UA_NODEIDTYPE_NUMERIC_COMPLETE:
-        dst->identifierType = UA_NODEIDTYPE_NUMERIC;
-        ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16);
-        ret |= DECODE_DIRECT(&dst->identifier.numeric, UInt32);
-        break;
-    case UA_NODEIDTYPE_STRING:
-        dst->identifierType = UA_NODEIDTYPE_STRING;
-        ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16);
-        ret |= DECODE_DIRECT(&dst->identifier.string, String);
-        break;
-    case UA_NODEIDTYPE_GUID:
-        dst->identifierType = UA_NODEIDTYPE_GUID;
-        ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16);
-        ret |= DECODE_DIRECT(&dst->identifier.guid, Guid);
-        break;
-    case UA_NODEIDTYPE_BYTESTRING:
-        dst->identifierType = UA_NODEIDTYPE_BYTESTRING;
-        ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16);
-        ret |= DECODE_DIRECT(&dst->identifier.byteString, String); /* ByteString */
-        break;
-    default:
-        ret |= UA_STATUSCODE_BADINTERNALERROR;
-        break;
-    }
-    return ret;
-}
-
-/* ExpandedNodeId */
-ENCODE_BINARY(ExpandedNodeId) {
-    /* Set up the encoding mask */
-    u8 encoding = 0;
-    if((void*)src->namespaceUri.data > UA_EMPTY_ARRAY_SENTINEL)
-        encoding |= UA_EXPANDEDNODEID_NAMESPACEURI_FLAG;
-    if(src->serverIndex > 0)
-        encoding |= UA_EXPANDEDNODEID_SERVERINDEX_FLAG;
-
-    /* Encode the NodeId */
-    status ret = NodeId_encodeBinaryWithEncodingMask(&src->nodeId, encoding, ctx);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Encode the namespace. */
-    if((void*)src->namespaceUri.data > UA_EMPTY_ARRAY_SENTINEL) {
-        ret = ENCODE_DIRECT(&src->namespaceUri, String);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    /* Encode the serverIndex */
-    if(src->serverIndex > 0)
-        ret = ENCODE_WITHEXCHANGE(&src->serverIndex, UA_TYPES_UINT32);
-    return ret;
-}
-
-DECODE_BINARY(ExpandedNodeId) {
-    /* Decode the encoding mask */
-    if(ctx->pos >= ctx->end)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    u8 encoding = *ctx->pos;
-
-    /* Decode the NodeId */
-    status ret = DECODE_DIRECT(&dst->nodeId, NodeId);
-
-    /* Decode the NamespaceUri */
-    if(encoding & UA_EXPANDEDNODEID_NAMESPACEURI_FLAG) {
-        dst->nodeId.namespaceIndex = 0;
-        ret |= DECODE_DIRECT(&dst->namespaceUri, String);
-    }
-
-    /* Decode the ServerIndex */
-    if(encoding & UA_EXPANDEDNODEID_SERVERINDEX_FLAG)
-        ret |= DECODE_DIRECT(&dst->serverIndex, UInt32);
-    return ret;
-}
-
-/* QualifiedName */
-ENCODE_BINARY(QualifiedName) {
-    status ret = ENCODE_DIRECT(&src->namespaceIndex, UInt16);
-    ret |= ENCODE_DIRECT(&src->name, String);
-    return ret;
-}
-
-DECODE_BINARY(QualifiedName) {
-    status ret = DECODE_DIRECT(&dst->namespaceIndex, UInt16);
-    ret |= DECODE_DIRECT(&dst->name, String);
-    return ret;
-}
-
-/* LocalizedText */
-#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE 0x01u
-#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT 0x02u
-
-ENCODE_BINARY(LocalizedText) {
-    /* Set up the encoding mask */
-    u8 encoding = 0;
-    if(src->locale.data)
-        encoding |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE;
-    if(src->text.data)
-        encoding |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
-
-    /* Encode the encoding byte */
-    status ret = ENCODE_DIRECT(&encoding, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Encode the strings */
-    if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE)
-        ret |= ENCODE_DIRECT(&src->locale, String);
-    if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT)
-        ret |= ENCODE_DIRECT(&src->text, String);
-    return ret;
-}
-
-DECODE_BINARY(LocalizedText) {
-    /* Decode the encoding mask */
-    u8 encoding = 0;
-    status ret = DECODE_DIRECT(&encoding, Byte);
-
-    /* Decode the content */
-    if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE)
-        ret |= DECODE_DIRECT(&dst->locale, String);
-    if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT)
-        ret |= DECODE_DIRECT(&dst->text, String);
-    return ret;
-}
-
-/* The binary encoding has a different nodeid from the data type. So it is not
- * possible to reuse UA_findDataType */
-static const UA_DataType *
-UA_findDataTypeByBinaryInternal(const UA_NodeId *typeId, Ctx *ctx) {
-    /* We only store a numeric identifier for the encoding nodeid of data types */
-    if(typeId->identifierType != UA_NODEIDTYPE_NUMERIC)
-        return NULL;
-
-    /* Always look in built-in types first
-     * (may contain data types from all namespaces) */
-    for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
-        if(UA_TYPES[i].binaryEncodingId == typeId->identifier.numeric &&
-           UA_TYPES[i].typeId.namespaceIndex == typeId->namespaceIndex)
-            return &UA_TYPES[i];
-    }
-
-    const UA_DataTypeArray *customTypes = ctx->customTypes;
-    while(customTypes) {
-        for(size_t i = 0; i < customTypes->typesSize; ++i) {
-            if(customTypes->types[i].binaryEncodingId == typeId->identifier.numeric &&
-               customTypes->types[i].typeId.namespaceIndex == typeId->namespaceIndex)
-                return &customTypes->types[i];
-        }
-        customTypes = customTypes->next;
-    }
-
-    return NULL;
-}
-
-const UA_DataType *
-UA_findDataTypeByBinary(const UA_NodeId *typeId) {
-    Ctx ctx;
-    ctx.customTypes = NULL;
-    return UA_findDataTypeByBinaryInternal(typeId, &ctx);
-}
-
-/* ExtensionObject */
-ENCODE_BINARY(ExtensionObject) {
-    u8 encoding = (u8)src->encoding;
-
-    /* No content or already encoded content. */
-    if(encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) {
-        status ret = ENCODE_DIRECT(&src->content.encoded.typeId, NodeId);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        ret = ENCODE_WITHEXCHANGE(&encoding, UA_TYPES_BYTE);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        switch(src->encoding) {
-        case UA_EXTENSIONOBJECT_ENCODED_NOBODY:
-            break;
-        case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING:
-        case UA_EXTENSIONOBJECT_ENCODED_XML:
-            ret = ENCODE_DIRECT(&src->content.encoded.body, String); /* ByteString */
-            break;
-        default:
-            ret = UA_STATUSCODE_BADINTERNALERROR;
-        }
-        return ret;
-    }
-
-    /* Cannot encode with no data or no type description */
-    if(!src->content.decoded.type || !src->content.decoded.data)
-        return UA_STATUSCODE_BADENCODINGERROR;
-
-    /* Write the NodeId for the binary encoded type. The NodeId is always
-     * numeric, so no buffer replacement is taking place. */
-    UA_NodeId typeId = src->content.decoded.type->typeId;
-    if(typeId.identifierType != UA_NODEIDTYPE_NUMERIC)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    typeId.identifier.numeric = src->content.decoded.type->binaryEncodingId;
-    status ret = ENCODE_DIRECT(&typeId, NodeId);
-
-    /* Write the encoding byte */
-    encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-    ret |= ENCODE_DIRECT(&encoding, Byte);
-
-    /* Compute the content length */
-    const UA_DataType *contentType = src->content.decoded.type;
-    size_t len = UA_calcSizeBinary(src->content.decoded.data, contentType);
-
-    /* Encode the content length */
-    if(len > UA_INT32_MAX)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    i32 signed_len = (i32)len;
-    ret |= ENCODE_DIRECT(&signed_len, UInt32); /* Int32 */
-
-    /* Return early upon failures (no buffer exchange until here) */
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Encode the content */
-    return encodeWithExchangeBuffer(src->content.decoded.data, contentType, ctx);
-}
-
-static status
-ExtensionObject_decodeBinaryContent(UA_ExtensionObject *dst, const UA_NodeId *typeId, Ctx *ctx) {
-    /* Lookup the datatype */
-    const UA_DataType *type = UA_findDataTypeByBinaryInternal(typeId, ctx);
-
-    /* Unknown type, just take the binary content */
-    if(!type) {
-        dst->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-        UA_NodeId_copy(typeId, &dst->content.encoded.typeId);
-        return DECODE_DIRECT(&dst->content.encoded.body, String); /* ByteString */
-    }
-
-    /* Allocate memory */
-    dst->content.decoded.data = UA_new(type);
-    if(!dst->content.decoded.data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Jump over the length field (TODO: check if the decoded length matches) */
-    ctx->pos += 4;
-
-    /* Decode */
-    dst->encoding = UA_EXTENSIONOBJECT_DECODED;
-    dst->content.decoded.type = type;
-    return decodeBinaryJumpTable[type->typeKind](dst->content.decoded.data, type, ctx);
-}
-
-DECODE_BINARY(ExtensionObject) {
-    u8 encoding = 0;
-    UA_NodeId binTypeId; /* Can contain a string nodeid. But no corresponding
-                          * type is then found in open62541. We only store
-                          * numerical nodeids of the binary encoding identifier.
-                          * The extenionobject will be decoded to contain a
-                          * binary blob. */
-    UA_NodeId_init(&binTypeId);
-    status ret = UA_STATUSCODE_GOOD;
-    ret |= DECODE_DIRECT(&binTypeId, NodeId);
-    ret |= DECODE_DIRECT(&encoding, Byte);
-    if(ret != UA_STATUSCODE_GOOD) {
-        UA_NodeId_clear(&binTypeId);
-        return ret;
-    }
-
-    switch(encoding) {
-    case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING:
-        ret = ExtensionObject_decodeBinaryContent(dst, &binTypeId, ctx);
-        UA_NodeId_deleteMembers(&binTypeId);
-        break;
-    case UA_EXTENSIONOBJECT_ENCODED_NOBODY:
-        dst->encoding = (UA_ExtensionObjectEncoding)encoding;
-        dst->content.encoded.typeId = binTypeId; /* move to dst */
-        dst->content.encoded.body = UA_BYTESTRING_NULL;
-        break;
-    case UA_EXTENSIONOBJECT_ENCODED_XML:
-        dst->encoding = (UA_ExtensionObjectEncoding)encoding;
-        dst->content.encoded.typeId = binTypeId; /* move to dst */
-        ret = DECODE_DIRECT(&dst->content.encoded.body, String); /* ByteString */
-        if(ret != UA_STATUSCODE_GOOD)
-            UA_NodeId_clear(&dst->content.encoded.typeId);
-        break;
-    default:
-        UA_NodeId_clear(&binTypeId);
-        ret = UA_STATUSCODE_BADDECODINGERROR;
-        break;
-    }
-
-    return ret;
-}
-
-/* Variant */
-
-static status
-Variant_encodeBinaryWrapExtensionObject(const UA_Variant *src,
-                                        const UA_Boolean isArray, Ctx *ctx) {
-    /* Default to 1 for a scalar. */
-    size_t length = 1;
-
-    /* Encode the array length if required */
-    status ret = UA_STATUSCODE_GOOD;
-    if(isArray) {
-        if(src->arrayLength > UA_INT32_MAX)
-            return UA_STATUSCODE_BADENCODINGERROR;
-        length = src->arrayLength;
-        i32 encodedLength = (i32)src->arrayLength;
-        ret = ENCODE_DIRECT(&encodedLength, UInt32); /* Int32 */
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    /* Set up the ExtensionObject */
-    UA_ExtensionObject eo;
-    UA_ExtensionObject_init(&eo);
-    eo.encoding = UA_EXTENSIONOBJECT_DECODED;
-    eo.content.decoded.type = src->type;
-    const u16 memSize = src->type->memSize;
-    uintptr_t ptr = (uintptr_t)src->data;
-
-    /* Iterate over the array */
-    for(size_t i = 0; i < length && ret == UA_STATUSCODE_GOOD; ++i) {
-        eo.content.decoded.data = (void*)ptr;
-        ret = encodeWithExchangeBuffer(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], ctx);
-        ptr += memSize;
-    }
-    return ret;
-}
-
-enum UA_VARIANT_ENCODINGMASKTYPE {
-    UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK = 0x3Fu,        /* bits 0:5 */
-    UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS = (u8)(0x01u << 6u), /* bit 6 */
-    UA_VARIANT_ENCODINGMASKTYPE_ARRAY = (u8)(0x01u << 7u)  /* bit 7 */
-};
-
-ENCODE_BINARY(Variant) {
-    /* Quit early for the empty variant */
-    u8 encoding = 0;
-    if(!src->type)
-        return ENCODE_DIRECT(&encoding, Byte);
-
-    /* Set the content type in the encoding mask */
-    const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO);
-    const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM);
-    if(isBuiltin)
-        encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(src->type->typeKind + 1u)));
-    else if(isEnum)
-        encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_INT32 + 1u)));
-    else
-        encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_EXTENSIONOBJECT + 1u)));
-
-    /* Set the array type in the encoding mask */
-    const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL;
-    const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0;
-    if(isArray) {
-        encoding |= (u8)UA_VARIANT_ENCODINGMASKTYPE_ARRAY;
-        if(hasDimensions)
-            encoding |= (u8)UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS;
-    }
-
-    /* Encode the encoding byte */
-    status ret = ENCODE_DIRECT(&encoding, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Encode the content */
-    if(!isBuiltin && !isEnum)
-        ret = Variant_encodeBinaryWrapExtensionObject(src, isArray, ctx);
-    else if(!isArray)
-        ret = encodeWithExchangeBuffer(src->data, src->type, ctx);
-    else
-        ret = Array_encodeBinary(src->data, src->arrayLength, src->type, ctx);
-
-    /* Encode the array dimensions */
-    if(hasDimensions && ret == UA_STATUSCODE_GOOD)
-        ret = Array_encodeBinary(src->arrayDimensions, src->arrayDimensionsSize,
-                                 &UA_TYPES[UA_TYPES_INT32], ctx);
-    return ret;
-}
-
-static status
-Variant_decodeBinaryUnwrapExtensionObject(UA_Variant *dst, Ctx *ctx) {
-    /* Save the position in the ByteString. If unwrapping is not possible, start
-     * from here to decode a normal ExtensionObject. */
-    u8 *old_pos = ctx->pos;
-
-    /* Decode the DataType */
-    UA_NodeId typeId;
-    UA_NodeId_init(&typeId);
-    status ret = DECODE_DIRECT(&typeId, NodeId);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Decode the EncodingByte */
-    u8 encoding;
-    ret = DECODE_DIRECT(&encoding, Byte);
-    if(ret != UA_STATUSCODE_GOOD) {
-        UA_NodeId_clear(&typeId);
-        return ret;
-    }
-
-    /* Search for the datatype. Default to ExtensionObject. */
-    if(encoding == UA_EXTENSIONOBJECT_ENCODED_BYTESTRING &&
-       (dst->type = UA_findDataTypeByBinaryInternal(&typeId, ctx)) != NULL) {
-        /* Jump over the length field (TODO: check if length matches) */
-        ctx->pos += 4;
-    } else {
-        /* Reset and decode as ExtensionObject */
-        dst->type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
-        ctx->pos = old_pos;
-        UA_NodeId_clear(&typeId);
-    }
-
-    /* Allocate memory */
-    dst->data = UA_new(dst->type);
-    if(!dst->data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    /* Decode the content */
-    return decodeBinaryJumpTable[dst->type->typeKind](dst->data, dst->type, ctx);
-}
-
-/* The resulting variant always has the storagetype UA_VARIANT_DATA. */
-DECODE_BINARY(Variant) {
-    /* Decode the encoding byte */
-    u8 encodingByte;
-    status ret = DECODE_DIRECT(&encodingByte, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Return early for an empty variant (was already _inited) */
-    if(encodingByte == 0)
-        return UA_STATUSCODE_GOOD;
-
-    /* Does the variant contain an array? */
-    const UA_Boolean isArray = (encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_ARRAY) > 0;
-
-    /* Get the datatype of the content. The type must be a builtin data type.
-     * All not-builtin types are wrapped in an ExtensionObject. The "type kind"
-     * for types up to DiagnsticInfo equals to the index in the encoding
-     * byte. */
-    size_t typeKind = (size_t)((encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK) - 1);
-    if(typeKind > UA_DATATYPEKIND_DIAGNOSTICINFO)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* A variant cannot contain a variant. But it can contain an array of
-     * variants */
-    if(typeKind == UA_DATATYPEKIND_VARIANT && !isArray)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* Check the recursion limit */
-    if(ctx->depth > UA_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    ctx->depth++;
-
-    /* Decode the content */
-    dst->type = &UA_TYPES[typeKind];
-    if(isArray) {
-        ret = Array_decodeBinary(&dst->data, &dst->arrayLength, dst->type, ctx);
-    } else if(typeKind != UA_DATATYPEKIND_EXTENSIONOBJECT) {
-        dst->data = UA_new(dst->type);
-        if(!dst->data)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        ret = decodeBinaryJumpTable[typeKind](dst->data, dst->type, ctx);
-    } else {
-        ret = Variant_decodeBinaryUnwrapExtensionObject(dst, ctx);
-    }
-
-    /* Decode array dimensions */
-    if(isArray && (encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS) > 0)
-        ret |= Array_decodeBinary((void**)&dst->arrayDimensions, &dst->arrayDimensionsSize,
-                                  &UA_TYPES[UA_TYPES_INT32], ctx);
-
-    ctx->depth--;
-    return ret;
-}
-
-/* DataValue */
-ENCODE_BINARY(DataValue) {
-    /* Set up the encoding mask */
-    u8 encodingMask = src->hasValue;
-    encodingMask |= (u8)(src->hasStatus << 1u);
-    encodingMask |= (u8)(src->hasSourceTimestamp << 2u);
-    encodingMask |= (u8)(src->hasServerTimestamp << 3u);
-    encodingMask |= (u8)(src->hasSourcePicoseconds << 4u);
-    encodingMask |= (u8)(src->hasServerPicoseconds << 5u);
-
-    /* Encode the encoding byte */
-    status ret = ENCODE_DIRECT(&encodingMask, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Encode the variant. */
-    if(src->hasValue) {
-        ret = ENCODE_DIRECT(&src->value, Variant);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(src->hasStatus)
-        ret |= ENCODE_WITHEXCHANGE(&src->status, UA_TYPES_STATUSCODE);
-    if(src->hasSourceTimestamp)
-        ret |= ENCODE_WITHEXCHANGE(&src->sourceTimestamp, UA_TYPES_DATETIME);
-    if(src->hasSourcePicoseconds)
-        ret |= ENCODE_WITHEXCHANGE(&src->sourcePicoseconds, UA_TYPES_UINT16);
-    if(src->hasServerTimestamp)
-        ret |= ENCODE_WITHEXCHANGE(&src->serverTimestamp, UA_TYPES_DATETIME);
-    if(src->hasServerPicoseconds)
-        ret |= ENCODE_WITHEXCHANGE(&src->serverPicoseconds, UA_TYPES_UINT16);
-    return ret;
-}
-
-#define MAX_PICO_SECONDS 9999
-
-DECODE_BINARY(DataValue) {
-    /* Decode the encoding mask */
-    u8 encodingMask;
-    status ret = DECODE_DIRECT(&encodingMask, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Check the recursion limit */
-    if(ctx->depth > UA_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    ctx->depth++;
-
-    /* Decode the content */
-    if(encodingMask & 0x01u) {
-        dst->hasValue = true;
-        ret |= DECODE_DIRECT(&dst->value, Variant);
-    }
-    if(encodingMask & 0x02u) {
-        dst->hasStatus = true;
-        ret |= DECODE_DIRECT(&dst->status, UInt32); /* StatusCode */
-    }
-    if(encodingMask & 0x04u) {
-        dst->hasSourceTimestamp = true;
-        ret |= DECODE_DIRECT(&dst->sourceTimestamp, UInt64); /* DateTime */
-    }
-    if(encodingMask & 0x10u) {
-        dst->hasSourcePicoseconds = true;
-        ret |= DECODE_DIRECT(&dst->sourcePicoseconds, UInt16);
-        if(dst->sourcePicoseconds > MAX_PICO_SECONDS)
-            dst->sourcePicoseconds = MAX_PICO_SECONDS;
-    }
-    if(encodingMask & 0x08u) {
-        dst->hasServerTimestamp = true;
-        ret |= DECODE_DIRECT(&dst->serverTimestamp, UInt64); /* DateTime */
-    }
-    if(encodingMask & 0x20u) {
-        dst->hasServerPicoseconds = true;
-        ret |= DECODE_DIRECT(&dst->serverPicoseconds, UInt16);
-        if(dst->serverPicoseconds > MAX_PICO_SECONDS)
-            dst->serverPicoseconds = MAX_PICO_SECONDS;
-    }
-
-    ctx->depth--;
-
-    return ret;
-}
-
-/* DiagnosticInfo */
-ENCODE_BINARY(DiagnosticInfo) {
-    /* Set up the encoding mask */
-    u8 encodingMask = src->hasSymbolicId;
-    encodingMask |= (u8)(src->hasNamespaceUri << 1u);
-    encodingMask |= (u8)(src->hasLocalizedText << 2u);
-    encodingMask |= (u8)(src->hasLocale << 3u);
-    encodingMask |= (u8)(src->hasAdditionalInfo << 4u);
-    encodingMask |= (u8)(src->hasInnerDiagnosticInfo << 5u);
-
-    /* Encode the numeric content */
-    status ret = ENCODE_DIRECT(&encodingMask, Byte);
-    if(src->hasSymbolicId)
-        ret |= ENCODE_DIRECT(&src->symbolicId, UInt32); /* Int32 */
-    if(src->hasNamespaceUri)
-        ret |= ENCODE_DIRECT(&src->namespaceUri, UInt32); /* Int32 */
-    if(src->hasLocalizedText)
-        ret |= ENCODE_DIRECT(&src->localizedText, UInt32); /* Int32 */
-    if(src->hasLocale)
-        ret |= ENCODE_DIRECT(&src->locale, UInt32); /* Int32 */
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Encode the additional info */
-    if(src->hasAdditionalInfo) {
-        ret = ENCODE_DIRECT(&src->additionalInfo, String);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    /* Encode the inner status code */
-    if(src->hasInnerStatusCode) {
-        ret = ENCODE_WITHEXCHANGE(&src->innerStatusCode, UA_TYPES_UINT32);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    /* Encode the inner diagnostic info */
-    if(src->hasInnerDiagnosticInfo)
-        // innerDiagnosticInfo is already a pointer, so don't use the & reference here
-        ret = ENCODE_WITHEXCHANGE(src->innerDiagnosticInfo,
-                                  UA_TYPES_DIAGNOSTICINFO);
-
-    return ret;
-}
-
-DECODE_BINARY(DiagnosticInfo) {
-    /* Decode the encoding mask */
-    u8 encodingMask;
-    status ret = DECODE_DIRECT(&encodingMask, Byte);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    /* Decode the content */
-    if(encodingMask & 0x01u) {
-        dst->hasSymbolicId = true;
-        ret |= DECODE_DIRECT(&dst->symbolicId, UInt32); /* Int32 */
-    }
-    if(encodingMask & 0x02u) {
-        dst->hasNamespaceUri = true;
-        ret |= DECODE_DIRECT(&dst->namespaceUri, UInt32); /* Int32 */
-    }
-    if(encodingMask & 0x04u) {
-        dst->hasLocalizedText = true;
-        ret |= DECODE_DIRECT(&dst->localizedText, UInt32); /* Int32 */
-    }
-    if(encodingMask & 0x08u) {
-        dst->hasLocale = true;
-        ret |= DECODE_DIRECT(&dst->locale, UInt32); /* Int32 */
-    }
-    if(encodingMask & 0x10u) {
-        dst->hasAdditionalInfo = true;
-        ret |= DECODE_DIRECT(&dst->additionalInfo, String);
-    }
-    if(encodingMask & 0x20u) {
-        dst->hasInnerStatusCode = true;
-        ret |= DECODE_DIRECT(&dst->innerStatusCode, UInt32); /* StatusCode */
-    }
-    if(encodingMask & 0x40u) {
-        /* innerDiagnosticInfo is allocated on the heap */
-        dst->innerDiagnosticInfo = (UA_DiagnosticInfo*)
-            UA_calloc(1, sizeof(UA_DiagnosticInfo));
-        if(!dst->innerDiagnosticInfo)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        dst->hasInnerDiagnosticInfo = true;
-
-        /* Check the recursion limit */
-        if(ctx->depth > UA_ENCODING_MAX_RECURSION)
-            return UA_STATUSCODE_BADENCODINGERROR;
-
-        ctx->depth++;
-        ret |= DECODE_DIRECT(dst->innerDiagnosticInfo, DiagnosticInfo);
-        ctx->depth--;
-    }
-    return ret;
-}
-
-static status
-encodeBinaryStruct(const void *src, const UA_DataType *type, Ctx *ctx) {
-    /* Check the recursion limit */
-    if(ctx->depth > UA_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    ctx->depth++;
-
-    uintptr_t ptr = (uintptr_t)src;
-    status ret = UA_STATUSCODE_GOOD;
-    u8 membersSize = type->membersSize;
-    const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] };
-
-    /* Loop over members */
-    for(size_t i = 0; i < membersSize; ++i) {
-        const UA_DataTypeMember *m = &type->members[i];
-        const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex];
-        ptr += m->padding;
-
-        /* Array. Buffer-exchange is done inside Array_encodeBinary if required. */
-        if(m->isArray) {
-            const size_t length = *((const size_t*)ptr);
-            ptr += sizeof(size_t);
-            ret = Array_encodeBinary(*(void *UA_RESTRICT const *)ptr, length, mt, ctx);
-            ptr += sizeof(void*);
-            continue;
-        }
-
-        /* Scalar */
-        ret = encodeWithExchangeBuffer((const void*)ptr, mt, ctx);
-        ptr += mt->memSize;
-    }
-
-    ctx->depth--;
-    return ret;
-}
-
-static status
-encodeBinaryNotImplemented(const void *src, const UA_DataType *type, Ctx *ctx) {
-    (void)src, (void)type, (void)ctx;
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-/********************/
-/* Structured Types */
-/********************/
-
-const encodeBinarySignature encodeBinaryJumpTable[UA_DATATYPEKINDS] = {
-    (encodeBinarySignature)Boolean_encodeBinary,
-    (encodeBinarySignature)Byte_encodeBinary, /* SByte */
-    (encodeBinarySignature)Byte_encodeBinary,
-    (encodeBinarySignature)UInt16_encodeBinary, /* Int16 */
-    (encodeBinarySignature)UInt16_encodeBinary,
-    (encodeBinarySignature)UInt32_encodeBinary, /* Int32 */
-    (encodeBinarySignature)UInt32_encodeBinary,
-    (encodeBinarySignature)UInt64_encodeBinary, /* Int64 */
-    (encodeBinarySignature)UInt64_encodeBinary,
-    (encodeBinarySignature)Float_encodeBinary,
-    (encodeBinarySignature)Double_encodeBinary,
-    (encodeBinarySignature)String_encodeBinary,
-    (encodeBinarySignature)UInt64_encodeBinary, /* DateTime */
-    (encodeBinarySignature)Guid_encodeBinary,
-    (encodeBinarySignature)String_encodeBinary, /* ByteString */
-    (encodeBinarySignature)String_encodeBinary, /* XmlElement */
-    (encodeBinarySignature)NodeId_encodeBinary,
-    (encodeBinarySignature)ExpandedNodeId_encodeBinary,
-    (encodeBinarySignature)UInt32_encodeBinary, /* StatusCode */
-    (encodeBinarySignature)QualifiedName_encodeBinary,
-    (encodeBinarySignature)LocalizedText_encodeBinary,
-    (encodeBinarySignature)ExtensionObject_encodeBinary,
-    (encodeBinarySignature)DataValue_encodeBinary,
-    (encodeBinarySignature)Variant_encodeBinary,
-    (encodeBinarySignature)DiagnosticInfo_encodeBinary,
-    (encodeBinarySignature)encodeBinaryNotImplemented, /* Decimal */
-    (encodeBinarySignature)UInt32_encodeBinary, /* Enumeration */
-    (encodeBinarySignature)encodeBinaryStruct,
-    (encodeBinarySignature)encodeBinaryNotImplemented, /* Structure with Optional Fields */
-    (encodeBinarySignature)encodeBinaryStruct, /* Union */
-    (encodeBinarySignature)encodeBinaryStruct /* BitfieldCluster */
-};
-
-status
-UA_encodeBinary(const void *src, const UA_DataType *type,
-                u8 **bufPos, const u8 **bufEnd,
-                UA_exchangeEncodeBuffer exchangeCallback, void *exchangeHandle) {
-    /* Set up the context */
-    Ctx ctx;
-    ctx.pos = *bufPos;
-    ctx.end = *bufEnd;
-    ctx.depth = 0;
-    ctx.exchangeBufferCallback = exchangeCallback;
-    ctx.exchangeBufferCallbackHandle = exchangeHandle;
-
-    if(!ctx.pos)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    /* Encode */
-    status ret = encodeWithExchangeBuffer(src, type, &ctx);
-
-    /* Set the new buffer position for the output. Beware that the buffer might
-     * have been exchanged internally. */
-    *bufPos = ctx.pos;
-    *bufEnd = ctx.end;
-    return ret;
-}
-
-static status
-decodeBinaryNotImplemented(void *dst, const UA_DataType *type, Ctx *ctx) {
-    (void)dst, (void)type, (void)ctx;
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-static status
-decodeBinaryStructure(void *dst, const UA_DataType *type, Ctx *ctx) {
-    /* Check the recursion limit */
-    if(ctx->depth > UA_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    ctx->depth++;
-
-    uintptr_t ptr = (uintptr_t)dst;
-    status ret = UA_STATUSCODE_GOOD;
-    u8 membersSize = type->membersSize;
-    const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] };
-
-    /* Loop over members */
-    for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) {
-        const UA_DataTypeMember *m = &type->members[i];
-        const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex];
-        ptr += m->padding;
-
-        /* Array */
-        if(m->isArray) {
-            size_t *length = (size_t*)ptr;
-            ptr += sizeof(size_t);
-            ret = Array_decodeBinary((void *UA_RESTRICT *UA_RESTRICT)ptr, length, mt , ctx);
-            ptr += sizeof(void*);
-            continue;
-        }
-
-        /* Scalar */
-        ret = decodeBinaryJumpTable[mt->typeKind]((void *UA_RESTRICT)ptr, mt, ctx);
-        ptr += mt->memSize;
-    }
-
-    ctx->depth--;
-    return ret;
-}
-
-const decodeBinarySignature decodeBinaryJumpTable[UA_DATATYPEKINDS] = {
-    (decodeBinarySignature)Boolean_decodeBinary,
-    (decodeBinarySignature)Byte_decodeBinary, /* SByte */
-    (decodeBinarySignature)Byte_decodeBinary,
-    (decodeBinarySignature)UInt16_decodeBinary, /* Int16 */
-    (decodeBinarySignature)UInt16_decodeBinary,
-    (decodeBinarySignature)UInt32_decodeBinary, /* Int32 */
-    (decodeBinarySignature)UInt32_decodeBinary,
-    (decodeBinarySignature)UInt64_decodeBinary, /* Int64 */
-    (decodeBinarySignature)UInt64_decodeBinary,
-    (decodeBinarySignature)Float_decodeBinary,
-    (decodeBinarySignature)Double_decodeBinary,
-    (decodeBinarySignature)String_decodeBinary,
-    (decodeBinarySignature)UInt64_decodeBinary, /* DateTime */
-    (decodeBinarySignature)Guid_decodeBinary,
-    (decodeBinarySignature)String_decodeBinary, /* ByteString */
-    (decodeBinarySignature)String_decodeBinary, /* XmlElement */
-    (decodeBinarySignature)NodeId_decodeBinary,
-    (decodeBinarySignature)ExpandedNodeId_decodeBinary,
-    (decodeBinarySignature)UInt32_decodeBinary, /* StatusCode */
-    (decodeBinarySignature)QualifiedName_decodeBinary,
-    (decodeBinarySignature)LocalizedText_decodeBinary,
-    (decodeBinarySignature)ExtensionObject_decodeBinary,
-    (decodeBinarySignature)DataValue_decodeBinary,
-    (decodeBinarySignature)Variant_decodeBinary,
-    (decodeBinarySignature)DiagnosticInfo_decodeBinary,
-    (decodeBinarySignature)decodeBinaryNotImplemented, /* Decimal */
-    (decodeBinarySignature)UInt32_decodeBinary, /* Enumeration */
-    (decodeBinarySignature)decodeBinaryStructure,
-    (decodeBinarySignature)decodeBinaryNotImplemented, /* Structure with optional fields */
-    (decodeBinarySignature)decodeBinaryNotImplemented, /* Union */
-    (decodeBinarySignature)decodeBinaryNotImplemented /* BitfieldCluster */
-};
-
-status
-UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst,
-                const UA_DataType *type, const UA_DataTypeArray *customTypes) {
-    /* Set up the context */
-    Ctx ctx;
-    ctx.pos = &src->data[*offset];
-    ctx.end = &src->data[src->length];
-    ctx.depth = 0;
-    ctx.customTypes = customTypes;
-
-    /* Decode */
-    memset(dst, 0, type->memSize); /* Initialize the value */
-    status ret = decodeBinaryJumpTable[type->typeKind](dst, type, &ctx);
-
-    if(ret == UA_STATUSCODE_GOOD) {
-        /* Set the new offset */
-        *offset = (size_t)(ctx.pos - src->data) / sizeof(u8);
-    } else {
-        /* Clean up */
-        UA_clear(dst, type);
-        memset(dst, 0, type->memSize);
-    }
-    return ret;
-}
-
-/**
- * Compute the Message Size
- * ------------------------
- * The following methods are used to compute the length of a datum in binary
- * encoding. */
-
-static size_t
-Array_calcSizeBinary(const void *src, size_t length, const UA_DataType *type) {
-    size_t s = 4; /* length */
-    if(type->overlayable) {
-        s += type->memSize * length;
-        return s;
-    }
-    uintptr_t ptr = (uintptr_t)src;
-    for(size_t i = 0; i < length; ++i) {
-        s += calcSizeBinaryJumpTable[type->typeKind]((const void*)ptr, type);
-        ptr += type->memSize;
-    }
-    return s;
-}
-
-static size_t calcSizeBinary1(const void *_, const UA_DataType *__) { (void)_, (void)__; return 1; }
-static size_t calcSizeBinary2(const void *_, const UA_DataType *__) { (void)_, (void)__; return 2; }
-static size_t calcSizeBinary4(const void *_, const UA_DataType *__) { (void)_, (void)__; return 4; }
-static size_t calcSizeBinary8(const void *_, const UA_DataType *__) { (void)_, (void)__; return 8; }
-
-CALCSIZE_BINARY(String) { return 4 + src->length; }
-
-CALCSIZE_BINARY(Guid) { return 16; }
-
-CALCSIZE_BINARY(NodeId) {
-    size_t s = 1; /* Encoding byte */
-    switch(src->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-        if(src->identifier.numeric > UA_UINT16_MAX || src->namespaceIndex > UA_BYTE_MAX) {
-            s += 6;
-        } else if(src->identifier.numeric > UA_BYTE_MAX || src->namespaceIndex > 0) {
-            s += 3;
-        } else {
-            s += 1;
-        }
-        break;
-    case UA_NODEIDTYPE_BYTESTRING:
-    case UA_NODEIDTYPE_STRING:
-        s += 2;
-        s += String_calcSizeBinary(&src->identifier.string, NULL);
-        break;
-    case UA_NODEIDTYPE_GUID:
-        s += 18;
-        break;
-    default:
-        return 0;
-    }
-    return s;
-}
-
-CALCSIZE_BINARY(ExpandedNodeId) {
-    size_t s = NodeId_calcSizeBinary(&src->nodeId, NULL);
-    if(src->namespaceUri.length > 0)
-        s += String_calcSizeBinary(&src->namespaceUri, NULL);
-    if(src->serverIndex > 0)
-        s += 4;
-    return s;
-}
-
-CALCSIZE_BINARY(QualifiedName) {
-    return 2 + String_calcSizeBinary(&src->name, NULL);
-}
-
-CALCSIZE_BINARY(LocalizedText) {
-    size_t s = 1; /* Encoding byte */
-    if(src->locale.data)
-        s += String_calcSizeBinary(&src->locale, NULL);
-    if(src->text.data)
-        s += String_calcSizeBinary(&src->text, NULL);
-    return s;
-}
-
-CALCSIZE_BINARY(ExtensionObject) {
-    size_t s = 1; /* Encoding byte */
-
-    /* Encoded content */
-    if(src->encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) {
-        s += NodeId_calcSizeBinary(&src->content.encoded.typeId, NULL);
-        switch(src->encoding) {
-        case UA_EXTENSIONOBJECT_ENCODED_NOBODY:
-            break;
-        case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING:
-        case UA_EXTENSIONOBJECT_ENCODED_XML:
-            s += String_calcSizeBinary(&src->content.encoded.body, NULL);
-            break;
-        default:
-            return 0;
-        }
-        return s;
-    }
-
-    /* Decoded content */
-    if(!src->content.decoded.type || !src->content.decoded.data)
-        return 0;
-    if(src->content.decoded.type->typeId.identifierType != UA_NODEIDTYPE_NUMERIC)
-        return 0;
-
-    s += NodeId_calcSizeBinary(&src->content.decoded.type->typeId, NULL); /* Type encoding length */
-    s += 4; /* Encoding length field */
-    const UA_DataType *type = src->content.decoded.type;
-    s += calcSizeBinaryJumpTable[type->typeKind](src->content.decoded.data, type); /* Encoding length */
-    return s;
-}
-
-CALCSIZE_BINARY(Variant) {
-    size_t s = 1; /* Encoding byte */
-    if(!src->type)
-        return s;
-
-    const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL;
-    if(isArray)
-        s += Array_calcSizeBinary(src->data, src->arrayLength, src->type);
-    else
-        s += calcSizeBinaryJumpTable[src->type->typeKind](src->data, src->type);
-
-    const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO);
-    const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM);
-    if(!isBuiltin && !isEnum) {
-        /* The type is wrapped inside an extensionobject */
-        /* (NodeId + encoding byte + extension object length) * array length */
-        size_t length = isArray ? src->arrayLength : 1;
-        s += (NodeId_calcSizeBinary(&src->type->typeId, NULL) + 1 + 4) * length;
-    }
-
-    const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0;
-    if(hasDimensions)
-        s += Array_calcSizeBinary(src->arrayDimensions, src->arrayDimensionsSize,
-                                  &UA_TYPES[UA_TYPES_INT32]);
-    return s;
-}
-
-CALCSIZE_BINARY(DataValue) {
-    size_t s = 1; /* Encoding byte */
-    if(src->hasValue)
-        s += Variant_calcSizeBinary(&src->value, NULL);
-    if(src->hasStatus)
-        s += 4;
-    if(src->hasSourceTimestamp)
-        s += 8;
-    if(src->hasSourcePicoseconds)
-        s += 2;
-    if(src->hasServerTimestamp)
-        s += 8;
-    if(src->hasServerPicoseconds)
-        s += 2;
-    return s;
-}
-
-CALCSIZE_BINARY(DiagnosticInfo) {
-    size_t s = 1; /* Encoding byte */
-    if(src->hasSymbolicId)
-        s += 4;
-    if(src->hasNamespaceUri)
-        s += 4;
-    if(src->hasLocalizedText)
-        s += 4;
-    if(src->hasLocale)
-        s += 4;
-    if(src->hasAdditionalInfo)
-        s += String_calcSizeBinary(&src->additionalInfo, NULL);
-    if(src->hasInnerStatusCode)
-        s += 4;
-    if(src->hasInnerDiagnosticInfo)
-        s += DiagnosticInfo_calcSizeBinary(src->innerDiagnosticInfo, NULL);
-    return s;
-}
-
-static size_t
-calcSizeBinaryStructure(const void *p, const UA_DataType *type) {
-    size_t s = 0;
-    uintptr_t ptr = (uintptr_t)p;
-    u8 membersSize = type->membersSize;
-    const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] };
-
-    /* Loop over members */
-    for(size_t i = 0; i < membersSize; ++i) {
-        const UA_DataTypeMember *member = &type->members[i];
-        const UA_DataType *membertype = &typelists[!member->namespaceZero][member->memberTypeIndex];
-        ptr += member->padding;
-
-        /* Array */
-        if(member->isArray) {
-            const size_t length = *((const size_t*)ptr);
-            ptr += sizeof(size_t);
-            s += Array_calcSizeBinary(*(void *UA_RESTRICT const *)ptr, length, membertype);
-            ptr += sizeof(void*);
-            continue;
-        }
-
-        /* Scalar */
-        s += calcSizeBinaryJumpTable[membertype->typeKind]((const void*)ptr, membertype);
-        ptr += membertype->memSize;
-    }
-
-    return s;
-}
-
-static size_t
-calcSizeBinaryNotImplemented(const void *p, const UA_DataType *type) {
-    (void)p, (void)type;
-    return 0;
-}
-
-const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_DATATYPEKINDS] = {
-    (calcSizeBinarySignature)calcSizeBinary1, /* Boolean */
-    (calcSizeBinarySignature)calcSizeBinary1, /* SByte */
-    (calcSizeBinarySignature)calcSizeBinary1, /* Byte */
-    (calcSizeBinarySignature)calcSizeBinary2, /* Int16 */
-    (calcSizeBinarySignature)calcSizeBinary2, /* UInt16 */
-    (calcSizeBinarySignature)calcSizeBinary4, /* Int32 */
-    (calcSizeBinarySignature)calcSizeBinary4, /* UInt32 */
-    (calcSizeBinarySignature)calcSizeBinary8, /* Int64 */
-    (calcSizeBinarySignature)calcSizeBinary8, /* UInt64 */
-    (calcSizeBinarySignature)calcSizeBinary4, /* Float */
-    (calcSizeBinarySignature)calcSizeBinary8, /* Double */
-    (calcSizeBinarySignature)String_calcSizeBinary,
-    (calcSizeBinarySignature)calcSizeBinary8, /* DateTime */
-    (calcSizeBinarySignature)Guid_calcSizeBinary,
-    (calcSizeBinarySignature)String_calcSizeBinary, /* ByteString */
-    (calcSizeBinarySignature)String_calcSizeBinary, /* XmlElement */
-    (calcSizeBinarySignature)NodeId_calcSizeBinary,
-    (calcSizeBinarySignature)ExpandedNodeId_calcSizeBinary,
-    (calcSizeBinarySignature)calcSizeBinary4, /* StatusCode */
-    (calcSizeBinarySignature)QualifiedName_calcSizeBinary,
-    (calcSizeBinarySignature)LocalizedText_calcSizeBinary,
-    (calcSizeBinarySignature)ExtensionObject_calcSizeBinary,
-    (calcSizeBinarySignature)DataValue_calcSizeBinary,
-    (calcSizeBinarySignature)Variant_calcSizeBinary,
-    (calcSizeBinarySignature)DiagnosticInfo_calcSizeBinary,
-    (calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Decimal */
-    (calcSizeBinarySignature)calcSizeBinary4, /* Enumeration */
-    (calcSizeBinarySignature)calcSizeBinaryStructure,
-    (calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Structure with Optional Fields */
-    (calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Union */
-    (calcSizeBinarySignature)calcSizeBinaryNotImplemented /* BitfieldCluster */
-};
-
-size_t
-UA_calcSizeBinary(const void *p, const UA_DataType *type) {
-    return calcSizeBinaryJumpTable[type->typeKind](p, type);
-}
diff --git a/ext/open62541/src/ua_types_encoding_binary.h b/ext/open62541/src/ua_types_encoding_binary.h
deleted file mode 100644
index 0270acf..0000000
--- a/ext/open62541/src/ua_types_encoding_binary.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2015 (c) Sten Grüner
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
- */
-
-#ifndef UA_TYPES_ENCODING_BINARY_H_
-#define UA_TYPES_ENCODING_BINARY_H_
-
-#include <open62541/types.h>
-
-_UA_BEGIN_DECLS
-
-typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos,
-                                                 const UA_Byte **bufEnd);
-
-/* Encodes the scalar value described by type in the binary encoding. Encoding
- * is thread-safe if thread-local variables are enabled. Encoding is also
- * reentrant and can be safely called from signal handlers or interrupts.
- *
- * @param src The value. Must not be NULL.
- * @param type The value type. Must not be NULL.
- * @param bufPos Points to a pointer to the current position in the encoding
- *        buffer. Must not be NULL. The pointer is advanced by the number of
- *        encoded bytes, or, if the buffer is exchanged, to the position in the
- *        new buffer.
- * @param bufEnd Points to a pointer to the end of the encoding buffer (encoding
- *        always stops before *buf_end). Must not be NULL. The pointer is
- *        changed when the buffer is exchanged.
- * @param exchangeCallback Called when the end of the buffer is reached. This is
-          used to send out a message chunk before continuing with the encoding.
-          Is ignored if NULL.
- * @param exchangeHandle Custom data passed into the exchangeCallback.
- * @return Returns a statuscode whether encoding succeeded. */
-UA_StatusCode 
-UA_encodeBinary(const void *src, const UA_DataType *type,
-                UA_Byte **bufPos, const UA_Byte **bufEnd,
-                UA_exchangeEncodeBuffer exchangeCallback,
-                void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-/* Decodes a scalar value described by type from binary encoding. Decoding
- * is thread-safe if thread-local variables are enabled. Decoding is also
- * reentrant and can be safely called from signal handlers or interrupts.
- *
- * @param src The buffer with the binary encoded value. Must not be NULL.
- * @param offset The current position in the buffer. Must not be NULL. The value
- *        is advanced as decoding progresses.
- * @param dst The target value. Must not be NULL. The target is assumed to have
- *        size type->memSize. The value is reset to zero before decoding. If
- *        decoding fails, members are deleted and the value is reset (zeroed)
- *        again.
- * @param type The value type. Must not be NULL.
- * @param customTypesSize The number of non-standard datatypes contained in the
- *        customTypes array.
- * @param customTypes An array of non-standard datatypes (not included in
- *        UA_TYPES). Can be NULL if customTypesSize is zero.
- * @return Returns a statuscode whether decoding succeeded. */
-UA_StatusCode
-UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst,
-                const UA_DataType *type, const UA_DataTypeArray *customTypes)
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-/* Returns the number of bytes the value p takes in binary encoding. Returns
- * zero if an error occurs. UA_calcSizeBinary is thread-safe and reentrant since
- * it does not access global (thread-local) variables. */
-size_t
-UA_calcSizeBinary(const void *p, const UA_DataType *type);
-
-const UA_DataType *
-UA_findDataTypeByBinary(const UA_NodeId *typeId);
-
-_UA_END_DECLS
-
-#endif /* UA_TYPES_ENCODING_BINARY_H_ */
diff --git a/ext/open62541/src/ua_types_encoding_json.c b/ext/open62541/src/ua_types_encoding_json.c
deleted file mode 100644
index b7d8690..0000000
--- a/ext/open62541/src/ua_types_encoding_json.c
+++ /dev/null
@@ -1,3329 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Lukas Meling)
- */
-
-#include "ua_types_encoding_json.h"
-
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_types_encoding_binary.h"
-
-#include <float.h>
-#include <math.h>
-
-#ifdef UA_ENABLE_CUSTOM_LIBC
-#include "../deps/musl/floatscan.h"
-#include "../deps/musl/vfprintf.h"
-#endif
-
-#include "../deps/itoa.h"
-#include "../deps/atoi.h"
-#include "../deps/string_escape.h"
-#include "../deps/base64.h"
-
-#include "../deps/libc_time.h"
-
-#if defined(_MSC_VER)
-# define strtoll _strtoi64
-# define strtoull _strtoui64
-#endif
-
-/* vs2008 does not have INFINITY and NAN defined */
-#ifndef INFINITY
-# define INFINITY ((UA_Double)(DBL_MAX+DBL_MAX))
-#endif
-#ifndef NAN
-# define NAN ((UA_Double)(INFINITY-INFINITY))
-#endif
-
-#if defined(_MSC_VER)
-# pragma warning(disable: 4756)
-# pragma warning(disable: 4056)
-#endif
-
-#define UA_NODEIDTYPE_NUMERIC_TWOBYTE 0
-#define UA_NODEIDTYPE_NUMERIC_FOURBYTE 1
-#define UA_NODEIDTYPE_NUMERIC_COMPLETE 2
-
-#define UA_EXPANDEDNODEID_SERVERINDEX_FLAG 0x40
-#define UA_EXPANDEDNODEID_NAMESPACEURI_FLAG 0x80
-
-#define UA_JSON_DATETIME_LENGTH 30
-
-/* Max length of numbers for the allocation of temp buffers. Don't forget that
- * printf adds an additional \0 at the end!
- *
- * Sources:
- * https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/
- *
- * UInt16: 3 + 1
- * SByte: 3 + 1
- * UInt32:
- * Int32:
- * UInt64:
- * Int64:
- * Float: 149 + 1
- * Double: 767 + 1
- */
-
-/************/
-/* Encoding */
-/************/
-
-#define ENCODE_JSON(TYPE) static status \
-    TYPE##_encodeJson(const UA_##TYPE *src, const UA_DataType *type, CtxJson *ctx)
-
-#define ENCODE_DIRECT_JSON(SRC, TYPE) \
-    TYPE##_encodeJson((const UA_##TYPE*)SRC, NULL, ctx)
-
-extern const encodeJsonSignature encodeJsonJumpTable[UA_DATATYPEKINDS];
-extern const decodeJsonSignature decodeJsonJumpTable[UA_DATATYPEKINDS];
-
-/* Forward declarations */
-UA_String UA_DateTime_toJSON(UA_DateTime t);
-ENCODE_JSON(ByteString);
-
-static status UA_FUNC_ATTR_WARN_UNUSED_RESULT
-writeChar(CtxJson *ctx, char c) {
-    if(ctx->pos >= ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    if(!ctx->calcOnly)
-        *ctx->pos = (UA_Byte)c;
-    ctx->pos++;
-    return UA_STATUSCODE_GOOD;
-}
-
-#define WRITE_JSON_ELEMENT(ELEM)                            \
-    UA_FUNC_ATTR_WARN_UNUSED_RESULT status                  \
-    writeJson##ELEM(CtxJson *ctx)
-
-static WRITE_JSON_ELEMENT(Quote) {
-    return writeChar(ctx, '\"');
-}
-
-WRITE_JSON_ELEMENT(ObjStart) {
-    /* increase depth, save: before first key-value no comma needed. */
-    ctx->depth++;
-    ctx->commaNeeded[ctx->depth] = false;
-    return writeChar(ctx, '{');
-}
-
-WRITE_JSON_ELEMENT(ObjEnd) {
-    ctx->depth--; //decrease depth
-    ctx->commaNeeded[ctx->depth] = true;
-    return writeChar(ctx, '}');
-}
-
-WRITE_JSON_ELEMENT(ArrStart) {
-    /* increase depth, save: before first array entry no comma needed. */
-    ctx->commaNeeded[++ctx->depth] = false;
-    return writeChar(ctx, '[');
-}
-
-WRITE_JSON_ELEMENT(ArrEnd) {
-    ctx->depth--; //decrease depth
-    ctx->commaNeeded[ctx->depth] = true;
-    return writeChar(ctx, ']');
-}
-
-WRITE_JSON_ELEMENT(CommaIfNeeded) {
-    if(ctx->commaNeeded[ctx->depth])
-        return writeChar(ctx, ',');
-    return UA_STATUSCODE_GOOD;
-}
-
-status
-writeJsonArrElm(CtxJson *ctx, const void *value,
-                const UA_DataType *type) {
-    status ret = writeJsonCommaIfNeeded(ctx);
-    ctx->commaNeeded[ctx->depth] = true;
-    ret |= encodeJsonInternal(value, type, ctx);
-    return ret;
-}
-
-status writeJsonObjElm(CtxJson *ctx, const char *key,
-                       const void *value, const UA_DataType *type){
-    return writeJsonKey(ctx, key) | encodeJsonInternal(value, type, ctx);
-}
-
-status writeJsonNull(CtxJson *ctx) {
-    if(ctx->pos + 4 > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    if(ctx->calcOnly) {
-        ctx->pos += 4;
-    } else {
-        *(ctx->pos++) = 'n';
-        *(ctx->pos++) = 'u';
-        *(ctx->pos++) = 'l';
-        *(ctx->pos++) = 'l';
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Keys for JSON */
-
-/* LocalizedText */
-static const char* UA_JSONKEY_LOCALE = "Locale";
-static const char* UA_JSONKEY_TEXT = "Text";
-
-/* QualifiedName */
-static const char* UA_JSONKEY_NAME = "Name";
-static const char* UA_JSONKEY_URI = "Uri";
-
-/* NodeId */
-static const char* UA_JSONKEY_ID = "Id";
-static const char* UA_JSONKEY_IDTYPE = "IdType";
-static const char* UA_JSONKEY_NAMESPACE = "Namespace";
-
-/* ExpandedNodeId */
-static const char* UA_JSONKEY_SERVERURI = "ServerUri";
-
-/* Variant */
-static const char* UA_JSONKEY_TYPE = "Type";
-static const char* UA_JSONKEY_BODY = "Body";
-static const char* UA_JSONKEY_DIMENSION = "Dimension";
-
-/* DataValue */
-static const char* UA_JSONKEY_VALUE = "Value";
-static const char* UA_JSONKEY_STATUS = "Status";
-static const char* UA_JSONKEY_SOURCETIMESTAMP = "SourceTimestamp";
-static const char* UA_JSONKEY_SOURCEPICOSECONDS = "SourcePicoseconds";
-static const char* UA_JSONKEY_SERVERTIMESTAMP = "ServerTimestamp";
-static const char* UA_JSONKEY_SERVERPICOSECONDS = "ServerPicoseconds";
-
-/* ExtensionObject */
-static const char* UA_JSONKEY_ENCODING = "Encoding";
-static const char* UA_JSONKEY_TYPEID = "TypeId";
-
-/* StatusCode */
-static const char* UA_JSONKEY_CODE = "Code";
-static const char* UA_JSONKEY_SYMBOL = "Symbol";
-
-/* DiagnosticInfo */
-static const char* UA_JSONKEY_SYMBOLICID = "SymbolicId";
-static const char* UA_JSONKEY_NAMESPACEURI = "NamespaceUri";
-static const char* UA_JSONKEY_LOCALIZEDTEXT = "LocalizedText";
-static const char* UA_JSONKEY_ADDITIONALINFO = "AdditionalInfo";
-static const char* UA_JSONKEY_INNERSTATUSCODE = "InnerStatusCode";
-static const char* UA_JSONKEY_INNERDIAGNOSTICINFO = "InnerDiagnosticInfo";
-
-/* Writes null terminated string to output buffer (current ctx->pos). Writes
- * comma in front of key if needed. Encapsulates key in quotes. */
-status UA_FUNC_ATTR_WARN_UNUSED_RESULT
-writeJsonKey(CtxJson *ctx, const char* key) {
-    size_t size = strlen(key);
-    if(ctx->pos + size + 4 > ctx->end) /* +4 because of " " : and , */
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    status ret = writeJsonCommaIfNeeded(ctx);
-    ctx->commaNeeded[ctx->depth] = true;
-    if(ctx->calcOnly) {
-        ctx->commaNeeded[ctx->depth] = true;
-        ctx->pos += 3;
-        ctx->pos += size;
-        return ret;
-    }
-
-    ret |= writeChar(ctx, '\"');
-    for(size_t i = 0; i < size; i++) {
-        *(ctx->pos++) = (u8)key[i];
-    }
-    ret |= writeChar(ctx, '\"');
-    ret |= writeChar(ctx, ':');
-    return ret;
-}
-
-/* Boolean */
-ENCODE_JSON(Boolean) {
-    size_t sizeOfJSONBool;
-    if(*src == true) {
-        sizeOfJSONBool = 4; /*"true"*/
-    } else {
-        sizeOfJSONBool = 5; /*"false"*/
-    }
-
-    if(ctx->calcOnly) {
-        ctx->pos += sizeOfJSONBool;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    if(ctx->pos + sizeOfJSONBool > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(*src) {
-        *(ctx->pos++) = 't';
-        *(ctx->pos++) = 'r';
-        *(ctx->pos++) = 'u';
-        *(ctx->pos++) = 'e';
-    } else {
-        *(ctx->pos++) = 'f';
-        *(ctx->pos++) = 'a';
-        *(ctx->pos++) = 'l';
-        *(ctx->pos++) = 's';
-        *(ctx->pos++) = 'e';
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/*****************/
-/* Integer Types */
-/*****************/
-
-/* Byte */
-ENCODE_JSON(Byte) {
-    char buf[4];
-    UA_UInt16 digits = itoaUnsigned(*src, buf, 10);
-
-    /* Ensure destination can hold the data- */
-    if(ctx->pos + digits > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    /* Copy digits to the output string/buffer. */
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, digits);
-    ctx->pos += digits;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* signed Byte */
-ENCODE_JSON(SByte) {
-    char buf[5];
-    UA_UInt16 digits = itoaSigned(*src, buf);
-    if(ctx->pos + digits > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, digits);
-    ctx->pos += digits;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* UInt16 */
-ENCODE_JSON(UInt16) {
-    char buf[6];
-    UA_UInt16 digits = itoaUnsigned(*src, buf, 10);
-
-    if(ctx->pos + digits > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, digits);
-    ctx->pos += digits;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Int16 */
-ENCODE_JSON(Int16) {
-    char buf[7];
-    UA_UInt16 digits = itoaSigned(*src, buf);
-
-    if(ctx->pos + digits > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, digits);
-    ctx->pos += digits;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* UInt32 */
-ENCODE_JSON(UInt32) {
-    char buf[11];
-    UA_UInt16 digits = itoaUnsigned(*src, buf, 10);
-
-    if(ctx->pos + digits > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, digits);
-    ctx->pos += digits;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Int32 */
-ENCODE_JSON(Int32) {
-    char buf[12];
-    UA_UInt16 digits = itoaSigned(*src, buf);
-
-    if(ctx->pos + digits > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, digits);
-    ctx->pos += digits;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* UInt64 */
-ENCODE_JSON(UInt64) {
-    char buf[23];
-    buf[0] = '\"';
-    UA_UInt16 digits = itoaUnsigned(*src, buf + 1, 10);
-    buf[digits + 1] = '\"';
-    UA_UInt16 length = (UA_UInt16)(digits + 2);
-
-    if(ctx->pos + length > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, length);
-
-    ctx->pos += length;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Int64 */
-ENCODE_JSON(Int64) {
-    char buf[23];
-    buf[0] = '\"';
-    UA_UInt16 digits = itoaSigned(*src, buf + 1);
-    buf[digits + 1] = '\"';
-    UA_UInt16 length = (UA_UInt16)(digits + 2);
-
-    if(ctx->pos + length > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buf, length);
-    ctx->pos += length;
-    return UA_STATUSCODE_GOOD;
-}
-
-/************************/
-/* Floating Point Types */
-/************************/
-
-/* Convert special numbers to string
- * - fmt_fp gives NAN, nan,-NAN, -nan, inf, INF, -inf, -INF
- * - Special floating-point numbers such as positive infinity (INF), negative
- *   infinity (-INF) and not-a-number (NaN) shall be represented by the values
- *   “Infinity”, “-Infinity” and “NaN” encoded as a JSON string. */
-static status
-checkAndEncodeSpecialFloatingPoint(char *buffer, size_t *len) {
-    /*nan and NaN*/
-    if(*len == 3 && 
-            (buffer[0] == 'n' || buffer[0] == 'N') && 
-            (buffer[1] == 'a' || buffer[1] == 'A') && 
-            (buffer[2] == 'n' || buffer[2] == 'N')) {
-        *len = 5;
-        memcpy(buffer, "\"NaN\"", *len);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /*-nan and -NaN*/
-    if(*len == 4 && buffer[0] == '-' && 
-            (buffer[1] == 'n' || buffer[1] == 'N') && 
-            (buffer[2] == 'a' || buffer[2] == 'A') && 
-            (buffer[3] == 'n' || buffer[3] == 'N')) {
-        *len = 6;
-        memcpy(buffer, "\"-NaN\"", *len);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /*inf*/
-    if(*len == 3 && 
-            (buffer[0] == 'i' || buffer[0] == 'I') && 
-            (buffer[1] == 'n' || buffer[1] == 'N') && 
-            (buffer[2] == 'f' || buffer[2] == 'F')) {
-        *len = 10;
-        memcpy(buffer, "\"Infinity\"", *len);
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /*-inf*/
-    if(*len == 4 && buffer[0] == '-' && 
-            (buffer[1] == 'i' || buffer[1] == 'I') && 
-            (buffer[2] == 'n' || buffer[2] == 'N') && 
-            (buffer[3] == 'f' || buffer[3] == 'F')) {
-        *len = 11;
-        memcpy(buffer, "\"-Infinity\"", *len);
-        return UA_STATUSCODE_GOOD;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-ENCODE_JSON(Float) {
-    char buffer[200];
-    if(*src == *src) {
-#ifdef UA_ENABLE_CUSTOM_LIBC
-        fmt_fp(buffer, *src, 0, -1, 0, 'g');
-#else
-        UA_snprintf(buffer, 200, "%.149g", (UA_Double)*src);
-#endif
-    } else {
-        strcpy(buffer, "NaN");
-    }
-
-    size_t len = strlen(buffer);
-    if(len == 0)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    
-    checkAndEncodeSpecialFloatingPoint(buffer, &len);
-    
-    if(ctx->pos + len > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buffer, len);
-
-    ctx->pos += len;
-    return UA_STATUSCODE_GOOD;
-}
-
-ENCODE_JSON(Double) {
-    char buffer[2000];
-    if(*src == *src) {
-#ifdef UA_ENABLE_CUSTOM_LIBC
-        fmt_fp(buffer, *src, 0, 17, 0, 'g');
-#else
-        UA_snprintf(buffer, 2000, "%.1074g", *src);
-#endif
-    } else {
-        strcpy(buffer, "NaN");
-    }
-
-    size_t len = strlen(buffer);
-    checkAndEncodeSpecialFloatingPoint(buffer, &len);    
-
-    if(ctx->pos + len > ctx->end)
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, buffer, len);
-
-    ctx->pos += len;
-    return UA_STATUSCODE_GOOD;
-}
-
-static status
-encodeJsonArray(CtxJson *ctx, const void *ptr, size_t length,
-                const UA_DataType *type) {
-    encodeJsonSignature encodeType = encodeJsonJumpTable[type->typeKind];
-    status ret = writeJsonArrStart(ctx);
-    uintptr_t uptr = (uintptr_t)ptr;
-    for(size_t i = 0; i < length && ret == UA_STATUSCODE_GOOD; ++i) {
-        ret |= writeJsonCommaIfNeeded(ctx);
-        ret |= encodeType((const void*)uptr, type, ctx);
-        ctx->commaNeeded[ctx->depth] = true;
-        uptr += type->memSize;
-    }
-    ret |= writeJsonArrEnd(ctx);
-    return ret;
-}
-
-/*****************/
-/* Builtin Types */
-/*****************/
-
-static const u8 hexmapLower[16] =
-    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
-static const u8 hexmapUpper[16] =
-    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
-
-ENCODE_JSON(String) {
-    if(!src->data)
-        return writeJsonNull(ctx);
-
-    if(src->length == 0) {
-        status retval = writeJsonQuote(ctx);
-        retval |= writeJsonQuote(ctx);
-        return  retval;
-    }
-
-    UA_StatusCode ret = writeJsonQuote(ctx);
-    
-    /* Escaping adapted from https://github.com/akheron/jansson dump.c */
-
-    const char *str = (char*)src->data;
-    const char *pos = str;
-    const char *end = str;
-    const char *lim = str + src->length;
-    UA_UInt32 codepoint = 0;
-    while(1) {
-        const char *text;
-        u8 seq[13];
-        size_t length;
-
-        while(end < lim) {
-            end = utf8_iterate(pos, (size_t)(lim - pos), (int32_t *)&codepoint);
-            if(!end)
-                return UA_STATUSCODE_BADENCODINGERROR;
-
-            /* mandatory escape or control char */
-            if(codepoint == '\\' || codepoint == '"' || codepoint < 0x20)
-                break;
-
-            /* TODO: Why is this commented? */
-            /* slash 
-            if((flags & JSON_ESCAPE_SLASH) && codepoint == '/')
-                break;*/
-
-            /* non-ASCII
-            if((flags & JSON_ENSURE_ASCII) && codepoint > 0x7F)
-                break;*/
-
-            pos = end;
-        }
-
-        if(pos != str) {
-            if(ctx->pos + (pos - str) > ctx->end)
-                return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-            if(!ctx->calcOnly)
-                memcpy(ctx->pos, str, (size_t)(pos - str));
-            ctx->pos += pos - str;
-        }
-
-        if(end == pos)
-            break;
-
-        /* handle \, /, ", and control codes */
-        length = 2;
-        switch(codepoint) {
-        case '\\': text = "\\\\"; break;
-        case '\"': text = "\\\""; break;
-        case '\b': text = "\\b"; break;
-        case '\f': text = "\\f"; break;
-        case '\n': text = "\\n"; break;
-        case '\r': text = "\\r"; break;
-        case '\t': text = "\\t"; break;
-        case '/':  text = "\\/"; break;
-        default:
-            if(codepoint < 0x10000) {
-                /* codepoint is in BMP */
-                seq[0] = '\\';
-                seq[1] = 'u';
-                UA_Byte b1 = (UA_Byte)(codepoint >> 8u);
-                UA_Byte b2 = (UA_Byte)(codepoint >> 0u);
-                seq[2] = hexmapLower[(b1 & 0xF0u) >> 4u];
-                seq[3] = hexmapLower[b1 & 0x0Fu];
-                seq[4] = hexmapLower[(b2 & 0xF0u) >> 4u];
-                seq[5] = hexmapLower[b2 & 0x0Fu];
-                length = 6;
-            } else {
-                /* not in BMP -> construct a UTF-16 surrogate pair */
-                codepoint -= 0x10000;
-                UA_UInt32 first = 0xD800u | ((codepoint & 0xffc00u) >> 10u);
-                UA_UInt32 last = 0xDC00u | (codepoint & 0x003ffu);
-
-                UA_Byte fb1 = (UA_Byte)(first >> 8u);
-                UA_Byte fb2 = (UA_Byte)(first >> 0u);
-                    
-                UA_Byte lb1 = (UA_Byte)(last >> 8u);
-                UA_Byte lb2 = (UA_Byte)(last >> 0u);
-                    
-                seq[0] = '\\';
-                seq[1] = 'u';
-                seq[2] = hexmapLower[(fb1 & 0xF0u) >> 4u];
-                seq[3] = hexmapLower[fb1 & 0x0Fu];
-                seq[4] = hexmapLower[(fb2 & 0xF0u) >> 4u];
-                seq[5] = hexmapLower[fb2 & 0x0Fu];
-                    
-                seq[6] = '\\';
-                seq[7] = 'u';
-                seq[8] = hexmapLower[(lb1 & 0xF0u) >> 4u];
-                seq[9] = hexmapLower[lb1 & 0x0Fu];
-                seq[10] = hexmapLower[(lb2 & 0xF0u) >> 4u];
-                seq[11] = hexmapLower[lb2 & 0x0Fu];
-                length = 12;
-            }
-            text = (char*)seq;
-            break;
-        }
-
-        if(ctx->pos + length > ctx->end)
-            return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-        if(!ctx->calcOnly)
-            memcpy(ctx->pos, text, length);
-        ctx->pos += length;
-        str = pos = end;
-    }
-
-    ret |= writeJsonQuote(ctx);
-    return ret;
-}
-    
-ENCODE_JSON(ByteString) {
-    if(!src->data)
-        return writeJsonNull(ctx);
-
-    if(src->length == 0) {
-        status retval = writeJsonQuote(ctx);
-        retval |= writeJsonQuote(ctx);
-        return retval;
-    }
-
-    status ret = writeJsonQuote(ctx);
-    size_t flen = 0;
-    unsigned char *ba64 = UA_base64(src->data, src->length, &flen);
-    
-    /* Not converted, no mem */
-    if(!ba64)
-        return UA_STATUSCODE_BADENCODINGERROR;
-
-    if(ctx->pos + flen > ctx->end) {
-        UA_free(ba64);
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    }
-    
-    /* Copy flen bytes to output stream. */
-    if(!ctx->calcOnly)
-        memcpy(ctx->pos, ba64, flen);
-    ctx->pos += flen;
-
-    /* Base64 result no longer needed */
-    UA_free(ba64);
-    
-    ret |= writeJsonQuote(ctx);
-    return ret;
-}
-
-/* Converts Guid to a hexadecimal represenation */
-static void UA_Guid_to_hex(const UA_Guid *guid, u8* out) {
-    /*
-                          16 byte
-       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-       |   data1   |data2|data3|          data4        |
-       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-       |aa aa aa aa-bb bb-cc cc-dd dd-ee ee ee ee ee ee|
-       +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-                          36 character
-    */
-
-#ifdef hexCharlowerCase
-    const u8 *hexmap = hexmapLower;
-#else
-    const u8 *hexmap = hexmapUpper;
-#endif
-    size_t i = 0, j = 28;
-    for(; i<8;i++,j-=4)         /* pos 0-7, 4byte, (a) */
-        out[i] = hexmap[(guid->data1 >> j) & 0x0Fu];
-    out[i++] = '-';             /* pos 8 */
-    for(j=12; i<13;i++,j-=4)    /* pos 9-12, 2byte, (b) */
-        out[i] = hexmap[(uint16_t)(guid->data2 >> j) & 0x0Fu];
-    out[i++] = '-';             /* pos 13 */
-    for(j=12; i<18;i++,j-=4)    /* pos 14-17, 2byte (c) */
-        out[i] = hexmap[(uint16_t)(guid->data3 >> j) & 0x0Fu];
-    out[i++] = '-';             /* pos 18 */
-    for(j=0;i<23;i+=2,j++) {     /* pos 19-22, 2byte (d) */
-        out[i] = hexmap[(guid->data4[j] & 0xF0u) >> 4u];
-        out[i+1] = hexmap[guid->data4[j] & 0x0Fu];
-    }
-    out[i++] = '-';             /* pos 23 */
-    for(j=2; i<36;i+=2,j++) {    /* pos 24-35, 6byte (e) */
-        out[i] = hexmap[(guid->data4[j] & 0xF0u) >> 4u];
-        out[i+1] = hexmap[guid->data4[j] & 0x0Fu];
-    }
-}
-
-/* Guid */
-ENCODE_JSON(Guid) {
-    if(ctx->pos + 38 > ctx->end) /* 36 + 2 (") */
-        return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED;
-    status ret = writeJsonQuote(ctx);
-    u8 *buf = ctx->pos;
-    if(!ctx->calcOnly)
-        UA_Guid_to_hex(src, buf);
-    ctx->pos += 36;
-    ret |= writeJsonQuote(ctx);
-    return ret;
-}
-
-static void
-printNumber(u16 n, u8 *pos, size_t digits) {
-    for(size_t i = digits; i > 0; --i) {
-        pos[i - 1] = (u8) ((n % 10) + '0');
-        n = n / 10;
-    }
-}
-
-ENCODE_JSON(DateTime) {
-    UA_DateTimeStruct tSt = UA_DateTime_toStruct(*src);
-
-    /* Format: yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z' is used. max 30 bytes.*/
-    UA_Byte buffer[UA_JSON_DATETIME_LENGTH];
-
-    printNumber(tSt.year, &buffer[0], 4);
-    buffer[4] = '-';
-    printNumber(tSt.month, &buffer[5], 2);
-    buffer[7] = '-';
-    printNumber(tSt.day, &buffer[8], 2);
-    buffer[10] = 'T';
-    printNumber(tSt.hour, &buffer[11], 2);
-    buffer[13] = ':';
-    printNumber(tSt.min, &buffer[14], 2);
-    buffer[16] = ':';
-    printNumber(tSt.sec, &buffer[17], 2);
-    buffer[19] = '.';
-    printNumber(tSt.milliSec, &buffer[20], 3);
-    printNumber(tSt.microSec, &buffer[23], 3);
-    printNumber(tSt.nanoSec, &buffer[26], 3);
-
-    size_t length = 28;
-    while (buffer[length] == '0')
-        length--;
-    if (length != 19)
-         length++;
-
-    buffer[length] = 'Z';
-    UA_String str = {length + 1, buffer};
-    return ENCODE_DIRECT_JSON(&str, String);
-}
-
-/* NodeId */
-static status
-NodeId_encodeJsonInternal(UA_NodeId const *src, CtxJson *ctx) {
-    status ret = UA_STATUSCODE_GOOD;
-    switch (src->identifierType) {
-    case UA_NODEIDTYPE_NUMERIC:
-        ret |= writeJsonKey(ctx, UA_JSONKEY_ID);
-        ret |= ENCODE_DIRECT_JSON(&src->identifier.numeric, UInt32);
-        break;
-    case UA_NODEIDTYPE_STRING:
-        ret |= writeJsonKey(ctx, UA_JSONKEY_IDTYPE);
-        ret |= writeChar(ctx, '1');
-        ret |= writeJsonKey(ctx, UA_JSONKEY_ID);
-        ret |= ENCODE_DIRECT_JSON(&src->identifier.string, String);
-        break;
-    case UA_NODEIDTYPE_GUID:
-        ret |= writeJsonKey(ctx, UA_JSONKEY_IDTYPE);
-        ret |= writeChar(ctx, '2');
-        ret |= writeJsonKey(ctx, UA_JSONKEY_ID); /* Id */
-        ret |= ENCODE_DIRECT_JSON(&src->identifier.guid, Guid);
-        break;
-    case UA_NODEIDTYPE_BYTESTRING:
-        ret |= writeJsonKey(ctx, UA_JSONKEY_IDTYPE);
-        ret |= writeChar(ctx, '3');
-        ret |= writeJsonKey(ctx, UA_JSONKEY_ID); /* Id */
-        ret |= ENCODE_DIRECT_JSON(&src->identifier.byteString, ByteString);
-        break;
-    default:
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    return ret;
-}
-
-ENCODE_JSON(NodeId) {
-    UA_StatusCode ret = writeJsonObjStart(ctx);
-    ret |= NodeId_encodeJsonInternal(src, ctx);
-    if(ctx->useReversible) {
-        if(src->namespaceIndex > 0) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-            ret |= ENCODE_DIRECT_JSON(&src->namespaceIndex, UInt16);
-        }
-    } else {
-        /* For the non-reversible encoding, the field is the NamespaceUri 
-         * associated with the NamespaceIndex, encoded as a JSON string.
-         * A NamespaceIndex of 1 is always encoded as a JSON number. */
-        if(src->namespaceIndex == 1) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-            ret |= ENCODE_DIRECT_JSON(&src->namespaceIndex, UInt16);
-        } else {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-            
-            /* Check if Namespace given and in range */
-            if(src->namespaceIndex < ctx->namespacesSize && ctx->namespaces != NULL) {
-                UA_String namespaceEntry = ctx->namespaces[src->namespaceIndex];
-                ret |= ENCODE_DIRECT_JSON(&namespaceEntry, String);
-            } else {
-                return UA_STATUSCODE_BADNOTFOUND;
-            }
-        }
-    }
-
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-/* ExpandedNodeId */
-ENCODE_JSON(ExpandedNodeId) {
-    status ret = writeJsonObjStart(ctx);
-    /* Encode the NodeId */
-    ret |= NodeId_encodeJsonInternal(&src->nodeId, ctx);
-    
-    if(ctx->useReversible) {
-        if(src->namespaceUri.data != NULL && src->namespaceUri.length != 0 && 
-           (void*) src->namespaceUri.data > UA_EMPTY_ARRAY_SENTINEL) {
-            /* If the NamespaceUri is specified it is encoded as a JSON string in this field. */ 
-            ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-            ret |= ENCODE_DIRECT_JSON(&src->namespaceUri, String);
-        } else {
-            /* If the NamespaceUri is not specified, the NamespaceIndex is encoded with these rules:
-             * The field is encoded as a JSON number for the reversible encoding.
-             * The field is omitted if the NamespaceIndex equals 0. */
-            if(src->nodeId.namespaceIndex > 0) {
-                ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-                ret |= ENCODE_DIRECT_JSON(&src->nodeId.namespaceIndex, UInt16);
-            }
-        }
-
-        /* Encode the serverIndex/Url 
-         * This field is encoded as a JSON number for the reversible encoding.
-         * This field is omitted if the ServerIndex equals 0. */
-        if(src->serverIndex > 0) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_SERVERURI);
-            ret |= ENCODE_DIRECT_JSON(&src->serverIndex, UInt32);
-        }
-
-        ret |= writeJsonObjEnd(ctx);
-        return ret;
-    }
-    
-    
-    /* NON-Reversible Case */
-
-    /* If the NamespaceUri is not specified, the NamespaceIndex is encoded with these rules:
-     * For the non-reversible encoding the field is the NamespaceUri associated with the
-     * NamespaceIndex encoded as a JSON string.
-     * A NamespaceIndex of 1 is always encoded as a JSON number. */
-
-    if(src->namespaceUri.data != NULL && src->namespaceUri.length != 0) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-        ret |= ENCODE_DIRECT_JSON(&src->namespaceUri, String);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    } else {
-        if(src->nodeId.namespaceIndex == 1) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-            ret |= ENCODE_DIRECT_JSON(&src->nodeId.namespaceIndex, UInt16);
-            if(ret != UA_STATUSCODE_GOOD)
-                return ret;
-        } else {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACE);
-
-            /* Check if Namespace given and in range */
-            if(src->nodeId.namespaceIndex < ctx->namespacesSize 
-                    && ctx->namespaces != NULL) {
-
-                UA_String namespaceEntry = ctx->namespaces[src->nodeId.namespaceIndex];
-                ret |= ENCODE_DIRECT_JSON(&namespaceEntry, String);
-                if(ret != UA_STATUSCODE_GOOD)
-                    return ret;
-            } else {
-                return UA_STATUSCODE_BADNOTFOUND;
-            }
-        }
-    }
-
-    /* For the non-reversible encoding, this field is the ServerUri associated
-     * with the ServerIndex portion of the ExpandedNodeId, encoded as a JSON
-     * string. */
-
-    /* Check if Namespace given and in range */
-    if(src->serverIndex < ctx->serverUrisSize && ctx->serverUris != NULL) {
-        UA_String serverUriEntry = ctx->serverUris[src->serverIndex];
-        ret |= writeJsonKey(ctx, UA_JSONKEY_SERVERURI);
-        ret |= ENCODE_DIRECT_JSON(&serverUriEntry, String);
-    } else {
-        return UA_STATUSCODE_BADNOTFOUND;
-    }
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-/* LocalizedText */
-ENCODE_JSON(LocalizedText) {
-    if(ctx->useReversible) {
-        status ret = writeJsonObjStart(ctx);
-        ret |= writeJsonKey(ctx, UA_JSONKEY_LOCALE);
-        ret |= ENCODE_DIRECT_JSON(&src->locale, String);
-        ret |= writeJsonKey(ctx, UA_JSONKEY_TEXT);
-        ret |= ENCODE_DIRECT_JSON(&src->text, String);
-        ret |= writeJsonObjEnd(ctx);
-        return ret;
-    }
-    
-    /* For the non-reversible form, LocalizedText value shall be encoded as a
-     * JSON string containing the Text component.*/
-    return ENCODE_DIRECT_JSON(&src->text, String);
-}
-
-ENCODE_JSON(QualifiedName) {
-    status ret = writeJsonObjStart(ctx);
-    ret |= writeJsonKey(ctx, UA_JSONKEY_NAME);
-    ret |= ENCODE_DIRECT_JSON(&src->name, String);
-
-    if(ctx->useReversible) {
-        if(src->namespaceIndex != 0) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_URI);
-            ret |= ENCODE_DIRECT_JSON(&src->namespaceIndex, UInt16);
-        }
-    } else {
-        /* For the non-reversible form, the NamespaceUri associated with the
-         * NamespaceIndex portion of the QualifiedName is encoded as JSON string
-         * unless the NamespaceIndex is 1 or if NamespaceUri is unknown. In
-         * these cases, the NamespaceIndex is encoded as a JSON number. */
-        if(src->namespaceIndex == 1) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_URI);
-            ret |= ENCODE_DIRECT_JSON(&src->namespaceIndex, UInt16);
-        } else {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_URI);
-
-             /* Check if Namespace given and in range */
-            if(src->namespaceIndex < ctx->namespacesSize && ctx->namespaces != NULL) {
-                UA_String namespaceEntry = ctx->namespaces[src->namespaceIndex];
-                ret |= ENCODE_DIRECT_JSON(&namespaceEntry, String);
-            } else {
-                /* If not encode as number */
-                ret |= ENCODE_DIRECT_JSON(&src->namespaceIndex, UInt16);
-            }
-        }
-    }
-
-    return ret | writeJsonObjEnd(ctx);
-}
-
-ENCODE_JSON(StatusCode) {
-    if(!src)
-        return writeJsonNull(ctx);
-
-    if(ctx->useReversible)
-        return ENCODE_DIRECT_JSON(src, UInt32);
-
-    if(*src == UA_STATUSCODE_GOOD)
-        return writeJsonNull(ctx);
-
-    status ret = UA_STATUSCODE_GOOD;
-    ret |= writeJsonObjStart(ctx);
-    ret |= writeJsonKey(ctx, UA_JSONKEY_CODE);
-    ret |= ENCODE_DIRECT_JSON(src, UInt32);
-    ret |= writeJsonKey(ctx, UA_JSONKEY_SYMBOL);
-    const char *codename = UA_StatusCode_name(*src);
-    UA_String statusDescription = UA_STRING((char*)(uintptr_t)codename);
-    ret |= ENCODE_DIRECT_JSON(&statusDescription, String);
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-/* ExtensionObject */
-ENCODE_JSON(ExtensionObject) {
-    u8 encoding = (u8) src->encoding;
-    if(encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY)
-        return writeJsonNull(ctx);
-    
-    status ret = UA_STATUSCODE_GOOD;
-    /* already encoded content.*/
-    if(encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) {
-        ret |= writeJsonObjStart(ctx);
-        if(ctx->useReversible) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_TYPEID);
-            ret |= ENCODE_DIRECT_JSON(&src->content.encoded.typeId, NodeId);
-            if(ret != UA_STATUSCODE_GOOD)
-                return ret;
-        }
-        
-        switch (src->encoding) {
-            case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING:
-            {
-                if(ctx->useReversible) {
-                    ret |= writeJsonKey(ctx, UA_JSONKEY_ENCODING);
-                    ret |= writeChar(ctx, '1');
-                }
-                ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-                ret |= ENCODE_DIRECT_JSON(&src->content.encoded.body, String);
-                break;
-            }
-            case UA_EXTENSIONOBJECT_ENCODED_XML:
-            {
-                if(ctx->useReversible) {
-                    ret |= writeJsonKey(ctx, UA_JSONKEY_ENCODING);
-                    ret |= writeChar(ctx, '2');
-                }
-                ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-                ret |= ENCODE_DIRECT_JSON(&src->content.encoded.body, String);
-                break;
-            }
-            default:
-                ret = UA_STATUSCODE_BADINTERNALERROR;
-        }
-
-        ret |= writeJsonObjEnd(ctx);
-        return ret;
-    } /* encoding <= UA_EXTENSIONOBJECT_ENCODED_XML */
-         
-    /* Cannot encode with no type description */
-    if(!src->content.decoded.type)
-        return UA_STATUSCODE_BADENCODINGERROR;
-
-    if(!src->content.decoded.data)
-        return writeJsonNull(ctx);
-
-    UA_NodeId typeId = src->content.decoded.type->typeId;
-    if(typeId.identifierType != UA_NODEIDTYPE_NUMERIC)
-        return UA_STATUSCODE_BADENCODINGERROR;
-
-    ret |= writeJsonObjStart(ctx);
-    const UA_DataType *contentType = src->content.decoded.type;
-    if(ctx->useReversible) {
-        /* REVERSIBLE */
-        ret |= writeJsonKey(ctx, UA_JSONKEY_TYPEID);
-        ret |= ENCODE_DIRECT_JSON(&typeId, NodeId);
-
-        /* Encode the content */
-        ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-        ret |= encodeJsonInternal(src->content.decoded.data, contentType, ctx);
-    } else {
-        /* NON-REVERSIBLE
-         * For the non-reversible form, ExtensionObject values 
-         * shall be encoded as a JSON object containing only the 
-         * value of the Body field. The TypeId and Encoding fields are dropped.
-         * 
-         * TODO: UA_JSONKEY_BODY key in the ExtensionObject?
-         */
-        ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-        ret |= encodeJsonInternal(src->content.decoded.data, contentType, ctx);
-    }
-
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-static status
-Variant_encodeJsonWrapExtensionObject(const UA_Variant *src, const bool isArray, CtxJson *ctx) {
-    size_t length = 1;
-
-    status ret = UA_STATUSCODE_GOOD;
-    if(isArray) {
-        if(src->arrayLength > UA_INT32_MAX)
-            return UA_STATUSCODE_BADENCODINGERROR;
-        
-        length = src->arrayLength;
-    }
-
-    /* Set up the ExtensionObject */
-    UA_ExtensionObject eo;
-    UA_ExtensionObject_init(&eo);
-    eo.encoding = UA_EXTENSIONOBJECT_DECODED;
-    eo.content.decoded.type = src->type;
-    const u16 memSize = src->type->memSize;
-    uintptr_t ptr = (uintptr_t) src->data;
-
-    if(isArray) {
-        ret |= writeJsonArrStart(ctx);
-        ctx->commaNeeded[ctx->depth] = false;
-
-        /* Iterate over the array */
-        for(size_t i = 0; i <  length && ret == UA_STATUSCODE_GOOD; ++i) {
-            eo.content.decoded.data = (void*) ptr;
-            ret |= writeJsonArrElm(ctx, &eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-            ptr += memSize;
-        }
-    
-        ret |= writeJsonArrEnd(ctx);
-        return ret;
-    }
-
-    eo.content.decoded.data = (void*) ptr;
-    return encodeJsonInternal(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], ctx);
-}
-
-static status
-addMultiArrayContentJSON(CtxJson *ctx, void* array, const UA_DataType *type, 
-                         size_t *index, UA_UInt32 *arrayDimensions, size_t dimensionIndex, 
-                         size_t dimensionSize) {
-    /* Check the recursion limit */
-    if(ctx->depth > UA_JSON_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    
-    /* Stop recursion: The inner Arrays are written */
-    status ret;
-    if(dimensionIndex == (dimensionSize - 1)) {
-        ret = encodeJsonArray(ctx, ((u8*)array) + (type->memSize * *index),
-                              arrayDimensions[dimensionIndex], type);
-        (*index) += arrayDimensions[dimensionIndex];
-        return ret;
-    }
-
-    /* Recurse to the next dimension */
-    ret = writeJsonArrStart(ctx);
-    for(size_t i = 0; i < arrayDimensions[dimensionIndex]; i++) {
-        ret |= writeJsonCommaIfNeeded(ctx);
-        ret |= addMultiArrayContentJSON(ctx, array, type, index, arrayDimensions,
-                                        dimensionIndex + 1, dimensionSize);
-        ctx->commaNeeded[ctx->depth] = true;
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-    ret |= writeJsonArrEnd(ctx);
-    return ret;
-}
-
-ENCODE_JSON(Variant) {
-    /* If type is 0 (NULL) the Variant contains a NULL value and the containing
-     * JSON object shall be omitted or replaced by the JSON literal ‘null’ (when
-     * an element of a JSON array). */
-    if(!src->type) {
-        return writeJsonNull(ctx);
-    }
-        
-    /* Set the content type in the encoding mask */
-    const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO);
-    const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM);
-    
-    /* Set the array type in the encoding mask */
-    const bool isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL;
-    const bool hasDimensions = isArray && src->arrayDimensionsSize > 0;
-    status ret = UA_STATUSCODE_GOOD;
-    
-    if(ctx->useReversible) {
-        ret |= writeJsonObjStart(ctx);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-
-        /* Encode the content */
-        if(!isBuiltin && !isEnum) {
-            /* REVERSIBLE:  NOT BUILTIN, can it be encoded? Wrap in extension object.*/
-            ret |= writeJsonKey(ctx, UA_JSONKEY_TYPE);
-            ret |= ENCODE_DIRECT_JSON(&UA_TYPES[UA_TYPES_EXTENSIONOBJECT].typeId.identifier.numeric, UInt32);
-            ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-            ret |= Variant_encodeJsonWrapExtensionObject(src, isArray, ctx);
-        } else if(!isArray) {
-            /*REVERSIBLE:  BUILTIN, single value.*/
-            ret |= writeJsonKey(ctx, UA_JSONKEY_TYPE);
-            ret |= ENCODE_DIRECT_JSON(&src->type->typeId.identifier.numeric, UInt32);
-            ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-            ret |= encodeJsonInternal(src->data, src->type, ctx);
-        } else {
-            /*REVERSIBLE:   BUILTIN, array.*/
-            ret |= writeJsonKey(ctx, UA_JSONKEY_TYPE);
-            ret |= ENCODE_DIRECT_JSON(&src->type->typeId.identifier.numeric, UInt32);
-            ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-            ret |= encodeJsonArray(ctx, src->data, src->arrayLength, src->type);
-        }
-        
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        
-        /* REVERSIBLE:  Encode the array dimensions */
-        if(hasDimensions && ret == UA_STATUSCODE_GOOD) {
-            ret |= writeJsonKey(ctx, UA_JSONKEY_DIMENSION);
-            ret |= encodeJsonArray(ctx, src->arrayDimensions, src->arrayDimensionsSize, 
-                                   &UA_TYPES[UA_TYPES_INT32]);
-            if(ret != UA_STATUSCODE_GOOD)
-                return ret;
-        }
-
-        ret |= writeJsonObjEnd(ctx);
-        return ret;
-    } /* reversible */
-
-    
-    /* NON-REVERSIBLE
-     * For the non-reversible form, Variant values shall be encoded as a JSON object containing only
-     * the value of the Body field. The Type and Dimensions fields are dropped. Multi-dimensional
-     * arrays are encoded as a multi dimensional JSON array as described in 5.4.5.
-     */
-
-    ret |= writeJsonObjStart(ctx);
-    if(!isBuiltin && !isEnum) {
-        /*NON REVERSIBLE:  NOT BUILTIN, can it be encoded? Wrap in extension object.*/
-        if(src->arrayDimensionsSize > 1) {
-            return UA_STATUSCODE_BADNOTIMPLEMENTED;
-        }
-
-        ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-        ret |= Variant_encodeJsonWrapExtensionObject(src, isArray, ctx);
-    } else if(!isArray) {
-        /*NON REVERSIBLE:   BUILTIN, single value.*/
-        ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-        ret |= encodeJsonInternal(src->data, src->type, ctx);
-    } else {
-        /*NON REVERSIBLE:   BUILTIN, array.*/
-        ret |= writeJsonKey(ctx, UA_JSONKEY_BODY);
-
-        size_t dimensionSize = src->arrayDimensionsSize;
-        if(dimensionSize > 1) {
-            /*nonreversible multidimensional array*/
-            size_t index = 0;  size_t dimensionIndex = 0;
-            void *ptr = src->data;
-            const UA_DataType *arraytype = src->type;
-            ret |= addMultiArrayContentJSON(ctx, ptr, arraytype, &index, 
-                    src->arrayDimensions, dimensionIndex, dimensionSize);
-        } else {
-            /*nonreversible simple array*/
-            ret |= encodeJsonArray(ctx, src->data, src->arrayLength, src->type);
-        }
-    }
-
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-/* DataValue */
-ENCODE_JSON(DataValue) {
-    UA_Boolean hasValue = src->hasValue && src->value.type != NULL;
-    UA_Boolean hasStatus = src->hasStatus && src->status;
-    UA_Boolean hasSourceTimestamp = src->hasSourceTimestamp && src->sourceTimestamp;
-    UA_Boolean hasSourcePicoseconds = src->hasSourcePicoseconds && src->sourcePicoseconds;
-    UA_Boolean hasServerTimestamp = src->hasServerTimestamp && src->serverTimestamp;
-    UA_Boolean hasServerPicoseconds = src->hasServerPicoseconds && src->serverPicoseconds;
-
-    if(!hasValue && !hasStatus && !hasSourceTimestamp && !hasSourcePicoseconds &&
-       !hasServerTimestamp && !hasServerPicoseconds) {
-        return writeJsonNull(ctx); /*no element, encode as null*/
-    }
-
-    status ret = UA_STATUSCODE_GOOD;
-    ret |= writeJsonObjStart(ctx);
-
-    if(hasValue) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_VALUE);
-        ret |= ENCODE_DIRECT_JSON(&src->value, Variant);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(hasStatus) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_STATUS);
-        ret |= ENCODE_DIRECT_JSON(&src->status, StatusCode);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(hasSourceTimestamp) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_SOURCETIMESTAMP);
-        ret |= ENCODE_DIRECT_JSON(&src->sourceTimestamp, DateTime);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(hasSourcePicoseconds) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_SOURCEPICOSECONDS);
-        ret |= ENCODE_DIRECT_JSON(&src->sourcePicoseconds, UInt16);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(hasServerTimestamp) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_SERVERTIMESTAMP);
-        ret |= ENCODE_DIRECT_JSON(&src->serverTimestamp, DateTime);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(hasServerPicoseconds) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_SERVERPICOSECONDS);
-        ret |= ENCODE_DIRECT_JSON(&src->serverPicoseconds, UInt16);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-/* DiagnosticInfo */
-ENCODE_JSON(DiagnosticInfo) {
-    status ret = UA_STATUSCODE_GOOD;
-    if(!src->hasSymbolicId && !src->hasNamespaceUri && !src->hasLocalizedText &&
-       !src->hasLocale && !src->hasAdditionalInfo && !src->hasInnerDiagnosticInfo &&
-       !src->hasInnerStatusCode) {
-        return writeJsonNull(ctx); /*no element present, encode as null.*/
-    }
-    
-    ret |= writeJsonObjStart(ctx);
-    
-    if(src->hasSymbolicId) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_SYMBOLICID);
-        ret |= ENCODE_DIRECT_JSON(&src->symbolicId, UInt32);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(src->hasNamespaceUri) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_NAMESPACEURI);
-        ret |= ENCODE_DIRECT_JSON(&src->namespaceUri, UInt32);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-    
-    if(src->hasLocalizedText) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_LOCALIZEDTEXT);
-        ret |= ENCODE_DIRECT_JSON(&src->localizedText, UInt32);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-    
-    if(src->hasLocale) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_LOCALE);
-        ret |= ENCODE_DIRECT_JSON(&src->locale, UInt32);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-    
-    if(src->hasAdditionalInfo) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_ADDITIONALINFO);
-        ret |= ENCODE_DIRECT_JSON(&src->additionalInfo, String);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(src->hasInnerStatusCode) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_INNERSTATUSCODE);
-        ret |= ENCODE_DIRECT_JSON(&src->innerStatusCode, StatusCode);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    if(src->hasInnerDiagnosticInfo && src->innerDiagnosticInfo) {
-        ret |= writeJsonKey(ctx, UA_JSONKEY_INNERDIAGNOSTICINFO);
-        /* Check recursion depth in encodeJsonInternal */
-        ret |= encodeJsonInternal(src->innerDiagnosticInfo, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], ctx);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-    }
-
-    ret |= writeJsonObjEnd(ctx);
-    return ret;
-}
-
-static status
-encodeJsonStructure(const void *src, const UA_DataType *type, CtxJson *ctx) {
-    /* Check the recursion limit */
-    if(ctx->depth > UA_JSON_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    ctx->depth++;
-
-    status ret = writeJsonObjStart(ctx);
-
-    uintptr_t ptr = (uintptr_t) src;
-    u8 membersSize = type->membersSize;
-    const UA_DataType * typelists[2] = {UA_TYPES, &type[-type->typeIndex]};
-    for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) {
-        const UA_DataTypeMember *m = &type->members[i];
-        const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex];
-
-        if(m->memberName != NULL && *m->memberName != 0)
-            ret |= writeJsonKey(ctx, m->memberName);
-
-        if(!m->isArray) {
-            ptr += m->padding;
-            size_t memSize = mt->memSize;
-            ret |= encodeJsonJumpTable[mt->typeKind]((const void*) ptr, mt, ctx);
-            ptr += memSize;
-        } else {
-            ptr += m->padding;
-            const size_t length = *((const size_t*) ptr);
-            ptr += sizeof (size_t);
-            ret |= encodeJsonArray(ctx, *(void * const *)ptr, length, mt);
-            ptr += sizeof (void*);
-        }
-    }
-
-    ret |= writeJsonObjEnd(ctx);
-
-    ctx->depth--;
-    return ret;
-}
-
-static status
-encodeJsonNotImplemented(const void *src, const UA_DataType *type, CtxJson *ctx) {
-    (void) src, (void) type, (void)ctx;
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-const encodeJsonSignature encodeJsonJumpTable[UA_DATATYPEKINDS] = {
-    (encodeJsonSignature)Boolean_encodeJson,
-    (encodeJsonSignature)SByte_encodeJson, /* SByte */
-    (encodeJsonSignature)Byte_encodeJson,
-    (encodeJsonSignature)Int16_encodeJson, /* Int16 */
-    (encodeJsonSignature)UInt16_encodeJson,
-    (encodeJsonSignature)Int32_encodeJson, /* Int32 */
-    (encodeJsonSignature)UInt32_encodeJson,
-    (encodeJsonSignature)Int64_encodeJson, /* Int64 */
-    (encodeJsonSignature)UInt64_encodeJson,
-    (encodeJsonSignature)Float_encodeJson,
-    (encodeJsonSignature)Double_encodeJson,
-    (encodeJsonSignature)String_encodeJson,
-    (encodeJsonSignature)DateTime_encodeJson, /* DateTime */
-    (encodeJsonSignature)Guid_encodeJson,
-    (encodeJsonSignature)ByteString_encodeJson, /* ByteString */
-    (encodeJsonSignature)String_encodeJson, /* XmlElement */
-    (encodeJsonSignature)NodeId_encodeJson,
-    (encodeJsonSignature)ExpandedNodeId_encodeJson,
-    (encodeJsonSignature)StatusCode_encodeJson, /* StatusCode */
-    (encodeJsonSignature)QualifiedName_encodeJson, /* QualifiedName */
-    (encodeJsonSignature)LocalizedText_encodeJson,
-    (encodeJsonSignature)ExtensionObject_encodeJson,
-    (encodeJsonSignature)DataValue_encodeJson,
-    (encodeJsonSignature)Variant_encodeJson,
-    (encodeJsonSignature)DiagnosticInfo_encodeJson,
-    (encodeJsonSignature)encodeJsonNotImplemented, /* Decimal */
-    (encodeJsonSignature)Int32_encodeJson, /* Enum */
-    (encodeJsonSignature)encodeJsonStructure,
-    (encodeJsonSignature)encodeJsonNotImplemented, /* Structure with optional fields */
-    (encodeJsonSignature)encodeJsonNotImplemented, /* Union */
-    (encodeJsonSignature)encodeJsonNotImplemented /* BitfieldCluster */
-};
-
-status
-encodeJsonInternal(const void *src, const UA_DataType *type, CtxJson *ctx) {
-    return encodeJsonJumpTable[type->typeKind](src, type, ctx);
-}
-
-status UA_FUNC_ATTR_WARN_UNUSED_RESULT
-UA_encodeJson(const void *src, const UA_DataType *type,
-              u8 **bufPos, const u8 **bufEnd, UA_String *namespaces, 
-              size_t namespaceSize, UA_String *serverUris, 
-              size_t serverUriSize, UA_Boolean useReversible) {
-    if(!src || !type)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    
-    /* Set up the context */
-    CtxJson ctx;
-    memset(&ctx, 0, sizeof(ctx));
-    ctx.pos = *bufPos;
-    ctx.end = *bufEnd;
-    ctx.depth = 0;
-    ctx.namespaces = namespaces;
-    ctx.namespacesSize = namespaceSize;
-    ctx.serverUris = serverUris;
-    ctx.serverUrisSize = serverUriSize;
-    ctx.useReversible = useReversible;
-    ctx.calcOnly = false;
-    
-    /* Encode */
-    status ret = encodeJsonJumpTable[type->typeKind](src, type, &ctx);
-    
-    *bufPos = ctx.pos;
-    *bufEnd = ctx.end;
-    return ret;
-}
-
-/************/
-/* CalcSize */
-/************/
-size_t
-UA_calcSizeJson(const void *src, const UA_DataType *type,
-                UA_String *namespaces, size_t namespaceSize,
-                UA_String *serverUris, size_t serverUriSize,
-                UA_Boolean useReversible) {
-    if(!src || !type)
-        return UA_STATUSCODE_BADINTERNALERROR;
-
-    /* Set up the context */
-    CtxJson ctx;
-    memset(&ctx, 0, sizeof(ctx));
-    ctx.pos = 0;
-    ctx.end = (const UA_Byte*)(uintptr_t)SIZE_MAX;
-    ctx.depth = 0;
-    ctx.namespaces = namespaces;
-    ctx.namespacesSize = namespaceSize;
-    ctx.serverUris = serverUris;
-    ctx.serverUrisSize = serverUriSize;
-    ctx.useReversible = useReversible;
-    ctx.calcOnly = true;
-
-    /* Encode */
-    status ret = encodeJsonJumpTable[type->typeKind](src, type, &ctx);
-    if(ret != UA_STATUSCODE_GOOD)
-        return 0;
-    return (size_t)ctx.pos;
-}
-
-/**********/
-/* Decode */
-/**********/
-
-/* Macro which gets current size and char pointer of current Token. Needs
- * ParseCtx (parseCtx) and CtxJson (ctx). Does NOT increment index of Token. */
-#define GET_TOKEN(data, size) do {                                               \
-    (size) = (size_t)(parseCtx->tokenArray[parseCtx->index].end - parseCtx->tokenArray[parseCtx->index].start); \
-    (data) = (char*)(ctx->pos + parseCtx->tokenArray[parseCtx->index].start); } while(0)
-
-#define ALLOW_NULL do {             \
-    if(isJsonNull(ctx, parseCtx)) { \
-        parseCtx->index++;          \
-        return UA_STATUSCODE_GOOD;  \
-    }} while(0)
-
-#define CHECK_TOKEN_BOUNDS do {                   \
-    if(parseCtx->index >= parseCtx->tokenCount)   \
-        return UA_STATUSCODE_BADDECODINGERROR;    \
-    } while(0)
-
-#define CHECK_PRIMITIVE do {                      \
-    if(getJsmnType(parseCtx) != JSMN_PRIMITIVE) { \
-        return UA_STATUSCODE_BADDECODINGERROR;    \
-    }} while(0)
-
-#define CHECK_STRING do {                      \
-    if(getJsmnType(parseCtx) != JSMN_STRING) { \
-        return UA_STATUSCODE_BADDECODINGERROR; \
-    }} while(0)
-
-#define CHECK_OBJECT do {                      \
-    if(getJsmnType(parseCtx) != JSMN_OBJECT) { \
-        return UA_STATUSCODE_BADDECODINGERROR; \
-    }} while(0)
-
-/* Forward declarations*/
-#define DECODE_JSON(TYPE) static status                        \
-    TYPE##_decodeJson(UA_##TYPE *dst, const UA_DataType *type, \
-                      CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken)
-
-/* decode without moving the token index */
-#define DECODE_DIRECT_JSON(DST, TYPE) TYPE##_decodeJson((UA_##TYPE*)DST, NULL, ctx, parseCtx, false)
-
-static status
-Array_decodeJson(void *dst, const UA_DataType *type, CtxJson *ctx, 
-        ParseCtx *parseCtx, UA_Boolean moveToken);
-
-static status
-Array_decodeJson_internal(void **dst, const UA_DataType *type, 
-        CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken);
-
-static status
-Variant_decodeJsonUnwrapExtensionObject(UA_Variant *dst, const UA_DataType *type, 
-        CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken);
-
-/* Json decode Helper */
-jsmntype_t
-getJsmnType(const ParseCtx *parseCtx) {
-    if(parseCtx->index >= parseCtx->tokenCount)
-        return JSMN_UNDEFINED;
-    return parseCtx->tokenArray[parseCtx->index].type;
-}
-
-static UA_Boolean
-isJsonTokenNull(const CtxJson *ctx, jsmntok_t *token) {
-    if(token->type != JSMN_PRIMITIVE)
-        return false;
-    char* elem = (char*)(ctx->pos + token->start);
-    return (elem[0] == 'n' && elem[1] == 'u' && elem[2] == 'l' && elem[3] == 'l');
-}
-
-UA_Boolean
-isJsonNull(const CtxJson *ctx, const ParseCtx *parseCtx) {
-    if(parseCtx->index >= parseCtx->tokenCount)
-        return false;
-
-    if(parseCtx->tokenArray[parseCtx->index].type != JSMN_PRIMITIVE) {
-        return false;
-    }
-    char* elem = (char*)(ctx->pos + parseCtx->tokenArray[parseCtx->index].start);
-    return (elem[0] == 'n' && elem[1] == 'u' && elem[2] == 'l' && elem[3] == 'l');
-}
-
-static UA_SByte jsoneq(const char *json, jsmntok_t *tok, const char *searchKey) {
-    /* TODO: necessary?
-       if(json == NULL
-            || tok == NULL 
-            || searchKey == NULL) {
-        return -1;
-    } */
-    
-    if(tok->type == JSMN_STRING) {
-         if(strlen(searchKey) == (size_t)(tok->end - tok->start) ) {
-             if(strncmp(json + tok->start,
-                        (const char*)searchKey, (size_t)(tok->end - tok->start)) == 0) {
-                 return 0;
-             }   
-         }
-    }
-    return -1;
-}
-
-DECODE_JSON(Boolean) {
-    CHECK_PRIMITIVE;
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    if(tokenSize == 4 &&
-       tokenData[0] == 't' && tokenData[1] == 'r' &&
-       tokenData[2] == 'u' && tokenData[3] == 'e') {
-        *dst = true;
-    } else if(tokenSize == 5 &&
-              tokenData[0] == 'f' && tokenData[1] == 'a' &&
-              tokenData[2] == 'l' && tokenData[3] == 's' &&
-              tokenData[4] == 'e') {
-        *dst = false;
-    } else {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    if(moveToken)
-        parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-#ifdef UA_ENABLE_CUSTOM_LIBC
-static UA_StatusCode
-parseUnsignedInteger(char* inputBuffer, size_t sizeOfBuffer,
-                     UA_UInt64 *destinationOfNumber) {
-    UA_UInt64 d = 0;
-    atoiUnsigned(inputBuffer, sizeOfBuffer, &d);
-    if(!destinationOfNumber)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    *destinationOfNumber = d;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-parseSignedInteger(char* inputBuffer, size_t sizeOfBuffer,
-                   UA_Int64 *destinationOfNumber) {
-    UA_Int64 d = 0;
-    atoiSigned(inputBuffer, sizeOfBuffer, &d);
-    if(!destinationOfNumber)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    *destinationOfNumber = d;
-    return UA_STATUSCODE_GOOD;
-}
-#else
-/* Safe strtol variant of unsigned string conversion.
- * Returns UA_STATUSCODE_BADDECODINGERROR in case of overflows.
- * Buffer limit is 20 digits. */
-static UA_StatusCode
-parseUnsignedInteger(char* inputBuffer, size_t sizeOfBuffer,
-                     UA_UInt64 *destinationOfNumber) {
-    /* Check size to avoid huge malicious stack allocation.
-     * No UInt64 can have more digits than 20. */
-    if(sizeOfBuffer > 20) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-
-    /* convert to null terminated string  */
-    UA_STACKARRAY(char, string, sizeOfBuffer+1);
-    memcpy(string, inputBuffer, sizeOfBuffer);
-    string[sizeOfBuffer] = 0;
-
-    /* Conversion */
-    char *endptr, *str;
-    str = string;
-    errno = 0;    /* To distinguish success/failure after call */
-    UA_UInt64 val = strtoull(str, &endptr, 10);
-
-    /* Check for various possible errors */
-    if((errno == ERANGE && (val == LLONG_MAX || val == 0))
-          || (errno != 0 )) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-
-    /* Check if no digits were found */
-    if(endptr == str)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* copy to destination */
-    *destinationOfNumber = val;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Safe strtol variant of unsigned string conversion.
- * Returns UA_STATUSCODE_BADDECODINGERROR in case of overflows.
- * Buffer limit is 20 digits. */
-static UA_StatusCode
-parseSignedInteger(char* inputBuffer, size_t sizeOfBuffer,
-                   UA_Int64 *destinationOfNumber) {
-    /* Check size to avoid huge malicious stack allocation.
-     * No UInt64 can have more digits than 20. */
-    if(sizeOfBuffer > 20)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* convert to null terminated string  */
-    UA_STACKARRAY(char, string, sizeOfBuffer + 1);
-    memcpy(string, inputBuffer, sizeOfBuffer);
-    string[sizeOfBuffer] = 0;
-
-    /* Conversion */
-    char *endptr, *str;
-    str = string;
-    errno = 0;    /* To distinguish success/failure after call */
-    UA_Int64 val = strtoll(str, &endptr, 10);
-
-    /* Check for various possible errors */
-    if((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
-          || (errno != 0 )) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-
-    /* Check if no digits were found */
-    if(endptr == str)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* copy to destination */
-    *destinationOfNumber = val;
-    return UA_STATUSCODE_GOOD;
-}
-#endif
-
-DECODE_JSON(Byte) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_PRIMITIVE;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_UInt64 out = 0;
-    UA_StatusCode s = parseUnsignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_Byte)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(UInt16) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_PRIMITIVE;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_UInt64 out = 0;
-    UA_StatusCode s = parseUnsignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_UInt16)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(UInt32) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_PRIMITIVE;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_UInt64 out = 0;
-    UA_StatusCode s = parseUnsignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_UInt32)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(UInt64) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_STRING;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_UInt64 out = 0;
-    UA_StatusCode s = parseUnsignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_UInt64)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(SByte) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_PRIMITIVE;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_Int64 out = 0;
-    UA_StatusCode s = parseSignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_SByte)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(Int16) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_PRIMITIVE;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_Int64 out = 0;
-    UA_StatusCode s = parseSignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_Int16)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(Int32) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_PRIMITIVE;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_Int64 out = 0;
-    UA_StatusCode s = parseSignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_Int32)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-DECODE_JSON(Int64) {
-    CHECK_TOKEN_BOUNDS;
-    CHECK_STRING;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    UA_Int64 out = 0;
-    UA_StatusCode s = parseSignedInteger(tokenData, tokenSize, &out);
-    *dst = (UA_Int64)out;
-
-    if(moveToken)
-        parseCtx->index++;
-    return s;
-}
-
-static UA_UInt32 hex2int(char ch) {
-    if(ch >= '0' && ch <= '9')
-        return (UA_UInt32)(ch - '0');
-    if(ch >= 'A' && ch <= 'F')
-        return (UA_UInt32)(ch - 'A' + 10);
-    if(ch >= 'a' && ch <= 'f')
-        return (UA_UInt32)(ch - 'a' + 10);
-    return 0;
-}
-
-/* Float
-* Either a JSMN_STRING or JSMN_PRIMITIVE
-*/
-DECODE_JSON(Float) {
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-    
-    /* https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/
-     * Maximum digit counts for select IEEE floating-point formats: 149
-     * Sanity check. */
-    if(tokenSize > 150)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    jsmntype_t tokenType = getJsmnType(parseCtx);
-    if(tokenType == JSMN_STRING) {
-        /*It could be a String with Nan, Infinity*/
-        if(tokenSize == 8 && memcmp(tokenData, "Infinity", 8) == 0) {
-            *dst = (UA_Float)INFINITY;
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        if(tokenSize == 9 && memcmp(tokenData, "-Infinity", 9) == 0) {
-            /* workaround an MSVC 2013 issue */
-            *dst = (UA_Float)-INFINITY;
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        if(tokenSize == 3 && memcmp(tokenData, "NaN", 3) == 0) {
-            *dst = (UA_Float)NAN;
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        if(tokenSize == 4 && memcmp(tokenData, "-NaN", 4) == 0) {
-            *dst = (UA_Float)NAN;
-            return UA_STATUSCODE_GOOD;
-        }
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    if(tokenType != JSMN_PRIMITIVE)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* Null-Terminate for sscanf. */
-    UA_STACKARRAY(char, string, tokenSize+1);
-    memcpy(string, tokenData, tokenSize);
-    string[tokenSize] = 0;
-    
-    UA_Float d = 0;
-#ifdef UA_ENABLE_CUSTOM_LIBC
-    d = (UA_Float)__floatscan(string, 1, 0);
-#else
-    char c = 0;
-    /* On success, the function returns the number of variables filled.
-     * In the case of an input failure before any data could be successfully read, EOF is returned. */
-    int ret = sscanf(string, "%f%c", &d, &c);
-
-    /* Exactly one var must be filled. %c acts as a guard for wrong input which is accepted by sscanf.
-    E.g. 1.23.45 is not accepted. */
-    if(ret == EOF || (ret != 1))
-        return UA_STATUSCODE_BADDECODINGERROR;
-#endif
-    
-    *dst = d;
-
-    parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-/* Either a JSMN_STRING or JSMN_PRIMITIVE */
-DECODE_JSON(Double) {
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-    
-    /* https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/
-     * Maximum digit counts for select IEEE floating-point formats: 1074
-     * Sanity check.
-     */
-    if(tokenSize > 1075)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    jsmntype_t tokenType = getJsmnType(parseCtx);
-    if(tokenType == JSMN_STRING) {
-        /*It could be a String with Nan, Infinity*/
-        if(tokenSize == 8 && memcmp(tokenData, "Infinity", 8) == 0) {
-            *dst = INFINITY;
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        if(tokenSize == 9 && memcmp(tokenData, "-Infinity", 9) == 0) {
-            /* workaround an MSVC 2013 issue */
-            *dst = -INFINITY;
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        if(tokenSize == 3 && memcmp(tokenData, "NaN", 3) == 0) {
-            *dst = NAN;
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        if(tokenSize == 4 && memcmp(tokenData, "-NaN", 4) == 0) {
-            *dst = NAN;
-            return UA_STATUSCODE_GOOD;
-        }
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    if(tokenType != JSMN_PRIMITIVE)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* Null-Terminate for sscanf. Should this better be handled on heap? Max
-     * 1075 input chars allowed. Not using heap. */
-    UA_STACKARRAY(char, string, tokenSize+1);
-    memcpy(string, tokenData, tokenSize);
-    string[tokenSize] = 0;
-    
-    UA_Double d = 0;
-#ifdef UA_ENABLE_CUSTOM_LIBC
-    d = (UA_Double)__floatscan(string, 2, 0);
-#else
-    char c = 0;
-    /* On success, the function returns the number of variables filled.
-     * In the case of an input failure before any data could be successfully read, EOF is returned. */
-    int ret = sscanf(string, "%lf%c", &d, &c);
-
-    /* Exactly one var must be filled. %c acts as a guard for wrong input which is accepted by sscanf.
-    E.g. 1.23.45 is not accepted. */
-    if(ret == EOF || (ret != 1))
-        return UA_STATUSCODE_BADDECODINGERROR;
-#endif
-    
-    *dst = d;
-
-    parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-/*
-  Expects 36 chars in format    00000003-0009-000A-0807-060504030201
-                                | data1| |d2| |d3| |d4| |  data4   |
-*/
-static UA_Guid UA_Guid_fromChars(const char* chars) {
-    UA_Guid dst;
-    UA_Guid_init(&dst);
-    for(size_t i = 0; i < 8; i++)
-        dst.data1 |= (UA_UInt32)(hex2int(chars[i]) << (28 - (i*4)));
-    for(size_t i = 0; i < 4; i++) {
-        dst.data2 |= (UA_UInt16)(hex2int(chars[9+i]) << (12 - (i*4)));
-        dst.data3 |= (UA_UInt16)(hex2int(chars[14+i]) << (12 - (i*4)));
-    }
-    dst.data4[0] |= (UA_Byte)(hex2int(chars[19]) << 4u);
-    dst.data4[0] |= (UA_Byte)(hex2int(chars[20]) << 0u);
-    dst.data4[1] |= (UA_Byte)(hex2int(chars[21]) << 4u);
-    dst.data4[1] |= (UA_Byte)(hex2int(chars[22]) << 0u);
-    for(size_t i = 0; i < 6; i++) {
-        dst.data4[2+i] |= (UA_Byte)(hex2int(chars[24 + i*2]) << 4u);
-        dst.data4[2+i] |= (UA_Byte)(hex2int(chars[25 + i*2]) << 0u);
-    }
-    return dst;
-}
-
-DECODE_JSON(Guid) {
-    CHECK_STRING;
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    if(tokenSize != 36)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* check if incorrect chars are present */
-    for(size_t i = 0; i < tokenSize; i++) {
-        if(!(tokenData[i] == '-'
-                || (tokenData[i] >= '0' && tokenData[i] <= '9')
-                || (tokenData[i] >= 'A' && tokenData[i] <= 'F')
-                || (tokenData[i] >= 'a' && tokenData[i] <= 'f'))) {
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    }
-
-    *dst = UA_Guid_fromChars(tokenData);
-
-    if(moveToken)
-        parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_JSON(String) {
-    ALLOW_NULL;
-    CHECK_STRING;
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    /* Empty string? */
-    if(tokenSize == 0) {
-        dst->data = (UA_Byte*)UA_EMPTY_ARRAY_SENTINEL;
-        dst->length = 0;
-        if(moveToken)
-            parseCtx->index++;
-        return UA_STATUSCODE_GOOD;
-    }
-    
-    /* The actual value is at most of the same length as the source string:
-     * - Shortcut escapes (e.g. "\t") (length 2) are converted to 1 byte
-     * - A single \uXXXX escape (length 6) is converted to at most 3 bytes
-     * - Two \uXXXX escapes (length 12) forming an UTF-16 surrogate pair are
-     *   converted to 4 bytes */
-    char *outputBuffer = (char*)UA_malloc(tokenSize);
-    if(!outputBuffer)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    
-    const char *p = (char*)tokenData;
-    const char *end = (char*)&tokenData[tokenSize];
-    char *pos = outputBuffer;
-    while(p < end) {
-        /* No escaping */
-        if(*p != '\\') {
-            *(pos++) = *(p++);
-            continue;
-        }
-
-        /* Escape character */
-        p++;
-        if(p == end)
-            goto cleanup;
-        
-        if(*p != 'u') {
-            switch(*p) {
-            case '"': case '\\': case '/': *pos = *p; break;
-            case 'b': *pos = '\b'; break;
-            case 'f': *pos = '\f'; break;
-            case 'n': *pos = '\n'; break;
-            case 'r': *pos = '\r'; break;
-            case 't': *pos = '\t'; break;
-            default: goto cleanup;
-            }
-            pos++;
-            p++;
-            continue;
-        }
-            
-        /* Unicode */
-        if(p + 4 >= end)
-            goto cleanup;
-        int32_t value_signed = decode_unicode_escape(p);
-        if(value_signed < 0)
-            goto cleanup;
-        uint32_t value = (uint32_t)value_signed;
-        p += 5;
-
-        if(0xD800 <= value && value <= 0xDBFF) {
-            /* Surrogate pair */
-            if(p + 5 >= end)
-                goto cleanup;
-            if(*p != '\\' || *(p + 1) != 'u')
-                goto cleanup;
-            int32_t value2 = decode_unicode_escape(p + 1);
-            if(value2 < 0xDC00 || value2 > 0xDFFF)
-                goto cleanup;
-            value = ((value - 0xD800u) << 10u) + (uint32_t)((value2 - 0xDC00) + 0x10000);
-            p += 6;
-        } else if(0xDC00 <= value && value <= 0xDFFF) {
-            /* Invalid Unicode '\\u%04X' */
-            goto cleanup;
-        }
-
-        size_t length;
-        if(utf8_encode((int32_t)value, pos, &length))
-            goto cleanup;
-
-        pos += length;
-    }
-
-    dst->length = (size_t)(pos - outputBuffer);
-    if(dst->length > 0) {
-        dst->data = (UA_Byte*)outputBuffer;
-    } else {
-        dst->data = (UA_Byte*)UA_EMPTY_ARRAY_SENTINEL;
-        UA_free(outputBuffer);
-    }
-
-    if(moveToken)
-        parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-    
-cleanup:
-    UA_free(outputBuffer);  
-    return UA_STATUSCODE_BADDECODINGERROR;
-}
-
-DECODE_JSON(ByteString) {
-    ALLOW_NULL;
-    CHECK_STRING;
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-
-    /* Empty bytestring? */
-    if(tokenSize == 0) {
-        dst->data = (UA_Byte*)UA_EMPTY_ARRAY_SENTINEL;
-        dst->length = 0;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    size_t flen = 0;
-    unsigned char* unB64 = UA_unbase64((unsigned char*)tokenData, tokenSize, &flen);
-    if(unB64 == 0)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    dst->data = (u8*)unB64;
-    dst->length = flen;
-    
-    if(moveToken)
-        parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_JSON(LocalizedText) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    DecodeEntry entries[2] = {
-        {UA_JSONKEY_LOCALE, &dst->locale, (decodeJsonSignature) String_decodeJson, false, NULL},
-        {UA_JSONKEY_TEXT, &dst->text, (decodeJsonSignature) String_decodeJson, false, NULL}
-    };
-
-    return decodeFields(ctx, parseCtx, entries, 2, type);
-}
-
-DECODE_JSON(QualifiedName) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    DecodeEntry entries[2] = {
-        {UA_JSONKEY_NAME, &dst->name, (decodeJsonSignature) String_decodeJson, false, NULL},
-        {UA_JSONKEY_URI, &dst->namespaceIndex, (decodeJsonSignature) UInt16_decodeJson, false, NULL}
-    };
-
-    return decodeFields(ctx, parseCtx, entries, 2, type);
-}
-
-/* Function for searching ahead of the current token. Used for retrieving the
- * OPC UA type of a token */
-static status
-searchObjectForKeyRec(const char *searchKey, CtxJson *ctx, 
-                      ParseCtx *parseCtx, size_t *resultIndex, UA_UInt16 depth) {
-    UA_StatusCode ret = UA_STATUSCODE_BADNOTFOUND;
-    
-    CHECK_TOKEN_BOUNDS;
-    
-    if(parseCtx->tokenArray[parseCtx->index].type == JSMN_OBJECT) {
-        size_t objectCount = (size_t)parseCtx->tokenArray[parseCtx->index].size;
-        parseCtx->index++; /*Object to first Key*/
-        
-        for(size_t i = 0; i < objectCount; i++) {
-            CHECK_TOKEN_BOUNDS;
-            if(depth == 0) { /* we search only on first layer */
-                if(jsoneq((char*)ctx->pos, &parseCtx->tokenArray[parseCtx->index], searchKey) == 0) {
-                    /*found*/
-                    parseCtx->index++; /*We give back a pointer to the value of the searched key!*/
-                    *resultIndex = parseCtx->index;
-                    return UA_STATUSCODE_GOOD;
-                }
-            }
-               
-            parseCtx->index++; /* value */
-            CHECK_TOKEN_BOUNDS;
-            
-            if(parseCtx->tokenArray[parseCtx->index].type == JSMN_OBJECT) {
-               ret = searchObjectForKeyRec(searchKey, ctx, parseCtx, resultIndex,
-                                           (UA_UInt16)(depth + 1));
-            } else if(parseCtx->tokenArray[parseCtx->index].type == JSMN_ARRAY) {
-               ret = searchObjectForKeyRec(searchKey, ctx, parseCtx, resultIndex,
-                                           (UA_UInt16)(depth + 1));
-            } else {
-                /* Only Primitive or string */
-                parseCtx->index++;
-            }
-        }
-    } else if(parseCtx->tokenArray[parseCtx->index].type == JSMN_ARRAY) {
-        size_t arraySize = (size_t)parseCtx->tokenArray[parseCtx->index].size;
-        parseCtx->index++; /*Object to first element*/
-        
-        for(size_t i = 0; i < arraySize; i++) {
-            CHECK_TOKEN_BOUNDS;
-            if(parseCtx->tokenArray[parseCtx->index].type == JSMN_OBJECT) {
-               ret = searchObjectForKeyRec(searchKey, ctx, parseCtx, resultIndex,
-                                           (UA_UInt16)(depth + 1));
-            } else if(parseCtx->tokenArray[parseCtx->index].type == JSMN_ARRAY) {
-               ret = searchObjectForKeyRec(searchKey, ctx, parseCtx, resultIndex,
-                                           (UA_UInt16)(depth + 1));
-            } else {
-                /* Only Primitive or string */
-                parseCtx->index++;
-            }
-        }
-    }
-    return ret;
-}
-
-UA_FUNC_ATTR_WARN_UNUSED_RESULT status
-lookAheadForKey(const char* search, CtxJson *ctx,
-                ParseCtx *parseCtx, size_t *resultIndex) {
-    UA_UInt16 oldIndex = parseCtx->index; /* Save index for later restore */
-    
-    UA_UInt16 depth = 0;
-    UA_StatusCode ret  = searchObjectForKeyRec(search, ctx, parseCtx, resultIndex, depth);
-
-    parseCtx->index = oldIndex; /* Restore index */
-    return ret;
-}
-
-/* Function used to jump over an object which cannot be parsed */
-static status
-jumpOverRec(CtxJson *ctx, ParseCtx *parseCtx,
-            size_t *resultIndex, UA_UInt16 depth) {
-    UA_StatusCode ret = UA_STATUSCODE_BADDECODINGERROR;
-    CHECK_TOKEN_BOUNDS;
-    
-    if(parseCtx->tokenArray[parseCtx->index].type == JSMN_OBJECT) {
-        size_t objectCount = (size_t)(parseCtx->tokenArray[parseCtx->index].size);
-        
-        parseCtx->index++; /*Object to first Key*/
-        CHECK_TOKEN_BOUNDS;
-        
-        size_t i;
-        for(i = 0; i < objectCount; i++) {
-            CHECK_TOKEN_BOUNDS;
-             
-            parseCtx->index++; /*value*/
-            CHECK_TOKEN_BOUNDS;
-            
-            if(parseCtx->tokenArray[parseCtx->index].type == JSMN_OBJECT) {
-               jumpOverRec(ctx, parseCtx, resultIndex, (UA_UInt16)(depth + 1));
-            } else if(parseCtx->tokenArray[parseCtx->index].type == JSMN_ARRAY) {
-               jumpOverRec(ctx, parseCtx, resultIndex, (UA_UInt16)(depth + 1));
-            } else {
-                /*Only Primitive or string*/
-                parseCtx->index++;
-            }
-        }
-    } else if(parseCtx->tokenArray[parseCtx->index].type == JSMN_ARRAY) {
-        size_t arraySize = (size_t)(parseCtx->tokenArray[parseCtx->index].size);
-        
-        parseCtx->index++; /*Object to first element*/
-        CHECK_TOKEN_BOUNDS;
-        
-        size_t i;
-        for(i = 0; i < arraySize; i++) {
-            if(parseCtx->tokenArray[parseCtx->index].type == JSMN_OBJECT) {
-               jumpOverRec(ctx, parseCtx, resultIndex, (UA_UInt16)(depth + 1));
-            } else if(parseCtx->tokenArray[parseCtx->index].type == JSMN_ARRAY) {
-               jumpOverRec(ctx, parseCtx, resultIndex, (UA_UInt16)(depth + 1));
-            } else {
-                /*Only Primitive or string*/
-                parseCtx->index++;
-            }
-        }
-    }
-    return ret;
-}
-
-static status
-jumpOverObject(CtxJson *ctx, ParseCtx *parseCtx, size_t *resultIndex) {
-    UA_UInt16 oldIndex = parseCtx->index; /* Save index for later restore */
-    UA_UInt16 depth = 0;
-    jumpOverRec(ctx, parseCtx, resultIndex, depth);
-    *resultIndex = parseCtx->index;
-    parseCtx->index = oldIndex; /* Restore index */
-    return UA_STATUSCODE_GOOD;
-}
-
-static status
-prepareDecodeNodeIdJson(UA_NodeId *dst, CtxJson *ctx, ParseCtx *parseCtx, 
-                        u8 *fieldCount, DecodeEntry *entries) {
-    /* possible keys: Id, IdType*/
-    /* Id must always be present */
-    entries[*fieldCount].fieldName = UA_JSONKEY_ID;
-    entries[*fieldCount].found = false;
-    entries[*fieldCount].type = NULL;
-    
-    /* IdType */
-    UA_Boolean hasIdType = false;
-    size_t searchResult = 0; 
-    status ret = lookAheadForKey(UA_JSONKEY_IDTYPE, ctx, parseCtx, &searchResult);
-    if(ret == UA_STATUSCODE_GOOD) { /*found*/
-         hasIdType = true;
-    }
-    
-    if(hasIdType) {
-        size_t size = (size_t)(parseCtx->tokenArray[searchResult].end -
-                               parseCtx->tokenArray[searchResult].start);
-        if(size < 1) {
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-
-        char *idType = (char*)(ctx->pos + parseCtx->tokenArray[searchResult].start);
-      
-        if(idType[0] == '2') {
-            dst->identifierType = UA_NODEIDTYPE_GUID;
-            entries[*fieldCount].fieldPointer = &dst->identifier.guid;
-            entries[*fieldCount].function = (decodeJsonSignature) Guid_decodeJson;
-        } else if(idType[0] == '1') {
-            dst->identifierType = UA_NODEIDTYPE_STRING;
-            entries[*fieldCount].fieldPointer = &dst->identifier.string;
-            entries[*fieldCount].function = (decodeJsonSignature) String_decodeJson;
-        } else if(idType[0] == '3') {
-            dst->identifierType = UA_NODEIDTYPE_BYTESTRING;
-            entries[*fieldCount].fieldPointer = &dst->identifier.byteString;
-            entries[*fieldCount].function = (decodeJsonSignature) ByteString_decodeJson;
-        } else {
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-        
-        /* Id always present */
-        (*fieldCount)++;
-        
-        entries[*fieldCount].fieldName = UA_JSONKEY_IDTYPE;
-        entries[*fieldCount].fieldPointer = NULL;
-        entries[*fieldCount].function = NULL;
-        entries[*fieldCount].found = false;
-        entries[*fieldCount].type = NULL;
-        
-        /* IdType */
-        (*fieldCount)++;
-    } else {
-        dst->identifierType = UA_NODEIDTYPE_NUMERIC;
-        entries[*fieldCount].fieldPointer = &dst->identifier.numeric;
-        entries[*fieldCount].function = (decodeJsonSignature) UInt32_decodeJson;
-        entries[*fieldCount].type = NULL;
-        (*fieldCount)++;
-    }
-    
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_JSON(NodeId) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    /* NameSpace */
-    UA_Boolean hasNamespace = false;
-    size_t searchResultNamespace = 0;
-    status ret = lookAheadForKey(UA_JSONKEY_NAMESPACE, ctx, parseCtx, &searchResultNamespace);
-    if(ret != UA_STATUSCODE_GOOD) {
-        dst->namespaceIndex = 0;
-    } else {
-        hasNamespace = true;
-    }
-    
-    /* Keep track over number of keys present, incremented if key found */
-    u8 fieldCount = 0;
-    DecodeEntry entries[3];
-    ret = prepareDecodeNodeIdJson(dst, ctx, parseCtx, &fieldCount, entries);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    if(hasNamespace) {
-        entries[fieldCount].fieldName = UA_JSONKEY_NAMESPACE;
-        entries[fieldCount].fieldPointer = &dst->namespaceIndex;
-        entries[fieldCount].function = (decodeJsonSignature) UInt16_decodeJson;
-        entries[fieldCount].found = false;
-        entries[fieldCount].type = NULL;
-        fieldCount++;
-    } else {
-        dst->namespaceIndex = 0;
-    }
-    ret = decodeFields(ctx, parseCtx, entries, fieldCount, type);
-    return ret;
-}
-
-DECODE_JSON(ExpandedNodeId) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    /* Keep track over number of keys present, incremented if key found */
-    u8 fieldCount = 0;
-    
-    /* ServerUri */
-    UA_Boolean hasServerUri = false;
-    size_t searchResultServerUri = 0;
-    status ret = lookAheadForKey(UA_JSONKEY_SERVERURI, ctx, parseCtx, &searchResultServerUri);
-    if(ret != UA_STATUSCODE_GOOD) {
-        dst->serverIndex = 0; 
-    } else {
-        hasServerUri = true;
-    }
-    
-    /* NameSpace */
-    UA_Boolean hasNamespace = false;
-    UA_Boolean isNamespaceString = false;
-    size_t searchResultNamespace = 0;
-    ret = lookAheadForKey(UA_JSONKEY_NAMESPACE, ctx, parseCtx, &searchResultNamespace);
-    if(ret != UA_STATUSCODE_GOOD) {
-        dst->namespaceUri = UA_STRING_NULL;
-    } else {
-        hasNamespace = true;
-        jsmntok_t nsToken = parseCtx->tokenArray[searchResultNamespace];
-        if(nsToken.type == JSMN_STRING)
-            isNamespaceString = true;
-    }
-
-    DecodeEntry entries[4];
-    ret = prepareDecodeNodeIdJson(&dst->nodeId, ctx, parseCtx, &fieldCount, entries);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    if(hasNamespace) {
-        entries[fieldCount].fieldName = UA_JSONKEY_NAMESPACE;
-        if(isNamespaceString) {
-            entries[fieldCount].fieldPointer = &dst->namespaceUri;
-            entries[fieldCount].function = (decodeJsonSignature) String_decodeJson;
-        } else {
-            entries[fieldCount].fieldPointer = &dst->nodeId.namespaceIndex;
-            entries[fieldCount].function = (decodeJsonSignature) UInt16_decodeJson;
-        }
-        entries[fieldCount].found = false;
-        entries[fieldCount].type = NULL;
-        fieldCount++; 
-    }
-    
-    if(hasServerUri) {
-        entries[fieldCount].fieldName = UA_JSONKEY_SERVERURI;
-        entries[fieldCount].fieldPointer = &dst->serverIndex;
-        entries[fieldCount].function = (decodeJsonSignature) UInt32_decodeJson;
-        entries[fieldCount].found = false;
-        entries[fieldCount].type = NULL;
-        fieldCount++;  
-    } else {
-        dst->serverIndex = 0;
-    }
-    
-    return decodeFields(ctx, parseCtx, entries, fieldCount, type);
-}
-
-DECODE_JSON(DateTime) {
-    CHECK_STRING;
-    CHECK_TOKEN_BOUNDS;
-    size_t tokenSize;
-    char* tokenData;
-    GET_TOKEN(tokenData, tokenSize);
-    
-    /* TODO: proper ISO 8601:2004 parsing, musl strptime!*/
-    /* DateTime  ISO 8601:2004 without milli is 20 Characters, with millis 24 */
-    if(tokenSize != 20 && tokenSize != 24) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    /* sanity check */
-    if(tokenData[4] != '-' || tokenData[7] != '-' || tokenData[10] != 'T' ||
-       tokenData[13] != ':' || tokenData[16] != ':' ||
-       !(tokenData[19] == 'Z' || tokenData[19] == '.')) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    struct mytm dts;
-    memset(&dts, 0, sizeof(dts));
-    
-    UA_UInt64 year = 0;
-    atoiUnsigned(&tokenData[0], 4, &year);
-    dts.tm_year = (UA_UInt16)year - 1900;
-    UA_UInt64 month = 0;
-    atoiUnsigned(&tokenData[5], 2, &month);
-    dts.tm_mon = (UA_UInt16)month - 1;
-    UA_UInt64 day = 0;
-    atoiUnsigned(&tokenData[8], 2, &day);
-    dts.tm_mday = (UA_UInt16)day;
-    UA_UInt64 hour = 0;
-    atoiUnsigned(&tokenData[11], 2, &hour);
-    dts.tm_hour = (UA_UInt16)hour;
-    UA_UInt64 min = 0;
-    atoiUnsigned(&tokenData[14], 2, &min);
-    dts.tm_min = (UA_UInt16)min;
-    UA_UInt64 sec = 0;
-    atoiUnsigned(&tokenData[17], 2, &sec);
-    dts.tm_sec = (UA_UInt16)sec;
-    
-    UA_UInt64 msec = 0;
-    if(tokenSize == 24) {
-        atoiUnsigned(&tokenData[20], 3, &msec);
-    }
-    
-    long long sinceunix = __tm_to_secs(&dts);
-    UA_DateTime dt = (UA_DateTime)((UA_UInt64)(sinceunix*UA_DATETIME_SEC +
-                                               UA_DATETIME_UNIX_EPOCH) +
-                                   (UA_UInt64)(UA_DATETIME_MSEC * msec)); 
-    *dst = dt;
-  
-    if(moveToken)
-        parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-DECODE_JSON(StatusCode) {
-    status ret = DECODE_DIRECT_JSON(dst, UInt32);
-    if(ret != UA_STATUSCODE_GOOD)
-        return ret;
-
-    if(moveToken)
-        parseCtx->index++;
-    return UA_STATUSCODE_GOOD;
-}
-
-static status
-VariantDimension_decodeJson(void * dst, const UA_DataType *type, 
-                            CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken) {
-    (void) type;
-    const UA_DataType *dimType = &UA_TYPES[UA_TYPES_UINT32];
-    return Array_decodeJson_internal((void**)dst, dimType, ctx, parseCtx, moveToken);
-}
-
-DECODE_JSON(Variant) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    /* First search for the variant type in the json object. */
-    size_t searchResultType = 0;
-    status ret = lookAheadForKey(UA_JSONKEY_TYPE, ctx, parseCtx, &searchResultType);
-    if(ret != UA_STATUSCODE_GOOD)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    size_t size = (size_t)(parseCtx->tokenArray[searchResultType].end - parseCtx->tokenArray[searchResultType].start);
-
-    /* check if size is zero or the type is not a number */
-    if(size < 1 || parseCtx->tokenArray[searchResultType].type != JSMN_PRIMITIVE) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    /*Parse the type*/
-    UA_UInt64 idTypeDecoded = 0;
-    char *idTypeEncoded = (char*)(ctx->pos + parseCtx->tokenArray[searchResultType].start);
-    status typeDecodeStatus = atoiUnsigned(idTypeEncoded, size, &idTypeDecoded);
-    
-    /* value is not a valid number */
-    if(typeDecodeStatus != UA_STATUSCODE_GOOD) {
-        return typeDecodeStatus;
-    }
-
-    /*Set the type, Get the Type by nodeID!*/
-    UA_NodeId typeNodeId = UA_NODEID_NUMERIC(0, (UA_UInt32)idTypeDecoded);
-    const UA_DataType *bodyType = UA_findDataType(&typeNodeId);
-    if(bodyType == NULL) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    /*Set the type*/
-    dst->type = bodyType;
-    
-    /* LookAhead BODY */
-    /* Does the variant contain an array? */
-    UA_Boolean isArray = false;
-    UA_Boolean isBodyNull = false;
-    
-    /* Search for body */
-    size_t searchResultBody = 0;
-    ret = lookAheadForKey(UA_JSONKEY_BODY, ctx, parseCtx, &searchResultBody);
-    if(ret == UA_STATUSCODE_GOOD) { /* body found */
-        /* get body token */
-        jsmntok_t bodyToken = parseCtx->tokenArray[searchResultBody];
-        
-        /*BODY is null?*/
-        if(isJsonTokenNull(ctx, &bodyToken)) {
-            dst->data = NULL;
-            isBodyNull = true;
-        }
-        
-        if(bodyToken.type == JSMN_ARRAY) {
-            isArray = true;
-            
-            size_t arraySize = 0;
-            arraySize = (size_t)parseCtx->tokenArray[searchResultBody].size;
-            dst->arrayLength = arraySize;
-        }
-    } else {
-        /*TODO: no body? set value NULL?*/
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    /* LookAhead DIMENSION */
-    UA_Boolean hasDimension = false;
-
-    /* Has the variant dimension? */
-    size_t searchResultDim = 0;
-    ret = lookAheadForKey(UA_JSONKEY_DIMENSION, ctx, parseCtx, &searchResultDim);
-    if(ret == UA_STATUSCODE_GOOD) {
-        hasDimension = true;
-        size_t dimensionSize = 0;
-        dimensionSize = (size_t)parseCtx->tokenArray[searchResultDim].size;
-        dst->arrayDimensionsSize = dimensionSize;
-    }
-    
-    /* no array but has dimension. error? */
-    if(!isArray && hasDimension)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    
-    /* Get the datatype of the content. The type must be a builtin data type.
-    * All not-builtin types are wrapped in an ExtensionObject. */
-    if(bodyType->typeKind > UA_TYPES_DIAGNOSTICINFO)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    /* A variant cannot contain a variant. But it can contain an array of
-        * variants */
-    if(bodyType->typeKind == UA_DATATYPEKIND_VARIANT && !isArray)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    
-    if(isArray) {
-        DecodeEntry entries[3] = {
-            {UA_JSONKEY_TYPE, NULL, NULL, false, NULL},
-            {UA_JSONKEY_BODY, &dst->data, (decodeJsonSignature) Array_decodeJson, false, NULL},
-            {UA_JSONKEY_DIMENSION, &dst->arrayDimensions,
-             (decodeJsonSignature) VariantDimension_decodeJson, false, NULL}};
-
-        if(!hasDimension) {
-            ret = decodeFields(ctx, parseCtx, entries, 2, bodyType); /*use first 2 fields*/
-        } else {
-            ret = decodeFields(ctx, parseCtx, entries, 3, bodyType); /*use all fields*/
-        }      
-    } else if(bodyType->typeKind != UA_DATATYPEKIND_EXTENSIONOBJECT) {
-        /* Allocate Memory for Body */
-        if(!isBodyNull) {
-            dst->data = UA_new(bodyType);
-            if(!dst->data)
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-        
-        DecodeEntry entries[2] = {{UA_JSONKEY_TYPE, NULL, NULL, false, NULL},
-            {UA_JSONKEY_BODY, dst->data, (decodeJsonSignature) decodeJsonInternal, false, NULL}};
-        ret = decodeFields(ctx, parseCtx, entries, 2, bodyType);
-    } else { /* extensionObject */
-        DecodeEntry entries[2] = {{UA_JSONKEY_TYPE, NULL, NULL, false, NULL},
-            {UA_JSONKEY_BODY, dst,
-             (decodeJsonSignature) Variant_decodeJsonUnwrapExtensionObject, false, NULL}};
-        ret = decodeFields(ctx, parseCtx, entries, 2, bodyType);
-    }
-    return ret;
-}
-
-DECODE_JSON(DataValue) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    DecodeEntry entries[6] = {
-       {UA_JSONKEY_VALUE, &dst->value, (decodeJsonSignature) Variant_decodeJson, false, NULL},
-       {UA_JSONKEY_STATUS, &dst->status, (decodeJsonSignature) StatusCode_decodeJson, false, NULL},
-       {UA_JSONKEY_SOURCETIMESTAMP, &dst->sourceTimestamp, (decodeJsonSignature) DateTime_decodeJson, false, NULL},
-       {UA_JSONKEY_SOURCEPICOSECONDS, &dst->sourcePicoseconds, (decodeJsonSignature) UInt16_decodeJson, false, NULL},
-       {UA_JSONKEY_SERVERTIMESTAMP, &dst->serverTimestamp, (decodeJsonSignature) DateTime_decodeJson, false, NULL},
-       {UA_JSONKEY_SERVERPICOSECONDS, &dst->serverPicoseconds, (decodeJsonSignature) UInt16_decodeJson, false, NULL}};
-
-    status ret = decodeFields(ctx, parseCtx, entries, 6, type);
-    dst->hasValue = entries[0].found; dst->hasStatus = entries[1].found;
-    dst->hasSourceTimestamp = entries[2].found; dst->hasSourcePicoseconds = entries[3].found;
-    dst->hasServerTimestamp = entries[4].found; dst->hasServerPicoseconds = entries[5].found;
-    return ret;
-}
-
-DECODE_JSON(ExtensionObject) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    /* Search for Encoding */
-    size_t searchEncodingResult = 0;
-    status ret = lookAheadForKey(UA_JSONKEY_ENCODING, ctx, parseCtx, &searchEncodingResult);
-    
-    /* If no encoding found it is structure encoding */
-    if(ret != UA_STATUSCODE_GOOD) {
-        UA_NodeId typeId;
-        UA_NodeId_init(&typeId);
-
-        size_t searchTypeIdResult = 0;
-        ret = lookAheadForKey(UA_JSONKEY_TYPEID, ctx, parseCtx, &searchTypeIdResult);
-        if(ret != UA_STATUSCODE_GOOD) {
-            /* TYPEID not found, abort */
-            return UA_STATUSCODE_BADENCODINGERROR;
-        }
-
-        /* parse the nodeid */
-        /*for restore*/
-        UA_UInt16 index = parseCtx->index;
-        parseCtx->index = (UA_UInt16)searchTypeIdResult;
-        ret = NodeId_decodeJson(&typeId, &UA_TYPES[UA_TYPES_NODEID], ctx, parseCtx, true);
-        if(ret != UA_STATUSCODE_GOOD)
-            return ret;
-        
-        /*restore*/
-        parseCtx->index = index;
-        const UA_DataType *typeOfBody = UA_findDataType(&typeId);
-        if(!typeOfBody) {
-            /*dont decode body: 1. save as bytestring, 2. jump over*/
-            dst->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-            UA_NodeId_copy(&typeId, &dst->content.encoded.typeId);
-            
-            /*Check if Object in Extentionobject*/
-            if(getJsmnType(parseCtx) != JSMN_OBJECT) {
-                UA_NodeId_deleteMembers(&typeId);
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-            
-            /*Search for Body to save*/
-            size_t searchBodyResult = 0;
-            ret = lookAheadForKey(UA_JSONKEY_BODY, ctx, parseCtx, &searchBodyResult);
-            if(ret != UA_STATUSCODE_GOOD) {
-                /*No Body*/
-                UA_NodeId_deleteMembers(&typeId);
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-            
-            if(searchBodyResult >= (size_t)parseCtx->tokenCount) {
-                /*index not in Tokenarray*/
-                UA_NodeId_deleteMembers(&typeId);
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-
-            /* Get the size of the Object as a string, not the Object key count! */
-            UA_Int64 sizeOfJsonString =(parseCtx->tokenArray[searchBodyResult].end -
-                    parseCtx->tokenArray[searchBodyResult].start);
-            
-            char* bodyJsonString = (char*)(ctx->pos + parseCtx->tokenArray[searchBodyResult].start);
-            
-            if(sizeOfJsonString <= 0) {
-                UA_NodeId_deleteMembers(&typeId);
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-            
-            /* Save encoded as bytestring. */
-            ret = UA_ByteString_allocBuffer(&dst->content.encoded.body, (size_t)sizeOfJsonString);
-            if(ret != UA_STATUSCODE_GOOD) {
-                UA_NodeId_deleteMembers(&typeId);
-                return ret;
-            }
-
-            memcpy(dst->content.encoded.body.data, bodyJsonString, (size_t)sizeOfJsonString);
-            
-            size_t tokenAfteExtensionObject = 0;
-            jumpOverObject(ctx, parseCtx, &tokenAfteExtensionObject);
-            
-            if(tokenAfteExtensionObject == 0) {
-                /*next object token not found*/
-                UA_NodeId_deleteMembers(&typeId);
-                UA_ByteString_deleteMembers(&dst->content.encoded.body);
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-            
-            parseCtx->index = (UA_UInt16)tokenAfteExtensionObject;
-            
-            return UA_STATUSCODE_GOOD;
-        }
-        
-        /*Type id not used anymore, typeOfBody has type*/
-        UA_NodeId_deleteMembers(&typeId);
-        
-        /*Set Found Type*/
-        dst->content.decoded.type = typeOfBody;
-        dst->encoding = UA_EXTENSIONOBJECT_DECODED;
-        
-        if(searchTypeIdResult != 0) {
-            dst->content.decoded.data = UA_new(typeOfBody);
-            if(!dst->content.decoded.data)
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-
-            UA_NodeId typeId_dummy;
-            DecodeEntry entries[2] = {
-                {UA_JSONKEY_TYPEID, &typeId_dummy, (decodeJsonSignature) NodeId_decodeJson, false, NULL},
-                {UA_JSONKEY_BODY, dst->content.decoded.data,
-                 (decodeJsonSignature) decodeJsonJumpTable[typeOfBody->typeKind], false, NULL}
-            };
-
-            return decodeFields(ctx, parseCtx, entries, 2, typeOfBody);
-        } else {
-           return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    } else { /* UA_JSONKEY_ENCODING found */
-        /*Parse the encoding*/
-        UA_UInt64 encoding = 0;
-        char *extObjEncoding = (char*)(ctx->pos + parseCtx->tokenArray[searchEncodingResult].start);
-        size_t size = (size_t)(parseCtx->tokenArray[searchEncodingResult].end - parseCtx->tokenArray[searchEncodingResult].start);
-        atoiUnsigned(extObjEncoding, size, &encoding);
-
-        if(encoding == 1) {
-            /* BYTESTRING in Json Body */
-            dst->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-            UA_UInt16 encodingTypeJson;
-            DecodeEntry entries[3] = {
-                {UA_JSONKEY_ENCODING, &encodingTypeJson, (decodeJsonSignature) UInt16_decodeJson, false, NULL},
-                {UA_JSONKEY_BODY, &dst->content.encoded.body, (decodeJsonSignature) String_decodeJson, false, NULL},
-                {UA_JSONKEY_TYPEID, &dst->content.encoded.typeId, (decodeJsonSignature) NodeId_decodeJson, false, NULL}
-            };
-
-            return decodeFields(ctx, parseCtx, entries, 3, type);
-        } else if(encoding == 2) {
-            /* XmlElement in Json Body */
-            dst->encoding = UA_EXTENSIONOBJECT_ENCODED_XML;
-            UA_UInt16 encodingTypeJson;
-            DecodeEntry entries[3] = {
-                {UA_JSONKEY_ENCODING, &encodingTypeJson, (decodeJsonSignature) UInt16_decodeJson, false, NULL},
-                {UA_JSONKEY_BODY, &dst->content.encoded.body, (decodeJsonSignature) String_decodeJson, false, NULL},
-                {UA_JSONKEY_TYPEID, &dst->content.encoded.typeId, (decodeJsonSignature) NodeId_decodeJson, false, NULL}
-            };
-            return decodeFields(ctx, parseCtx, entries, 3, type);
-        } else {
-            return UA_STATUSCODE_BADDECODINGERROR;
-        }
-    }
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-static status
-Variant_decodeJsonUnwrapExtensionObject(UA_Variant *dst, const UA_DataType *type, 
-                                        CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken) {
-    (void) type, (void) moveToken;
-    /*EXTENSIONOBJECT POSITION!*/
-    UA_UInt16 old_index = parseCtx->index;
-    UA_Boolean typeIdFound;
-    
-    /* Decode the DataType */
-    UA_NodeId typeId;
-    UA_NodeId_init(&typeId);
-
-    size_t searchTypeIdResult = 0;
-    status ret = lookAheadForKey(UA_JSONKEY_TYPEID, ctx, parseCtx, &searchTypeIdResult);
-
-    if(ret != UA_STATUSCODE_GOOD) {
-        /*No Typeid found*/
-        typeIdFound = false;
-        /*return UA_STATUSCODE_BADDECODINGERROR;*/
-    } else {
-        typeIdFound = true;
-        /* parse the nodeid */
-        parseCtx->index = (UA_UInt16)searchTypeIdResult;
-        ret = NodeId_decodeJson(&typeId, &UA_TYPES[UA_TYPES_NODEID], ctx, parseCtx, true);
-        if(ret != UA_STATUSCODE_GOOD) {
-            UA_NodeId_deleteMembers(&typeId);
-            return ret;
-        }
-
-        /*restore index, ExtensionObject position*/
-        parseCtx->index = old_index;
-    }
-
-    /* ---Decode the EncodingByte--- */
-    if(!typeIdFound)
-        return UA_STATUSCODE_BADDECODINGERROR;
-
-    UA_Boolean encodingFound = false;
-    /*Search for Encoding*/
-    size_t searchEncodingResult = 0;
-    ret = lookAheadForKey(UA_JSONKEY_ENCODING, ctx, parseCtx, &searchEncodingResult);
-
-    UA_UInt64 encoding = 0;
-    /*If no encoding found it is Structure encoding*/
-    if(ret == UA_STATUSCODE_GOOD) { /*FOUND*/
-        encodingFound = true;
-        char *extObjEncoding = (char*)(ctx->pos + parseCtx->tokenArray[searchEncodingResult].start);
-        size_t size = (size_t)(parseCtx->tokenArray[searchEncodingResult].end 
-                               - parseCtx->tokenArray[searchEncodingResult].start);
-        atoiUnsigned(extObjEncoding, size, &encoding);
-    }
-        
-    const UA_DataType *typeOfBody = UA_findDataType(&typeId);
-        
-    if(encoding == 0 || typeOfBody != NULL) {
-        /*This value is 0 if the body is Structure encoded as a JSON object (see 5.4.6).*/
-        /* Found a valid type and it is structure encoded so it can be unwrapped */
-        dst->type = typeOfBody;
-
-        /* Allocate memory for type*/
-        dst->data = UA_new(dst->type);
-        if(!dst->data) {
-            UA_NodeId_deleteMembers(&typeId);
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        }
-
-        /* Decode the content */
-        UA_NodeId nodeIddummy;
-        DecodeEntry entries[3] =
-            {
-             {UA_JSONKEY_TYPEID, &nodeIddummy, (decodeJsonSignature) NodeId_decodeJson, false, NULL},
-             {UA_JSONKEY_BODY, dst->data,
-              (decodeJsonSignature) decodeJsonJumpTable[dst->type->typeKind], false, NULL},
-             {UA_JSONKEY_ENCODING, NULL, NULL, false, NULL}};
-
-        ret = decodeFields(ctx, parseCtx, entries, encodingFound ? 3:2, typeOfBody);
-        if(ret != UA_STATUSCODE_GOOD) {
-            UA_free(dst->data);
-        }
-    } else if(encoding == 1 || encoding == 2 || typeOfBody == NULL) {
-        UA_NodeId_deleteMembers(&typeId);
-            
-        /* decode as ExtensionObject */
-        dst->type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
-
-        /* Allocate memory for extensionobject*/
-        dst->data = UA_new(dst->type);
-        if(!dst->data)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-
-        /* decode: Does not move tokenindex. */
-        ret = DECODE_DIRECT_JSON(dst->data, ExtensionObject);
-        if(ret != UA_STATUSCODE_GOOD)
-            UA_free(dst->data);
-    } else {
-        /*no recognized encoding type*/
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    return ret;
-}
-status DiagnosticInfoInner_decodeJson(void* dst, const UA_DataType* type, 
-        CtxJson* ctx, ParseCtx* parseCtx, UA_Boolean moveToken);
-
-DECODE_JSON(DiagnosticInfo) {
-    ALLOW_NULL;
-    CHECK_OBJECT;
-
-    DecodeEntry entries[7] = {
-       {UA_JSONKEY_SYMBOLICID, &dst->symbolicId, (decodeJsonSignature) Int32_decodeJson, false, NULL},
-       {UA_JSONKEY_NAMESPACEURI, &dst->namespaceUri, (decodeJsonSignature) Int32_decodeJson, false, NULL},
-       {UA_JSONKEY_LOCALIZEDTEXT, &dst->localizedText, (decodeJsonSignature) Int32_decodeJson, false, NULL},
-       {UA_JSONKEY_LOCALE, &dst->locale, (decodeJsonSignature) Int32_decodeJson, false, NULL},
-       {UA_JSONKEY_ADDITIONALINFO, &dst->additionalInfo, (decodeJsonSignature) String_decodeJson, false, NULL},
-       {UA_JSONKEY_INNERSTATUSCODE, &dst->innerStatusCode, (decodeJsonSignature) StatusCode_decodeJson, false, NULL},
-       {UA_JSONKEY_INNERDIAGNOSTICINFO, &dst->innerDiagnosticInfo, (decodeJsonSignature) DiagnosticInfoInner_decodeJson, false, NULL}};
-    status ret = decodeFields(ctx, parseCtx, entries, 7, type);
-
-    dst->hasSymbolicId = entries[0].found; dst->hasNamespaceUri = entries[1].found;
-    dst->hasLocalizedText = entries[2].found; dst->hasLocale = entries[3].found;
-    dst->hasAdditionalInfo = entries[4].found; dst->hasInnerStatusCode = entries[5].found;
-    dst->hasInnerDiagnosticInfo = entries[6].found;
-    return ret;
-}
-
-status
-DiagnosticInfoInner_decodeJson(void* dst, const UA_DataType* type, 
-                               CtxJson* ctx, ParseCtx* parseCtx, UA_Boolean moveToken) {
-    UA_DiagnosticInfo *inner = (UA_DiagnosticInfo*)UA_calloc(1, sizeof(UA_DiagnosticInfo));
-    if(inner == NULL) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    memcpy(dst, &inner, sizeof(UA_DiagnosticInfo*)); /* Copy new Pointer do dest */
-    return DiagnosticInfo_decodeJson(inner, type, ctx, parseCtx, moveToken);
-}
-
-status 
-decodeFields(CtxJson *ctx, ParseCtx *parseCtx, DecodeEntry *entries,
-             size_t entryCount, const UA_DataType *type) {
-    CHECK_TOKEN_BOUNDS;
-    size_t objectCount = (size_t)(parseCtx->tokenArray[parseCtx->index].size);
-    status ret = UA_STATUSCODE_GOOD;
-
-    if(entryCount == 1) {
-        if(*(entries[0].fieldName) == 0) { /*No MemberName*/
-            return entries[0].function(entries[0].fieldPointer, type,
-                                       ctx, parseCtx, true); /*ENCODE DIRECT*/
-        }
-    } else if(entryCount == 0) {
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-
-    parseCtx->index++; /*go to first key*/
-    CHECK_TOKEN_BOUNDS;
-    
-    for (size_t currentObjectCount = 0; currentObjectCount < objectCount &&
-             parseCtx->index < parseCtx->tokenCount; currentObjectCount++) {
-
-        /* start searching at the index of currentObjectCount */
-        for (size_t i = currentObjectCount; i < entryCount + currentObjectCount; i++) {
-            /* Search for KEY, if found outer loop will be one less. Best case
-             * is objectCount if in order! */
-            size_t index = i % entryCount;
-            
-            CHECK_TOKEN_BOUNDS;
-            if(jsoneq((char*) ctx->pos, &parseCtx->tokenArray[parseCtx->index], 
-                       entries[index].fieldName) != 0)
-                continue;
-
-            if(entries[index].found) {
-                /*Duplicate Key found, abort.*/
-                return UA_STATUSCODE_BADDECODINGERROR;
-            }
-
-            entries[index].found = true;
-
-            parseCtx->index++; /*goto value*/
-            CHECK_TOKEN_BOUNDS;
-            
-            /* Find the data type.
-             * TODO: get rid of parameter type. Only forward via DecodeEntry.
-             */
-            const UA_DataType *membertype = type;
-            if(entries[index].type)
-                membertype = entries[index].type;
-
-            if(entries[index].function != NULL) {
-                ret = entries[index].function(entries[index].fieldPointer,
-                                              membertype, ctx, parseCtx, true); /*Move Token True*/
-                if(ret != UA_STATUSCODE_GOOD)
-                    return ret;
-            } else {
-                /*overstep single value, this will not work if object or array
-                 Only used not to double parse pre looked up type, but it has to be overstepped*/
-                parseCtx->index++;
-            }
-            break;
-        }
-    }
-    return ret;
-}
-
-static status
-Array_decodeJson_internal(void **dst, const UA_DataType *type, 
-        CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken) {
-    (void) moveToken;
-    status ret;
-    
-    if(parseCtx->tokenArray[parseCtx->index].type != JSMN_ARRAY)
-        return UA_STATUSCODE_BADDECODINGERROR;
-    
-    size_t length = (size_t)parseCtx->tokenArray[parseCtx->index].size;
-
-    /* Save the length of the array */
-    size_t *p = (size_t*) dst - 1;
-    *p = length;
-
-    /* Return early for empty arrays */
-    if(length == 0) {
-        *dst = UA_EMPTY_ARRAY_SENTINEL;
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Allocate memory */
-    *dst = UA_calloc(length, type->memSize);
-    if(*dst == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    
-    parseCtx->index++; /* We go to first Array member!*/
-    
-    /* Decode array members */
-    uintptr_t ptr = (uintptr_t)*dst;
-    for(size_t i = 0; i < length; ++i) {
-        ret = decodeJsonJumpTable[type->typeKind]((void*)ptr, type, ctx, parseCtx, true);
-        if(ret != UA_STATUSCODE_GOOD) {
-            UA_Array_delete(*dst, i+1, type);
-            *dst = NULL;
-            return ret;
-        }
-        ptr += type->memSize;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-/*Wrapper for array with valid decodingStructure.*/
-static status
-Array_decodeJson(void * dst, const UA_DataType *type, CtxJson *ctx, 
-        ParseCtx *parseCtx, UA_Boolean moveToken) {
-    return Array_decodeJson_internal((void **)dst, type, ctx, parseCtx, moveToken);
-}
-
-static status
-decodeJsonStructure(void *dst, const UA_DataType *type, CtxJson *ctx, 
-                    ParseCtx *parseCtx, UA_Boolean moveToken) {
-    (void) moveToken;
-    /* Check the recursion limit */
-    if(ctx->depth > UA_JSON_ENCODING_MAX_RECURSION)
-        return UA_STATUSCODE_BADENCODINGERROR;
-    ctx->depth++;
-
-    uintptr_t ptr = (uintptr_t)dst;
-    status ret = UA_STATUSCODE_GOOD;
-    u8 membersSize = type->membersSize;
-    const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] };
-    
-    UA_STACKARRAY(DecodeEntry, entries, membersSize);
-
-    for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) {
-        const UA_DataTypeMember *m = &type->members[i];
-        const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex];
-
-        entries[i].type = mt;
-        if(!m->isArray) {
-            ptr += m->padding;
-            entries[i].fieldName = m->memberName;
-            entries[i].fieldPointer = (void*)ptr;
-            entries[i].function = decodeJsonJumpTable[mt->typeKind];
-            entries[i].found = false;
-            ptr += mt->memSize;
-        } else {
-            ptr += m->padding;
-            ptr += sizeof(size_t);
-            entries[i].fieldName = m->memberName;
-            entries[i].fieldPointer = (void*)ptr;
-            entries[i].function = (decodeJsonSignature)Array_decodeJson;
-            entries[i].found = false;
-            ptr += sizeof(void*);
-        }
-    }
-    
-    ret = decodeFields(ctx, parseCtx, entries, membersSize, type);
-
-    ctx->depth--;
-    return ret;
-}
-
-static status
-decodeJsonNotImplemented(void *dst, const UA_DataType *type, CtxJson *ctx, 
-                         ParseCtx *parseCtx, UA_Boolean moveToken) {
-    (void)dst, (void)type, (void)ctx, (void)parseCtx, (void)moveToken;
-    return UA_STATUSCODE_BADNOTIMPLEMENTED;
-}
-
-const decodeJsonSignature decodeJsonJumpTable[UA_DATATYPEKINDS] = {
-    (decodeJsonSignature)Boolean_decodeJson,
-    (decodeJsonSignature)SByte_decodeJson, /* SByte */
-    (decodeJsonSignature)Byte_decodeJson,
-    (decodeJsonSignature)Int16_decodeJson, /* Int16 */
-    (decodeJsonSignature)UInt16_decodeJson,
-    (decodeJsonSignature)Int32_decodeJson, /* Int32 */
-    (decodeJsonSignature)UInt32_decodeJson,
-    (decodeJsonSignature)Int64_decodeJson, /* Int64 */
-    (decodeJsonSignature)UInt64_decodeJson,
-    (decodeJsonSignature)Float_decodeJson,
-    (decodeJsonSignature)Double_decodeJson,
-    (decodeJsonSignature)String_decodeJson,
-    (decodeJsonSignature)DateTime_decodeJson, /* DateTime */
-    (decodeJsonSignature)Guid_decodeJson,
-    (decodeJsonSignature)ByteString_decodeJson, /* ByteString */
-    (decodeJsonSignature)String_decodeJson, /* XmlElement */
-    (decodeJsonSignature)NodeId_decodeJson,
-    (decodeJsonSignature)ExpandedNodeId_decodeJson,
-    (decodeJsonSignature)StatusCode_decodeJson, /* StatusCode */
-    (decodeJsonSignature)QualifiedName_decodeJson, /* QualifiedName */
-    (decodeJsonSignature)LocalizedText_decodeJson,
-    (decodeJsonSignature)ExtensionObject_decodeJson,
-    (decodeJsonSignature)DataValue_decodeJson,
-    (decodeJsonSignature)Variant_decodeJson,
-    (decodeJsonSignature)DiagnosticInfo_decodeJson,
-    (decodeJsonSignature)decodeJsonNotImplemented, /* Decimal */
-    (decodeJsonSignature)Int32_decodeJson, /* Enum */
-    (decodeJsonSignature)decodeJsonStructure,
-    (decodeJsonSignature)decodeJsonNotImplemented, /* Structure with optional fields */
-    (decodeJsonSignature)decodeJsonNotImplemented, /* Union */
-    (decodeJsonSignature)decodeJsonNotImplemented /* BitfieldCluster */
-};
-
-decodeJsonSignature getDecodeSignature(u8 index) {
-    return decodeJsonJumpTable[index];
-}
-
-status
-tokenize(ParseCtx *parseCtx, CtxJson *ctx, const UA_ByteString *src) {
-    /* Set up the context */
-    ctx->pos = &src->data[0];
-    ctx->end = &src->data[src->length];
-    ctx->depth = 0;
-    parseCtx->tokenCount = 0;
-    parseCtx->index = 0;
-
-    /*Set up tokenizer jsmn*/
-    jsmn_parser p;
-    jsmn_init(&p);
-    parseCtx->tokenCount = (UA_Int32)
-        jsmn_parse(&p, (char*)src->data, src->length,
-                   parseCtx->tokenArray, UA_JSON_MAXTOKENCOUNT);
-    
-    if(parseCtx->tokenCount < 0) {
-        if(parseCtx->tokenCount == JSMN_ERROR_NOMEM)
-            return UA_STATUSCODE_BADOUTOFMEMORY;
-        return UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-decodeJsonInternal(void *dst, const UA_DataType *type,
-                   CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken) {
-
-    return decodeJsonJumpTable[type->typeKind](dst, type, ctx, parseCtx, moveToken);
-}
-
-status UA_FUNC_ATTR_WARN_UNUSED_RESULT
-UA_decodeJson(const UA_ByteString *src, void *dst, const UA_DataType *type) {
-    
-#ifndef UA_ENABLE_TYPEDESCRIPTION
-    return UA_STATUSCODE_BADNOTSUPPORTED;
-#endif
-    
-    if(dst == NULL || src == NULL || type == NULL) {
-        return UA_STATUSCODE_BADARGUMENTSMISSING;
-    }
-    
-    /* Set up the context */
-    CtxJson ctx;
-    ParseCtx parseCtx;
-    parseCtx.tokenArray = (jsmntok_t*)UA_malloc(sizeof(jsmntok_t) * UA_JSON_MAXTOKENCOUNT);
-    if(!parseCtx.tokenArray)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    
-    status ret = tokenize(&parseCtx, &ctx, src);
-    if(ret != UA_STATUSCODE_GOOD)
-        goto cleanup;
-
-    /* Assume the top-level element is an object */
-    if(parseCtx.tokenCount < 1 || parseCtx.tokenArray[0].type != JSMN_OBJECT) {
-        if(parseCtx.tokenCount == 1) {
-            if(parseCtx.tokenArray[0].type == JSMN_PRIMITIVE ||
-               parseCtx.tokenArray[0].type == JSMN_STRING) {
-               /* Only a primitive to parse. Do it directly. */
-               memset(dst, 0, type->memSize); /* Initialize the value */
-               ret = decodeJsonJumpTable[type->typeKind](dst, type, &ctx, &parseCtx, true);
-               goto cleanup;
-            }
-        }
-        ret = UA_STATUSCODE_BADDECODINGERROR;
-        goto cleanup;
-    }
-
-    /* Decode */
-    memset(dst, 0, type->memSize); /* Initialize the value */
-    ret = decodeJsonJumpTable[type->typeKind](dst, type, &ctx, &parseCtx, true);
-
-    cleanup:
-    UA_free(parseCtx.tokenArray);
-    
-    /* sanity check if all Tokens were processed */
-    if(!(parseCtx.index == parseCtx.tokenCount ||
-         parseCtx.index == parseCtx.tokenCount-1)) {
-        ret = UA_STATUSCODE_BADDECODINGERROR;
-    }
-    
-    if(ret != UA_STATUSCODE_GOOD)
-        UA_deleteMembers(dst, type); /* Clean up */
-    return ret;
-}
diff --git a/ext/open62541/src/ua_types_encoding_json.h b/ext/open62541/src/ua_types_encoding_json.h
deleted file mode 100644
index 558c24e..0000000
--- a/ext/open62541/src/ua_types_encoding_json.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Lukas Meling)
- */
-
-#ifndef UA_TYPES_ENCODING_JSON_H_
-#define UA_TYPES_ENCODING_JSON_H_
-
-#include <open62541/types.h>
-
-#include "ua_types_encoding_binary.h"
-#include "ua_types_encoding_json.h"
-#include "ua_util_internal.h"
-
-#include "../deps/jsmn/jsmn.h"
-
-_UA_BEGIN_DECLS
-
-#define UA_JSON_MAXTOKENCOUNT 1000
-    
-size_t
-UA_calcSizeJson(const void *src, const UA_DataType *type,
-                UA_String *namespaces, size_t namespaceSize,
-                UA_String *serverUris, size_t serverUriSize,
-                UA_Boolean useReversible) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-UA_StatusCode
-UA_encodeJson(const void *src, const UA_DataType *type,
-              uint8_t **bufPos, const uint8_t **bufEnd,
-              UA_String *namespaces, size_t namespaceSize,
-              UA_String *serverUris, size_t serverUriSize,
-              UA_Boolean useReversible) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-UA_StatusCode
-UA_decodeJson(const UA_ByteString *src, void *dst,
-              const UA_DataType *type) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-/* Interal Definitions
- *
- * For future by the PubSub encoding */
-
-#define UA_JSON_ENCODING_MAX_RECURSION 100
-typedef struct {
-    uint8_t *pos;
-    const uint8_t *end;
-
-    uint16_t depth; /* How often did we en-/decoding recurse? */
-    UA_Boolean commaNeeded[UA_JSON_ENCODING_MAX_RECURSION];
-    UA_Boolean useReversible;
-    UA_Boolean calcOnly; /* Only compute the length of the decoding */
-
-    size_t namespacesSize;
-    UA_String *namespaces;
-    
-    size_t serverUrisSize;
-    UA_String *serverUris;
-} CtxJson;
-
-UA_StatusCode writeJsonObjStart(CtxJson *ctx);
-UA_StatusCode writeJsonObjElm(CtxJson *ctx, const char *key,
-                              const void *value, const UA_DataType *type);
-UA_StatusCode writeJsonObjEnd(CtxJson *ctx);
-
-UA_StatusCode writeJsonArrStart(CtxJson *ctx);
-UA_StatusCode writeJsonArrElm(CtxJson *ctx, const void *value,
-                              const UA_DataType *type);
-UA_StatusCode writeJsonArrEnd(CtxJson *ctx);
-
-UA_StatusCode writeJsonKey(CtxJson *ctx, const char* key);
-UA_StatusCode writeJsonCommaIfNeeded(CtxJson *ctx);
-UA_StatusCode writeJsonNull(CtxJson *ctx);
-
-/* The encoding length is returned in ctx->pos */
-static UA_INLINE UA_StatusCode
-calcJsonObjStart(CtxJson *ctx) {
-    UA_assert(ctx->calcOnly);
-    return writeJsonObjStart(ctx);
-}
-
-static UA_INLINE UA_StatusCode
-calcJsonObjElm(CtxJson *ctx, const char *key,
-               const void *value, const UA_DataType *type) {
-    UA_assert(ctx->calcOnly);
-    return writeJsonObjElm(ctx, key, value, type);
-}
-
-static UA_INLINE UA_StatusCode
-calcJsonObjEnd(CtxJson *ctx) {
-    UA_assert(ctx->calcOnly);
-    return writeJsonObjEnd(ctx);
-}
-
-static UA_INLINE UA_StatusCode
-calcJsonArrStart(CtxJson *ctx) {
-    UA_assert(ctx->calcOnly);
-    return writeJsonArrStart(ctx);
-}
-
-static UA_INLINE UA_StatusCode
-calcJsonArrElm(CtxJson *ctx, const void *value,
-               const UA_DataType *type) {
-    UA_assert(ctx->calcOnly);
-    return writeJsonArrElm(ctx, value, type);
-}
-
-static UA_INLINE UA_StatusCode
-calcJsonArrEnd(CtxJson *ctx) {
-    UA_assert(ctx->calcOnly);
-    return writeJsonArrEnd(ctx);
-}
-
-status
-encodeJsonInternal(const void *src, const UA_DataType *type, CtxJson *ctx);
-
-typedef struct {
-    jsmntok_t *tokenArray;
-    UA_Int32 tokenCount;
-    UA_UInt16 index;
-
-    /* Additonal data for special cases such as networkmessage/datasetmessage
-     * Currently only used for dataSetWriterIds */
-    size_t numCustom;
-    void * custom;
-    size_t* currentCustomIndex;
-} ParseCtx;
-
-typedef UA_StatusCode
-(*encodeJsonSignature)(const void *src, const UA_DataType *type, CtxJson *ctx);
-
-typedef UA_StatusCode
-(*decodeJsonSignature)(void *dst, const UA_DataType *type, CtxJson *ctx,
-                       ParseCtx *parseCtx, UA_Boolean moveToken);
-
-/* Map for decoding a Json Object. An array of this is passed to the
- * decodeFields function. If the key "fieldName" is found in the json object
- * (mark as found and) decode the value with the "function" and write result
- * into "fieldPointer" (destination). */
-typedef struct {
-    const char * fieldName;
-    void * fieldPointer;
-    decodeJsonSignature function;
-    UA_Boolean found;
-    const UA_DataType *type;
-} DecodeEntry;
-
-UA_StatusCode
-decodeFields(CtxJson *ctx, ParseCtx *parseCtx,
-             DecodeEntry *entries, size_t entryCount,
-             const UA_DataType *type);
-
-UA_StatusCode
-decodeJsonInternal(void *dst, const UA_DataType *type,
-                   CtxJson *ctx, ParseCtx *parseCtx, UA_Boolean moveToken);
-
-/* workaround: TODO generate functions for UA_xxx_decodeJson */
-decodeJsonSignature getDecodeSignature(u8 index);
-UA_StatusCode lookAheadForKey(const char* search, CtxJson *ctx, ParseCtx *parseCtx, size_t *resultIndex);
-jsmntype_t getJsmnType(const ParseCtx *parseCtx);
-UA_StatusCode tokenize(ParseCtx *parseCtx, CtxJson *ctx, const UA_ByteString *src);
-UA_Boolean isJsonNull(const CtxJson *ctx, const ParseCtx *parseCtx);
-
-_UA_END_DECLS
-
-#endif /* UA_TYPES_ENCODING_JSON_H_ */
diff --git a/ext/open62541/src/ua_util.c b/ext/open62541/src/ua_util.c
deleted file mode 100644
index f6d475c..0000000
--- a/ext/open62541/src/ua_util.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014, 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#include <open62541/types_generated_handling.h>
-#include <open62541/util.h>
-
-#include "ua_util_internal.h"
-
-#include "base64.h"
-
-size_t
-UA_readNumberWithBase(const UA_Byte *buf, size_t buflen, UA_UInt32 *number, UA_Byte base) {
-    UA_assert(buf);
-    UA_assert(number);
-    u32 n = 0;
-    size_t progress = 0;
-    /* read numbers until the end or a non-number character appears */
-    while(progress < buflen) {
-        u8 c = buf[progress];
-        if(c >= '0' && c <= '9' && c <= '0' + (base-1))
-           n = (n * base) + c - '0';
-        else if(base > 9 && c >= 'a' && c <= 'z' && c <= 'a' + (base-11))
-           n = (n * base) + c-'a' + 10;
-        else if(base > 9 && c >= 'A' && c <= 'Z' && c <= 'A' + (base-11))
-           n = (n * base) + c-'A' + 10;
-        else
-           break;
-        ++progress;
-    }
-    *number = n;
-    return progress;
-}
-
-size_t
-UA_readNumber(UA_Byte *buf, size_t buflen, UA_UInt32 *number)
-{
-    return UA_readNumberWithBase(buf, buflen, number, 10);
-}
-
-UA_StatusCode
-UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname,
-                    u16 *outPort, UA_String *outPath) {
-    /* Url must begin with "opc.tcp://" or opc.udp:// (if pubsub enabled) */
-    if(endpointUrl->length < 11) {
-        return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-    }
-    if (strncmp((char*)endpointUrl->data, "opc.tcp://", 10) != 0) {
-#ifdef UA_ENABLE_PUBSUB
-        if (strncmp((char*)endpointUrl->data, "opc.udp://", 10) != 0 &&
-                strncmp((char*)endpointUrl->data, "opc.mqtt://", 11) != 0) {
-            return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-        }
-#else
-        return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-#endif
-    }
-
-    /* Where does the hostname end? */
-    size_t curr = 10;
-    if(endpointUrl->data[curr] == '[') {
-        /* IPv6: opc.tcp://[2001:0db8:85a3::8a2e:0370:7334]:1234/path */
-        for(; curr < endpointUrl->length; ++curr) {
-            if(endpointUrl->data[curr] == ']')
-                break;
-        }
-        if(curr == endpointUrl->length)
-            return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-        curr++;
-    } else {
-        /* IPv4 or hostname: opc.tcp://something.something:1234/path */
-        for(; curr < endpointUrl->length; ++curr) {
-            if(endpointUrl->data[curr] == ':' || endpointUrl->data[curr] == '/')
-                break;
-        }
-    }
-
-    /* Set the hostname */
-    outHostname->data = &endpointUrl->data[10];
-    outHostname->length = curr - 10;
-    if(curr == endpointUrl->length)
-        return UA_STATUSCODE_GOOD;
-
-    /* Set the port */
-    if(endpointUrl->data[curr] == ':') {
-        if(++curr == endpointUrl->length)
-            return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-        u32 largeNum;
-        size_t progress = UA_readNumber(&endpointUrl->data[curr], endpointUrl->length - curr, &largeNum);
-        if(progress == 0 || largeNum > 65535)
-            return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-        /* Test if the end of a valid port was reached */
-        curr += progress;
-        if(curr == endpointUrl->length || endpointUrl->data[curr] == '/')
-            *outPort = (u16)largeNum;
-        if(curr == endpointUrl->length)
-            return UA_STATUSCODE_GOOD;
-    }
-
-    /* Set the path */
-    UA_assert(curr < endpointUrl->length);
-    if(endpointUrl->data[curr] != '/')
-        return UA_STATUSCODE_BADTCPENDPOINTURLINVALID;
-    if(++curr == endpointUrl->length)
-        return UA_STATUSCODE_GOOD;
-    outPath->data = &endpointUrl->data[curr];
-    outPath->length = endpointUrl->length - curr;
-
-    /* Remove trailing slash from the path */
-    if(endpointUrl->data[endpointUrl->length - 1] == '/')
-        outPath->length--;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_parseEndpointUrlEthernet(const UA_String *endpointUrl, UA_String *target,
-                            UA_UInt16 *vid, UA_Byte *pcp) {
-    /* Url must begin with "opc.eth://" */
-    if(endpointUrl->length < 11) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    if(strncmp((char*) endpointUrl->data, "opc.eth://", 10) != 0) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    /* Where does the host address end? */
-    size_t curr = 10;
-    for(; curr < endpointUrl->length; ++curr) {
-        if(endpointUrl->data[curr] == ':') {
-           break;
-        }
-    }
-
-    /* set host address */
-    target->data = &endpointUrl->data[10];
-    target->length = curr - 10;
-    if(curr == endpointUrl->length) {
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Set VLAN */
-    u32 value = 0;
-    curr++;  /* skip ':' */
-    size_t progress = UA_readNumber(&endpointUrl->data[curr],
-                                    endpointUrl->length - curr, &value);
-    if(progress == 0 || value > 4096) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    curr += progress;
-    if(curr == endpointUrl->length || endpointUrl->data[curr] == '.') {
-        *vid = (UA_UInt16) value;
-    }
-    if(curr == endpointUrl->length) {
-        return UA_STATUSCODE_GOOD;
-    }
-
-    /* Set priority */
-    if(endpointUrl->data[curr] != '.') {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    curr++;  /* skip '.' */
-    progress = UA_readNumber(&endpointUrl->data[curr],
-                             endpointUrl->length - curr, &value);
-    if(progress == 0 || value > 7) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    curr += progress;
-    if(curr != endpointUrl->length) {
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    *pcp = (UA_Byte) value;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode UA_ByteString_toBase64String(const UA_ByteString *byteString, UA_String *str) {
-    if (str->length != 0) {
-        UA_free(str->data);
-        str->data = NULL;
-        str->length = 0;
-    }
-    if (byteString == NULL || byteString->data == NULL)
-        return UA_STATUSCODE_GOOD;
-    if (byteString == str)
-        return UA_STATUSCODE_BADINVALIDARGUMENT;
-
-    str->data = (UA_Byte*)UA_base64(byteString->data,
-                                    byteString->length, &str->length);
-    if(str->data == NULL)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-UA_StatusCode
-UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
-    if (nodeIdStr->length != 0) {
-        UA_free(nodeIdStr->data);
-        nodeIdStr->data = NULL;
-        nodeIdStr->length = 0;
-    }
-    if (nodeId == NULL)
-        return UA_STATUSCODE_GOOD;
-
-    char *nsStr = NULL;
-    long snprintfLen = 0;
-    size_t nsLen = 0;
-    if (nodeId->namespaceIndex != 0) {
-        nsStr = (char*)UA_malloc(9+1); // strlen("ns=XXXXX;") = 9 + Nullbyte
-        snprintfLen = UA_snprintf(nsStr, 10, "ns=%d;", nodeId->namespaceIndex);
-        if (snprintfLen < 0 || snprintfLen >= 10) {
-            UA_free(nsStr);
-            return UA_STATUSCODE_BADINTERNALERROR;
-        }
-        nsLen = (size_t)(snprintfLen);
-    }
-
-
-    UA_ByteString byteStr = UA_BYTESTRING_NULL;
-    switch (nodeId->identifierType) {
-        case UA_NODEIDTYPE_NUMERIC:
-            /* ns (2 byte, 65535) = 5 chars, numeric (4 byte, 4294967295) = 10 chars, delim = 1 , nullbyte = 1-> 17 chars */
-            nodeIdStr->length = nsLen + 2 + 10 + 1;
-            nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL) {
-                nodeIdStr->length = 0;
-                UA_free(nsStr);
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-            }
-            snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%si=%lu",
-                        nsLen > 0 ? nsStr : "",
-                        (unsigned long )nodeId->identifier.numeric);
-            break;
-        case UA_NODEIDTYPE_STRING:
-            /* ns (16bit) = 5 chars, strlen + nullbyte */
-            nodeIdStr->length = nsLen + 2 + nodeId->identifier.string.length + 1;
-            nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL) {
-                nodeIdStr->length = 0;
-                UA_free(nsStr);
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-            }
-            snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%ss=%.*s",
-                        nsLen > 0 ? nsStr : "",
-                        (int)nodeId->identifier.string.length, nodeId->identifier.string.data);
-            break;
-        case UA_NODEIDTYPE_GUID:
-            /* ns (16bit) = 5 chars + strlen(A123456C-0ABC-1A2B-815F-687212AAEE1B)=36 + nullbyte */
-            nodeIdStr->length = nsLen + 2 + 36 + 1;
-            nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL) {
-                nodeIdStr->length = 0;
-                UA_free(nsStr);
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-            }
-            snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sg=" UA_PRINTF_GUID_FORMAT,
-                        nsLen > 0 ? nsStr : "",
-                        UA_PRINTF_GUID_DATA(nodeId->identifier.guid));
-            break;
-        case UA_NODEIDTYPE_BYTESTRING:
-            UA_ByteString_toBase64String(&nodeId->identifier.byteString, &byteStr);
-            /* ns (16bit) = 5 chars + LEN + nullbyte */
-            nodeIdStr->length = nsLen + 2 + byteStr.length + 1;
-            nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL) {
-                nodeIdStr->length = 0;
-                UA_String_deleteMembers(&byteStr);
-                UA_free(nsStr);
-                return UA_STATUSCODE_BADOUTOFMEMORY;
-            }
-            snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sb=%.*s",
-                        nsLen > 0 ? nsStr : "",
-                        (int)byteStr.length, byteStr.data);
-            UA_String_deleteMembers(&byteStr);
-            break;
-    }
-    UA_free(nsStr);
-
-    if (snprintfLen < 0 || snprintfLen >= (long) nodeIdStr->length) {
-        UA_free(nodeIdStr->data);
-        nodeIdStr->data = NULL;
-        nodeIdStr->length = 0;
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-    nodeIdStr->length = (size_t)snprintfLen;
-
-    return UA_STATUSCODE_GOOD;
-}
-
diff --git a/ext/open62541/src/ua_util_internal.h b/ext/open62541/src/ua_util_internal.h
deleted file mode 100644
index 4967133..0000000
--- a/ext/open62541/src/ua_util_internal.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014, 2017 (c) Florian Palm
- *    Copyright 2015 (c) LEvertz
- *    Copyright 2015-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef UA_UTIL_H_
-#define UA_UTIL_H_
-
-#define UA_INTERNAL
-#include <open62541/types.h>
-#include <open62541/util.h>
-
-_UA_BEGIN_DECLS
-
-/* Macro-Expand for MSVC workarounds */
-#define UA_MACRO_EXPAND(x) x
-
-/* Integer Shortnames
- * ------------------
- * These are not exposed on the public API, since many user-applications make
- * the same definitions in their headers. */
-
-typedef UA_Byte u8;
-typedef UA_SByte i8;
-typedef UA_UInt16 u16;
-typedef UA_Int16 i16;
-typedef UA_UInt32 u32;
-typedef UA_Int32 i32;
-typedef UA_UInt64 u64;
-typedef UA_Int64 i64;
-typedef UA_StatusCode status;
-
-/* Utility Functions
- * ----------------- */
-
-#ifdef UA_DEBUG_DUMP_PKGS
-void UA_EXPORT UA_dump_hex_pkg(UA_Byte* buffer, size_t bufferLen);
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_UTIL_H_ */
diff --git a/ext/open62541/src/ua_workqueue.c b/ext/open62541/src/ua_workqueue.c
deleted file mode 100644
index 0611199..0000000
--- a/ext/open62541/src/ua_workqueue.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015 (c) Nick Goossens
- *    Copyright 2015 (c) Jörg Schüler-Maroldt
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) Jonas Green
- */
-
-#include "ua_workqueue.h"
-
-void UA_WorkQueue_init(UA_WorkQueue *wq) {
-    /* Initialized the linked list for delayed callbacks */
-    SIMPLEQ_INIT(&wq->delayedCallbacks);
-
-#if UA_MULTITHREADING >= 200
-    wq->delayedCallbacks_checkpoint = NULL;
-    pthread_mutex_init(&wq->delayedCallbacks_accessMutex,  NULL);
-
-    /* Initialize the dispatch queue for worker threads */
-    SIMPLEQ_INIT(&wq->dispatchQueue);
-    pthread_mutex_init(&wq->dispatchQueue_accessMutex, NULL);
-    pthread_cond_init(&wq->dispatchQueue_condition, NULL);
-    pthread_mutex_init(&wq->dispatchQueue_conditionMutex, NULL);
-#endif
-}
-
-#if UA_MULTITHREADING >= 200
-/* Forward declaration */
-static void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq);
-#endif
-
-void UA_WorkQueue_cleanup(UA_WorkQueue *wq) {
-#if UA_MULTITHREADING >= 200
-    /* Shut down workers */
-    UA_WorkQueue_stop(wq);
-
-    /* Execute remaining work in the dispatch queue */
-    while(true) {
-        pthread_mutex_lock(&wq->dispatchQueue_accessMutex);
-        UA_DelayedCallback *dc = SIMPLEQ_FIRST(&wq->dispatchQueue);
-        if(!dc) {
-            pthread_mutex_unlock(&wq->dispatchQueue_accessMutex);
-            break;
-        }
-        SIMPLEQ_REMOVE_HEAD(&wq->dispatchQueue, next);
-        pthread_mutex_unlock(&wq->dispatchQueue_accessMutex);
-        dc->callback(dc->application, dc->data);
-        UA_free(dc);
-    }
-#endif
-
-    /* All workers are shut down. Execute remaining delayed work here. */
-    UA_WorkQueue_manuallyProcessDelayed(wq);
-
-#if UA_MULTITHREADING >= 200
-    wq->delayedCallbacks_checkpoint = NULL;
-    pthread_mutex_destroy(&wq->dispatchQueue_accessMutex);
-    pthread_cond_destroy(&wq->dispatchQueue_condition);
-    pthread_mutex_destroy(&wq->dispatchQueue_conditionMutex);
-    pthread_mutex_destroy(&wq->delayedCallbacks_accessMutex);
-#endif
-}
-
-/***********/
-/* Workers */
-/***********/
-
-#if UA_MULTITHREADING >= 200
-
-static void *
-workerLoop(UA_Worker *worker) {
-    UA_WorkQueue *wq = worker->queue;
-    UA_UInt32 *counter = &worker->counter;
-    volatile UA_Boolean *running = &worker->running;
-
-    /* Initialize the (thread local) random seed with the ram address
-     * of the worker. Not for security-critical entropy! */
-    UA_random_seed((uintptr_t)worker);
-
-    while(*running) {
-        UA_atomic_addUInt32(counter, 1);
-
-        /* Remove a callback from the queue */
-        pthread_mutex_lock(&wq->dispatchQueue_accessMutex);
-        UA_DelayedCallback *dc = SIMPLEQ_FIRST(&wq->dispatchQueue);
-        if(dc)
-            SIMPLEQ_REMOVE_HEAD(&wq->dispatchQueue, next);
-        pthread_mutex_unlock(&wq->dispatchQueue_accessMutex);
-
-        /* Nothing to do. Sleep until a callback is dispatched */
-        if(!dc) {
-            pthread_mutex_lock(&wq->dispatchQueue_conditionMutex);
-            pthread_cond_wait(&wq->dispatchQueue_condition,
-                              &wq->dispatchQueue_conditionMutex);
-            pthread_mutex_unlock(&wq->dispatchQueue_conditionMutex);
-            continue;
-        }
-
-        /* Execute */
-        if(dc->callback)
-            dc->callback(dc->application, dc->data);
-        UA_free(dc);
-    }
-
-    return NULL;
-}
-
-/* Can be called repeatedly and starts additional workers */
-UA_StatusCode
-UA_WorkQueue_start(UA_WorkQueue *wq, size_t workersCount) {
-    if(wq->workersSize > 0 || workersCount == 0)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    
-    /* Create the worker array */
-    wq->workers = (UA_Worker*)UA_calloc(workersCount, sizeof(UA_Worker));
-    if(!wq->workers)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    wq->workersSize = workersCount;
-
-    /* Spin up the workers */
-    for(size_t i = 0; i < workersCount; ++i) {
-        UA_Worker *w = &wq->workers[i];
-        w->queue = wq;
-        w->counter = 0;
-        w->running = true;
-        pthread_create(&w->thread, NULL, (void* (*)(void*))workerLoop, w);
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-void UA_WorkQueue_stop(UA_WorkQueue *wq) {
-    if(wq->workersSize == 0)
-        return;
-
-    /* Signal the workers to stop */
-    for(size_t i = 0; i < wq->workersSize; ++i)
-        wq->workers[i].running = false;
-
-    /* Wake up all workers */
-    pthread_cond_broadcast(&wq->dispatchQueue_condition);
-
-    /* Wait for the workers to finish, then clean up */
-    for(size_t i = 0; i < wq->workersSize; ++i)
-        pthread_join(wq->workers[i].thread, NULL);
-
-    UA_free(wq->workers);
-    wq->workers = NULL;
-    wq->workersSize = 0;
-}
-
-void UA_WorkQueue_enqueue(UA_WorkQueue *wq, UA_ApplicationCallback cb,
-                          void *application, void *data) {
-    UA_DelayedCallback *dc = (UA_DelayedCallback*)UA_malloc(sizeof(UA_DelayedCallback));
-    if(!dc) {
-        cb(application, data); /* Execute immediately if the memory could not be allocated */
-        return;
-    }
-
-    dc->callback = cb;
-    dc->application = application;
-    dc->data = data;
-
-    /* Enqueue for the worker threads */
-    pthread_mutex_lock(&wq->dispatchQueue_accessMutex);
-    SIMPLEQ_INSERT_TAIL(&wq->dispatchQueue, dc, next);
-    pthread_mutex_unlock(&wq->dispatchQueue_accessMutex);
-
-    /* Wake up sleeping workers */
-    pthread_cond_broadcast(&wq->dispatchQueue_condition);
-}
-
-#endif
-
-/*********************/
-/* Delayed Callbacks */
-/*********************/
-
-#if UA_MULTITHREADING >= 200
-
-/* Delayed Callbacks are called only when all callbacks that were dispatched
- * prior are finished. After every UA_MAX_DELAYED_SAMPLE delayed Callbacks that
- * were added to the queue, we sample the counters from the workers. The
- * counters are compared to the last counters that were sampled. If every worker
- * has proceeded the counter, then we know that all delayed callbacks prior to
- * the last sample-point are safe to execute. */
-
-/* Sample the worker counter for every nth delayed callback. This is used to
- * test that all workers have **finished** their current job before the delayed
- * callback is processed. */
-#define UA_MAX_DELAYED_SAMPLE 100
-
-/* Call only with a held mutex for the delayed callbacks */
-static void
-dispatchDelayedCallbacks(UA_WorkQueue *wq, UA_DelayedCallback *cb) {
-    /* Are callbacks before the last checkpoint ready? */
-    for(size_t i = 0; i < wq->workersSize; ++i) {
-        if(wq->workers[i].counter == wq->workers[i].checkpointCounter)
-            return;
-    }
-
-    /* Dispatch all delayed callbacks up to the checkpoint.
-     * TODO: Move over the entire queue up to the checkpoint in one step. */
-    if(wq->delayedCallbacks_checkpoint != NULL) {
-        UA_DelayedCallback *iter, *tmp_iter;
-        SIMPLEQ_FOREACH_SAFE(iter, &wq->delayedCallbacks, next, tmp_iter) {
-            pthread_mutex_lock(&wq->dispatchQueue_accessMutex);
-            SIMPLEQ_INSERT_TAIL(&wq->dispatchQueue, iter, next);
-            pthread_mutex_unlock(&wq->dispatchQueue_accessMutex);
-            if(iter == wq->delayedCallbacks_checkpoint)
-                break;
-        }
-    }
-
-    /* Create the new sample point */
-    for(size_t i = 0; i < wq->workersSize; ++i)
-        wq->workers[i].checkpointCounter = wq->workers[i].counter;
-    wq->delayedCallbacks_checkpoint = cb;
-}
-
-#endif
-
-void
-UA_WorkQueue_enqueueDelayed(UA_WorkQueue *wq, UA_DelayedCallback *cb) {
-#if UA_MULTITHREADING >= 200
-    pthread_mutex_lock(&wq->dispatchQueue_accessMutex);
-#endif
-
-    SIMPLEQ_INSERT_HEAD(&wq->delayedCallbacks, cb, next);
-
-#if UA_MULTITHREADING >= 200
-    wq->delayedCallbacks_sinceDispatch++;
-    if(wq->delayedCallbacks_sinceDispatch > UA_MAX_DELAYED_SAMPLE) {
-        dispatchDelayedCallbacks(wq, cb);
-        wq->delayedCallbacks_sinceDispatch = 0;
-    }
-    pthread_mutex_unlock(&wq->dispatchQueue_accessMutex);
-#endif
-}
-
-/* Assumes all workers are shut down */
-void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq) {
-    UA_DelayedCallback *dc, *dc_tmp;
-    SIMPLEQ_FOREACH_SAFE(dc, &wq->delayedCallbacks, next, dc_tmp) {
-        SIMPLEQ_REMOVE_HEAD(&wq->delayedCallbacks, next);
-        if(dc->callback)
-            dc->callback(dc->application, dc->data);
-        UA_free(dc);
-    }
-#if UA_MULTITHREADING >= 200
-    wq->delayedCallbacks_checkpoint = NULL;
-#endif
-}
diff --git a/ext/open62541/src/ua_workqueue.h b/ext/open62541/src/ua_workqueue.h
deleted file mode 100644
index af6be06..0000000
--- a/ext/open62541/src/ua_workqueue.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- *    Copyright 2014-2016 (c) Sten Grüner
- *    Copyright 2015 (c) Chris Iatrou
- *    Copyright 2015 (c) Nick Goossens
- *    Copyright 2015 (c) Jörg Schüler-Maroldt
- *    Copyright 2015-2016 (c) Oleksiy Vasylyev
- *    Copyright 2016-2017 (c) Florian Palm
- *    Copyright 2017 (c) Stefan Profanter, fortiss GmbH
- *    Copyright 2016 (c) Lorenz Haas
- *    Copyright 2017 (c) Jonas Green
- */
-
-#ifndef UA_WORKQUEUE_H_
-#define UA_WORKQUEUE_H_
-
-#include "ua_util_internal.h"
-#include "open62541_queue.h"
-
-#if UA_MULTITHREADING >= 200
-#include <pthread.h>
-#endif
-
-_UA_BEGIN_DECLS
-
-/* Callback where the application is either a client or a server */
-typedef void (*UA_ApplicationCallback)(void *application, void *data);
-
-/* Delayed callbacks are executed when all previously enqueue work is finished.
- * This is used to free memory that might used by a parallel worker or where the
- * current threat has remaining pointers to until the current operation
- * finishes. */
-typedef struct UA_DelayedCallback {
-    SIMPLEQ_ENTRY(UA_DelayedCallback) next;
-    UA_ApplicationCallback callback;
-    void *application;
-    void *data;
-} UA_DelayedCallback;
-
-struct UA_WorkQueue;
-typedef struct UA_WorkQueue UA_WorkQueue;
-
-#if UA_MULTITHREADING >= 200
-
-/* Workers take out callbacks from the work queue and execute them.
- *
- * Future Plans: Use work-stealing to load-balance between cores.
- * Le, Nhat Minh, et al. "Correct and efficient work-stealing for weak memory
- * models." ACM SIGPLAN Notices. Vol. 48. No. 8. ACM, 2013. */
-typedef struct {
-    pthread_t thread;
-    volatile UA_Boolean running;
-    UA_WorkQueue *queue;
-    UA_UInt32 counter;
-    UA_UInt32 checkpointCounter; /* Counter when the last checkpoint was made
-                                  * for the delayed callbacks */
-
-    /* separate cache lines */
-    char padding[64 - sizeof(void*) - sizeof(pthread_t) -
-                 sizeof(UA_UInt32) - sizeof(UA_Boolean)];
-} UA_Worker;
-
-#endif
-
-struct UA_WorkQueue {
-    /* Worker threads and work queue. Without multithreading, work is executed
-       immediately. */
-#if UA_MULTITHREADING >= 200
-    UA_Worker *workers;
-    size_t workersSize;
-
-    /* Work queue */
-    SIMPLEQ_HEAD(, UA_DelayedCallback) dispatchQueue; /* Dispatch queue for the worker threads */
-    pthread_mutex_t dispatchQueue_accessMutex; /* mutex for access to queue */
-    pthread_cond_t dispatchQueue_condition; /* so the workers don't spin if the queue is empty */
-    pthread_mutex_t dispatchQueue_conditionMutex; /* mutex for access to condition variable */
-#endif
-
-    /* Delayed callbacks
-     * To be executed after all curretly dispatched works has finished */
-    SIMPLEQ_HEAD(, UA_DelayedCallback) delayedCallbacks;
-#if UA_MULTITHREADING >= 200
-    pthread_mutex_t delayedCallbacks_accessMutex;
-    UA_DelayedCallback *delayedCallbacks_checkpoint;
-    size_t delayedCallbacks_sinceDispatch; /* How many have been added since we
-                                            * tried to dispatch callbacks? */
-#endif
-};
-
-void UA_WorkQueue_init(UA_WorkQueue *wq);
-
-/* Enqueue a delayed callback. It is executed when all previous work in the
- * queue has been finished. The ``cb`` pointer is freed afterwards. ``cb`` can
- * have a NULL callback that is not executed.
- *
- * This method checks internally if existing delayed work can be moved from the
- * delayed queue to the worker dispatch queue. */
-void UA_WorkQueue_enqueueDelayed(UA_WorkQueue *wq, UA_DelayedCallback *cb);
-
-/* Stop the workers, process all enqueued work in the calling thread, clean up
- * mutexes etc. */
-void UA_WorkQueue_cleanup(UA_WorkQueue *wq);
-
-#if UA_MULTITHREADING >= 200
-
-/* Spin up a number of worker threads that listen on the work queue */
-UA_StatusCode UA_WorkQueue_start(UA_WorkQueue *wq, size_t workersCount);
-
-void UA_WorkQueue_stop(UA_WorkQueue *wq);
-
-/* Enqueue work for the worker threads */
-void UA_WorkQueue_enqueue(UA_WorkQueue *wq, UA_ApplicationCallback cb,
-                          void *application, void *data);
-
-#else
-
-/* Process all enqueued delayed work. This is not needed when workers are
- * running for the multithreading case. (UA_WorkQueue_cleanup still calls this
- * method during cleanup when the workers are shut down.) */
-void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq);
-
-#endif
-
-_UA_END_DECLS
-
-#endif /* UA_SERVER_WORKQUEUE_H_ */
diff --git a/ext/open62541/tests/CMakeLists.txt b/ext/open62541/tests/CMakeLists.txt
deleted file mode 100644
index 91d03a7..0000000
--- a/ext/open62541/tests/CMakeLists.txt
+++ /dev/null
@@ -1,379 +0,0 @@
-# Load CMake Packages
-find_package(Check REQUIRED)
-set(LIBS ${CHECK_LIBRARIES} ${open62541_LIBRARIES})
-if(NOT WIN32 AND NOT APPLE)
-  list(APPEND LIBS subunit)
-endif()
-
-include_directories(${CHECK_INCLUDE_DIR})
-#find_package(Threads REQUIRED)
-if(NOT MSVC AND UA_ENABLE_UNIT_TESTS_MEMCHECK)
-    find_package(Valgrind REQUIRED)
-endif()
-
-if(CMAKE_HOST_SYSTEM_NAME MATCHES "OpenBSD")
-    link_directories(/usr/local/lib)
-    add_definitions(-Wno-gnu-zero-variadic-macro-arguments)
-endif()
-
-if(APPLE)
-    # CLang on Apple complains about many cases like this:
-    # /Users/travis/build/open62541/open62541/tests/check_chunking.c:148:22: warning: implicit conversion changes signedness: 'size_t' (aka 'unsigned long') to 'intmax_t' (aka 'long') [-Wsign-conversion]
-    #    ck_assert_int_eq(counter,9); //10 chunks allocated - callback called 4 times
-    add_definitions(-Wno-sign-conversion)
-endif()
-
-get_property(open62541_BUILD_INCLUDE_DIRS TARGET open62541 PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
-include_directories(${open62541_BUILD_INCLUDE_DIRS})
-# ua_server_internal.h
-include_directories("${PROJECT_SOURCE_DIR}/src")
-include_directories("${PROJECT_SOURCE_DIR}/src/server")
-# testing_clock.h
-include_directories("${CMAKE_CURRENT_SOURCE_DIR}/testing-plugins")
-# #include <src_generated/<...>.h>
-include_directories("${PROJECT_BINARY_DIR}")
-
-if(UA_ENABLE_ENCRYPTION)
-    # mbedtls includes
-    include_directories(${MBEDTLS_INCLUDE_DIRS})
-endif()
-
-add_definitions(-DUA_sleep_ms=UA_comboSleep)
-
-#############################
-# Compiled binaries folders #
-#############################
-
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/tests)
-if (MSVC)
-    set(TESTS_BINARY_DIR ${CMAKE_BINARY_DIR}/bin/tests/${CMAKE_BUILD_TYPE})
-else()
-    set(TESTS_BINARY_DIR ${CMAKE_BINARY_DIR}/bin/tests)
-endif()
-
-# Use different plugins for testing
-set(test_plugin_sources ${PROJECT_SOURCE_DIR}/arch/network_tcp.c
-    ${PROJECT_SOURCE_DIR}/tests/testing-plugins/testing_clock.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_log_stdout.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_config_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_accesscontrol_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_pki_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_nodestore_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_none.c
-    ${PROJECT_SOURCE_DIR}/tests/testing-plugins/testing_policy.c
-    ${PROJECT_SOURCE_DIR}/tests/testing-plugins/testing_networklayers.c
-    )
-
-if(UA_ENABLE_HISTORIZING)
-    set(test_plugin_sources ${test_plugin_sources}
-        ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_data_backend_memory.c
-        ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_data_gathering_default.c
-        ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_database_default.c)
-endif()
-
-if(UA_ENABLE_ENCRYPTION)
-  list(APPEND test_plugin_sources
-       ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/securitypolicy_mbedtls_common.c
-              ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c
-              ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic256.c
-              ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c)
-endif()
-
-add_library(open62541-testplugins OBJECT ${test_plugin_sources} ${PROJECT_SOURCE_DIR}/arch/${UA_ARCHITECTURE}/ua_architecture_functions.c)
-add_dependencies(open62541-testplugins open62541)
-target_compile_definitions(open62541-testplugins PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
-
-if(NOT MSVC)
-    add_definitions(-Wno-deprecated-declarations)
-endif()
-# Workaround some clang warnings in the uni tests
-if((NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND (CMAKE_COMPILER_IS_GNUCC OR "x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang"))
-    add_definitions(-Wno-sign-conversion)
-endif()
-
-# Unit Test Definition Macro
-# For now we need to disable the libc freeres. See https://github.com/open62541/open62541/pull/1003#issuecomment-315045143
-# This also requires to disable the phtread cache with no-nptl-pthread-stackcache
-set(VALGRIND_FLAGS --quiet --trace-children=yes --leak-check=full --run-libc-freeres=no --sim-hints=no-nptl-pthread-stackcache --track-fds=yes)
-macro(add_test_valgrind TEST_NAME)
-    if(UA_ENABLE_UNIT_TESTS_MEMCHECK)
-        if(MSVC)
-            add_test(${TEST_NAME} drmemory -batch -exit_code_if_errors 1 -results_to_stderr -summary -- ${ARGN})
-        else()
-            set(VALGRIND_LOG ${TESTS_BINARY_DIR}/${TEST_NAME}.log)
-            set(VALGRIND_CMD valgrind --error-exitcode=1 --suppressions=${PROJECT_SOURCE_DIR}/tools/valgrind_suppressions.supp ${VALGRIND_FLAGS} --log-file=${VALGRIND_LOG} ${ARGN})
-            add_test(${TEST_NAME} ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/valgrind_check_error.py ${VALGRIND_LOG} ${VALGRIND_CMD})
-        endif()
-    else()
-        add_test(${TEST_NAME} ${ARGN})
-    endif()
-    if (UA_BUILD_FUZZING_CORPUS)
-        target_sources(check_${TEST_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/tests/fuzz/ua_debug_dump_pkgs_file.c)
-        file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/corpus/${TEST_NAME})
-        target_compile_definitions(check_${TEST_NAME} PRIVATE UA_CORPUS_OUTPUT_DIR="${PROJECT_BINARY_DIR}/corpus/${TEST_NAME}")
-    endif()
-endmacro()
-
-add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
-
-# the unit test are built directly on the open62541 object files. so they can
-# access symbols that are hidden/not exported to the shared library
-
-add_executable(check_types_builtin check_types_builtin.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_types_builtin ${LIBS})
-add_test_valgrind(types_builtin ${TESTS_BINARY_DIR}/check_types_builtin)
-
-if(UA_ENABLE_JSON_ENCODING)
-    add_executable(check_types_builtin_json check_types_builtin_json.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_types_builtin_json ${LIBS})
-    add_test_valgrind(types_builtin_json ${TESTS_BINARY_DIR}/check_types_builtin_json)
-
-    if(UA_ENABLE_PUBSUB)
-        add_executable(check_pubsub_encoding_json pubsub/check_pubsub_encoding_json.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-        target_link_libraries(check_pubsub_encoding_json ${LIBS})
-        add_test_valgrind(pubsub_encoding_json ${TESTS_BINARY_DIR}/check_pubsub_encoding_json)
-
-        add_executable(check_pubsub_publish_json pubsub/check_pubsub_publish_json.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-        target_link_libraries(check_pubsub_publish_json ${LIBS})
-        add_test_valgrind(pubsub_publish_json ${TESTS_BINARY_DIR}/check_pubsub_publish_json)
-    endif()
-endif()
-
-add_executable(check_types_memory check_types_memory.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_types_memory ${LIBS})
-add_test_valgrind(types_memory ${TESTS_BINARY_DIR}/check_types_memory)
-
-add_executable(check_types_range check_types_range.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_types_range ${LIBS})
-add_test_valgrind(types_range ${TESTS_BINARY_DIR}/check_types_range)
-
-add_executable(check_types_custom check_types_custom.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_types_custom ${LIBS})
-add_test_valgrind(types_custom ${TESTS_BINARY_DIR}/check_types_custom)
-
-add_executable(check_chunking check_chunking.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_chunking ${LIBS})
-add_test_valgrind(chunking ${TESTS_BINARY_DIR}/check_chunking)
-
-add_executable(check_utils check_utils.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_utils ${LIBS})
-add_test_valgrind(utils ${TESTS_BINARY_DIR}/check_utils)
-
-add_executable(check_securechannel check_securechannel.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_securechannel ${LIBS})
-add_test_valgrind(securechannel ${TESTS_BINARY_DIR}/check_securechannel)
-
-add_executable(check_timer check_timer.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_timer ${LIBS})
-add_test_valgrind(timer ${TESTS_BINARY_DIR}/check_timer)
-
-# Test Server
-
-add_executable(check_accesscontrol server/check_accesscontrol.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_accesscontrol ${LIBS})
-add_test_valgrind(accesscontrol ${TESTS_BINARY_DIR}/check_accesscontrol)
-
-add_executable(check_services_view server/check_services_view.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_services_view ${LIBS})
-add_test_valgrind(services_view ${TESTS_BINARY_DIR}/check_services_view)
-
-add_executable(check_services_attributes server/check_services_attributes.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_services_attributes ${LIBS})
-add_test_valgrind(services_attributes ${TESTS_BINARY_DIR}/check_services_attributes)
-
-add_executable(check_services_nodemanagement server/check_services_nodemanagement.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_services_nodemanagement ${LIBS})
-add_test_valgrind(services_nodemanagement ${TESTS_BINARY_DIR}/check_services_nodemanagement)
-
-add_executable(check_server_callbacks server/check_server_callbacks.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_server_callbacks ${LIBS})
-add_test_valgrind(server_callbacks ${TESTS_BINARY_DIR}/check_server_callbacks)
-
-if (UA_MULTITHREADING EQUAL 100)
-    add_executable(check_mt_addVariableNode multithreading/check_mt_addVariableNode.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_addVariableNode ${LIBS})
-    add_test_valgrind(mt_addVariableNode ${TESTS_BINARY_DIR}/check_mt_addVariableNode)
-
-    add_executable(check_mt_addVariableTypeNode multithreading/check_mt_addVariableTypeNode.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_addVariableTypeNode ${LIBS})
-    add_test_valgrind(mt_addVariableTypeNode ${TESTS_BINARY_DIR}/check_mt_addVariableTypeNode)
-
-    add_executable(check_mt_addObjectNode multithreading/check_mt_addObjectNode.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_addObjectNode ${LIBS})
-    add_test_valgrind(mt_addObjectNode ${TESTS_BINARY_DIR}/check_mt_addObjectNode)
-
-    add_executable(check_mt_readValueAttribute multithreading/check_mt_readValueAttribute.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_readValueAttribute ${LIBS})
-    add_test_valgrind(mt_readValueAttribute ${TESTS_BINARY_DIR}/check_mt_readValueAttribute)
-
-    add_executable(check_mt_writeValueAttribute multithreading/check_mt_writeValueAttribute.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_writeValueAttribute ${LIBS})
-    add_test_valgrind(mt_writeValueAttribute ${TESTS_BINARY_DIR}/check_mt_readWriteDelete)
-
-    add_executable(check_mt_readWriteDelete multithreading/check_mt_readWriteDelete.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_readWriteDelete ${LIBS})
-    add_test_valgrind(mt_readWriteDelete ${TESTS_BINARY_DIR}/check_mt_readWriteDelete)
-
-    add_executable(check_mt_readWriteDeleteCallback multithreading/check_mt_readWriteDeleteCallback.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_readWriteDeleteCallback ${LIBS})
-    add_test_valgrind(mt_readWriteDeleteCallback ${TESTS_BINARY_DIR}/check_mt_readWriteDeleteCallback)
-
-    add_executable(check_mt_addDeleteObject multithreading/check_mt_addDeleteObject.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_mt_addDeleteObject ${LIBS})
-    add_test_valgrind(mt_addDeleteObject ${TESTS_BINARY_DIR}/check_mt_addDeleteObject)
-endif()
-
-add_executable(check_services_call server/check_services_call.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_services_call ${LIBS})
-add_test_valgrind(services_call ${TESTS_BINARY_DIR}/check_services_call)
-
-add_executable(check_services_subscriptions server/check_services_subscriptions.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_services_subscriptions ${LIBS})
-add_test_valgrind(services_subscriptions ${TESTS_BINARY_DIR}/check_services_subscriptions)
-
-add_executable(check_monitoreditem_filter server/check_monitoreditem_filter.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_monitoreditem_filter ${LIBS})
-add_test_valgrind(monitoreditem_filter ${TESTS_BINARY_DIR}/check_monitoreditem_filter)
-
-add_executable(check_subscription_events server/check_subscription_events.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_subscription_events ${LIBS})
-add_test_valgrind(subscription_events ${TESTS_BINARY_DIR}/check_subscription_events)
-
-add_executable(check_nodestore server/check_nodestore.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_nodestore ${LIBS})
-add_test_valgrind(nodestore ${TESTS_BINARY_DIR}/check_nodestore)
-
-if(UA_ENABLE_HISTORIZING)
-    add_executable(check_server_historical_data server/check_server_historical_data.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_server_historical_data ${LIBS})
-    add_test_valgrind(server_historical_data ${TESTS_BINARY_DIR}/check_server_historical_data)
-endif()
-
-add_executable(check_session server/check_session.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_session ${LIBS})
-add_test_valgrind(session ${TESTS_BINARY_DIR}/check_session)
-
-add_executable(check_server server/check_server.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_server ${LIBS})
-add_test_valgrind(server ${TESTS_BINARY_DIR}/check_server)
-
-add_executable(check_server_jobs server/check_server_jobs.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_server_jobs ${LIBS})
-add_test_valgrind(server_jobs ${TESTS_BINARY_DIR}/check_server_jobs)
-
-add_executable(check_server_userspace server/check_server_userspace.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_server_userspace ${LIBS})
-add_test_valgrind(server_userspace ${TESTS_BINARY_DIR}/check_server_userspace)
-
-add_executable(check_node_inheritance server/check_node_inheritance.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_node_inheritance ${LIBS})
-add_test_valgrind(node_inheritance ${TESTS_BINARY_DIR}/check_node_inheritance)
-
-add_executable(check_local_monitored_item server/check_local_monitored_item.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_local_monitored_item ${LIBS})
-add_test_valgrind(local_monitored_item ${TESTS_BINARY_DIR}/check_local_monitored_item)
-
-if(UA_ENABLE_DISCOVERY)
-    add_executable(check_discovery server/check_discovery.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_discovery ${LIBS})
-    add_test_valgrind(discovery ${TESTS_BINARY_DIR}/check_discovery)
-endif()
-
-if(UA_ENABLE_PUBSUB)
-    add_executable(check_pubsub_encoding pubsub/check_pubsub_encoding.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_pubsub_encoding ${LIBS})
-    add_test_valgrind(pubsub_encoding ${TESTS_BINARY_DIR}/check_pubsub_encoding)
-    add_executable(check_pubsub_pds pubsub/check_pubsub_pds.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_pds ${LIBS})
-    add_test_valgrind(pubsub_pds ${TESTS_BINARY_DIR}/check_pubsub_pds)
-    add_executable(check_pubsub_connection_udp pubsub/check_pubsub_connection_udp.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_connection_udp ${LIBS})
-    add_test_valgrind(pubsub_connection_udp ${TESTS_BINARY_DIR}/check_pubsub_connection_udp)
-    add_executable(check_pubsub_publish pubsub/check_pubsub_publish.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_publish ${LIBS})
-    add_test_valgrind(pubsub_publish ${TESTS_BINARY_DIR}/check_pubsub_publish)
-    add_executable(check_pubsub_publish_uadp pubsub/check_pubsub_publish_uadp.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_publish_uadp ${LIBS})
-    add_test_valgrind(pubsub_publish ${TESTS_BINARY_DIR}/check_pubsub_publish_uadp)
-
-    #Link libraries for executing subscriber unit test
-    add_executable(check_pubsub_subscribe pubsub/check_pubsub_subscribe.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_subscribe ${LIBS})
-    add_test_valgrind(check_pubsub_subscribe ${TESTS_BINARY_DIR}/check_pubsub_subscribe)
-    add_executable(check_pubsub_publishspeed pubsub/check_pubsub_publishspeed.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_publishspeed ${LIBS})
-    add_test_valgrind(pubsub_publishspeed ${TESTS_BINARY_DIR}/check_pubsub_publish)
-
-    add_executable(check_pubsub_multiple_layer pubsub/check_pubsub_multiple_layer.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-    target_link_libraries(check_pubsub_multiple_layer ${LIBS})
-    add_test_valgrind(pubsub_multiple_layer ${TESTS_BINARY_DIR}/check_pubsub_multiple_layer)
-
-    if(UA_ENABLE_PUBSUB_INFORMATIONMODEL)
-        add_executable(check_pubsub_informationmodel pubsub/check_pubsub_informationmodel.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-        target_link_libraries(check_pubsub_informationmodel ${LIBS})
-        add_test(check_pubsub_informationmodel ${TESTS_BINARY_DIR}/check_pubsub_informationmodel)
-        if(UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS)
-            add_executable(check_pubsub_informationmodel_methods pubsub/check_pubsub_informationmodel_methods.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-plugins>)
-            target_link_libraries(check_pubsub_informationmodel_methods ${LIBS})
-            add_test(check_pubsub_informationmodel_methods ${TESTS_BINARY_DIR}/check_pubsub_informationmodel_methods)
-
-        endif()
-    endif()
-endif()
-
-add_executable(check_server_readspeed server/check_server_readspeed.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_server_readspeed ${LIBS})
-add_test_valgrind(server_readspeed ${TESTS_BINARY_DIR}/check_server_readspeed)
-
-if(UA_ENABLE_SUBSCRIPTIONS)
-    add_executable(check_server_monitoringspeed server/check_server_monitoringspeed.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_server_monitoringspeed ${LIBS})
-    add_test_valgrind(server_monitoringspeed ${TESTS_BINARY_DIR}/check_server_monitoringspeed)
-endif()
-
-# Test Client
-
-add_executable(check_client client/check_client.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_client ${LIBS})
-add_test_valgrind(client ${TESTS_BINARY_DIR}/check_client)
-
-add_executable(check_client_securechannel client/check_client_securechannel.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_client_securechannel ${LIBS})
-add_test_valgrind(client_securechannel ${TESTS_BINARY_DIR}/check_client_securechannel)
-
-add_executable(check_client_async client/check_client_async.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_client_async ${LIBS})
-add_test_valgrind(client_async ${TESTS_BINARY_DIR}/check_client_async)
-
-add_executable(check_client_async_connect client/check_client_async_connect.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_client_async_connect ${LIBS})
-add_test_valgrind(client_async_connect ${TESTS_BINARY_DIR}/check_client_async_connect)
-
-add_executable(check_client_subscriptions client/check_client_subscriptions.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_client_subscriptions ${LIBS})
-add_test_valgrind(client_subscriptions ${TESTS_BINARY_DIR}/check_client_subscriptions)
-
-add_executable(check_client_highlevel client/check_client_highlevel.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-target_link_libraries(check_client_highlevel ${LIBS})
-add_test_valgrind(client_highlevel ${TESTS_BINARY_DIR}/check_client_highlevel)
-
-if(UA_ENABLE_HISTORIZING)
-    add_executable(check_client_historical_data client/check_client_historical_data.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_client_historical_data ${LIBS})
-    add_test_valgrind(client_historical_data ${TESTS_BINARY_DIR}/check_client_historical_data)
-endif()
-
-# Test Encryption
-
-if(UA_ENABLE_ENCRYPTION)
-    add_executable(check_encryption_basic128rsa15 encryption/check_encryption_basic128rsa15.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_encryption_basic128rsa15 ${LIBS})
-    add_test_valgrind(encryption_basic128rsa15 ${TESTS_BINARY_DIR}/check_encryption_basic128rsa15)
-
-    add_executable(check_encryption_basic256sha256 encryption/check_encryption_basic256sha256.c $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    target_link_libraries(check_encryption_basic256sha256 ${LIBS})
-    add_test_valgrind(encryption_basic256sha256 ${TESTS_BINARY_DIR}/check_encryption_basic256sha256)
-endif()
-
-# Tests for Nodeset Compiler
-add_subdirectory(nodeset-compiler)
diff --git a/ext/open62541/tests/check_chunking.c b/ext/open62541/tests/check_chunking.c
deleted file mode 100644
index 6513582..0000000
--- a/ext/open62541/tests/check_chunking.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-
-#include "ua_securechannel.h"
-#include "ua_types_encoding_binary.h"
-
-#include <check.h>
-
-UA_ByteString *buffers;
-size_t bufIndex;
-size_t counter;
-size_t dataCount;
-
-static UA_StatusCode
-sendChunkMockUp(void *_, UA_Byte **bufPos, const UA_Byte **bufEnd) {
-    size_t offset = (uintptr_t)(*bufPos - buffers[bufIndex].data);
-    bufIndex++;
-    *bufPos = buffers[bufIndex].data;
-    *bufEnd = &(*bufPos)[buffers[bufIndex].length];
-    counter++;
-    dataCount += offset;
-    return UA_STATUSCODE_GOOD;
-}
-
-START_TEST(encodeArrayIntoFiveChunksShallWork) {
-    size_t arraySize = 30; //number of elements within the array which should be encoded
-    size_t chunkCount = 6; // maximum chunk count
-    size_t chunkSize = 30; //size in bytes of each chunk
-    bufIndex = 0;
-    counter = 0;
-    dataCount = 0;
-    buffers = (UA_ByteString*)UA_Array_new(chunkCount, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    for(size_t i=0;i<chunkCount;i++){
-        UA_ByteString_allocBuffer(&buffers[i],chunkSize);
-    }
-
-    UA_Int32 *ar = (UA_Int32*)UA_Array_new(arraySize,&UA_TYPES[UA_TYPES_INT32]);
-    for(size_t i = 0; i < arraySize; i++)
-        ar[i] = (UA_Int32)i;
-
-    UA_Variant v;
-    UA_Variant_setArrayCopy(&v, ar, arraySize, &UA_TYPES[UA_TYPES_INT32]);
-
-    UA_ByteString workingBuffer = buffers[0];
-    UA_Byte *pos = workingBuffer.data;
-    const UA_Byte *end = &workingBuffer.data[workingBuffer.length];
-    UA_StatusCode retval = UA_encodeBinary(&v,&UA_TYPES[UA_TYPES_VARIANT],
-                                           &pos, &end, sendChunkMockUp, NULL);
-
-    ck_assert_uint_eq(retval,UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(counter,4); //5 chunks allocated - callback called 4 times
-
-    dataCount += (uintptr_t)(pos - buffers[bufIndex].data);
-    ck_assert_int_eq(UA_calcSizeBinary(&v,&UA_TYPES[UA_TYPES_VARIANT]), dataCount);
-
-    UA_Variant_deleteMembers(&v);
-    UA_Array_delete(buffers, chunkCount, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    UA_Array_delete(ar, arraySize, &UA_TYPES[UA_TYPES_INT32]);
-} END_TEST
-
-START_TEST(encodeStringIntoFiveChunksShallWork) {
-    size_t stringLength = 120; //number of elements within the array which should be encoded
-    size_t chunkCount = 6; // maximum chunk count
-    size_t chunkSize = 30; //size in bytes of each chunk
-
-    UA_String string;
-    bufIndex = 0;
-    counter = 0;
-    dataCount = 0;
-    UA_String_init(&string);
-    string.data = (UA_Byte*)UA_malloc(stringLength);
-    string.length = stringLength;
-    char tmpString[9] = {'o','p','e','n','6','2','5','4','1'};
-    //char tmpString[9] = {'1','4','5','2','6','n','e','p','o'};
-    buffers = (UA_ByteString*)UA_Array_new(chunkCount, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    for(size_t i=0;i<chunkCount;i++){
-        UA_ByteString_allocBuffer(&buffers[i],chunkSize);
-    }
-
-    UA_ByteString workingBuffer=buffers[0];
-
-    for(size_t i=0;i<stringLength;i++){
-        size_t tmp = i % 9;
-        string.data[i] =  tmpString[tmp];
-    }
-    UA_Variant v;
-    UA_Variant_setScalarCopy(&v,&string,&UA_TYPES[UA_TYPES_STRING]);
-
-    UA_Byte *pos = workingBuffer.data;
-    const UA_Byte *end = &workingBuffer.data[workingBuffer.length];
-    UA_StatusCode retval = UA_encodeBinary(&v, &UA_TYPES[UA_TYPES_VARIANT],
-                                           &pos, &end, sendChunkMockUp, NULL);
-
-    ck_assert_uint_eq(retval,UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(counter,4); //5 chunks allocated - callback called 4 times
-
-    dataCount += (uintptr_t)(pos - buffers[bufIndex].data);
-    ck_assert_int_eq(UA_calcSizeBinary(&v,&UA_TYPES[UA_TYPES_VARIANT]), dataCount);
-
-    UA_Variant_deleteMembers(&v);
-    UA_Array_delete(buffers, chunkCount, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    UA_String_deleteMembers(&string);
-} END_TEST
-
-START_TEST(encodeTwoStringsIntoTenChunksShallWork) {
-    size_t stringLength = 143; //number of elements within the array which should be encoded
-    size_t chunkCount = 10; // maximum chunk count
-    size_t chunkSize = 30; //size in bytes of each chunk
-
-    UA_String string;
-    bufIndex = 0;
-    counter = 0;
-    dataCount = 0;
-    UA_String_init(&string);
-    string.data = (UA_Byte*)UA_malloc(stringLength);
-    string.length = stringLength;
-    char tmpString[9] = {'o','p','e','n','6','2','5','4','1'};
-    buffers = (UA_ByteString*)UA_Array_new(chunkCount, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    for(size_t i=0;i<chunkCount;i++){
-        UA_ByteString_allocBuffer(&buffers[i],chunkSize);
-    }
-
-    UA_ByteString workingBuffer=buffers[0];
-
-    for(size_t i=0;i<stringLength;i++){
-        size_t tmp = i % 9;
-        string.data[i] =  tmpString[tmp];
-    }
-
-    UA_Byte *pos = workingBuffer.data;
-    const UA_Byte *end = &workingBuffer.data[workingBuffer.length];
-    UA_StatusCode retval = UA_encodeBinary(&string, &UA_TYPES[UA_TYPES_STRING],
-                                           &pos, &end, sendChunkMockUp, NULL);
-    ck_assert_uint_eq(retval,UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(counter,4); //5 chunks allocated - callback called 4 times
-    size_t offset = (uintptr_t)(pos - buffers[bufIndex].data);
-    ck_assert_int_eq(UA_calcSizeBinary(&string,&UA_TYPES[UA_TYPES_STRING]), dataCount + offset);
-
-    retval = UA_encodeBinary(&string,&UA_TYPES[UA_TYPES_STRING],
-                             &pos, &end, sendChunkMockUp, NULL);
-    dataCount += (uintptr_t)(pos - buffers[bufIndex].data);
-    ck_assert_uint_eq(retval,UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(counter,9); //10 chunks allocated - callback called 4 times
-    ck_assert_int_eq(2 * UA_calcSizeBinary(&string,&UA_TYPES[UA_TYPES_STRING]), dataCount);
-
-    UA_Array_delete(buffers, chunkCount, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    UA_String_deleteMembers(&string);
-} END_TEST
-
-int main(void) {
-    Suite *s = suite_create("Chunked encoding");
-    TCase *tc_message = tcase_create("encode chunking");
-    tcase_add_test(tc_message,encodeArrayIntoFiveChunksShallWork);
-    tcase_add_test(tc_message,encodeStringIntoFiveChunksShallWork);
-    tcase_add_test(tc_message,encodeTwoStringsIntoTenChunksShallWork);
-    suite_add_tcase(s, tc_message);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/check_securechannel.c b/ext/open62541/tests/check_securechannel.c
deleted file mode 100644
index dc54467..0000000
--- a/ext/open62541/tests/check_securechannel.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/transport_generated.h>
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/transport_generated_handling.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_securechannel.h"
-#include <ua_types_encoding_binary.h>
-
-#include "check.h"
-#include "testing_networklayers.h"
-#include "testing_policy.h"
-
-#define UA_BYTESTRING_STATIC(s) {sizeof(s)-1, (UA_Byte*)(s)}
-
-// Some default testing sizes. Can be overwritten in testing functions.
-#define DEFAULT_SYM_ENCRYPTION_BLOCK_SIZE 2
-#define DEFAULT_SYM_SIGNING_KEY_LENGTH 3
-#define DEFAULT_SYM_ENCRYPTION_KEY_LENGTH 5
-#define DEFAULT_ASYM_REMOTE_SIGNATURE_SIZE 7
-#define DEFAULT_ASYM_LOCAL_SIGNATURE_SIZE 11
-#define DEFAULT_SYM_SIGNATURE_SIZE 13
-#define DEFAULT_ASYM_REMOTE_PLAINTEXT_BLOCKSIZE 256
-#define DEFAULT_ASYM_REMOTE_BLOCKSIZE 256
-
-UA_SecureChannel testChannel;
-UA_ByteString dummyCertificate =
-    UA_BYTESTRING_STATIC("DUMMY CERTIFICATE DUMMY CERTIFICATE DUMMY CERTIFICATE");
-UA_SecurityPolicy dummyPolicy;
-UA_Connection testingConnection;
-UA_ByteString sentData;
-
-
-static funcs_called fCalled;
-static key_sizes keySizes;
-
-static void
-setup_secureChannel(void) {
-    TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled, &keySizes);
-    UA_SecureChannel_init(&testChannel);
-    UA_SecureChannel_setSecurityPolicy(&testChannel, &dummyPolicy, &dummyCertificate);
-
-    testingConnection = createDummyConnection(65535, &sentData);
-    UA_Connection_attachSecureChannel(&testingConnection, &testChannel);
-    testChannel.connection = &testingConnection;
-}
-
-static void
-teardown_secureChannel(void) {
-    UA_SecureChannel_close(&testChannel);
-    UA_SecureChannel_deleteMembers(&testChannel);
-    dummyPolicy.deleteMembers(&dummyPolicy);
-    testingConnection.close(&testingConnection);
-}
-
-static void
-setup_funcs_called(void) {
-    memset(&fCalled, 0, sizeof(struct funcs_called));
-}
-
-static void
-teardown_funcs_called(void) {
-    memset(&fCalled, 0, sizeof(struct funcs_called));
-}
-
-static void
-setup_key_sizes(void) {
-    memset(&keySizes, 0, sizeof(struct key_sizes));
-
-    keySizes.sym_sig_keyLen = DEFAULT_SYM_SIGNING_KEY_LENGTH;
-    keySizes.sym_enc_blockSize = DEFAULT_SYM_ENCRYPTION_BLOCK_SIZE;
-    keySizes.sym_enc_keyLen = DEFAULT_SYM_ENCRYPTION_KEY_LENGTH;
-    keySizes.sym_sig_size = DEFAULT_SYM_SIGNATURE_SIZE;
-
-    keySizes.asym_lcl_sig_size = DEFAULT_ASYM_LOCAL_SIGNATURE_SIZE;
-    keySizes.asym_rmt_sig_size = DEFAULT_ASYM_REMOTE_SIGNATURE_SIZE;
-
-    keySizes.asym_rmt_ptext_blocksize = DEFAULT_ASYM_REMOTE_PLAINTEXT_BLOCKSIZE;
-    keySizes.asym_rmt_blocksize = DEFAULT_ASYM_REMOTE_BLOCKSIZE;
-    keySizes.asym_rmt_enc_key_size = 2048;
-    keySizes.asym_lcl_enc_key_size = 1024;
-}
-
-static void
-teardown_key_sizes(void) {
-    memset(&keySizes, 0, sizeof(struct key_sizes));
-}
-
-START_TEST(SecureChannel_initAndDelete) {
-    TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled, &keySizes);
-    UA_StatusCode retval;
-
-    UA_SecureChannel channel;
-    UA_SecureChannel_init(&channel);
-    retval = UA_SecureChannel_setSecurityPolicy(&channel, &dummyPolicy, &dummyCertificate);
-
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected StatusCode to be good");
-    ck_assert_msg(channel.state == UA_SECURECHANNELSTATE_FRESH, "Expected state to be fresh");
-    ck_assert_msg(fCalled.newContext, "Expected newContext to have been called");
-    ck_assert_msg(fCalled.makeCertificateThumbprint,
-                  "Expected makeCertificateThumbprint to have been called");
-    ck_assert_msg(channel.securityPolicy == &dummyPolicy, "SecurityPolicy not set correctly");
-
-    UA_SecureChannel_close(&channel);
-    UA_SecureChannel_deleteMembers(&channel);
-    ck_assert_msg(fCalled.deleteContext, "Expected deleteContext to have been called");
-
-    dummyPolicy.deleteMembers(&dummyPolicy);
-}END_TEST
-
-START_TEST(SecureChannel_generateNewKeys) {
-    UA_StatusCode retval = UA_SecureChannel_generateNewKeys(&testChannel);
-
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected Statuscode to be good");
-    ck_assert_msg(fCalled.generateKey, "Expected generateKey to have been called");
-    ck_assert_msg(fCalled.setLocalSymEncryptingKey,
-                  "Expected setLocalSymEncryptingKey to have been called");
-    ck_assert_msg(fCalled.setLocalSymSigningKey,
-                  "Expected setLocalSymSigningKey to have been called");
-    ck_assert_msg(fCalled.setLocalSymIv, "Expected setLocalSymIv to have been called");
-    ck_assert_msg(fCalled.setRemoteSymEncryptingKey,
-                  "Expected setRemoteSymEncryptingKey to have been called");
-    ck_assert_msg(fCalled.setRemoteSymSigningKey,
-                  "Expected setRemoteSymSigningKey to have been called");
-    ck_assert_msg(fCalled.setRemoteSymIv, "Expected setRemoteSymIv to have been called");
-}END_TEST
-
-START_TEST(SecureChannel_revolveTokens) {
-    // Fake that no token was issued by setting 0
-    testChannel.nextSecurityToken.tokenId = 0;
-    UA_StatusCode retval = UA_SecureChannel_revolveTokens(&testChannel);
-    ck_assert_msg(retval == UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN,
-                  "Expected failure because tokenId 0 signifies that no token was issued");
-
-    // Fake an issued token by setting an id
-    testChannel.nextSecurityToken.tokenId = 10;
-    retval = UA_SecureChannel_revolveTokens(&testChannel);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to return GOOD");
-    ck_assert_msg(fCalled.generateKey,
-                  "Expected generateKey to be called because new keys need to be generated,"
-                  "when switching to the next token.");
-
-    UA_ChannelSecurityToken testToken;
-    UA_ChannelSecurityToken_init(&testToken);
-
-    ck_assert_msg(memcmp(&testChannel.nextSecurityToken, &testToken,
-                         sizeof(UA_ChannelSecurityToken)) == 0,
-                  "Expected the next securityToken to be freshly initialized");
-    ck_assert_msg(testChannel.securityToken.tokenId == 10, "Expected token to have been copied");
-}END_TEST
-
-static void
-createDummyResponse(UA_OpenSecureChannelResponse *response) {
-    UA_OpenSecureChannelResponse_init(response);
-    memset(response, 0, sizeof(UA_OpenSecureChannelResponse));
-}
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_withoutConnection) {
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
-
-    // Remove connection to provoke error
-    UA_Connection_detachSecureChannel(testChannel.connection);
-    testChannel.connection = NULL;
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure without a connection");
-}END_TEST
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_invalidParameters) {
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, NULL,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, &dummyResponse, NULL);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-}END_TEST
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeInvalid) {
-    // Configure our channel correctly for OPN messages and setup dummy message
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_INVALID;
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval == UA_STATUSCODE_BADSECURITYMODEREJECTED,
-                  "Expected SecurityMode rejected error");
-}
-END_TEST
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeNone) {
-    // Configure our channel correctly for OPN messages and setup dummy message
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
-    ck_assert_msg(!fCalled.asym_enc, "Message encryption was called but should not have been");
-    ck_assert_msg(!fCalled.asym_sign, "Message signing was called but should not have been");
-}
-END_TEST
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeSign) {
-    // Configure our channel correctly for OPN messages and setup dummy message
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGN;
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
-    ck_assert_msg(fCalled.asym_enc, "Expected message to have been encrypted but it was not");
-    ck_assert_msg(fCalled.asym_sign, "Expected message to have been signed but it was not");
-}END_TEST
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeSignAndEncrypt) {
-    // Configure our channel correctly for OPN messages and setup dummy message
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, 42, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
-    ck_assert_msg(fCalled.asym_enc, "Expected message to have been encrypted but it was not");
-    ck_assert_msg(fCalled.asym_sign, "Expected message to have been signed but it was not");
-}END_TEST
-
-#endif /* UA_ENABLE_ENCRYPTION */
-
-START_TEST(SecureChannel_sendAsymmetricOPNMessage_sentDataIsValid) {
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-
-    /* Enable encryption for the SecureChannel */
-#ifdef UA_ENABLE_ENCRYPTION
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-#else
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
-#endif
-
-    UA_UInt32 requestId = UA_UInt32_random();
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, requestId, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
-
-    size_t offset = 0;
-    UA_SecureConversationMessageHeader header;
-    UA_SecureConversationMessageHeader_decodeBinary(&sentData, &offset, &header);
-
-    UA_AsymmetricAlgorithmSecurityHeader asymSecurityHeader;
-    UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(&sentData, &offset, &asymSecurityHeader);
-
-    ck_assert_msg(UA_ByteString_equal(&testChannel.securityPolicy->policyUri,
-                                      &asymSecurityHeader.securityPolicyUri),
-                  "Expected securityPolicyUri to be equal to the one used by the secureChannel");
-
-#ifdef UA_ENABLE_ENCRYPTION
-    ck_assert_msg(UA_ByteString_equal(&dummyCertificate, &asymSecurityHeader.senderCertificate),
-                  "Expected the certificate to be equal to the one used  by the secureChannel");
-
-    UA_ByteString thumbPrint = {20, testChannel.remoteCertificateThumbprint};
-    ck_assert_msg(UA_ByteString_equal(&thumbPrint,
-                                      &asymSecurityHeader.receiverCertificateThumbprint),
-                  "Expected receiverCertificateThumbprint to be equal to the one set "
-                  "in the secureChannel");
-
-    /* Dummy encryption */
-    for(size_t i = offset; i < header.messageHeader.messageSize; ++i) {
-        sentData.data[i] = (UA_Byte)((sentData.data[i] - 1) % (UA_BYTE_MAX + 1));
-    }
-#endif
-
-    UA_SequenceHeader sequenceHeader;
-    UA_SequenceHeader_decodeBinary(&sentData, &offset, &sequenceHeader);
-    ck_assert_msg(sequenceHeader.requestId == requestId, "Expected requestId to be %i but was %i",
-                  requestId,
-                  sequenceHeader.requestId);
-
-    UA_NodeId original =
-        UA_NODEID_NUMERIC(0, UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE].binaryEncodingId);
-    UA_NodeId requestTypeId;
-    UA_NodeId_decodeBinary(&sentData, &offset, &requestTypeId);
-    ck_assert_msg(UA_NodeId_equal(&original, &requestTypeId), "Expected nodeIds to be equal");
-
-    UA_OpenSecureChannelResponse sentResponse;
-    UA_OpenSecureChannelResponse_decodeBinary(&sentData, &offset, &sentResponse);
-
-    ck_assert_msg(memcmp(&sentResponse, &dummyResponse, sizeof(UA_OpenSecureChannelResponse)) == 0,
-                  "Expected the sent response to be equal to the one supplied to the send function");
-
-#ifdef UA_ENABLE_ENCRYPTION
-    UA_Byte paddingByte = sentData.data[offset];
-    size_t paddingSize = (size_t)paddingByte;
-
-    for(size_t i = 0; i <= paddingSize; ++i) {
-        ck_assert_msg(sentData.data[offset + i] == paddingByte,
-                      "Expected padding byte %i to be %i but got value %i",
-                      i, paddingByte, sentData.data[offset + i]);
-    }
-
-    ck_assert_msg(sentData.data[offset + paddingSize + 1] == '*', "Expected first byte of signature");
-#endif
-
-    UA_SecureConversationMessageHeader_deleteMembers(&header);
-    UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymSecurityHeader);
-    UA_SequenceHeader_deleteMembers(&sequenceHeader);
-    UA_OpenSecureChannelResponse_deleteMembers(&sentResponse);
-} END_TEST
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-START_TEST(Securechannel_sendAsymmetricOPNMessage_extraPaddingPresentWhenKeyLargerThan2048Bits) {
-    keySizes.asym_rmt_enc_key_size = 4096;
-    keySizes.asym_rmt_blocksize = 4096;
-    keySizes.asym_rmt_ptext_blocksize = 4096;
-
-    UA_OpenSecureChannelResponse dummyResponse;
-    createDummyResponse(&dummyResponse);
-
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-    UA_UInt32 requestId = UA_UInt32_random();
-
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel, requestId, &dummyResponse,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
-
-    size_t offset = 0;
-    UA_SecureConversationMessageHeader header;
-    UA_SecureConversationMessageHeader_decodeBinary(&sentData, &offset, &header);
-
-    UA_AsymmetricAlgorithmSecurityHeader asymSecurityHeader;
-    UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(&sentData, &offset, &asymSecurityHeader);
-    ck_assert_msg(UA_ByteString_equal(&dummyCertificate, &asymSecurityHeader.senderCertificate),
-                  "Expected the certificate to be equal to the one used  by the secureChannel");
-    ck_assert_msg(UA_ByteString_equal(&testChannel.securityPolicy->policyUri,
-                                      &asymSecurityHeader.securityPolicyUri),
-                  "Expected securityPolicyUri to be equal to the one used by the secureChannel");
-    UA_ByteString thumbPrint = {20, testChannel.remoteCertificateThumbprint};
-    ck_assert_msg(UA_ByteString_equal(&thumbPrint,
-                                      &asymSecurityHeader.receiverCertificateThumbprint),
-                  "Expected receiverCertificateThumbprint to be equal to the one set "
-                  "in the secureChannel");
-
-    for(size_t i = offset; i < header.messageHeader.messageSize; ++i) {
-        sentData.data[i] = (UA_Byte)((sentData.data[i] - 1) % (UA_BYTE_MAX + 1));
-    }
-
-    UA_SequenceHeader sequenceHeader;
-    UA_SequenceHeader_decodeBinary(&sentData, &offset, &sequenceHeader);
-    ck_assert_msg(sequenceHeader.requestId == requestId, "Expected requestId to be %i but was %i",
-                  requestId, sequenceHeader.requestId);
-
-    UA_NodeId original =
-        UA_NODEID_NUMERIC(0, UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE].binaryEncodingId);
-    UA_NodeId requestTypeId;
-    UA_NodeId_decodeBinary(&sentData, &offset, &requestTypeId);
-    ck_assert_msg(UA_NodeId_equal(&original, &requestTypeId), "Expected nodeIds to be equal");
-
-    UA_OpenSecureChannelResponse sentResponse;
-    UA_OpenSecureChannelResponse_decodeBinary(&sentData, &offset, &sentResponse);
-
-    ck_assert_msg(memcmp(&sentResponse, &dummyResponse, sizeof(UA_OpenSecureChannelResponse)) == 0,
-                  "Expected the sent response to be equal to the one supplied to the send function");
-
-    UA_Byte paddingByte = sentData.data[offset];
-    UA_Byte extraPaddingByte = sentData.data[sentData.length - keySizes.asym_lcl_sig_size - 1];
-    size_t paddingSize = (size_t)paddingByte;
-    paddingSize |= extraPaddingByte << 8;
-
-    for(size_t i = 0; i <= paddingSize; ++i) {
-        ck_assert_msg(sentData.data[offset + i] == paddingByte,
-                      "Expected padding byte %i to be %i but got value %i",
-                      i,
-                      paddingByte,
-                      sentData.data[offset + i]);
-    }
-
-    ck_assert_msg(sentData.data[offset + paddingSize + 1] == extraPaddingByte,
-                  "Expected extra padding byte to be %i but got %i",
-                  extraPaddingByte, sentData.data[offset + paddingSize + 1]);
-    ck_assert_msg(sentData.data[offset + paddingSize + 2] == '*',
-                  "Expected first byte 42 of signature but got %i",
-                  sentData.data[offset + paddingSize + 2]);
-
-    UA_SecureConversationMessageHeader_deleteMembers(&header);
-    UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymSecurityHeader);
-    UA_SequenceHeader_deleteMembers(&sequenceHeader);
-    UA_OpenSecureChannelResponse_deleteMembers(&sentResponse);
-}END_TEST
-
-#endif /* UA_ENABLE_ENCRYPTION */
-
-START_TEST(SecureChannel_sendSymmetricMessage) {
-    // initialize dummy message
-    UA_ReadRequest dummyMessage;
-    UA_ReadRequest_init(&dummyMessage);
-    UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
-
-    UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
-                                                                 &dummyMessage, &dummyType);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
-    // TODO: expand test
-}
-END_TEST
-
-START_TEST(SecureChannel_sendSymmetricMessage_modeNone) {
-    // initialize dummy message
-    UA_ReadRequest dummyMessage;
-    UA_ReadRequest_init(&dummyMessage);
-    UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
-
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
-
-    UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
-                                                                 &dummyMessage, &dummyType);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
-    ck_assert_msg(!fCalled.sym_sign, "Expected message to not have been signed");
-    ck_assert_msg(!fCalled.sym_enc, "Expected message to not have been encrypted");
-} END_TEST
-
-#ifdef UA_ENABLE_ENCRYPTION
-
-START_TEST(SecureChannel_sendSymmetricMessage_modeSign) {
-    // initialize dummy message
-    UA_ReadRequest dummyMessage;
-    UA_ReadRequest_init(&dummyMessage);
-    UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
-
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGN;
-
-    UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
-                                                                 &dummyMessage, &dummyType);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
-    ck_assert_msg(fCalled.sym_sign, "Expected message to have been signed");
-    ck_assert_msg(!fCalled.sym_enc, "Expected message to not have been encrypted");
-} END_TEST
-
-START_TEST(SecureChannel_sendSymmetricMessage_modeSignAndEncrypt)
-{
-    // initialize dummy message
-    UA_ReadRequest dummyMessage;
-    UA_ReadRequest_init(&dummyMessage);
-    UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
-
-    testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
-
-    UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
-                                                                 &dummyMessage, &dummyType);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
-    ck_assert_msg(fCalled.sym_sign, "Expected message to have been signed");
-    ck_assert_msg(fCalled.sym_enc, "Expected message to have been encrypted");
-} END_TEST
-
-#endif /* UA_ENABLE_ENCRYPTION */
-
-START_TEST(SecureChannel_sendSymmetricMessage_invalidParameters) {
-    // initialize dummy message
-    UA_ReadRequest dummyMessage;
-    UA_ReadRequest_init(&dummyMessage);
-    UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
-
-    UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(NULL, 42, UA_MESSAGETYPE_MSG,
-                                                                 &dummyMessage, &dummyType);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42,
-                                                   UA_MESSAGETYPE_HEL, &dummyMessage, &dummyType);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42,
-                                                   UA_MESSAGETYPE_ACK, &dummyMessage, &dummyType);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42,
-                                                   UA_MESSAGETYPE_ERR, &dummyMessage, &dummyType);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42,
-                                                   UA_MESSAGETYPE_OPN, &dummyMessage, &dummyType);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42,
-                                                   UA_MESSAGETYPE_MSG, NULL, &dummyType);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-
-    retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42,
-                                                   UA_MESSAGETYPE_MSG, &dummyMessage, NULL);
-    ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
-} END_TEST
-
-static Suite *
-testSuite_SecureChannel(void) {
-    Suite *s = suite_create("SecureChannel");
-
-    TCase *tc_initAndDelete = tcase_create("Initialize and delete Securechannel");
-    tcase_add_checked_fixture(tc_initAndDelete, setup_funcs_called, teardown_funcs_called);
-    tcase_add_checked_fixture(tc_initAndDelete, setup_key_sizes, teardown_key_sizes);
-    tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete);
-    suite_add_tcase(s, tc_initAndDelete);
-
-    TCase *tc_generateNewKeys = tcase_create("Test generateNewKeys function");
-    tcase_add_checked_fixture(tc_generateNewKeys, setup_funcs_called, teardown_funcs_called);
-    tcase_add_checked_fixture(tc_generateNewKeys, setup_key_sizes, teardown_key_sizes);
-    tcase_add_checked_fixture(tc_generateNewKeys, setup_secureChannel, teardown_secureChannel);
-    tcase_add_test(tc_generateNewKeys, SecureChannel_generateNewKeys);
-    suite_add_tcase(s, tc_generateNewKeys);
-
-    TCase *tc_revolveTokens = tcase_create("Test revolveTokens function");
-    tcase_add_checked_fixture(tc_revolveTokens, setup_funcs_called, teardown_funcs_called);
-    tcase_add_checked_fixture(tc_revolveTokens, setup_key_sizes, teardown_key_sizes);
-    tcase_add_checked_fixture(tc_revolveTokens, setup_secureChannel, teardown_secureChannel);
-    tcase_add_test(tc_revolveTokens, SecureChannel_revolveTokens);
-    suite_add_tcase(s, tc_revolveTokens);
-
-    TCase *tc_sendAsymmetricOPNMessage = tcase_create("Test sendAsymmetricOPNMessage function");
-    tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_funcs_called, teardown_funcs_called);
-    tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_key_sizes, teardown_key_sizes);
-    tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_secureChannel, teardown_secureChannel);
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_withoutConnection);
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_invalidParameters);
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeInvalid);
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeNone);
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_sentDataIsValid);
-#ifdef UA_ENABLE_ENCRYPTION
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeSign);
-    tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeSignAndEncrypt);
-    tcase_add_test(tc_sendAsymmetricOPNMessage,
-                   Securechannel_sendAsymmetricOPNMessage_extraPaddingPresentWhenKeyLargerThan2048Bits);
-#endif
-    suite_add_tcase(s, tc_sendAsymmetricOPNMessage);
-
-    TCase *tc_sendSymmetricMessage = tcase_create("Test sendSymmetricMessage function");
-    tcase_add_checked_fixture(tc_sendSymmetricMessage, setup_funcs_called, teardown_funcs_called);
-    tcase_add_checked_fixture(tc_sendSymmetricMessage, setup_key_sizes, teardown_key_sizes);
-    tcase_add_checked_fixture(tc_sendSymmetricMessage, setup_secureChannel, teardown_secureChannel);
-    tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage);
-    tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_invalidParameters);
-    tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_modeNone);
-#ifdef UA_ENABLE_ENCRYPTION
-    tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_modeSign);
-    tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_modeSignAndEncrypt);
-#endif
-    suite_add_tcase(s, tc_sendSymmetricMessage);
-
-    return s;
-}
-
-int
-main(void) {
-    Suite *s = testSuite_SecureChannel();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/check_timer.c b/ext/open62541/tests/check_timer.c
deleted file mode 100644
index 24f1bbe..0000000
--- a/ext/open62541/tests/check_timer.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public 
- * License, v. 2.0. If a copy of the MPL was not distributed with this 
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "ua_timer.h"
-#include "check.h"
-
-#include <time.h>
-#include <stdio.h>
-
-#define N_EVENTS 10000
-
-size_t count = 0;
-
-static void
-timerCallback(void *application, void *data) {
-    count++;
-}
-
-static void
-executionCallback(void *executionApplication, UA_ApplicationCallback cb,
-                  void *callbackApplication, void *data) {
-    cb(callbackApplication, data);
-}
-
-/* Create empty events with different callback intervals */
-static void
-createEvents(UA_Timer *t, UA_UInt32 events) {
-    for(size_t i = 0; i < events; i++) {
-        UA_Double interval = (UA_Double)i+1;
-        UA_StatusCode retval =
-            UA_Timer_addRepeatedCallback(t, timerCallback, NULL, NULL, interval, NULL);
-        ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    }
-}
-
-START_TEST(benchmarkTimer) {
-    UA_Timer timer;
-    UA_Timer_init(&timer);
-    createEvents(&timer, N_EVENTS);
-
-    clock_t begin = clock();
-    UA_DateTime now = 0;
-    for(size_t i = 0; i < 1000; i++) {
-        UA_DateTime next = UA_Timer_process(&timer, now, executionCallback, NULL);
-        /* At least 100 msec distance between _process */
-        now = next + (UA_DATETIME_MSEC * 100);
-        if(next > now)
-            now = next;
-    }
-
-    clock_t finish = clock();
-    double time_spent = (double)(finish - begin) / CLOCKS_PER_SEC;
-    printf("duration was %f s\n", time_spent);
-    printf("%lu callbacks\n", (unsigned long)count);
-
-    UA_Timer_deleteMembers(&timer);
-} END_TEST
-
-int main(void) {
-    Suite *s  = suite_create("Test Event Timer");
-    TCase *tc = tcase_create("test cases");
-    tcase_add_test(tc, benchmarkTimer);
-    suite_add_tcase(s, tc);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all (sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/check_types_builtin.c b/ext/open62541/tests/check_types_builtin.c
deleted file mode 100644
index ba00bf2..0000000
--- a/ext/open62541/tests/check_types_builtin.c
+++ /dev/null
@@ -1,1559 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/types_generated_handling.h>
-#include <open62541/util.h>
-
-#include "ua_types_encoding_binary.h"
-
-#include <check.h>
-#include <float.h>
-#include <math.h>
-
-/* copied here from encoding_binary.c */
-enum UA_VARIANT_ENCODINGMASKTYPE_enum {
-    UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK = 0x3F,            // bits 0:5
-    UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS  = (0x01 << 6),     // bit 6
-    UA_VARIANT_ENCODINGMASKTYPE_ARRAY       = (0x01 << 7)      // bit 7
-};
-
-START_TEST(UA_Byte_decodeShallCopyAndAdvancePosition) {
-    // given
-    UA_Byte dst;
-    UA_Byte data[] = { 0x08 };
-    UA_ByteString src = { 1, data };
-    size_t pos = 0;
-
-    // when
-    UA_StatusCode retval = UA_Byte_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(pos, 1);
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_BYTE]));
-    ck_assert_uint_eq(dst, 0x08);
-}
-END_TEST
-
-START_TEST(UA_Byte_decodeShallModifyOnlyCurrentPosition) {
-    // given
-    UA_Byte dst[]  = { 0xFF, 0xFF, 0xFF };
-    UA_Byte data[] = { 0x08 };
-    UA_ByteString src = { 1, data };
-    size_t pos = 0;
-    // when
-    UA_StatusCode retval = UA_Byte_decodeBinary(&src, &pos, &dst[1]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 1);
-    ck_assert_uint_eq(dst[0], 0xFF);
-    ck_assert_uint_eq(dst[1], 0x08);
-    ck_assert_uint_eq(dst[2], 0xFF);
-}
-END_TEST
-
-START_TEST(UA_Int16_decodeShallAssumeLittleEndian) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = {
-            0x01, 0x00,     // 1
-            0x00, 0x01      // 256
-    };
-    UA_ByteString src = { 4, data };
-    // when
-    UA_Int16 val_01_00, val_00_01;
-    UA_StatusCode retval = UA_Int16_decodeBinary(&src, &pos, &val_01_00);
-    retval |= UA_Int16_decodeBinary(&src, &pos, &val_00_01);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(val_01_00, 1);
-    ck_assert_int_eq(val_00_01, 256);
-    ck_assert_int_eq(pos, 4);
-}
-END_TEST
-
-START_TEST(UA_Int16_decodeShallRespectSign) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = {
-            0xFF, 0xFF,     // -1
-            0x00, 0x80      // -32768
-    };
-    UA_ByteString src = { 4, data };
-    // when
-    UA_Int16 val_ff_ff, val_00_80;
-    UA_StatusCode retval = UA_Int16_decodeBinary(&src, &pos, &val_ff_ff);
-    retval |= UA_Int16_decodeBinary(&src, &pos, &val_00_80);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(val_ff_ff, -1);
-    ck_assert_int_eq(val_00_80, -32768);
-}
-END_TEST
-
-START_TEST(UA_UInt16_decodeShallNotRespectSign) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = {
-            0xFF, 0xFF,     // (2^16)-1
-            0x00, 0x80      // (2^15)
-    };
-    UA_ByteString src = { 4, data };
-    // when
-    UA_UInt16     val_ff_ff, val_00_80;
-    UA_StatusCode retval = UA_UInt16_decodeBinary(&src, &pos, &val_ff_ff);
-    retval |= UA_UInt16_decodeBinary(&src, &pos, &val_00_80);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 4);
-    ck_assert_uint_eq(val_ff_ff, (0x01 << 16)-1);
-    ck_assert_uint_eq(val_00_80, (0x01 << 15));
-}
-END_TEST
-
-START_TEST(UA_Int32_decodeShallAssumeLittleEndian) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = {
-            0x01, 0x00, 0x00, 0x00,     // 1
-            0x00, 0x01, 0x00, 0x00      // 256
-    };
-    UA_ByteString src = { 8, data };
-
-    // when
-    UA_Int32 val_01_00, val_00_01;
-    UA_StatusCode retval = UA_Int32_decodeBinary(&src, &pos, &val_01_00);
-    retval |= UA_Int32_decodeBinary(&src, &pos, &val_00_01);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(val_01_00, 1);
-    ck_assert_int_eq(val_00_01, 256);
-    ck_assert_int_eq(pos, 8);
-}
-END_TEST
-
-START_TEST(UA_Int32_decodeShallRespectSign) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = {
-            0xFF, 0xFF, 0xFF, 0xFF,     // -1
-            0x00, 0x80, 0xFF, 0xFF      // -32768
-    };
-    UA_ByteString src = { 8, data };
-
-    // when
-    UA_Int32 val_ff_ff, val_00_80;
-    UA_StatusCode retval = UA_Int32_decodeBinary(&src, &pos, &val_ff_ff);
-    retval |= UA_Int32_decodeBinary(&src, &pos, &val_00_80);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(val_ff_ff, -1);
-    ck_assert_int_eq(val_00_80, -32768);
-}
-END_TEST
-
-START_TEST(UA_UInt32_decodeShallNotRespectSign) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = {
-            0xFF, 0xFF, 0xFF, 0xFF,     // (2^32)-1
-            0x00, 0x00, 0x00, 0x80      // (2^31)
-    };
-    UA_ByteString src = { 8, data };
-
-    // when
-    UA_UInt32 val_ff_ff, val_00_80;
-    UA_StatusCode retval = UA_UInt32_decodeBinary(&src, &pos, &val_ff_ff);
-    retval |= UA_UInt32_decodeBinary(&src, &pos, &val_00_80);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 8);
-    ck_assert_uint_eq(val_ff_ff, (UA_UInt32)( (0x01LL << 32 ) - 1 ));
-    ck_assert_uint_eq(val_00_80, (UA_UInt32)(0x01) << 31);
-}
-END_TEST
-
-START_TEST(UA_UInt64_decodeShallNotRespectSign) {
-    // given
-    UA_ByteString rawMessage;
-    UA_UInt64     expectedVal = 0xFF;
-    expectedVal = expectedVal << 56;
-    UA_Byte mem[8] = { 00, 00, 00, 00, 0x00, 0x00, 0x00, 0xFF };
-    rawMessage.data   = mem;
-    rawMessage.length = 8;
-    size_t pos = 0;
-    UA_UInt64 val;
-    // when
-    UA_UInt64_decodeBinary(&rawMessage, &pos, &val);
-    // then
-    ck_assert_uint_eq(val, expectedVal);
-}
-END_TEST
-
-START_TEST(UA_Int64_decodeShallRespectSign) {
-    // given
-    UA_ByteString rawMessage;
-    UA_UInt64 expectedVal = (UA_UInt64)0xFF << 56;
-    UA_Byte  mem[8]      = { 00, 00, 00, 00, 0x00, 0x00, 0x00, 0xFF };
-    rawMessage.data   = mem;
-    rawMessage.length = 8;
-
-    size_t pos = 0;
-    UA_Int64 val;
-    // when
-    UA_Int64_decodeBinary(&rawMessage, &pos, &val);
-    //then
-    ck_assert_uint_eq(val, expectedVal);
-}
-END_TEST
-
-START_TEST(UA_Float_decodeShallWorkOnExample) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 0x00, 0x00, 0xD0, 0xC0 }; // -6.5
-    UA_ByteString src = { 4, data };
-    UA_Float dst;
-    // when
-    UA_StatusCode retval = UA_Float_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 4);
-    ck_assert(-6.5000001 < dst);
-    ck_assert(dst < -6.49999999999);
-}
-END_TEST
-
-START_TEST(UA_Double_decodeShallGiveOne) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F }; // 1
-    UA_ByteString src = { 8, data }; // 1
-    UA_Double dst;
-    // when
-    UA_StatusCode retval = UA_Double_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 8);
-    ck_assert(0.9999999 < dst);
-    ck_assert(dst < 1.00000000001);
-}
-END_TEST
-
-START_TEST(UA_Double_decodeShallGiveZero) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-    UA_ByteString src = { 8, data }; // 1
-    UA_Double dst;
-    // when
-    UA_StatusCode retval = UA_Double_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 8);
-    ck_assert(-0.00000001 < dst);
-    ck_assert(dst < 0.000000001);
-}
-END_TEST
-
-START_TEST(UA_Double_decodeShallGiveMinusTwo) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }; // -2
-    UA_ByteString src = { 8, data };
-    UA_Double dst;
-    // when
-    UA_StatusCode retval = UA_Double_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 8);
-    ck_assert(-1.9999999 > dst);
-    ck_assert(dst > -2.00000000001);
-}
-END_TEST
-
-START_TEST(UA_Double_decodeShallGive2147483648) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x41 }; //2147483648
-    UA_ByteString src = { 8, data }; // 1
-    UA_Double dst;
-    // when
-    UA_StatusCode retval = UA_Double_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 8);
-    ck_assert(2147483647.9999999 <= dst);
-    ck_assert(dst <= 2147483648.00000001);
-}
-END_TEST
-
-START_TEST(UA_String_decodeShallAllocateMemoryAndCopyString) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] =
-    { 0x08, 0x00, 0x00, 0x00, 'A', 'C', 'P', 'L', 'T', ' ', 'U', 'A', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-    UA_ByteString src = { 16, data };
-    UA_String dst;
-    // when
-    UA_StatusCode retval = UA_String_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(dst.length, 8);
-    ck_assert_int_eq(dst.data[3], 'L');
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_STRING]));
-    // finally
-    UA_String_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_String_decodeWithNegativeSizeShallNotAllocateMemoryAndNullPtr) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] =
-    { 0xFF, 0xFF, 0xFF, 0xFF, 'A', 'C', 'P', 'L', 'T', ' ', 'U', 'A', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-    UA_ByteString src = { 16, data };
-    UA_String dst;
-    // when
-    UA_StatusCode retval = UA_String_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(dst.length, 0);
-    ck_assert_ptr_eq(dst.data, NULL);
-}
-END_TEST
-
-START_TEST(UA_String_decodeWithZeroSizeShallNotAllocateMemoryAndNullPtr) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] =
-    { 0x00, 0x00, 0x00, 0x00, 'A', 'C', 'P', 'L', 'T', ' ', 'U', 'A', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
-    UA_ByteString src = { 17, data };
-    UA_String dst;
-    // when
-    UA_StatusCode retval = UA_String_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(dst.length, 0);
-    ck_assert_ptr_eq(dst.data, UA_EMPTY_ARRAY_SENTINEL);
-}
-END_TEST
-
-START_TEST(UA_NodeId_decodeTwoByteShallReadTwoBytesAndSetNamespaceToZero) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 0 /* UA_NODEIDTYPE_TWOBYTE */, 0x10 };
-    UA_ByteString src    = { 2, data };
-    UA_NodeId dst;
-    // when
-    UA_StatusCode retval = UA_NodeId_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 2);
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_NODEID]));
-    ck_assert_int_eq(dst.identifierType, UA_NODEIDTYPE_NUMERIC);
-    ck_assert_int_eq(dst.identifier.numeric, 16);
-    ck_assert_int_eq(dst.namespaceIndex, 0);
-}
-END_TEST
-
-START_TEST(UA_NodeId_decodeFourByteShallReadFourBytesAndRespectNamespace) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { 1 /* UA_NODEIDTYPE_FOURBYTE */, 0x01, 0x00, 0x01 };
-    UA_ByteString src = { 4, data };
-    UA_NodeId dst;
-    // when
-    UA_StatusCode retval = UA_NodeId_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 4);
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_NODEID]));
-    ck_assert_int_eq(dst.identifierType, UA_NODEIDTYPE_NUMERIC);
-    ck_assert_int_eq(dst.identifier.numeric, 256);
-    ck_assert_int_eq(dst.namespaceIndex, 1);
-}
-END_TEST
-
-START_TEST(UA_NodeId_decodeStringShallAllocateMemory) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { UA_NODEIDTYPE_STRING, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 'P', 'L', 'T' };
-    UA_ByteString src = { 10, data };
-    UA_NodeId dst;
-    // when
-    UA_StatusCode retval = UA_NodeId_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 10);
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_NODEID]));
-    ck_assert_int_eq(dst.identifierType, UA_NODEIDTYPE_STRING);
-    ck_assert_int_eq(dst.namespaceIndex, 1);
-    ck_assert_int_eq(dst.identifier.string.length, 3);
-    ck_assert_int_eq(dst.identifier.string.data[1], 'L');
-    // finally
-    UA_NodeId_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Variant_decodeWithOutArrayFlagSetShallSetVTAndAllocateMemoryForArray) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { (UA_Byte)UA_TYPES[UA_TYPES_INT32].typeId.identifier.numeric, 0xFF, 0x00, 0x00, 0x00 };
-    UA_ByteString src = { 5, data };
-    UA_Variant dst;
-    // when
-    UA_StatusCode retval = UA_Variant_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(pos, 5);
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_VARIANT]));
-    //ck_assert_ptr_eq((const void *)dst.type, (const void *)&UA_TYPES[UA_TYPES_INT32]); //does not compile in gcc 4.6
-    ck_assert_int_eq((uintptr_t)dst.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(dst.arrayLength, 0);
-    ck_assert_int_ne((uintptr_t)dst.data, 0);
-    UA_assert(dst.data != NULL); /* repeat the previous argument so that clang-analyzer is happy */
-    ck_assert_int_eq(*(UA_Int32 *)dst.data, 255);
-    // finally
-    UA_Variant_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Variant_decodeWithArrayFlagSetShallSetVTAndAllocateMemoryForArray) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { (UA_Byte)(UA_TYPES[UA_TYPES_INT32].typeId.identifier.numeric |
-                                 UA_VARIANT_ENCODINGMASKTYPE_ARRAY),
-                       0x02, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-                       0xFF, 0xFF };
-    UA_ByteString src = { 13, data };
-    UA_Variant dst;
-    // when
-    UA_StatusCode retval = UA_Variant_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(pos, 1+4+2*4);
-    ck_assert_uint_eq(pos, UA_calcSizeBinary(&dst, &UA_TYPES[UA_TYPES_VARIANT]));
-    //ck_assert_ptr_eq((const (void*))dst.type, (const void*)&UA_TYPES[UA_TYPES_INT32]); //does not compile in gcc 4.6
-    ck_assert_int_eq((uintptr_t)dst.type,(uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(dst.arrayLength, 2);
-    ck_assert_int_eq(((UA_Int32 *)dst.data)[0], 255);
-    ck_assert_int_eq(((UA_Int32 *)dst.data)[1], -1);
-    // finally
-    UA_Variant_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Variant_decodeSingleExtensionObjectShallSetVTAndAllocateMemory){
-    /* // given */
-    /* size_t pos = 0; */
-    /* UA_Variant dst; */
-    /* UA_NodeId tmpNodeId; */
-
-    /* UA_NodeId_init(&tmpNodeId); */
-    /* tmpNodeId.identifier.numeric = 22; */
-    /* tmpNodeId.namespaceIndex = 2; */
-    /* tmpNodeId.identifierType = UA_NODEIDTYPE_NUMERIC; */
-
-    /* UA_ExtensionObject tmpExtensionObject; */
-    /* UA_ExtensionObject_init(&tmpExtensionObject); */
-    /* tmpExtensionObject.encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; */
-    /* tmpExtensionObject.content.encoded.body = UA_ByteString_withSize(3); */
-    /* tmpExtensionObject.content.encoded.body.data[0]= 10; */
-    /* tmpExtensionObject.content.encoded.body.data[1]= 20; */
-    /* tmpExtensionObject.content.encoded.body.data[2]= 30; */
-    /* tmpExtensionObject.content.encoded.typeId = tmpNodeId; */
-
-    /* UA_Variant tmpVariant; */
-    /* UA_Variant_init(&tmpVariant); */
-    /* tmpVariant.arrayDimensions = NULL; */
-    /* tmpVariant.arrayDimensionsSize = -1; */
-    /* tmpVariant.arrayLength = -1; */
-    /* tmpVariant.storageType = UA_VARIANT_DATA_NODELETE; */
-    /* tmpVariant.type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; */
-    /* tmpVariant.data = &tmpExtensionObject; */
-
-    /* UA_ByteString srcByteString = UA_ByteString_withSize(200); */
-    /* pos = 0; */
-    /* UA_Variant_encodeBinary(&tmpVariant,&srcByteString,pos); */
-
-    /* // when */
-    /* pos = 0; */
-    /* UA_StatusCode retval = UA_Variant_decodeBinary(&srcByteString, &pos, &dst); */
-    /* // then */
-    /* ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); */
-    /* // TODO!! */
-    /* /\* ck_assert_int_eq(dst.encoding, UA_EXTENSIONOBJECT_DECODED); *\/ */
-    /* /\* ck_assert_int_eq((uintptr_t)dst.content.decoded.type, (uintptr_t)&UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); *\/ */
-    /* /\* ck_assert_int_eq(dst.arrayLength, -1); *\/ */
-    /* /\* ck_assert_int_eq(((UA_ExtensionObject *)dst.data)->body.data[0], 10); *\/ */
-    /* /\* ck_assert_int_eq(((UA_ExtensionObject *)dst.data)->body.data[1], 20); *\/ */
-    /* /\* ck_assert_int_eq(((UA_ExtensionObject *)dst.data)->body.data[2], 30); *\/ */
-    /* /\* ck_assert_int_eq(((UA_ExtensionObject *)dst.data)->body.length, 3); *\/ */
-
-
-    /* // finally */
-    /* UA_Variant_deleteMembers(&dst); */
-    /* UA_ByteString_deleteMembers(&srcByteString); */
-    /* UA_ExtensionObject_deleteMembers(&tmpExtensionObject); */
-
-}
-END_TEST
-
-START_TEST(UA_Variant_decodeWithOutDeleteMembersShallFailInCheckMem) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { (UA_Byte)(UA_TYPES[UA_TYPES_INT32].typeId.identifier.numeric |
-                                 UA_VARIANT_ENCODINGMASKTYPE_ARRAY),
-                       0x02, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF };
-    UA_ByteString src = { 13, data };
-    UA_Variant dst;
-    // when
-    UA_StatusCode retval = UA_Variant_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    // finally
-    UA_Variant_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Variant_decodeWithTooSmallSourceShallReturnWithError) {
-    // given
-    size_t pos = 0;
-    UA_Byte data[] = { (UA_Byte)(UA_TYPES[UA_TYPES_INT32].typeId.identifier.numeric |
-                                 UA_VARIANT_ENCODINGMASKTYPE_ARRAY),
-                       0x02, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF };
-    UA_ByteString src = { 4, data };
-
-    UA_Variant dst;
-    // when
-    UA_StatusCode retval = UA_Variant_decodeBinary(&src, &pos, &dst);
-    // then
-    ck_assert_int_ne(retval, UA_STATUSCODE_GOOD);
-    // finally
-    UA_Variant_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Byte_encode_test) {
-    // given
-    UA_Byte src       = 8;
-    UA_Byte data[]    = { 0x00, 0xFF };
-    UA_ByteString dst = { 2, data };
-    ck_assert_uint_eq(dst.data[1], 0xFF);
-
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-    UA_StatusCode retval = UA_Byte_encodeBinary(&src, &pos, end);
-
-    ck_assert_uint_eq(dst.data[0], 0x08);
-    ck_assert_uint_eq(dst.data[1], 0xFF);
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 1);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // Test2
-    // given
-    src = 0xFF;
-    dst.data[1] = 0x00;
-    pos = dst.data;
-    retval      = UA_Byte_encodeBinary(&src, &pos, end);
-
-    ck_assert_int_eq(dst.data[0], 0xFF);
-    ck_assert_int_eq(dst.data[1], 0x00);
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 1);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-}
-END_TEST
-
-START_TEST(UA_UInt16_encodeNegativeShallEncodeLittleEndian) {
-    // given
-    UA_UInt16     src    = -1;
-    UA_Byte       data[] = { 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst    = { 4, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_UInt16_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 2);
-    ck_assert_int_eq(dst.data[0], 0xFF);
-    ck_assert_int_eq(dst.data[1], 0xFF);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // when test 2
-    src    = -32768;
-    retval = UA_UInt16_encodeBinary(&src, &pos, end);
-    // then test 2
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 4);
-    ck_assert_int_eq(dst.data[2], 0x00);
-    ck_assert_int_eq(dst.data[3], 0x80);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_UInt16_encodeShallEncodeLittleEndian) {
-    // given
-    UA_UInt16     src    = 0;
-    UA_Byte       data[] = {  0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst    = { 4, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_UInt16_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 2);
-    ck_assert_int_eq(dst.data[0], 0x00);
-    ck_assert_int_eq(dst.data[1], 0x00);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // when test 2
-    src    = 32767;
-    retval = UA_UInt16_encodeBinary(&src, &pos, end);
-    // then test 2
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 4);
-    ck_assert_int_eq(dst.data[2], 0xFF);
-    ck_assert_int_eq(dst.data[3], 0x7F);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_UInt32_encodeShallEncodeLittleEndian) {
-    // given
-    UA_UInt32     src    = -1;
-    UA_Byte       data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst    = { 8, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_UInt32_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 4);
-    ck_assert_int_eq(dst.data[0], 0xFF);
-    ck_assert_int_eq(dst.data[1], 0xFF);
-    ck_assert_int_eq(dst.data[2], 0xFF);
-    ck_assert_int_eq(dst.data[3], 0xFF);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // when test 2
-    src    = 0x0101FF00;
-    retval = UA_UInt32_encodeBinary(&src, &pos, end);
-    // then test 2
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 8);
-    ck_assert_int_eq(dst.data[4], 0x00);
-    ck_assert_int_eq(dst.data[5], 0xFF);
-    ck_assert_int_eq(dst.data[6], 0x01);
-    ck_assert_int_eq(dst.data[7], 0x01);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_Int32_encodeShallEncodeLittleEndian) {
-    // given
-    UA_Int32 src    = 1;
-    UA_Byte  data[]   = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst = { 8, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_Int32_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 4);
-    ck_assert_int_eq(dst.data[0], 0x01);
-    ck_assert_int_eq(dst.data[1], 0x00);
-    ck_assert_int_eq(dst.data[2], 0x00);
-    ck_assert_int_eq(dst.data[3], 0x00);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // when test 2
-    src    = 0x7FFFFFFF;
-    retval = UA_Int32_encodeBinary(&src, &pos, end);
-    // then test 2
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 8);
-    ck_assert_int_eq(dst.data[4], 0xFF);
-    ck_assert_int_eq(dst.data[5], 0xFF);
-    ck_assert_int_eq(dst.data[6], 0xFF);
-    ck_assert_int_eq(dst.data[7], 0x7F);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_Int32_encodeNegativeShallEncodeLittleEndian) {
-    // given
-    UA_Int32 src    = -1;
-    UA_Byte  data[]   = {  0x55, 0x55,    0x55,  0x55, 0x55,  0x55,    0x55,  0x55 };
-    UA_ByteString dst = { 8, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_Int32_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 4);
-    ck_assert_int_eq(dst.data[0], 0xFF);
-    ck_assert_int_eq(dst.data[1], 0xFF);
-    ck_assert_int_eq(dst.data[2], 0xFF);
-    ck_assert_int_eq(dst.data[3], 0xFF);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_UInt64_encodeShallWorkOnExample) {
-    // given
-    UA_UInt64     src    = -1;
-    UA_Byte       data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                             0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst    = { 16, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_UInt64_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 8);
-    ck_assert_int_eq(dst.data[0], 0xFF);
-    ck_assert_int_eq(dst.data[1], 0xFF);
-    ck_assert_int_eq(dst.data[2], 0xFF);
-    ck_assert_int_eq(dst.data[3], 0xFF);
-    ck_assert_int_eq(dst.data[4], 0xFF);
-    ck_assert_int_eq(dst.data[5], 0xFF);
-    ck_assert_int_eq(dst.data[6], 0xFF);
-    ck_assert_int_eq(dst.data[7], 0xFF);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // when test 2
-    src    = 0x7F0033AA44EE6611;
-    retval = UA_UInt64_encodeBinary(&src, &pos, end);
-    // then test 2
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 16);
-    ck_assert_int_eq(dst.data[8], 0x11);
-    ck_assert_int_eq(dst.data[9], 0x66);
-    ck_assert_int_eq(dst.data[10], 0xEE);
-    ck_assert_int_eq(dst.data[11], 0x44);
-    ck_assert_int_eq(dst.data[12], 0xAA);
-    ck_assert_int_eq(dst.data[13], 0x33);
-    ck_assert_int_eq(dst.data[14], 0x00);
-    ck_assert_int_eq(dst.data[15], 0x7F);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_Int64_encodeShallEncodeLittleEndian) {
-    // given
-    UA_Int64 src    = 0x7F0033AA44EE6611;
-    UA_Byte  data[]   = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                          0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst = { 16, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_Int64_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 8);
-    ck_assert_int_eq(dst.data[0], 0x11);
-    ck_assert_int_eq(dst.data[1], 0x66);
-    ck_assert_int_eq(dst.data[2], 0xEE);
-    ck_assert_int_eq(dst.data[3], 0x44);
-    ck_assert_int_eq(dst.data[4], 0xAA);
-    ck_assert_int_eq(dst.data[5], 0x33);
-    ck_assert_int_eq(dst.data[6], 0x00);
-    ck_assert_int_eq(dst.data[7], 0x7F);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_Int64_encodeNegativeShallEncodeLittleEndian) {
-    // given
-    UA_Int64 src    = -1;
-    UA_Byte  data[]   = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                          0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst = { 16, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_Int64_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 8);
-    ck_assert_int_eq(dst.data[0], 0xFF);
-    ck_assert_int_eq(dst.data[1], 0xFF);
-    ck_assert_int_eq(dst.data[2], 0xFF);
-    ck_assert_int_eq(dst.data[3], 0xFF);
-    ck_assert_int_eq(dst.data[4], 0xFF);
-    ck_assert_int_eq(dst.data[5], 0xFF);
-    ck_assert_int_eq(dst.data[6], 0xFF);
-    ck_assert_int_eq(dst.data[7], 0xFF);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_Float_encodeShallWorkOnExample) {
-#define UA_FLOAT_TESTS 9
-    /* use -NAN since the UA standard expected specific values for NAN with the
-       negative bit set */
-    UA_Float src[UA_FLOAT_TESTS] = {27.5f, -6.5f, 0.0f, -0.0f, -NAN, FLT_MAX, FLT_MIN, INFINITY, -INFINITY};
-    UA_Byte result[UA_FLOAT_TESTS][4] = {
-        {0x00, 0x00, 0xDC, 0x41}, // 27.5
-        {0x00, 0x00, 0xD0, 0xC0}, // -6.5
-        {0x00, 0x00, 0x00, 0x00}, // 0.0
-        {0x00, 0x00, 0x00, 0x80}, // -0.0
-        {0x00, 0x00, 0xC0, 0xFF}, // -NAN
-        {0xFF, 0xFF, 0x7F, 0x7F}, // FLT_MAX
-        {0x00, 0x00, 0x80, 0x00}, // FLT_MIN
-        {0x00, 0x00, 0x80, 0x7F}, // INF
-        {0x00, 0x00, 0x80, 0xFF} // -INF
-    };
-#if defined(_MSC_VER) || defined(__TINYC__)
-    /* On Visual Studio or TinyCC -NAN is encoded differently */
-    result[4][3] = 127;
-#endif
-
-    UA_Byte data[] = {0x55, 0x55, 0x55,  0x55};
-    UA_ByteString dst = {4, data};
-    const UA_Byte *end = &dst.data[dst.length];
-
-    for(size_t i = 0; i < 7; i++) {
-        UA_Byte *pos = dst.data;
-        UA_Int32 retval = UA_Float_encodeBinary(&src[i], &pos, end);
-        ck_assert_int_eq((uintptr_t)(pos - dst.data), 4);
-        ck_assert_int_eq(dst.data[0], result[i][0]);
-        ck_assert_int_eq(dst.data[1], result[i][1]);
-        ck_assert_int_eq(dst.data[2], result[i][2]);
-        ck_assert_int_eq(dst.data[3], result[i][3]);
-        ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    }
-}
-END_TEST
-
-START_TEST(UA_Double_encodeShallWorkOnExample) {
-    // given
-    UA_Double src = -6.5;
-    UA_Byte data[] = { 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
-                       0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
-    UA_ByteString dst = {16,data};
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when test 1
-    UA_StatusCode retval = UA_Double_encodeBinary(&src, &pos, end);
-    // then test 1
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 8);
-    ck_assert_int_eq(dst.data[6], 0x1A);
-    ck_assert_int_eq(dst.data[7], 0xC0);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_String_encodeShallWorkOnExample) {
-    // given
-    UA_String src;
-    src.length = 11;
-    UA_Byte mem[12] = "ACPLT OPCUA";
-    src.data = mem;
-
-    UA_Byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst = { 24, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when
-    UA_StatusCode retval = UA_String_encodeBinary(&src, &pos, end);
-    // then
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), sizeof(UA_Int32)+11);
-    ck_assert_uint_eq(sizeof(UA_Int32)+11, UA_calcSizeBinary(&src, &UA_TYPES[UA_TYPES_STRING]));
-    ck_assert_int_eq(dst.data[0], 11);
-    ck_assert_int_eq(dst.data[sizeof(UA_Int32)+0], 'A');
-    ck_assert_int_eq(dst.data[sizeof(UA_Int32)+1], 'C');
-    ck_assert_int_eq(dst.data[sizeof(UA_Int32)+2], 'P');
-    ck_assert_int_eq(dst.data[sizeof(UA_Int32)+3], 'L');
-    ck_assert_int_eq(dst.data[sizeof(UA_Int32)+4], 'T');
-    ck_assert_int_eq(dst.data[sizeof(UA_Int32)+5], 0x20); //Space
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_encodeShallWorkOnExample) {
-    // given
-    UA_ExpandedNodeId src = UA_EXPANDEDNODEID_NUMERIC(0, 15);
-    src.namespaceUri = UA_STRING("testUri");
-
-    UA_Byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst = { 32, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when
-    UA_StatusCode retval = UA_ExpandedNodeId_encodeBinary(&src, &pos, end);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 13);
-    ck_assert_uint_eq(13, UA_calcSizeBinary(&src, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]));
-    ck_assert_int_eq(dst.data[0], 0x80); // namespaceuri flag
-}
-END_TEST
-
-START_TEST(UA_DataValue_encodeShallWorkOnExampleWithoutVariant) {
-    // given
-    UA_DataValue src;
-    UA_DataValue_init(&src);
-    src.serverTimestamp = 80;
-    src.hasServerTimestamp = true;
-
-    UA_Byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
-    UA_ByteString dst = { 24, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when
-    UA_StatusCode retval = UA_DataValue_encodeBinary(&src, &pos, end);
-    // then
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 9);
-    ck_assert_uint_eq(9, UA_calcSizeBinary(&src, &UA_TYPES[UA_TYPES_DATAVALUE]));
-    ck_assert_int_eq(dst.data[0], 0x08); // encodingMask
-    ck_assert_int_eq(dst.data[1], 80);   // 8 Byte serverTimestamp
-    ck_assert_int_eq(dst.data[2], 0);
-    ck_assert_int_eq(dst.data[3], 0);
-    ck_assert_int_eq(dst.data[4], 0);
-    ck_assert_int_eq(dst.data[5], 0);
-    ck_assert_int_eq(dst.data[6], 0);
-    ck_assert_int_eq(dst.data[7], 0);
-    ck_assert_int_eq(dst.data[8], 0);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_DataValue_encodeShallWorkOnExampleWithVariant) {
-    // given
-    UA_DataValue src;
-    UA_DataValue_init(&src);
-    src.serverTimestamp    = 80;
-    src.hasValue = true;
-    src.hasServerTimestamp = true;
-    src.value.type = &UA_TYPES[UA_TYPES_INT32];
-    src.value.arrayLength  = 0; // one element (encoded as not an array)
-    UA_Int32 vdata = 45;
-    src.value.data = (void *)&vdata;
-
-    UA_Byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-    UA_ByteString dst = { 24, data };
-    UA_Byte *pos = dst.data;
-    const UA_Byte *end = &dst.data[dst.length];
-
-    // when
-    UA_StatusCode retval = UA_DataValue_encodeBinary(&src, &pos, end);
-    // then
-    ck_assert_int_eq((uintptr_t)(pos - dst.data), 1+(1+4)+8);           // represents the length
-    ck_assert_uint_eq(1+(1+4)+8, UA_calcSizeBinary(&src, &UA_TYPES[UA_TYPES_DATAVALUE]));
-    ck_assert_int_eq(dst.data[0], 0x08 | 0x01); // encodingMask
-    ck_assert_int_eq(dst.data[1], 0x06);        // Variant's Encoding Mask - INT32
-    ck_assert_int_eq(dst.data[2], 45);          // the single value
-    ck_assert_int_eq(dst.data[3], 0);
-    ck_assert_int_eq(dst.data[4], 0);
-    ck_assert_int_eq(dst.data[5], 0);
-    ck_assert_int_eq(dst.data[6], 80);  // the server timestamp
-    ck_assert_int_eq(dst.data[7], 0);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(UA_DateTime_toStructShallWorkOnExample) {
-    // given
-    UA_DateTime src = 13974671891234567 + (11644473600 * 10000000); // ua counts since 1601, unix since 1970
-    //1397467189... is Mon, 14 Apr 2014 09:19:49 GMT
-    //...1234567 are the milli-, micro- and nanoseconds
-    UA_DateTimeStruct dst;
-
-    // when
-    dst = UA_DateTime_toStruct(src);
-    // then
-    ck_assert_int_eq(dst.nanoSec, 700);
-    ck_assert_int_eq(dst.microSec, 456);
-    ck_assert_int_eq(dst.milliSec, 123);
-
-    ck_assert_int_eq(dst.sec, 49);
-    ck_assert_int_eq(dst.min, 19);
-    ck_assert_int_eq(dst.hour, 9);
-
-    ck_assert_int_eq(dst.day, 14);
-    ck_assert_int_eq(dst.month, 4);
-    ck_assert_int_eq(dst.year, 2014);
-}
-END_TEST
-
-START_TEST(UA_QualifiedName_equalShallWorkOnExample) {
-    // given
-    UA_QualifiedName qn1 = UA_QUALIFIEDNAME(5, "tEsT123!");
-    UA_QualifiedName qn2 = UA_QUALIFIEDNAME(3, "tEsT123!");
-    UA_QualifiedName qn3 = UA_QUALIFIEDNAME(5, "tEsT1");
-    UA_QualifiedName qn4 = UA_QUALIFIEDNAME(5, "tEsT123!");
-
-    ck_assert(UA_QualifiedName_equal(&qn1, &qn2) == UA_FALSE);
-    ck_assert(UA_QualifiedName_equal(&qn1, &qn3) == UA_FALSE);
-    ck_assert(UA_QualifiedName_equal(&qn1, &qn4) == UA_TRUE);
-}
-END_TEST
-
-START_TEST(UA_ExtensionObject_copyShallWorkOnExample) {
-    // given
-    /* UA_Byte data[3] = { 1, 2, 3 }; */
-
-    /* UA_ExtensionObject value, valueCopied; */
-    /* UA_ExtensionObject_init(&value); */
-    /* UA_ExtensionObject_init(&valueCopied); */
-
-    //Todo!!
-    /* value.typeId = UA_TYPES[UA_TYPES_BYTE].typeId; */
-    /* value.encoding    = UA_EXTENSIONOBJECT_ENCODINGMASK_NOBODYISENCODED; */
-    /* value.encoding    = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING; */
-    /* value.body.data   = data; */
-    /* value.body.length = 3; */
-
-    /* //when */
-    /* UA_ExtensionObject_copy(&value, &valueCopied); */
-
-    /* for(UA_Int32 i = 0;i < 3;i++) */
-    /*     ck_assert_int_eq(valueCopied.body.data[i], value.body.data[i]); */
-
-    /* ck_assert_int_eq(valueCopied.encoding, value.encoding); */
-    /* ck_assert_int_eq(valueCopied.typeId.identifierType, value.typeId.identifierType); */
-    /* ck_assert_int_eq(valueCopied.typeId.identifier.numeric, value.typeId.identifier.numeric); */
-
-    /* //finally */
-    /* value.body.data = NULL; // we cannot free the static string */
-    /* UA_ExtensionObject_deleteMembers(&value); */
-    /* UA_ExtensionObject_deleteMembers(&valueCopied); */
-}
-END_TEST
-
-START_TEST(UA_Array_copyByteArrayShallWorkOnExample) {
-    //given
-    UA_String testString;
-    UA_Byte  *dstArray;
-    UA_Int32  size = 5;
-    UA_Int32  i    = 0;
-    testString.data = (UA_Byte*)UA_malloc(size);
-    testString.data[0] = 'O';
-    testString.data[1] = 'P';
-    testString.data[2] = 'C';
-    testString.data[3] = 'U';
-    testString.data[4] = 'A';
-    testString.length  = 5;
-
-    //when
-    UA_StatusCode retval;
-    retval = UA_Array_copy((const void *)testString.data, 5, (void **)&dstArray, &UA_TYPES[UA_TYPES_BYTE]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    //then
-    for(i = 0;i < size;i++)
-        ck_assert_int_eq(testString.data[i], dstArray[i]);
-
-    //finally
-    UA_String_deleteMembers(&testString);
-    UA_free((void *)dstArray);
-
-}
-END_TEST
-
-START_TEST(UA_Array_copyUA_StringShallWorkOnExample) {
-    // given
-    UA_Int32   i, j;
-    UA_String *srcArray = (UA_String*)UA_Array_new(3, &UA_TYPES[UA_TYPES_STRING]);
-    UA_String *dstArray;
-
-    srcArray[0] = UA_STRING_ALLOC("open");
-    srcArray[1] = UA_STRING_ALLOC("62541");
-    srcArray[2] = UA_STRING_ALLOC("opc ua");
-    //when
-    UA_StatusCode retval;
-    retval = UA_Array_copy((const void *)srcArray, 3, (void **)&dstArray, &UA_TYPES[UA_TYPES_STRING]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    //then
-    for(i = 0;i < 3;i++) {
-        for(j = 0;j < 3;j++)
-            ck_assert_int_eq(srcArray[i].data[j], dstArray[i].data[j]);
-        ck_assert_int_eq(srcArray[i].length, dstArray[i].length);
-    }
-    //finally
-    UA_Array_delete(srcArray, 3, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Array_delete(dstArray, 3, &UA_TYPES[UA_TYPES_STRING]);
-}
-END_TEST
-
-START_TEST(UA_DiagnosticInfo_copyShallWorkOnExample) {
-    //given
-    UA_DiagnosticInfo value, innerValue, copiedValue;
-    UA_String testString = (UA_String){5, (UA_Byte*)"OPCUA"};
-
-    UA_DiagnosticInfo_init(&value);
-    UA_DiagnosticInfo_init(&innerValue);
-    value.hasInnerDiagnosticInfo = true;
-    value.innerDiagnosticInfo = &innerValue;
-    value.hasAdditionalInfo = true;
-    value.additionalInfo = testString;
-
-    //when
-    UA_DiagnosticInfo_copy(&value, &copiedValue);
-
-    //then
-    for(size_t i = 0;i < testString.length;i++)
-        ck_assert_int_eq(copiedValue.additionalInfo.data[i], value.additionalInfo.data[i]);
-    ck_assert_int_eq(copiedValue.additionalInfo.length, value.additionalInfo.length);
-
-    ck_assert_int_eq(copiedValue.hasInnerDiagnosticInfo, value.hasInnerDiagnosticInfo);
-    ck_assert_int_eq(copiedValue.innerDiagnosticInfo->locale, value.innerDiagnosticInfo->locale);
-    ck_assert_int_eq(copiedValue.innerStatusCode, value.innerStatusCode);
-    ck_assert_int_eq(copiedValue.locale, value.locale);
-    ck_assert_int_eq(copiedValue.localizedText, value.localizedText);
-    ck_assert_int_eq(copiedValue.namespaceUri, value.namespaceUri);
-    ck_assert_int_eq(copiedValue.symbolicId, value.symbolicId);
-
-    //finally
-    value.additionalInfo.data = NULL; // do not delete the static string
-    value.innerDiagnosticInfo = NULL; // do not delete the static innerdiagnosticinfo
-    UA_DiagnosticInfo_deleteMembers(&value);
-    UA_DiagnosticInfo_deleteMembers(&copiedValue);
-
-}
-END_TEST
-
-START_TEST(UA_ApplicationDescription_copyShallWorkOnExample) {
-    //given
-
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_String appString = (UA_String){3, (UA_Byte*)"APP"};
-    UA_String discString = (UA_String){4, (UA_Byte*)"DISC"};
-    UA_String gateWayString = (UA_String){7, (UA_Byte*)"GATEWAY"};
-
-    UA_String srcArray[3];
-    srcArray[0] = (UA_String){ 6, (UA_Byte*)"__open" };
-    srcArray[1] = (UA_String){ 6, (UA_Byte*)"_62541" };
-    srcArray[2] = (UA_String){ 6, (UA_Byte*)"opc ua" };
-
-    UA_ApplicationDescription value, copiedValue;
-    UA_ApplicationDescription_init(&value);
-    value.applicationUri = appString;
-    value.discoveryProfileUri = discString;
-    value.gatewayServerUri = gateWayString;
-    value.discoveryUrlsSize = 3;
-    value.discoveryUrls     = srcArray;
-
-    //when
-    retval = UA_ApplicationDescription_copy(&value, &copiedValue);
-
-    //then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    for(size_t i = 0; i < appString.length; i++)
-        ck_assert_int_eq(copiedValue.applicationUri.data[i], value.applicationUri.data[i]);
-    ck_assert_int_eq(copiedValue.applicationUri.length, value.applicationUri.length);
-
-    for(size_t i = 0; i < discString.length; i++)
-        ck_assert_int_eq(copiedValue.discoveryProfileUri.data[i], value.discoveryProfileUri.data[i]);
-    ck_assert_int_eq(copiedValue.discoveryProfileUri.length, value.discoveryProfileUri.length);
-
-    for(size_t i = 0; i < gateWayString.length; i++)
-        ck_assert_int_eq(copiedValue.gatewayServerUri.data[i], value.gatewayServerUri.data[i]);
-    ck_assert_int_eq(copiedValue.gatewayServerUri.length, value.gatewayServerUri.length);
-
-    //String Array Test
-    for(UA_Int32 i = 0;i < 3;i++) {
-        for(UA_Int32 j = 0;j < 6;j++)
-            ck_assert_int_eq(value.discoveryUrls[i].data[j], copiedValue.discoveryUrls[i].data[j]);
-        ck_assert_int_eq(value.discoveryUrls[i].length, copiedValue.discoveryUrls[i].length);
-    }
-    ck_assert_int_eq(copiedValue.discoveryUrls[0].data[2], 'o');
-    ck_assert_int_eq(copiedValue.discoveryUrls[0].data[3], 'p');
-    ck_assert_int_eq(copiedValue.discoveryUrlsSize, value.discoveryUrlsSize);
-
-    //finally
-    // UA_ApplicationDescription_deleteMembers(&value); // do not free the members as they are statically allocated
-    UA_ApplicationDescription_deleteMembers(&copiedValue);
-}
-END_TEST
-
-START_TEST(UA_QualifiedName_copyShallWorkOnInputExample) {
-    // given
-    UA_QualifiedName src = UA_QUALIFIEDNAME(5, "tEsT123!");
-    UA_QualifiedName dst;
-
-    // when
-    UA_StatusCode ret = UA_QualifiedName_copy(&src, &dst);
-    // then
-    ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq('E', dst.name.data[1]);
-    ck_assert_int_eq('!', dst.name.data[7]);
-    ck_assert_int_eq(8, dst.name.length);
-    ck_assert_int_eq(5, dst.namespaceIndex);
-    // finally
-    UA_QualifiedName_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Guid_copyShallWorkOnInputExample) {
-    //given
-    const UA_Guid src = {3, 45, 1222, {8, 7, 6, 5, 4, 3, 2, 1}};
-    UA_Guid dst;
-
-    //when
-    UA_StatusCode ret = UA_Guid_copy(&src, &dst);
-
-    //then
-    ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(src.data1, dst.data1);
-    ck_assert_int_eq(src.data3, dst.data3);
-    ck_assert_int_eq(src.data4[4], dst.data4[4]);
-    //finally
-}
-END_TEST
-
-START_TEST(UA_LocalizedText_copycstringShallWorkOnInputExample) {
-    // given
-    char src[8] = {'t', 'e', 'X', 't', '1', '2', '3', (char)0};
-    const UA_LocalizedText dst = UA_LOCALIZEDTEXT("", src);
-
-    // then
-    ck_assert_int_eq('1', dst.text.data[4]);
-    ck_assert_int_eq(0, dst.locale.length);
-    ck_assert_int_eq(7, dst.text.length);
-}
-END_TEST
-
-START_TEST(UA_DataValue_copyShallWorkOnInputExample) {
-    // given
-    UA_Variant srcVariant;
-    UA_Variant_init(&srcVariant);
-    UA_DataValue src;
-    UA_DataValue_init(&src);
-    src.hasSourceTimestamp = true;
-    src.sourceTimestamp = 4;
-    src.hasSourcePicoseconds = true;
-    src.sourcePicoseconds = 77;
-    src.hasServerPicoseconds = true;
-    src.serverPicoseconds = 8;
-    UA_DataValue dst;
-
-    // when
-    UA_StatusCode ret = UA_DataValue_copy(&src, &dst);
-    // then
-    ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(4, dst.sourceTimestamp);
-    ck_assert_int_eq(77, dst.sourcePicoseconds);
-    ck_assert_int_eq(8, dst.serverPicoseconds);
-}
-END_TEST
-
-START_TEST(UA_Variant_copyShallWorkOnSingleValueExample) {
-    //given
-    UA_String testString = (UA_String){5, (UA_Byte*)"OPCUA"};
-    UA_Variant value, copiedValue;
-    UA_Variant_init(&value);
-    UA_Variant_init(&copiedValue);
-    value.data = UA_malloc(sizeof(UA_String));
-    *((UA_String*)value.data) = testString;
-    value.type = &UA_TYPES[UA_TYPES_STRING];
-    value.arrayLength = 1;
-
-    //when
-    UA_Variant_copy(&value, &copiedValue);
-
-    //then
-    UA_String copiedString = *(UA_String*)(copiedValue.data);
-    for(UA_Int32 i = 0;i < 5;i++)
-        ck_assert_int_eq(copiedString.data[i], testString.data[i]);
-    ck_assert_int_eq(copiedString.length, testString.length);
-
-    ck_assert_int_eq(value.arrayDimensionsSize, copiedValue.arrayDimensionsSize);
-    ck_assert_int_eq(value.arrayLength, copiedValue.arrayLength);
-
-    //finally
-    ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it.
-    UA_Variant_deleteMembers(&value);
-    UA_Variant_deleteMembers(&copiedValue);
-}
-END_TEST
-
-START_TEST(UA_Variant_copyShallWorkOnByteStringIndexRange) {
-    UA_ByteString text = UA_BYTESTRING("My xml");
-    UA_Variant src;
-    UA_Variant_setScalar(&src, &text, &UA_TYPES[UA_TYPES_BYTESTRING]);
-
-    UA_NumericRangeDimension d1 = {0, 8388607};
-    UA_NumericRange nr;
-    nr.dimensionsSize = 1;
-    nr.dimensions = &d1;
-
-    UA_Variant dst;
-    UA_StatusCode retval = UA_Variant_copyRange(&src, &dst, nr);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&dst);
-}
-END_TEST
-
-START_TEST(UA_Variant_copyShallWorkOn1DArrayExample) {
-    // given
-    UA_String *srcArray = (UA_String*)UA_Array_new(3, &UA_TYPES[UA_TYPES_STRING]);
-    srcArray[0] = UA_STRING_ALLOC("__open");
-    srcArray[1] = UA_STRING_ALLOC("_62541");
-    srcArray[2] = UA_STRING_ALLOC("opc ua");
-
-    UA_UInt32 *dimensions;
-    dimensions = (UA_UInt32*)UA_malloc(sizeof(UA_UInt32));
-    dimensions[0] = 3;
-
-    UA_Variant value, copiedValue;
-    UA_Variant_init(&value);
-    UA_Variant_init(&copiedValue);
-
-    value.arrayLength = 3;
-    value.data = (void *)srcArray;
-    value.arrayDimensionsSize = 1;
-    value.arrayDimensions = dimensions;
-    value.type = &UA_TYPES[UA_TYPES_STRING];
-
-    //when
-    UA_Variant_copy(&value, &copiedValue);
-
-    //then
-    UA_Int32 i1 = value.arrayDimensions[0];
-    UA_Int32 i2 = copiedValue.arrayDimensions[0];
-    ck_assert_int_eq(i1, i2);
-
-    for(UA_Int32 i = 0;i < 3;i++) {
-        for(UA_Int32 j = 0;j < 6;j++) {
-            ck_assert_int_eq(((UA_String *)value.data)[i].data[j],
-                    ((UA_String *)copiedValue.data)[i].data[j]);
-        }
-        ck_assert_int_eq(((UA_String *)value.data)[i].length,
-                ((UA_String *)copiedValue.data)[i].length);
-    }
-    ck_assert_int_eq(((UA_String *)copiedValue.data)[0].data[2], 'o');
-    ck_assert_int_eq(((UA_String *)copiedValue.data)[0].data[3], 'p');
-    ck_assert_int_eq(value.arrayDimensionsSize, copiedValue.arrayDimensionsSize);
-    ck_assert_int_eq(value.arrayLength, copiedValue.arrayLength);
-
-    //finally
-    UA_Variant_deleteMembers(&value);
-    UA_Variant_deleteMembers(&copiedValue);
-}
-END_TEST
-
-START_TEST(UA_Variant_copyShallWorkOn2DArrayExample) {
-    // given
-    UA_Int32 *srcArray = (UA_Int32*)UA_Array_new(6, &UA_TYPES[UA_TYPES_INT32]);
-    srcArray[0] = 0;
-    srcArray[1] = 1;
-    srcArray[2] = 2;
-    srcArray[3] = 3;
-    srcArray[4] = 4;
-    srcArray[5] = 5;
-
-    UA_UInt32 *dimensions = (UA_UInt32*)UA_Array_new(2, &UA_TYPES[UA_TYPES_INT32]);
-    UA_UInt32 dim1 = 3;
-    UA_UInt32 dim2 = 2;
-    dimensions[0] = dim1;
-    dimensions[1] = dim2;
-
-    UA_Variant value, copiedValue;
-    UA_Variant_init(&value);
-    UA_Variant_init(&copiedValue);
-
-    value.arrayLength = 6;
-    value.data     = srcArray;
-    value.arrayDimensionsSize = 2;
-    value.arrayDimensions     = dimensions;
-    value.type = &UA_TYPES[UA_TYPES_INT32];
-
-    //when
-    UA_Variant_copy(&value, &copiedValue);
-
-    //then
-    //1st dimension
-    UA_Int32 i1 = value.arrayDimensions[0];
-    UA_Int32 i2 = copiedValue.arrayDimensions[0];
-    ck_assert_int_eq(i1, i2);
-    ck_assert_int_eq(i1, dim1);
-
-
-    //2nd dimension
-    i1 = value.arrayDimensions[1];
-    i2 = copiedValue.arrayDimensions[1];
-    ck_assert_int_eq(i1, i2);
-    ck_assert_int_eq(i1, dim2);
-
-
-    for(UA_Int32 i = 0;i < 6;i++) {
-        i1 = ((UA_Int32 *)value.data)[i];
-        i2 = ((UA_Int32 *)copiedValue.data)[i];
-        ck_assert_int_eq(i1, i2);
-        ck_assert_int_eq(i2, i);
-    }
-
-    ck_assert_int_eq(value.arrayDimensionsSize, copiedValue.arrayDimensionsSize);
-    ck_assert_int_eq(value.arrayLength, copiedValue.arrayLength);
-
-    //finally
-    UA_Variant_deleteMembers(&value);
-    UA_Variant_deleteMembers(&copiedValue);
-}
-END_TEST
-
-START_TEST(UA_ExtensionObject_encodeDecodeShallWorkOnExtensionObject) {
-    /* UA_Int32 val = 42; */
-    /* UA_VariableAttributes varAttr; */
-    /* UA_VariableAttributes_init(&varAttr); */
-    /* varAttr.dataType = UA_TYPES[UA_TYPES_INT32].typeId; */
-    /* UA_Variant_init(&varAttr.value); */
-    /* varAttr.value.type = &UA_TYPES[UA_TYPES_INT32]; */
-    /* varAttr.value.data = &val; */
-    /* varAttr.value.arrayLength = -1; */
-    /* varAttr.userWriteMask = 41; */
-    /* varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DATATYPE; */
-    /* varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_VALUE; */
-    /* varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_USERWRITEMASK; */
-
-    /* /\* wrap it into a extension object attributes *\/ */
-    /* UA_ExtensionObject extensionObject; */
-    /* UA_ExtensionObject_init(&extensionObject); */
-    /* extensionObject.typeId = UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES].typeId; */
-    /* UA_Byte extensionData[50]; */
-    /* extensionObject.body = (UA_ByteString){.data = extensionData, .length=50}; */
-    /* size_t posEncode = 0; */
-    /* UA_VariableAttributes_encodeBinary(&varAttr, &extensionObject.body, posEncode); */
-    /* extensionObject.body.length = posEncode; */
-    /* extensionObject.encoding = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING; */
-
-    /* UA_Byte data[50]; */
-    /* UA_ByteString dst = {.data = data, .length=50}; */
-
-    /* posEncode = 0; */
-    /* UA_ExtensionObject_encodeBinary(&extensionObject, &dst, posEncode); */
-
-    /* UA_ExtensionObject extensionObjectDecoded; */
-    /* size_t posDecode = 0; */
-    /* UA_ExtensionObject_decodeBinary(&dst, &posDecode, &extensionObjectDecoded); */
-
-    /* ck_assert_int_eq(posEncode, posDecode); */
-    /* ck_assert_int_eq(extensionObjectDecoded.body.length, extensionObject.body.length); */
-
-    /* UA_VariableAttributes varAttrDecoded; */
-    /* UA_VariableAttributes_init(&varAttrDecoded); */
-    /* posDecode = 0; */
-    /* UA_VariableAttributes_decodeBinary(&extensionObjectDecoded.body, &posDecode, &varAttrDecoded); */
-    /* ck_assert_uint_eq(41, varAttrDecoded.userWriteMask); */
-    /* ck_assert_int_eq(-1, varAttrDecoded.value.arrayLength); */
-
-    /* // finally */
-    /* UA_ExtensionObject_deleteMembers(&extensionObjectDecoded); */
-    /* UA_Variant_deleteMembers(&varAttrDecoded.value); */
-}
-END_TEST
-
-static Suite *testSuite_builtin(void) {
-    Suite *s = suite_create("Built-in Data Types 62541-6 Table 1");
-
-    TCase *tc_decode = tcase_create("decode");
-    tcase_add_test(tc_decode, UA_Byte_decodeShallCopyAndAdvancePosition);
-    tcase_add_test(tc_decode, UA_Byte_decodeShallModifyOnlyCurrentPosition);
-    tcase_add_test(tc_decode, UA_Int16_decodeShallAssumeLittleEndian);
-    tcase_add_test(tc_decode, UA_Int16_decodeShallRespectSign);
-    tcase_add_test(tc_decode, UA_UInt16_decodeShallNotRespectSign);
-    tcase_add_test(tc_decode, UA_Int32_decodeShallAssumeLittleEndian);
-    tcase_add_test(tc_decode, UA_Int32_decodeShallRespectSign);
-    tcase_add_test(tc_decode, UA_UInt32_decodeShallNotRespectSign);
-    tcase_add_test(tc_decode, UA_UInt64_decodeShallNotRespectSign);
-    tcase_add_test(tc_decode, UA_Int64_decodeShallRespectSign);
-    tcase_add_test(tc_decode, UA_Float_decodeShallWorkOnExample);
-    tcase_add_test(tc_decode, UA_Double_decodeShallGiveOne);
-    tcase_add_test(tc_decode, UA_Double_decodeShallGiveZero);
-    tcase_add_test(tc_decode, UA_Double_decodeShallGiveMinusTwo);
-    tcase_add_test(tc_decode, UA_Double_decodeShallGive2147483648);
-    tcase_add_test(tc_decode, UA_Byte_encode_test);
-    tcase_add_test(tc_decode, UA_String_decodeShallAllocateMemoryAndCopyString);
-    tcase_add_test(tc_decode, UA_String_decodeWithNegativeSizeShallNotAllocateMemoryAndNullPtr);
-    tcase_add_test(tc_decode, UA_String_decodeWithZeroSizeShallNotAllocateMemoryAndNullPtr);
-    tcase_add_test(tc_decode, UA_NodeId_decodeTwoByteShallReadTwoBytesAndSetNamespaceToZero);
-    tcase_add_test(tc_decode, UA_NodeId_decodeFourByteShallReadFourBytesAndRespectNamespace);
-    tcase_add_test(tc_decode, UA_NodeId_decodeStringShallAllocateMemory);
-    tcase_add_test(tc_decode, UA_Variant_decodeSingleExtensionObjectShallSetVTAndAllocateMemory);
-    tcase_add_test(tc_decode, UA_Variant_decodeWithOutArrayFlagSetShallSetVTAndAllocateMemoryForArray);
-    tcase_add_test(tc_decode, UA_Variant_decodeWithArrayFlagSetShallSetVTAndAllocateMemoryForArray);
-    tcase_add_test(tc_decode, UA_Variant_decodeWithOutDeleteMembersShallFailInCheckMem);
-    tcase_add_test(tc_decode, UA_Variant_decodeWithTooSmallSourceShallReturnWithError);
-    suite_add_tcase(s, tc_decode);
-
-    TCase *tc_encode = tcase_create("encode");
-    tcase_add_test(tc_encode, UA_Byte_encode_test);
-    tcase_add_test(tc_encode, UA_UInt16_encodeNegativeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_UInt16_encodeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_UInt32_encodeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_Int32_encodeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_Int32_encodeNegativeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_UInt64_encodeShallWorkOnExample);
-    tcase_add_test(tc_encode, UA_Int64_encodeNegativeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_Int64_encodeShallEncodeLittleEndian);
-    tcase_add_test(tc_encode, UA_Float_encodeShallWorkOnExample);
-    tcase_add_test(tc_encode, UA_Double_encodeShallWorkOnExample);
-    tcase_add_test(tc_encode, UA_String_encodeShallWorkOnExample);
-    tcase_add_test(tc_encode, UA_ExpandedNodeId_encodeShallWorkOnExample);
-    tcase_add_test(tc_encode, UA_DataValue_encodeShallWorkOnExampleWithoutVariant);
-    tcase_add_test(tc_encode, UA_DataValue_encodeShallWorkOnExampleWithVariant);
-    tcase_add_test(tc_encode, UA_ExtensionObject_encodeDecodeShallWorkOnExtensionObject);
-    suite_add_tcase(s, tc_encode);
-
-    TCase *tc_convert = tcase_create("convert");
-    tcase_add_test(tc_convert, UA_DateTime_toStructShallWorkOnExample);
-    suite_add_tcase(s, tc_convert);
-
-    TCase *tc_equal = tcase_create("equal");
-    tcase_add_test(tc_equal, UA_QualifiedName_equalShallWorkOnExample);
-    suite_add_tcase(s, tc_equal);
-
-    TCase *tc_copy = tcase_create("copy");
-    tcase_add_test(tc_copy, UA_Array_copyByteArrayShallWorkOnExample);
-    tcase_add_test(tc_copy, UA_Array_copyUA_StringShallWorkOnExample);
-    tcase_add_test(tc_copy, UA_ExtensionObject_copyShallWorkOnExample);
-    tcase_add_test(tc_copy, UA_Variant_copyShallWorkOnSingleValueExample);
-    tcase_add_test(tc_copy, UA_Variant_copyShallWorkOn1DArrayExample);
-    tcase_add_test(tc_copy, UA_Variant_copyShallWorkOn2DArrayExample);
-    tcase_add_test(tc_copy, UA_Variant_copyShallWorkOnByteStringIndexRange);
-
-    tcase_add_test(tc_copy, UA_DiagnosticInfo_copyShallWorkOnExample);
-    tcase_add_test(tc_copy, UA_ApplicationDescription_copyShallWorkOnExample);
-    tcase_add_test(tc_copy, UA_QualifiedName_copyShallWorkOnInputExample);
-    tcase_add_test(tc_copy, UA_Guid_copyShallWorkOnInputExample);
-    tcase_add_test(tc_copy, UA_LocalizedText_copycstringShallWorkOnInputExample);
-    tcase_add_test(tc_copy, UA_DataValue_copyShallWorkOnInputExample);
-    suite_add_tcase(s, tc_copy);
-    return s;
-}
-
-int main(void) {
-    int      number_failed = 0;
-    Suite   *s;
-    SRunner *sr;
-
-    s  = testSuite_builtin();
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/check_types_builtin_json.c b/ext/open62541/tests/check_types_builtin_json.c
deleted file mode 100644
index e102343..0000000
--- a/ext/open62541/tests/check_types_builtin_json.c
+++ /dev/null
@@ -1,6056 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/types_generated_handling.h>
-#include <open62541/util.h>
-
-#include "ua_types_encoding_binary.h"
-#include "ua_types_encoding_json.h"
-
-#include <check.h>
-#include <float.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#if defined(_MSC_VER)
-# pragma warning(disable: 4146)
-#endif
-
-/* Test Boolean */
-START_TEST(UA_Boolean_true_json_encode) {
-   
-    UA_Boolean *src = UA_Boolean_new();
-    UA_Boolean_init(src);
-    *src = UA_TRUE;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "true";
-    ck_assert_str_eq(result, (char*)buf.data);
-    
-    UA_ByteString_deleteMembers(&buf);
-    UA_Boolean_delete(src);
-    
-}
-END_TEST
-
-START_TEST(UA_Boolean_false_json_encode) {
-   
-    UA_Boolean *src = UA_Boolean_new();
-    UA_Boolean_init(src);
-    *src = UA_FALSE;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN];
-
-    UA_ByteString buf;
-
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    ck_assert_int_eq(size, 5);
-    
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-        
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "false";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Boolean_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Boolean_true_bufferTooSmall_json_encode) {
-   
-    UA_Boolean *src = UA_Boolean_new();
-    UA_Boolean_init(src);
-    *src = UA_FALSE;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN];
-
-    UA_ByteString buf;
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    char* result = "";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Boolean_delete(src);
-}
-END_TEST
-
-/* Test String */
-START_TEST(UA_String_json_encode) {
-    // given
-    UA_String src = UA_STRING("hello");
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
-    
-    UA_ByteString buf;
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-    // when
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"hello\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_String_Empty_json_encode) {
-    // given
-    UA_String src = UA_STRING("");
-    UA_ByteString buf;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
-    
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-    // when
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_String_Null_json_encode) {
-    // given
-    UA_String src = UA_STRING_NULL;
-    UA_ByteString buf;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
- 
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-    // when
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "null";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_String_escapesimple_json_encode) {
-    // given
-    UA_String src = UA_STRING("\b\th\"e\fl\nl\\o\r");
-    UA_ByteString buf;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-    // when
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_String_escapeutf_json_encode) {
-    // given
-    UA_String src = UA_STRING("he\\zsdl\alo€ \x26\x3A asdasd");
-    UA_ByteString buf;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-    // when
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"he\\\\zsdl\\u0007lo€ &: asdasd\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_String_special_json_encode) {
-    // given
-    UA_String src = UA_STRING("𝄞𠂊𝕥🔍");
-    UA_ByteString buf;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-    // when
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"𝄞𠂊𝕥🔍\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-/* Byte */
-START_TEST(UA_Byte_Max_Number_json_encode) {
-
-    UA_Byte *src = UA_Byte_new();
-    *src = 255;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE];
-
-    UA_ByteString buf;
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "255";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Byte_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Byte_Min_Number_json_encode) {
-
-    UA_Byte *src = UA_Byte_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE];
-
-    UA_ByteString buf;
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Byte_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Byte_smallbuf_Number_json_encode) {
-
-    UA_Byte *src = UA_Byte_new();
-    *src = 255;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Byte_delete(src);
-}
-END_TEST
-
-/* sByte */
-START_TEST(UA_SByte_Max_Number_json_encode) {
-
-    UA_SByte *src = UA_SByte_new();
-    *src = 127;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "127";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_SByte_delete(src);
-}
-END_TEST
-
-START_TEST(UA_SByte_Min_Number_json_encode) {
-
-    UA_SByte *src = UA_SByte_new();
-    *src = -128;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "-128";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_SByte_delete(src);
-}
-END_TEST
-
-START_TEST(UA_SByte_Zero_Number_json_encode) {
-
-    UA_SByte *src = UA_SByte_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_SByte_delete(src);
-}
-END_TEST
-
-START_TEST(UA_SByte_smallbuf_Number_json_encode) {
-
-    UA_SByte *src = UA_SByte_new();
-    *src = 127;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_SByte_delete(src);
-}
-END_TEST
-
-
-/* UInt16 */
-START_TEST(UA_UInt16_Max_Number_json_encode) {
-
-    UA_UInt16 *src = UA_UInt16_new();
-    *src = 65535;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "65535";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_UInt16_delete(src);
-}
-END_TEST
-
-START_TEST(UA_UInt16_Min_Number_json_encode) {
-
-    UA_UInt16 *src = UA_UInt16_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_UInt16_delete(src);
-}
-END_TEST
-
-START_TEST(UA_UInt16_smallbuf_Number_json_encode) {
-
-    UA_UInt16 *src = UA_UInt16_new();
-    *src = 255;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_UInt16_delete(src);
-}
-END_TEST
-
-/* Int16 */
-START_TEST(UA_Int16_Max_Number_json_encode) {
-
-    UA_Int16 *src = UA_Int16_new();
-    *src = 32767;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "32767";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Int16_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int16_Min_Number_json_encode) {
-
-    UA_Int16 *src = UA_Int16_new();
-    *src = -32768;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "-32768";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Int16_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int16_Zero_Number_json_encode) {
-
-    UA_Int16 *src = UA_Int16_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Int16_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int16_smallbuf_Number_json_encode) {
-
-    UA_Int16 *src = UA_Int16_new();
-    *src = 127;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Int16_delete(src);
-}
-END_TEST
-
-
-
-/* UInt32 */
-START_TEST(UA_UInt32_Max_Number_json_encode) {
-
-    UA_UInt32 *src = UA_UInt32_new();
-    *src = 4294967295;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "4294967295";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_UInt32_delete(src);
-}
-END_TEST
-
-START_TEST(UA_UInt32_Min_Number_json_encode) {
-
-    UA_UInt32 *src = UA_UInt32_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_UInt32_delete(src);
-}
-END_TEST
-
-START_TEST(UA_UInt32_smallbuf_Number_json_encode) {
-
-    UA_UInt32 *src = UA_UInt32_new();
-    *src = 255;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf);
-    UA_UInt32_delete(src);
-}
-END_TEST
-
-
-
-/* Int32 */
-START_TEST(UA_Int32_Max_Number_json_encode) {
-
-    UA_Int32 *src = UA_Int32_new();
-    *src = 2147483647;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "2147483647";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Int32_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int32_Min_Number_json_encode) {
-    UA_Int32 src = -2147483648;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
-    size_t size = UA_calcSizeJson((void *)&src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *)&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "-2147483648";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Int32_Zero_Number_json_encode) {
-
-    UA_Int32 *src = UA_Int32_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Int32_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int32_smallbuf_Number_json_encode) {
-
-    UA_Int32 *src = UA_Int32_new();
-    *src = 127;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
-
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Int32_delete(src);
-}
-END_TEST
-
-
-
-/* UINT64*/
-START_TEST(UA_UInt64_Max_Number_json_encode) {
-
-    UA_UInt64 *src = UA_UInt64_new();
-    //*src = 18446744073709551615;
-    ((u8*)src)[0] = 0xFF;
-    ((u8*)src)[1] = 0xFF;
-    ((u8*)src)[2] = 0xFF;
-    ((u8*)src)[3] = 0xFF;
-    ((u8*)src)[4] = 0xFF;
-    ((u8*)src)[5] = 0xFF;
-    ((u8*)src)[6] = 0xFF;
-    ((u8*)src)[7] = 0xFF;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"18446744073709551615\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_UInt64_delete(src);
-}
-END_TEST
-
-START_TEST(UA_UInt64_Min_Number_json_encode) {
-
-    UA_UInt64 *src = UA_UInt64_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"0\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_UInt64_delete(src);
-}
-END_TEST
-
-START_TEST(UA_UInt64_smallbuf_Number_json_encode) {
-
-    UA_UInt64 *src = UA_UInt64_new();
-    //*src = -9223372036854775808;
-    ((u8*)src)[0] = 0x00;
-    ((u8*)src)[1] = 0x00;
-    ((u8*)src)[2] = 0x00;
-    ((u8*)src)[3] = 0x00;
-    ((u8*)src)[4] = 0x00;
-    ((u8*)src)[5] = 0x00;
-    ((u8*)src)[6] = 0x00;
-    ((u8*)src)[7] = 0x80;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64];
-
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_UInt64_delete(src);
-}
-END_TEST
-
-/* Int64 */
-START_TEST(UA_Int64_Max_Number_json_encode) {
-
-    UA_Int64 *src = UA_Int64_new();
-    //*src = 9223372036854775808;
-    ((u8*)src)[0] = 0xFF;
-    ((u8*)src)[1] = 0xFF;
-    ((u8*)src)[2] = 0xFF;
-    ((u8*)src)[3] = 0xFF;
-    ((u8*)src)[4] = 0xFF;
-    ((u8*)src)[5] = 0xFF;
-    ((u8*)src)[6] = 0xFF;
-    ((u8*)src)[7] = 0x7F;
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"9223372036854775807\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Int64_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int64_Min_Number_json_encode) {
-
-    UA_Int64 *src = UA_Int64_new();
-    
-    // TODO: compiler error: integer constant is so large that it is unsigned [-Werror]
-    //*src = -9223372036854775808;
-  
-    ((u8*)src)[0] = 0x00;
-    ((u8*)src)[1] = 0x00;
-    ((u8*)src)[2] = 0x00;
-    ((u8*)src)[3] = 0x00;
-    ((u8*)src)[4] = 0x00;
-    ((u8*)src)[5] = 0x00;
-    ((u8*)src)[6] = 0x00;
-    ((u8*)src)[7] = 0x80;
-    
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"-9223372036854775808\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Int64_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int64_Zero_Number_json_encode) {
-
-    UA_Int64 *src = UA_Int64_new();
-    *src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"0\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Int64_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Int64_smallbuf_Number_json_encode) {
-
-    UA_Int64 *src = UA_Int64_new();
-    *src = 127;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
-
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Int64_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_Double_json_encode) {
-    UA_Double src = 1.1234;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "1.1233999999999999541699935434735380113124847412109375";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Double_pluszero_json_encode) {
-    UA_Double src = 0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Double_minuszero_json_encode) {
-    UA_Double src = -0;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "0";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Double_plusInf_json_encode) {
-    UA_Double src = INFINITY;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"Infinity\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-
-
-START_TEST(UA_Double_minusInf_json_encode) {
-    UA_Double src = -INFINITY;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"-Infinity\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Double_nan_json_encode) {
-    UA_Double src = NAN;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"NaN\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Double_onesmallest_json_encode) {
-    UA_Double src = 1.0000000000000002220446049250313080847263336181640625;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "1.0000000000000002220446049250313080847263336181640625";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Float_json_encode) {
-    UA_Float src = 1.0000000000F;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_FLOAT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "1";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-
-
-/* -------------------------LocalizedText------------------------- */
-START_TEST(UA_LocText_json_encode) {
-
-    UA_LocalizedText *src = UA_LocalizedText_new();
-    UA_LocalizedText_init(src);
-    src->locale = UA_STRING_ALLOC("theLocale");
-    src->text = UA_STRING_ALLOC("theText");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Locale\":\"theLocale\",\"Text\":\"theText\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_LocalizedText_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_LocText_NonReversible_json_encode) {
-
-    UA_LocalizedText *src = UA_LocalizedText_new();
-    UA_LocalizedText_init(src);
-    src->locale = UA_STRING_ALLOC("theLocale");
-    src->text = UA_STRING_ALLOC("theText");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"theText\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_LocalizedText_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_LocText_smallBuffer_json_encode) {
-    UA_LocalizedText *src = UA_LocalizedText_new();
-    UA_LocalizedText_init(src);
-    src->locale = UA_STRING_ALLOC("theLocale");
-    src->text = UA_STRING_ALLOC("theText");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
-
-    UA_ByteString buf;
-    UA_ByteString_allocBuffer(&buf, 4);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[4];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf);
-    UA_LocalizedText_delete(src);
-}
-END_TEST
-
-/* --------------------------------GUID----------------------------------- */
-START_TEST(UA_Guid_json_encode) {
-    UA_Guid src = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_GUID];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"00000003-0009-000A-0807-060504030201\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-START_TEST(UA_Guid_smallbuf_json_encode) {
-    UA_Guid *src = UA_Guid_new();
-    *src = UA_Guid_random();
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_GUID];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Guid_delete(src);
-}
-END_TEST
-
-
-
-/* -------------------------DateTime--------------------------------------*/
-START_TEST(UA_DateTime_json_encode) {
-    UA_DateTime *src = UA_DateTime_new();
-    *src = UA_DateTime_fromUnixTime(1234567);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DATETIME];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"1970-01-15T06:56:07Z\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_DateTime_delete(src);
-}
-END_TEST
-
-START_TEST(UA_DateTime_with_nanoseconds_json_encode) {
-    UA_DateTime *src = UA_DateTime_new();
-    *src = UA_DateTime_fromUnixTime(1234567) + 8901234;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DATETIME];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"1970-01-15T06:56:07.8901234Z\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_DateTime_delete(src);
-}
-END_TEST
-
-/* ------------------------Statuscode--------------------------------- */
-START_TEST(UA_StatusCode_json_encode) {
-    UA_StatusCode *src = UA_StatusCode_new();
-    *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-     *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "2161770496";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_StatusCode_delete(src);
-}
-END_TEST
-
-START_TEST(UA_StatusCode_nonReversible_json_encode) {
-    UA_StatusCode *src = UA_StatusCode_new();
-    *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-     *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_StatusCode_delete(src);
-}
-END_TEST
-
-START_TEST(UA_StatusCode_nonReversible_good_json_encode) {
-    UA_StatusCode *src = UA_StatusCode_new();
-    *src = UA_STATUSCODE_GOOD;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-     *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "null";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_StatusCode_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_StatusCode_smallbuf_json_encode) {
-    UA_StatusCode *src = UA_StatusCode_new();
-    *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_StatusCode_delete(src);
-}
-END_TEST
-
-
-/* -------------------------------NodeId--------------------------------*/
-
-/* Numeric */
-START_TEST(UA_NodeId_Numeric_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_NUMERIC(0, 5555);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Id\":5555}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_NodeId_Numeric_Namespace_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_NUMERIC(4, 5555);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Id\":5555,\"Namespace\":4}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-/* String */
-START_TEST(UA_NodeId_String_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_STRING_ALLOC(0, "foobar");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"foobar\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_NodeId_String_Namespace_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_STRING_ALLOC(5, "foobar");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"foobar\",\"Namespace\":5}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-/* Guid */
-START_TEST(UA_NodeId_Guid_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    UA_NodeId_init(src);
-    UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
-    *src = UA_NODEID_GUID(0, g);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_NodeId_Guid_Namespace_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
-    *src = UA_NODEID_GUID(5, g);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    // {"IdType":2,"Id":"00000003-0009-000A-0807-060504030201","Namespace":5}
-    ck_assert_int_eq(size, 70);
-    
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\",\"Namespace\":5}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-/* ByteString */
-START_TEST(UA_NodeId_ByteString_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_BYTESTRING_ALLOC(0, "asdfasdf");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    //{"IdType":3,"Id":"YXNkZmFzZGY="}
-    ck_assert_int_eq(size, 32);
-    
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_NodeId_ByteString_Namespace_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_BYTESTRING_ALLOC(5, "asdfasdf");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":5}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-/* Non-reversible, Namespace */
-START_TEST(UA_NodeId_NonReversible_Numeric_Namespace_json_encode) {
-    UA_NodeId *src = UA_NodeId_new();
-    *src = UA_NODEID_NUMERIC(2, 5555);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
-    
-    UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
-    size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE);
-    ck_assert_int_ne(size, 0);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Id\":5555,\"Namespace\":\"ns2\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_NodeId_delete(src);
-}
-END_TEST
-
-/* --------------------Diagnostic Info------------------------- */
-START_TEST(UA_DiagInfo_json_encode) {
-    UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(src);
-    src->hasAdditionalInfo = UA_TRUE;
-    src->hasInnerDiagnosticInfo = UA_FALSE;
-    src->hasInnerStatusCode = UA_TRUE;
-    src->hasLocale = UA_TRUE;
-    src->hasSymbolicId = UA_TRUE;
-    src->hasLocalizedText = UA_TRUE;
-    src->hasNamespaceUri = UA_TRUE;
-
-    UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
-    src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
-    src->innerStatusCode = statusCode;
-    src->locale = 12;
-    src->symbolicId = 13;
-    src->localizedText = 14;
-    src->namespaceUri = 15;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
-
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"SymbolicId\":13,\"NamespaceUri\":15,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_DiagnosticInfo_delete(src);
-}
-END_TEST
-
-
-
-START_TEST(UA_DiagInfo_withInner_json_encode) {
-    UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(innerDiag);
-    innerDiag->hasAdditionalInfo = UA_TRUE;
-    innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
-    innerDiag->hasInnerDiagnosticInfo = UA_FALSE;
-    innerDiag->hasInnerStatusCode = UA_FALSE;
-    innerDiag->hasLocale = UA_FALSE;
-    innerDiag->hasSymbolicId = UA_FALSE;
-    innerDiag->hasLocalizedText = UA_FALSE;
-    innerDiag->hasNamespaceUri = UA_FALSE;
-
-    UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(src);
-    src->hasAdditionalInfo = UA_TRUE;
-    src->hasInnerDiagnosticInfo = UA_TRUE;
-    src->hasInnerStatusCode = UA_TRUE;
-    src->hasLocale = UA_TRUE;
-    src->hasSymbolicId = UA_TRUE;
-    src->hasLocalizedText = UA_TRUE;
-    src->hasNamespaceUri = UA_FALSE;
-
-    UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
-    src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
-    src->innerDiagnosticInfo = innerDiag;
-    src->innerStatusCode = statusCode;
-    src->locale = 12;
-    src->symbolicId = 13;
-    src->localizedText = 14;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
-
-
-    UA_ByteString buf;
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    //{"SymbolicId":13,"LocalizedText":14,"Locale":12,"AdditionalInfo":"additionalInfo","InnerStatusCode":2155216896,"InnerDiagnosticInfo":{"AdditionalInfo":"INNER ADDITION INFO"}}
-    ck_assert_int_eq(size, 174);
-    
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_DiagnosticInfo_delete(src);
-}
-END_TEST
-
-START_TEST(UA_DiagInfo_withTwoInner_json_encode) {
-    
-    UA_DiagnosticInfo *innerDiag2 = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(innerDiag2);
-    innerDiag2->hasAdditionalInfo = UA_TRUE;
-    innerDiag2->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO2");
-    innerDiag2->hasInnerDiagnosticInfo = UA_FALSE;
-    innerDiag2->hasInnerStatusCode = UA_FALSE;
-    innerDiag2->hasLocale = UA_FALSE;
-    innerDiag2->hasSymbolicId = UA_FALSE;
-    innerDiag2->hasLocalizedText = UA_FALSE;
-    innerDiag2->hasNamespaceUri = UA_FALSE;
-    
-    UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(innerDiag);
-    innerDiag->hasAdditionalInfo = UA_TRUE;
-    innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
-    innerDiag->hasInnerDiagnosticInfo = UA_TRUE;
-    innerDiag->innerDiagnosticInfo = innerDiag2;
-    innerDiag->hasInnerStatusCode = UA_FALSE;
-    innerDiag->hasLocale = UA_FALSE;
-    innerDiag->hasSymbolicId = UA_FALSE;
-    innerDiag->hasLocalizedText = UA_FALSE;
-    innerDiag->hasNamespaceUri = UA_FALSE;
-
-    UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(src);
-    
-    src->hasAdditionalInfo = UA_TRUE;
-    src->hasInnerDiagnosticInfo = UA_TRUE;
-    src->hasInnerStatusCode = UA_TRUE;
-    src->hasLocale = UA_TRUE;
-    src->hasSymbolicId = UA_TRUE;
-    src->hasLocalizedText = UA_TRUE;
-    src->hasNamespaceUri = UA_FALSE;
-
-    UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
-    src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
-    src->innerDiagnosticInfo = innerDiag;
-    src->innerStatusCode = statusCode;
-    src->locale = 12;
-    src->symbolicId = 13;
-    src->localizedText = 14;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
-
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\",\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO2\"}}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_DiagnosticInfo_delete(src);
-}
-END_TEST
-
-START_TEST(UA_DiagInfo_noFields_json_encode) {
-    UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(src);
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "null";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_DiagnosticInfo_delete(src);
-}
-END_TEST
-
-START_TEST(UA_DiagInfo_smallBuffer_json_encode) {
-    UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
-    UA_DiagnosticInfo_init(src);
-    src->hasAdditionalInfo = UA_TRUE;
-    src->hasInnerDiagnosticInfo = UA_FALSE;
-    src->hasInnerStatusCode = UA_TRUE;
-    src->hasLocale = UA_TRUE;
-    src->hasSymbolicId = UA_TRUE;
-    src->hasLocalizedText = UA_TRUE;
-    src->hasNamespaceUri = UA_FALSE;
-
-    UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
-    src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
-    src->innerStatusCode = statusCode;
-    src->locale = 12;
-    src->symbolicId = 13;
-    src->localizedText = 14;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
-
-    
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, 2);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[2];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_DiagnosticInfo_delete(src);
-}
-END_TEST
-
-/* ---------------ByteString----------------- */
-START_TEST(UA_ByteString_json_encode) {
-    UA_ByteString *src = UA_ByteString_new();
-    UA_ByteString_init(src);
-    *src = UA_BYTESTRING_ALLOC("asdfasdf");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"YXNkZmFzZGY=\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ByteString_delete(src);
-}
-END_TEST
-
-START_TEST(UA_ByteString2_json_encode) {
-    UA_ByteString *src = UA_ByteString_new();
-    UA_ByteString_init(src);
-    *src = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    
-    //s = UA_decodeJson()
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=\"";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_ByteString_delete(src);
-}
-END_TEST
-
-START_TEST(UA_ByteString3_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_ByteString *variantContent = UA_ByteString_new();
-    *variantContent = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BYTESTRING]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    //printf("%s\n\n", (char*)buf.data);
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ByteString *srcData = ((UA_ByteString*)src->data);
-    UA_ByteString *outData = ((UA_ByteString*)out.data);
-    ck_assert(UA_ByteString_equal(srcData, outData));
-
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&out);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-/* ------------------QualifiedName---------------------------- */
-START_TEST(UA_QualName_json_encode) {
-    UA_QualifiedName *src = UA_QualifiedName_new();
-    UA_QualifiedName_init(src);
-    src->name = UA_STRING_ALLOC("derName");
-    src->namespaceIndex = 1;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Name\":\"derName\",\"Uri\":1}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_QualifiedName_delete(src);
-}
-END_TEST
-
-
-
-START_TEST(UA_QualName_NonReversible_json_encode) {
-    UA_QualifiedName *src = UA_QualifiedName_new();
-    UA_QualifiedName_init(src);
-    src->name = UA_STRING_ALLOC("derName");
-    src->namespaceIndex = 1;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Name\":\"derName\",\"Uri\":1}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_QualifiedName_delete(src);
-}
-END_TEST
-
-START_TEST(UA_QualName_NonReversible_Namespace_json_encode) {
-    UA_QualifiedName *src = UA_QualifiedName_new();
-    UA_QualifiedName_init(src);
-    src->name = UA_STRING_ALLOC("derName");
-    src->namespaceIndex = 2;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
-    UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
-    size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Name\":\"derName\",\"Uri\":\"ns2\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_QualifiedName_delete(src);
-}
-END_TEST
-
-START_TEST(UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode) {
-    UA_QualifiedName *src = UA_QualifiedName_new();
-    UA_QualifiedName_init(src);
-    src->name = UA_STRING_ALLOC("derName");
-    src->namespaceIndex = 6789;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Name\":\"derName\",\"Uri\":6789}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_QualifiedName_delete(src);
-}
-END_TEST
-
-/* ----------------------------Variant------------------------ */
-
-/* -----Builtin scalar----- */
-START_TEST(UA_Variant_Bool_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    
-    UA_Boolean *variantContent = UA_Boolean_new();
-    *variantContent = true;
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":1,\"Body\":true}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Number_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_UInt64 *variantContent = UA_UInt64_new();
-    *variantContent = 345634563456;
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_UINT64]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":9,\"Body\":\"345634563456\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Double_json_encode) {
-    /* Encode decode cyle of 100 Doubles */
-    UA_Double d = 0.0;
-    for(size_t i = 0; i < 100; i++){
-        d = nextafter(d,1);
-
-        UA_Variant *src = UA_Variant_new();
-        UA_Variant_init(src);
-        UA_Double *variantContent = UA_Double_new();
-        //*variantContent = 1.0000000000000002;
-        *variantContent = d;
-        UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-        const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-        size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-        UA_ByteString buf;
-
-        UA_ByteString_allocBuffer(&buf, size+1);
-
-        UA_Byte *bufPos = &buf.data[0];
-        const UA_Byte *bufEnd = &buf.data[size+1];
-
-        status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-        *bufPos = 0;
-        //printf("%s\n\n", (char*)buf.data);
-
-        UA_Variant out;
-        UA_Variant_init(&out);
-        retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-        ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Double srcData = *((UA_Double*)src->data);
-        UA_Double outData = *((UA_Double*)out.data);
-        ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
-
-        UA_ByteString_deleteMembers(&buf);
-        UA_Variant_deleteMembers(&out);
-        UA_Variant_delete(src);
-    }
-}
-END_TEST
-
-START_TEST(UA_Variant_Double2_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_Double *variantContent = UA_Double_new();
-    *variantContent = (pow(2,53)-1)*pow(2,-1074);
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-
-    //printf("%s\n\n", (char*)buf.data);
-    /*{"Type":11,"Body":4.4501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720757232455434770912461317493580281734466552734375e-308}*/
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Double srcData = *((UA_Double*)src->data);
-    UA_Double outData = *((UA_Double*)out.data);
-    ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
-
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&out);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_Variant_Double3_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_Double *variantContent = UA_Double_new();
-    *variantContent = 1.1234;
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Double srcData = *((UA_Double*)src->data);
-    UA_Double outData = *((UA_Double*)out.data);
-    ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
-
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&out);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_DoubleInf_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_Double *variantContent = UA_Double_new();
-    *variantContent = (UA_Double)INFINITY;
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    //printf("%s\n\n", (char*)buf.data);
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Double srcData = *((UA_Double*)src->data);
-    UA_Double outData = *((UA_Double*)out.data);
-    ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
-
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&out);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_DoubleNan_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_Double *variantContent = UA_Double_new();
-    *variantContent = (UA_Double)NAN;
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    //printf("%s\n\n", (char*)buf.data);
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Double srcData = *((UA_Double*)src->data);
-    UA_Double outData = *((UA_Double*)out.data);
-    ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
-
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&out);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Float_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_Float *variantContent = UA_Float_new();
-    *variantContent = (UA_Float)((pow(2,23)-1)/pow(2,149));
-    UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_FLOAT]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Float srcData = *((UA_Float*)src->data);
-    UA_Float outData = *((UA_Float*)out.data);
-    ck_assert(memcmp(&srcData, &outData, sizeof(UA_Float)) == 0);
-
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&out);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_Variant_NodeId_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_NodeId variantContent = UA_NODEID_STRING(1, "theID");
-    UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_NODEID]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":17,\"Body\":{\"IdType\":1,\"Id\":\"theID\",\"Namespace\":1}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_LocText_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_LocalizedText variantContent;
-    variantContent.locale = UA_STRING("localeString");
-    variantContent.text = UA_STRING("textString");
-    UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":21,\"Body\":{\"Locale\":\"localeString\",\"Text\":\"textString\"}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_QualName_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_QualifiedName variantContent;
-    UA_QualifiedName_init(&variantContent);
-    variantContent.name = UA_STRING("derName");
-    variantContent.namespaceIndex = 1;
-    
-    UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":20,\"Body\":{\"Name\":\"derName\",\"Uri\":1}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Variant_delete(src);
-}
-END_TEST
-
-
-/* ---Reversible Variant Array---- */
-START_TEST(UA_Variant_Array_UInt16_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_UInt16 zero[2] = {42,43};
-    UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_UINT16]);
-   
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    ck_assert_int_eq(size, 25);
-    
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":5,\"Body\":[42,43]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Array_Byte_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_Byte zero[2] = {42,43};
-    UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_BYTE]);
-   
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":3,\"Body\":[42,43]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Array_String_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_String zero[2] = {UA_STRING("eins"),UA_STRING("zwei")};
-    UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_STRING]);
-   
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":12,\"Body\":[\"eins\",\"zwei\"]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Matrix_UInt16_json_encode) {
-
-     // Set an array value
-    UA_Variant src;
-    UA_Variant_init(&src);
-    UA_UInt16 d[9] = {1, 2, 3,
-                      4, 5, 6,
-                      7, 8, 9};
-    UA_Variant_setArrayCopy(&src, d, 9, &UA_TYPES[UA_TYPES_UINT16]);
-
-    //Set array dimensions
-    src.arrayDimensions = (UA_UInt32 *)UA_Array_new(2, &UA_TYPES[UA_TYPES_UINT32]);
-    src.arrayDimensionsSize = 2;
-    src.arrayDimensions[0] = 3;
-    src.arrayDimensions[1] = 3;
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    //{"Type":5,"Body":[1,2,3,4,5,6,7,8,9],"Dimension":[3,3]}
-    size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    ck_assert_int_eq(sizeOfBytes, 55);
-    
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":5,\"Body\":[1,2,3,4,5,6,7,8,9],\"Dimension\":[3,3]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&src);
-}
-END_TEST
-
-
-/* NON-Reversible builtin simple */
-START_TEST(UA_Variant_StatusCode_NonReversible_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_StatusCode variantContent = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
-    UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_STATUSCODE]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Body\":{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf); 
-    UA_Variant_delete(src);
-}
-END_TEST
-
-
-/* NON-Reversible Array */
-START_TEST(UA_Variant_Array_String_NonReversible_json_encode) {
-    UA_Variant src;
-    UA_Variant_init(&src);
-    UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"),
-                      UA_STRING("4"), UA_STRING("5"), UA_STRING("6"),
-                      UA_STRING("7"), UA_STRING("8")};
-    UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]);
-
-    src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
-    src.arrayDimensionsSize = 1;
-    src.arrayDimensions[0] = 8;
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&src);
-}
-END_TEST
-
-/* NON-Reversible Matrix */
-START_TEST(UA_Variant_Matrix_String_NonReversible_json_encode) {
-    UA_Variant src;
-    UA_Variant_init(&src);
-    UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"),
-                      UA_STRING("4"), UA_STRING("5"), UA_STRING("6"),
-                      UA_STRING("7"), UA_STRING("8")};
-    UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]);
-
-    src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
-    src.arrayDimensionsSize = 4;
-    src.arrayDimensions[0] = 2;
-    src.arrayDimensions[1] = 2;
-    src.arrayDimensions[2] = 2;
-    src.arrayDimensions[3] = 1;
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    //{"Body":[[[["1"],["2"]],[["3"],["4"]]],[[["5"],["6"]],[["7"],["8"]]]]}
-    size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
-    ck_assert_int_eq(sizeOfBytes, 70);
-    
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Body\":[[[[\"1\"],[\"2\"]],[[\"3\"],[\"4\"]]],[[[\"5\"],[\"6\"]],[[\"7\"],[\"8\"]]]]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Matrix_NodeId_NonReversible_json_encode) {
-    UA_Variant src;
-    UA_Variant_init(&src);
-    UA_NodeId d[8] = {UA_NODEID_NUMERIC(1,1),UA_NODEID_NUMERIC(1,2),UA_NODEID_NUMERIC(1,3),UA_NODEID_NUMERIC(1,4),UA_NODEID_NUMERIC(1,5),UA_NODEID_NUMERIC(1,6),UA_NODEID_NUMERIC(1,7),UA_NODEID_NUMERIC(1,8)};
-    UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_NODEID]);
-
-    src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
-    src.arrayDimensionsSize = 4;
-    src.arrayDimensions[0] = 2;
-    src.arrayDimensions[1] = 2;
-    src.arrayDimensions[2] = 2;
-    src.arrayDimensions[3] = 1;
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Body\":[[[[{\"Id\":1,\"Namespace\":1}],[{\"Id\":2,\"Namespace\":1}]],[[{\"Id\":3,\"Namespace\":1}],[{\"Id\":4,\"Namespace\":1}]]],[[[{\"Id\":5,\"Namespace\":1}],[{\"Id\":6,\"Namespace\":1}]],[[{\"Id\":7,\"Namespace\":1}],[{\"Id\":8,\"Namespace\":1}]]]]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&src);
-}
-END_TEST
-
-
-
-START_TEST(UA_Variant_Wrap_json_encode) {
-    UA_Variant *src = UA_Variant_new();
-    UA_Variant_init(src);
-    UA_ViewDescription variantContent;
-    UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
-    variantContent.timestamp = srvts;
-    variantContent.viewVersion = 1236;
-    variantContent.viewId = UA_NODEID_NUMERIC(0,99999);
-    
-    UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236}}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_delete(src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Wrap_Array_json_encode) {
-    UA_Variant src;
-    UA_Variant_init(&src);
-    //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]);
-    //src.arrayDimensionsSize = 1;
-    //src.arrayDimensions[0] = 2;
-    
-    UA_ViewDescription variantContent1;
-    UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567);
-    variantContent1.timestamp = srvts1;
-    variantContent1.viewVersion = 1;
-    variantContent1.viewId = UA_NODEID_NUMERIC(0,1);
-    
-    UA_ViewDescription variantContent2;
-    UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
-    variantContent2.timestamp = srvts2;
-    variantContent2.viewVersion = 2;
-    variantContent2.viewId = UA_NODEID_NUMERIC(0,2);
-    
-    
-    UA_ViewDescription d[2] = {variantContent1, variantContent2};
-    UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
-
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Type\":22,\"Body\":[{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1}},{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":2},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":2}}]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&src);
-}
-END_TEST
-
-START_TEST(UA_Variant_Wrap_Array_NonReversible_json_encode) {
-    UA_Variant src;
-    UA_Variant_init(&src);
-    //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]);
-    //src.arrayDimensionsSize = 1;
-    //src.arrayDimensions[0] = 2;
-    
-    UA_ViewDescription variantContent1;
-    UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567);
-    variantContent1.timestamp = srvts1;
-    variantContent1.viewVersion = 1;
-    variantContent1.viewId = UA_NODEID_NUMERIC(1,1);
-    
-    UA_ViewDescription variantContent2;
-    UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
-    variantContent2.timestamp = srvts2;
-    variantContent2.viewVersion = 2;
-    variantContent2.viewId = UA_NODEID_NUMERIC(1,2);
-    
-    
-    UA_ViewDescription d[2] = {variantContent1, variantContent2};
-    UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
-
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Body\":[{\"Body\":{\"ViewId\":{\"Id\":1,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1}},{\"Body\":{\"ViewId\":{\"Id\":2,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":2}}]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_Variant_deleteMembers(&src);
-}
-END_TEST
-
-/* -----------ExtensionObject------------------*/
-START_TEST(UA_ExtensionObject_json_encode) {
-    UA_ExtensionObject *src = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(src);
-    src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    src->content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
-
-    UA_Boolean b = UA_FALSE;
-    src->content.decoded.data = &b;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"TypeId\":{\"Id\":1},\"Body\":false}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExtensionObject_delete(src);
-}
-END_TEST
-
-START_TEST(UA_ExtensionObject_xml_json_encode) {
-    UA_ExtensionObject *src = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(src);
-    src->encoding = UA_EXTENSIONOBJECT_ENCODED_XML;
-    src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234);
-
-    UA_ByteString b = UA_BYTESTRING_ALLOC("<Elemement></Element>");
-    src->content.encoded.body = b;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":2,\"Body\":\"<Elemement></Element>\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExtensionObject_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_ExtensionObject_byteString_json_encode) {
-    UA_ExtensionObject *src = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(src);
-    src->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-    src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234);
-
-    UA_ByteString b = UA_BYTESTRING_ALLOC("123456789012345678901234567890");
-    src->content.encoded.body = b;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":1,\"Body\":\"123456789012345678901234567890\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExtensionObject_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_ExtensionObject_NonReversible_StatusCode_json_encode) {
-    UA_ExtensionObject *src = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(src);
-    src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    src->content.decoded.type = &UA_TYPES[UA_TYPES_STATUSCODE];
-
-    UA_StatusCode b = UA_STATUSCODE_BADENCODINGERROR;
-    src->content.decoded.data = &b;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Body\":{\"Code\":2147876864,\"Symbol\":\"BadEncodingError\"}}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExtensionObject_delete(src);
-}
-END_TEST
-
-
-
-/* --------------ExpandedNodeId-------------------------- */
-START_TEST(UA_ExpandedNodeId_json_encode) {
-    UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
-    UA_ExpandedNodeId_init(src);
-    *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest");
-    src->namespaceUri = UA_STRING_ALLOC("asdf");
-    src->serverIndex = 1345;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"asdf\",\"ServerUri\":1345}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExpandedNodeId_delete(src);
-}
-END_TEST
-
-
-START_TEST(UA_ExpandedNodeId_MissingNamespaceUri_json_encode) {
-    UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
-    UA_ExpandedNodeId_init(src);
-    *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest");
-    src->namespaceUri = UA_STRING_NULL;
-    src->serverIndex = 1345;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":23,\"ServerUri\":1345}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExpandedNodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_NonReversible_Ns1_json_encode) {
-    UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
-    UA_ExpandedNodeId_init(src);
-    *src = UA_EXPANDEDNODEID_STRING_ALLOC(1, "testtestTest");
-    src->namespaceUri = UA_STRING_NULL;
-    src->serverIndex = 1;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
-    
-    UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, serverUris, 3, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, serverUris, 3, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":1,\"ServerUri\":\"uri1\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExpandedNodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_NonReversible_Namespace_json_encode) {
-    UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
-    UA_ExpandedNodeId_init(src);
-    *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest");
-    src->namespaceUri = UA_STRING_NULL;
-    src->serverIndex = 1;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
-    
-    UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
-    UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
-    
-    size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"ns2\",\"ServerUri\":\"uri1\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExpandedNodeId_delete(src);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode) {
-    UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
-    UA_ExpandedNodeId_init(src);
-    *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest");
-    src->namespaceUri = UA_STRING_ALLOC("NamespaceUri");
-    src->serverIndex = 1;
-    
-    UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
-    UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
-    
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
-    size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"NamespaceUri\",\"ServerUri\":\"uri1\"}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ExpandedNodeId_delete(src);
-}
-END_TEST
-
-/* -------------------------DataValue------------------------ */
-START_TEST(UA_DataValue_json_encode) {
-    UA_DataValue *src = UA_DataValue_new();
-    UA_DataValue_init(src);
-    src->hasServerPicoseconds = UA_TRUE;
-    src->hasServerTimestamp = UA_TRUE;
-    src->hasSourcePicoseconds = UA_TRUE;
-    src->hasSourceTimestamp = UA_TRUE;
-    src->hasStatus = UA_TRUE;
-    src->hasValue = UA_TRUE;
-
-    UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567) + 8901234;
-    UA_DateTime srvts = UA_DateTime_fromUnixTime(2345678) + 9012345;
-
-    src->sourceTimestamp = srcts;
-    src->serverTimestamp = srvts;
-    src->sourcePicoseconds = 5678;
-    src->serverPicoseconds = 6789;
-    
-    UA_Variant variant;
-    UA_Variant_init(&variant);
-    UA_Boolean variantContent = true;
-    UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    src->value = variant;
-
-    src->status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07.8901234Z\",\"SourcePicoseconds\":5678,\"ServerTimestamp\":\"1970-01-28T03:34:38.9012345Z\",\"ServerPicoseconds\":6789}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_DataValue_delete(src);
-}
-END_TEST
-
-START_TEST(UA_DataValue_null_json_encode) {
-    UA_DataValue *src = UA_DataValue_new();
-    UA_DataValue_init(src);
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE];
-    size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "null";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_DataValue_delete(src);
-}
-END_TEST
-
-START_TEST(UA_MessageReadResponse_json_encode) {
-    UA_ReadResponse src;
-    UA_ReadResponse_init(&src);
-    UA_DiagnosticInfo innerDiag;
-    innerDiag.hasAdditionalInfo = UA_TRUE;
-    innerDiag.additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
-    innerDiag.hasInnerDiagnosticInfo = UA_FALSE;
-    innerDiag.hasInnerStatusCode = UA_FALSE;
-    innerDiag.hasLocale = UA_FALSE;
-    innerDiag.hasSymbolicId = UA_FALSE;
-    innerDiag.hasLocalizedText = UA_FALSE;
-    innerDiag.hasNamespaceUri = UA_FALSE;
-    
-    UA_DiagnosticInfo *info = (UA_DiagnosticInfo*)UA_calloc(1, sizeof(UA_DiagnosticInfo));
-    info[0] = innerDiag;
-    src.diagnosticInfos = info;
-    src.diagnosticInfosSize = 1;
-    
-    UA_DataValue dv;
-    UA_DataValue_init(&dv);
-    dv.hasServerPicoseconds = UA_TRUE;
-    dv.hasServerTimestamp = UA_TRUE;
-    dv.hasSourcePicoseconds = UA_TRUE;
-    dv.hasSourceTimestamp = UA_TRUE;
-    dv.hasStatus = UA_TRUE;
-    dv.hasValue = UA_TRUE;
-
-    UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
-    UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
-
-    dv.sourceTimestamp = srcts;
-    dv.serverTimestamp = srvts;
-    dv.sourcePicoseconds = 0;
-    dv.serverPicoseconds = 0;
-    
-    
-    UA_Variant variant;
-    UA_Variant_init(&variant);
-    UA_Boolean variantContent = true;
-    UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    dv.value = variant;
-
-    dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
-    
-    UA_DataValue *values = (UA_DataValue*)UA_calloc(1, sizeof(UA_DataValue));
-    values[0] = dv;
-    src.results = values;
-    src.resultsSize = 1;
-    
-    
-    UA_ResponseHeader rh;
-    UA_ResponseHeader_init(&rh);
-    rh.stringTableSize = 0;
-    rh.requestHandle = 123123;
-    rh.serviceResult = UA_STATUSCODE_GOOD;
-    rh.timestamp = UA_DateTime_fromUnixTime(1234567);
-    
-    
-    UA_DiagnosticInfo serverDiag;
-    UA_DiagnosticInfo_init(&serverDiag);
-    serverDiag.hasAdditionalInfo = UA_TRUE;
-    serverDiag.additionalInfo = UA_STRING_ALLOC("serverDiag");
-    serverDiag.hasInnerDiagnosticInfo = UA_FALSE;
-    serverDiag.hasInnerStatusCode = UA_FALSE;
-    serverDiag.hasLocale = UA_FALSE;
-    serverDiag.hasSymbolicId = UA_FALSE;
-    serverDiag.hasLocalizedText = UA_FALSE;
-    serverDiag.hasNamespaceUri = UA_FALSE;
-    rh.serviceDiagnostics = serverDiag;
-    
-    
-    UA_ExtensionObject e;
-    UA_ExtensionObject_init(&e);
-    e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
-
-    UA_Boolean b = UA_FALSE;
-    e.content.decoded.data = &b;
-    
-    rh.additionalHeader = e;
-            
-    src.responseHeader = rh;
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_READRESPONSE];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"ResponseHeader\":{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"RequestHandle\":123123,\"ServiceResult\":0,\"ServiceDiagnostics\":{\"AdditionalInfo\":\"serverDiag\"},\"StringTable\":[],\"AdditionalHeader\":{\"TypeId\":{\"Id\":1},\"Body\":false}},\"Results\":[{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}],\"DiagnosticInfos\":[{\"AdditionalInfo\":\"INNER ADDITION INFO\"}]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ReadResponse_deleteMembers(&src); //TODO
-}
-END_TEST
-
-START_TEST(UA_ViewDescription_json_encode) {
-    UA_ViewDescription src;
-    UA_ViewDescription_init(&src);
-    UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
-    src.timestamp = srvts;
-    src.viewVersion = 1236;
-    src.viewId = UA_NODEID_NUMERIC(0,99999);
-    
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VIEWDESCRIPTION];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_ViewDescription_deleteMembers(&src);
-}
-END_TEST
-
-START_TEST(UA_WriteRequest_json_encode) {
-    UA_WriteRequest src;
-    UA_WriteRequest_init(&src);
-    
-    UA_RequestHeader rh;
-    rh.returnDiagnostics = 1;
-    rh.auditEntryId = UA_STRING_ALLOC("Auditentryid");
-    rh.requestHandle = 123123;
-    rh.authenticationToken = UA_NODEID_STRING_ALLOC(0,"authToken");
-    rh.timestamp = UA_DateTime_fromUnixTime(1234567);
-    rh.timeoutHint = 120;
-    
-    UA_ExtensionObject e;
-    UA_ExtensionObject_init(&e);
-    e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
-
-    UA_Boolean b = UA_FALSE;
-    e.content.decoded.data = &b;
-    
-    rh.additionalHeader = e;
-   
-    
-    
-    UA_DataValue dv;
-    UA_DataValue_init(&dv);
-    dv.hasServerPicoseconds = UA_TRUE;
-    dv.hasServerTimestamp = UA_TRUE;
-    dv.hasSourcePicoseconds = UA_TRUE;
-    dv.hasSourceTimestamp = UA_TRUE;
-    dv.hasStatus = UA_TRUE;
-    dv.hasValue = UA_TRUE;
-
-    UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
-    UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
-
-    dv.sourceTimestamp = srcts;
-    dv.serverTimestamp = srvts;
-    dv.sourcePicoseconds = 0;
-    dv.serverPicoseconds = 0;
-    
-    UA_Variant variant;
-    UA_Variant_init(&variant);
-    UA_Boolean variantContent = true;
-    UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    dv.value = variant;
-
-    dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
-    
-    UA_DataValue dv2;
-    UA_DataValue_init(&dv2);
-    dv2.hasServerPicoseconds = UA_TRUE;
-    dv2.hasServerTimestamp = UA_TRUE;
-    dv2.hasSourcePicoseconds = UA_TRUE;
-    dv2.hasSourceTimestamp = UA_TRUE;
-    dv2.hasStatus = UA_TRUE;
-    dv2.hasValue = UA_TRUE;
-
-    UA_DateTime srcts2 = UA_DateTime_fromUnixTime(1234567);
-    UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
-
-    dv2.sourceTimestamp = srcts2;
-    dv2.serverTimestamp = srvts2;
-    dv2.sourcePicoseconds = 0;
-    dv2.serverPicoseconds = 0;
-    
-    UA_Variant variant2;
-    UA_Variant_init(&variant2);
-    UA_Boolean variantContent2 = true;
-    UA_Variant_setScalarCopy(&variant2, &variantContent2, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    dv2.value = variant2;
-
-    dv2.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
-    
-    UA_WriteValue value;
-    UA_WriteValue_init(&value);
-    value.value = dv;
-    value.attributeId = 12;
-    value.indexRange = UA_STRING_ALLOC("BLOAB");
-    value.nodeId = UA_NODEID_STRING_ALLOC(0, "a1111");
-    
-    UA_WriteValue value2;
-    UA_WriteValue_init(&value2);
-    value2.value = dv2;
-    value2.attributeId = 12;
-    value2.indexRange = UA_STRING_ALLOC("BLOAB");
-    value2.nodeId = UA_NODEID_STRING_ALLOC(0, "a2222");
-    
-    UA_WriteValue *values = (UA_WriteValue*)UA_calloc(2,sizeof(UA_WriteValue));
-    values[0] = value;
-    values[1] = value2;
-    
-    src.nodesToWrite = values;
-    src.nodesToWriteSize = 2;
-    src.requestHeader = rh;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_WRITEREQUEST];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"RequestHeader\":{\"AuthenticationToken\":{\"IdType\":1,\"Id\":\"authToken\"},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"RequestHandle\":123123,\"ReturnDiagnostics\":1,\"AuditEntryId\":\"Auditentryid\",\"TimeoutHint\":120,\"AdditionalHeader\":{\"TypeId\":{\"Id\":1},\"Body\":false}},\"NodesToWrite\":[{\"NodeId\":{\"IdType\":1,\"Id\":\"a1111\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}},{\"NodeId\":{\"IdType\":1,\"Id\":\"a2222\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}}]}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-    UA_WriteRequest_deleteMembers(&src);
-}
-END_TEST
-
-
-START_TEST(UA_VariableAttributes_json_encode) {
-
-    const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = {
-        0,                           /* specifiedAttributes */
-        {{0, NULL}, {0, NULL}},      /* displayName */
-        {{0, NULL}, {0, NULL}},      /* description */
-        0, 0,                        /* writeMask (userWriteMask) */
-        {NULL, UA_VARIANT_DATA, 0, NULL, 0, NULL},          /* value */
-        {0, UA_NODEIDTYPE_NUMERIC, {0}},   /* dataType */
-        UA_VALUERANK_ANY,            /* valueRank */
-        0, NULL,                     /* arrayDimensions */
-        true                         /* isAbstract */
-    };
-
-    UA_VariableTypeAttributes src = UA_VariableTypeAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&src.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    src.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    src.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    src.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-
-    const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES];
-    size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
-    UA_ByteString buf;
-
-    UA_ByteString_allocBuffer(&buf, size+1);
-
-    UA_Byte *bufPos = &buf.data[0];
-    const UA_Byte *bufEnd = &buf.data[size+1];
-
-    status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
-
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
-    char* result = "{\"SpecifiedAttributes\":0,"
-                   "\"DisplayName\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"},"
-                   "\"Description\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"},"
-                   "\"WriteMask\":0,\"UserWriteMask\":0,"
-                   "\"Value\":{\"Type\":6,\"Body\":42},"
-                   "\"DataType\":{\"Id\":6},\"ValueRank\":-2,"
-                   "\"ArrayDimensions\":[],"
-                   "\"IsAbstract\":true}";
-    ck_assert_str_eq(result, (char*)buf.data);
-    UA_ByteString_deleteMembers(&buf);
-}
-END_TEST
-
-// ---------------------------DECODE-------------------------------------
-
-START_TEST(UA_Byte_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":0}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE);
-    ck_assert_uint_eq(*((UA_Byte*)out.data), 0);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Byte_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":255}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE);
-    ck_assert_uint_eq(*((UA_Byte*)out.data), 255);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-/* ----UInt16---- */
-START_TEST(UA_UInt16_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":0}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16);
-    ck_assert_uint_eq(*((UA_UInt16*)out.data), 0);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_UInt16_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":65535}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16);
-    ck_assert_uint_eq(*((UA_UInt16*)out.data), 65535);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_UInt32_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":0}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32);
-    ck_assert_uint_eq(*((UA_UInt32*)out.data), 0);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_UInt32_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":4294967295}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32);
-    ck_assert_uint_eq(*((UA_UInt32*)out.data), 4294967295);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_UInt64_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"0\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64);    
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x00);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_UInt64_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"18446744073709551615\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64);
-    ck_assert_int_eq(((u8*)(out.data))[0], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0xFF);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_UInt64_Overflow_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"18446744073709551616\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_SByte_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":-128}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE);
-    ck_assert_int_eq(*((UA_SByte*)out.data), -128);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_SByte_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":127}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE);
-    ck_assert_int_eq(*((UA_SByte*)out.data), 127);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Int16_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":-32768}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16);
-    ck_assert_int_eq(*((UA_Int16*)out.data), -32768);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Int16_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":32767}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16);
-    ck_assert_int_eq(*((UA_Int16*)out.data), 32767);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Int32_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":-2147483648}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32);
-    ck_assert(*(UA_Int32*)out.data == -2147483648);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Int32_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":2147483647}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32);
-    ck_assert_int_eq(*((UA_Int32*)out.data), 2147483647);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Int64_Min_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"-9223372036854775808\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64);    
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x80);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Int64_Max_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"9223372036854775807\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64);    
-    ck_assert_int_eq(((u8*)(out.data))[0], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xFF);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x7F);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Int64_Overflow_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"9223372036854775808\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Int64_TooBig_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"111111111111111111111111111111\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Int64_NoDigit_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"a\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Float_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":3.1415927410}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    //0 10000000 10010010000111111011011 = 40 49 0f db
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(((u8*)(out.data))[0], 0xdb);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x0f);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x49);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x40);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Float_json_one_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":1}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    //0 01111111 00000000000000000000000 = 3f80 0000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Float_json_inf_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"Infinity\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x7f);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Float_json_neginf_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-Infinity\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    //0 01111111 00000000000000000000000 = 3f80 0000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0xff);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Float_json_nan_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"NaN\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    //0 01111111 00000000000000000000000 = 3f80 0000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    //ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    //ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    //ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
-    //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
-
-    UA_Float val = *((UA_Float*)out.data);
-    ck_assert(val != val);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Float_json_negnan_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-NaN\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    //0 01111111 00000000000000000000000 = 3f80 0000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    //ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    //ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    //ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
-    //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
-
-    UA_Float val = *((UA_Float*)out.data);
-    ck_assert(val != val); /* check if not a number */
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.1234}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);   
-    ck_assert_int_eq(((u8*)(out.data))[0], 0xef);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x38);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x45);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x47);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x72);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0xf9);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xf1);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x3f);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_corrupt_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.12.34}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_one_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    //UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}");
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    // 0 01111111111 0000000000000000000000000000000000000000000000000000
-    // 3FF0000000000000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);       
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x3F);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Double_onepointsmallest_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.0000000000000002}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    // 0 01111111111 0000000000000000000000000000000000000000000000000001
-    // 3FF0000000000001
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);       
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x01);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x3F);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_nan_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"NaN\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Double val = *((UA_Double*)out.data);
-    ck_assert(val != val); /* check if not a number */
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_negnan_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-NaN\"}");
-    // when
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Double val = *((UA_Double*)out.data);
-    ck_assert(val != val); /* check if not a number */
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_inf_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"Infinity\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    // 0 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);       
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x7F);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_neginf_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-Infinity\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    // 1 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);       
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0xFF);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_zero_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":0}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    // 0 000 0000 0000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);       
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x00);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Double_negzero_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":-0}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    // 1 000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);       
-    ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
-    ck_assert_int_eq(((u8*)(out.data))[7], 0x80);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_String_json_decode) { 
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"abcdef\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    ck_assert_int_eq(  ((UA_String*)out.data)->length, 6);
-    ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a');
-    ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b');
-    ck_assert_int_eq(((UA_String*)out.data)->data[2], 'c');
-    ck_assert_int_eq(((UA_String*)out.data)->data[3], 'd');
-    ck_assert_int_eq(((UA_String*)out.data)->data[4], 'e');
-    ck_assert_int_eq(((UA_String*)out.data)->data[5], 'f');
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_String_empty_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    ck_assert_int_eq(  ((UA_String*)out.data)->length, 0);
-    ck_assert_ptr_eq(  ((UA_String*)out.data)->data, UA_EMPTY_ARRAY_SENTINEL);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_String_unescapeBS_json_decode) { 
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"ab\\tcdef\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    ck_assert_int_eq(  ((UA_String*)out.data)->length, 7);
-    ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a');
-    ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b');
-    ck_assert_int_eq(((UA_String*)out.data)->data[2], '\t');
-    ck_assert_int_eq(((UA_String*)out.data)->data[3], 'c');
-    ck_assert_int_eq(((UA_String*)out.data)->data[4], 'd');
-    ck_assert_int_eq(((UA_String*)out.data)->data[5], 'e');
-    ck_assert_int_eq(((UA_String*)out.data)->data[6], 'f');
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_String_escape_unicode_json_decode) { 
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\u002c\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    ck_assert_int_eq(  ((UA_String*)out.data)->length, 1);
-    ck_assert_int_eq( ((UA_String*)out.data)->data[0], ',');
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_String_escape2_json_decode) { 
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    ck_assert_int_eq(  ((UA_String*)out.data)->length, 12);//  \b\th\"e\fl\nl\\o\r
-    ck_assert_int_eq( ((UA_String*)out.data)->data[0], '\b');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[1], '\t');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[2], 'h');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[3], '\"');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[4], 'e');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[5], '\f');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[6], 'l');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[7], '\n');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[8], 'l');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[9], '\\');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[10], 'o');
-    ck_assert_int_eq( ((UA_String*)out.data)->data[11], '\r');
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_String_surrogatePair_json_decode) { 
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\uD800\\uDC00\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    ck_assert_int_eq(  ((UA_String*)out.data)->length, 4);//U+10000  => 0xF0 0x90 0x80 0x80
-    ck_assert_uint_eq( ((UA_String*)out.data)->data[0], 0xF0);
-    ck_assert_uint_eq( ((UA_String*)out.data)->data[1], 0x90);
-    ck_assert_uint_eq( ((UA_String*)out.data)->data[2], 0x80);
-    ck_assert_uint_eq( ((UA_String*)out.data)->data[3], 0x80);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-/* ---------------ByteString---------------------------*/
-START_TEST(UA_ByteString_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":\"YXNkZmFzZGY=\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING);
-    ck_assert_int_eq(((UA_ByteString*)out.data)->length, 8);
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[0], 'a');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[1], 's');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[2], 'd');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[3], 'f');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[4], 'a');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[5], 's');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[6], 'd');
-    ck_assert_int_eq(((UA_ByteString*)out.data)->data[7], 'f');
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-
-START_TEST(UA_ByteString_bad_json_decode) {
-    UA_ByteString out;
-    UA_ByteString_init(&out);
-    UA_ByteString buf = UA_STRING("\"\x90!\xc5 c{\",");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_BYTESTRING]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_ByteString_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ByteString_null_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":null}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING);
-    ck_assert_ptr_eq(out.data, NULL);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-/* ---------GUID---------------------------  */
-START_TEST(UA_Guid_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Guid_lower_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090a0b\"}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10);
-    ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Guid_tooShort_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-00\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Guid_tooLong_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B00000001\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Guid_wrong_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000=01-0002-0003-0405-060708090A0B\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-/* ------Statuscode----------- */
-START_TEST(UA_StatusCode_2_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":2}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE);
-    ck_assert_uint_eq(*((UA_StatusCode*)out.data), 2);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_StatusCode_3_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-
-    UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":222222222222222222222222222222222222}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_StatusCode_0_json_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":0}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE);
-    ck_assert_uint_eq(*((UA_StatusCode*)out.data), 0);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-/* ----------DateTime---------------- */
-START_TEST(UA_DateTime_json_decode) {
-    // given
-    UA_DateTime out;
-    UA_DateTime_init(&out);
-    UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.005Z\"");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_DateTimeStruct dts = UA_DateTime_toStruct(out);
-    ck_assert_int_eq(dts.year, 1970);
-    ck_assert_int_eq(dts.month, 1);
-    ck_assert_int_eq(dts.day, 2);
-    ck_assert_int_eq(dts.hour, 1);
-    ck_assert_int_eq(dts.min, 2);
-    ck_assert_int_eq(dts.sec, 3);
-    ck_assert_int_eq(dts.milliSec, 5);
-    ck_assert_int_eq(dts.microSec, 0);
-    ck_assert_int_eq(dts.nanoSec, 0);
-    
-    UA_DateTime_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_DateTime_micro_json_decode) {
-    // given
-    UA_DateTime out;
-    UA_DateTime_init(&out);
-    UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.042Z\"");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_DateTimeStruct dts = UA_DateTime_toStruct(out);
-    ck_assert_int_eq(dts.year, 1970);
-    ck_assert_int_eq(dts.month, 1);
-    ck_assert_int_eq(dts.day, 2);
-    ck_assert_int_eq(dts.hour, 1);
-    ck_assert_int_eq(dts.min, 2);
-    ck_assert_int_eq(dts.sec, 3);
-    ck_assert_int_eq(dts.milliSec, 42);
-    ck_assert_int_eq(dts.microSec, 0);
-    ck_assert_int_eq(dts.nanoSec, 0);
-    
-    UA_DateTime_deleteMembers(&out);
-}
-END_TEST
-
-
-/* ---------------QualifiedName----------------------- */
-START_TEST(UA_QualifiedName_json_decode) {
-    // given
-    UA_QualifiedName out;
-    UA_QualifiedName_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Name\":\"derName\",\"Uri\":1}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.name.length, 7);
-    ck_assert_int_eq(out.name.data[1], 'e');
-    ck_assert_int_eq(out.name.data[6], 'e');
-    ck_assert_int_eq(out.namespaceIndex, 1);
-    
-    UA_QualifiedName_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_QualifiedName_null_json_decode) {
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":20,\"Body\":null}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_QUALIFIEDNAME);
-    ck_assert_ptr_eq(out.data, NULL);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-/* --------LocalizedText------------ */
-START_TEST(UA_LocalizedText_json_decode) {
-    // given
-    UA_LocalizedText out;
-    UA_LocalizedText_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\",\"Text\":\"t2\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.locale.data[0], 't');
-    ck_assert_int_eq(out.text.data[0], 't');
-    ck_assert_int_eq(out.locale.data[1], '1');
-    ck_assert_int_eq(out.text.data[1], '2');
-    
-    UA_LocalizedText_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_LocalizedText_missing_json_decode) {
-    // given
-    UA_LocalizedText out;
-    UA_LocalizedText_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.locale.length, 2);
-    ck_assert_int_eq(out.locale.data[0], 't');
-    ck_assert_int_eq(out.locale.data[1], '1');
-    ck_assert_ptr_eq(out.text.data, NULL);
-    ck_assert_int_eq(out.text.length, 0);
-    
-    UA_LocalizedText_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_LocalizedText_null_json_decode) {
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":null}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_LOCALIZEDTEXT);
-    ck_assert_ptr_eq(out.data, NULL);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_ViewDescription_json_decode) {
-    // given
-    UA_ViewDescription out;
-    UA_ViewDescription_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236,\"ViewId\":{\"Id\":\"00000009-0002-027C-F3BF-BB7BEEFEEFBE\",\"IdType\":2}}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.viewVersion, 1236);
-    ck_assert_int_eq(out.viewId.identifierType, UA_NODEIDTYPE_GUID);
-    UA_DateTimeStruct dts = UA_DateTime_toStruct(out.timestamp);
-    ck_assert_int_eq(dts.year, 1970);
-    ck_assert_int_eq(dts.month, 1);
-    ck_assert_int_eq(dts.day, 15);
-    ck_assert_int_eq(dts.hour, 6);
-    ck_assert_int_eq(dts.min, 56);
-    ck_assert_int_eq(dts.sec, 7);
-    ck_assert_int_eq(dts.milliSec, 0);
-    ck_assert_int_eq(dts.microSec, 0);
-    ck_assert_int_eq(dts.nanoSec, 0);
-    ck_assert_int_eq(out.viewId.identifier.guid.data1, 9);
-    ck_assert_int_eq(out.viewId.identifier.guid.data2, 2);
-    
-    UA_ViewDescription_deleteMembers(&out);
-}
-END_TEST
-
-
-
-/* -----------------NodeId----------------------------- */
-START_TEST(UA_NodeId_Nummeric_json_decode) {
-    // given
-    UA_NodeId out;
-    UA_NodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Id\":42}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.identifier.numeric, 42);
-    ck_assert_int_eq(out.namespaceIndex, 0);
-    ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC);
-    
-    UA_NodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_NodeId_Nummeric_Namespace_json_decode) {
-    // given
-    UA_NodeId out;
-    UA_NodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Id\":42,\"Namespace\":123}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.identifier.numeric, 42);
-    ck_assert_int_eq(out.namespaceIndex, 123);
-    ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC);
-    
-    UA_NodeId_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_NodeId_String_json_decode) {
-    // given
-    UA_NodeId out;
-    UA_NodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test123\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.identifier.string.length, 7);
-    ck_assert_int_eq(out.identifier.string.data[0], 't');
-    ck_assert_int_eq(out.identifier.string.data[1], 'e');
-    ck_assert_int_eq(out.identifier.string.data[2], 's');
-    ck_assert_int_eq(out.identifier.string.data[3], 't');
-    ck_assert_int_eq(out.identifier.string.data[4], '1');
-    ck_assert_int_eq(out.identifier.string.data[5], '2');
-    ck_assert_int_eq(out.identifier.string.data[6], '3');
-    ck_assert_int_eq(out.namespaceIndex, 0);
-    ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_STRING);
-    
-    UA_NodeId_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_NodeId_Guid_json_decode) {
-    // given
-    UA_NodeId out;
-    UA_NodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":2,\"Id\":\"00000001-0002-0003-0405-060708090A0B\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(out.namespaceIndex, 0);
-    ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_GUID);
-    ck_assert_int_eq(out.identifier.guid.data1, 1);
-    ck_assert_int_eq(out.identifier.guid.data2, 2);
-    ck_assert_int_eq(out.identifier.guid.data3, 3);
-    ck_assert_int_eq(out.identifier.guid.data4[0], 4);
-    ck_assert_int_eq(out.identifier.guid.data4[1], 5);
-    ck_assert_int_eq(out.identifier.guid.data4[2], 6);
-    ck_assert_int_eq(out.identifier.guid.data4[3], 7);
-    ck_assert_int_eq(out.identifier.guid.data4[4], 8);
-    ck_assert_int_eq(out.identifier.guid.data4[5], 9);
-    ck_assert_int_eq(out.identifier.guid.data4[6], 10);
-    ck_assert_int_eq(out.identifier.guid.data4[7], 11);
-    
-    UA_NodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_NodeId_ByteString_json_decode) {
-    // given
-    UA_NodeId out;
-    UA_NodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(out.namespaceIndex, 0);
-    ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_BYTESTRING);
-    ck_assert_int_eq(out.identifier.byteString.length, 8);
-    ck_assert_int_eq(out.identifier.byteString.data[0], 'a');
-    ck_assert_int_eq(out.identifier.byteString.data[1], 's');
-    ck_assert_int_eq(out.identifier.byteString.data[2], 'd');
-    ck_assert_int_eq(out.identifier.byteString.data[3], 'f');
-    ck_assert_int_eq(out.identifier.byteString.data[4], 'a');
-    ck_assert_int_eq(out.identifier.byteString.data[5], 's');
-    ck_assert_int_eq(out.identifier.byteString.data[6], 'd');
-    ck_assert_int_eq(out.identifier.byteString.data[7], 'f');
-    
-    UA_NodeId_deleteMembers(&out);
-}
-END_TEST
-
-
-/* -----------------------ExpandedNodeId---------------------------*/
-START_TEST(UA_ExpandedNodeId_Nummeric_json_decode) {
-    // given
-    UA_ExpandedNodeId out;
-    UA_ExpandedNodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Id\":42}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.nodeId.identifier.numeric, 42);
-    ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_NUMERIC);
-    ck_assert_ptr_eq(out.namespaceUri.data, NULL);
-    ck_assert_int_eq(out.namespaceUri.length, 0);
-    ck_assert_int_eq(out.serverIndex, 0);
-    
-    UA_ExpandedNodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_String_json_decode) {
-    // given
-    UA_ExpandedNodeId out;
-    UA_ExpandedNodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
-    ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
-    ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
-    ck_assert_ptr_eq(out.namespaceUri.data, NULL);
-    ck_assert_int_eq(out.namespaceUri.length, 0);
-    ck_assert_int_eq(out.serverIndex, 0);
-    
-    UA_ExpandedNodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_String_Namespace_json_decode) {
-    // given
-    UA_ExpandedNodeId out;
-    UA_ExpandedNodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"abcdef\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
-    ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
-    ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
-    ck_assert_int_eq(out.namespaceUri.length, 6);
-    ck_assert_int_eq(out.namespaceUri.data[0], 'a');
-    ck_assert_int_eq(out.namespaceUri.data[1], 'b');
-    ck_assert_int_eq(out.namespaceUri.data[2], 'c');
-    ck_assert_int_eq(out.namespaceUri.data[3], 'd');
-    ck_assert_int_eq(out.namespaceUri.data[4], 'e');
-    ck_assert_int_eq(out.namespaceUri.data[5], 'f');
-    ck_assert_int_eq(out.serverIndex, 0);
-    
-    UA_ExpandedNodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode) {
-    // given
-    UA_ExpandedNodeId out;
-    UA_ExpandedNodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":42}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
-    ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
-    ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
-    ck_assert_int_eq(out.namespaceUri.length, 0);
-    ck_assert_ptr_eq(out.namespaceUri.data, NULL);
-    ck_assert_int_eq(out.nodeId.namespaceIndex, 42);
-    ck_assert_int_eq(out.serverIndex, 0);
-    
-    UA_ExpandedNodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode) {
-    // given
-    UA_ExpandedNodeId out;
-    UA_ExpandedNodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"test\",\"ServerUri\":13}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
-    ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
-    ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
-    ck_assert_int_eq(out.serverIndex, 13);
-    ck_assert_int_eq(out.namespaceUri.data[0], 't');
-    ck_assert_int_eq(out.namespaceUri.data[1], 'e');
-    ck_assert_int_eq(out.namespaceUri.data[2], 's');
-    ck_assert_int_eq(out.namespaceUri.data[3], 't');
-    
-    UA_ExpandedNodeId_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ExpandedNodeId_ByteString_json_decode) {
-    // given
-    UA_ExpandedNodeId out;
-    UA_ExpandedNodeId_init(&out);
-    UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":\"test\",\"ServerUri\":13}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.nodeId.identifier.string.length, 8);
-    ck_assert_int_eq(out.nodeId.identifier.string.data[0], 'a');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[1], 's');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[2], 'd');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[3], 'f');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[4], 'a');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[5], 's');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[6], 'd');
-    ck_assert_int_eq(out.nodeId.identifier.string.data[7], 'f');
-    ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_BYTESTRING);
-    ck_assert_int_eq(out.serverIndex, 13);
-    ck_assert_int_eq(out.namespaceUri.data[0], 't');
-    ck_assert_int_eq(out.namespaceUri.data[1], 'e');
-    ck_assert_int_eq(out.namespaceUri.data[2], 's');
-    ck_assert_int_eq(out.namespaceUri.data[3], 't');
-    
-    UA_ExpandedNodeId_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_DiagnosticInfo_json_decode) {
-    // given
-    
-    UA_DiagnosticInfo out;
-    UA_DiagnosticInfo_init(&out);
-    out.innerDiagnosticInfo = NULL;
-    UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,"
-            "\"LocalizedText\":14,"
-            "\"Locale\":12,"
-            "\"AdditionalInfo\":\"additionalInfo\","
-            "\"InnerStatusCode\":2155216896,"
-            "\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.locale, 12);
-    ck_assert_int_eq(out.symbolicId, 13);
-    ck_assert_int_eq(out.localizedText, 14);
-    ck_assert_int_eq(out.innerStatusCode, 2155216896);
-    ck_assert_int_eq(out.additionalInfo.length, 14);
-    ck_assert_int_eq(out.innerDiagnosticInfo->additionalInfo.length, 19);
-    UA_DiagnosticInfo_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_DiagnosticInfo_null_json_decode) {
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":25,\"Body\":null}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_DIAGNOSTICINFO);
-    ck_assert_ptr_eq(out.data, NULL);
-    
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasAdditionalInfo, 0);
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerDiagnosticInfo, 0);
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerStatusCode, 0);
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocale, 0);
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocalizedText, 0);
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasNamespaceUri, 0);
-    //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasSymbolicId, 0);
-    
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-/* --------------------DataValue--------------------------- */
-START_TEST(UA_DataValue_json_decode) {
-    // given
-    
-    UA_DataValue out;
-    UA_DataValue_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerPicoseconds\":0}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
-
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.hasStatus, 1);
-    ck_assert_int_eq(out.hasServerPicoseconds, 1);
-    ck_assert_int_eq(out.hasServerTimestamp, 1);
-    ck_assert_int_eq(out.hasSourcePicoseconds, 1);
-    ck_assert_int_eq(out.hasSourceTimestamp, 1);
-    ck_assert_int_eq(out.hasValue, 1);
-    ck_assert_int_eq(out.status, 2153250816);
-    ck_assert_int_eq(out.value.type->typeIndex, 0);
-    ck_assert_int_eq((*((UA_Boolean*)out.value.data)), 1);
-    UA_DataValue_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_DataValueMissingFields_json_decode) {
-    // given
-    
-    UA_DataValue out;
-    UA_DataValue_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true}}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
-
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.hasStatus, 0);
-    ck_assert_int_eq(out.hasServerPicoseconds, 0);
-    ck_assert_int_eq(out.hasServerTimestamp, 0);
-    ck_assert_int_eq(out.hasSourcePicoseconds, 0);
-    ck_assert_int_eq(out.hasSourceTimestamp, 0);
-    ck_assert_int_eq(out.hasValue, 1);
-    UA_DataValue_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_DataValue_null_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":23,\"Body\":null}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
-
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_ptr_eq(out.data, NULL);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-/*----------------------ExtensionObject------------------------*/
-START_TEST(UA_ExtensionObject_json_decode) {
-    // given
-    
-    UA_ExtensionObject out;
-    UA_ExtensionObject_init(&out);
-    UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":1},\"Body\":true}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_DECODED);
-    ck_assert_int_eq(*((UA_Boolean*)out.content.decoded.data), UA_TRUE);
-    ck_assert_int_eq(out.content.decoded.type->typeIndex, UA_TYPES_BOOLEAN);
-    UA_ExtensionObject_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_ExtensionObject_EncodedByteString_json_decode) {
-    // given
-    
-    UA_ExtensionObject out;
-    UA_ExtensionObject_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Encoding\":1,\"TypeId\":{\"Id\":42},\"Body\":\"YXNkZmFzZGY=\"}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING);
-    //TODO: Not base64 decoded, correct?
-    ck_assert_int_eq(out.content.encoded.body.data[0], 'Y');
-    ck_assert_int_eq(out.content.encoded.body.data[0], 'Y');
-    ck_assert_int_eq(out.content.encoded.body.data[1], 'X');
-    ck_assert_int_eq(out.content.encoded.body.data[2], 'N');
-    ck_assert_int_eq(out.content.encoded.body.data[3], 'k');
-    ck_assert_int_eq(out.content.encoded.body.data[4], 'Z');
-    ck_assert_int_eq(out.content.encoded.body.data[5], 'm');
-    ck_assert_int_eq(out.content.encoded.body.data[6], 'F');
-    ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42);
-    
-    UA_ExtensionObject_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_ExtensionObject_EncodedXml_json_decode) {
-    // given
-    
-    UA_ExtensionObject out;
-    UA_ExtensionObject_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Encoding\":2,\"TypeId\":{\"Id\":42},\"Body\":\"<Element></Element>\"}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_XML);
-    ck_assert_int_eq(out.content.encoded.body.data[0], '<');
-    ck_assert_int_eq(out.content.encoded.body.data[1], 'E');
-    ck_assert_int_eq(out.content.encoded.body.data[2], 'l');
-    ck_assert_int_eq(out.content.encoded.body.data[3], 'e');
-    ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42);
-    UA_ExtensionObject_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_ExtensionObject_Unkown_json_decode) {
-    // given
-    
-    UA_ExtensionObject out;
-    UA_ExtensionObject_init(&out);
-    UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":4711},\"Body\":{\"unknown\":\"body\",\"saveas\":\"Bytestring\"}}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING);
-    ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 4711);
-    
-    //{"unknown":"body","saveas":"Bytestring"}Q
-    ck_assert_int_eq(out.content.encoded.body.length, 40);
-    ck_assert_int_eq(out.content.encoded.body.data[2], 'u');
-    ck_assert_int_eq(out.content.encoded.body.data[3], 'n');
-    ck_assert_int_eq(out.content.encoded.body.data[4], 'k');
-    ck_assert_int_eq(out.content.encoded.body.data[5], 'n');
-    ck_assert_int_eq(out.content.encoded.body.data[6], 'o');
-    ck_assert_int_eq(out.content.encoded.body.data[7], 'w');
-    UA_ExtensionObject_deleteMembers(&out);
-}
-END_TEST
-
-/* ----------------- Variant ---------------------*/
-START_TEST(UA_VariantBool_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":false}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, 0);
-    ck_assert_uint_eq(*((UA_Boolean*)out.data), 0);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_VariantBoolNull_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":null}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_VariantStringArray_json_decode) {
-    // given
-    
-    UA_Variant *out = UA_Variant_new();
-    UA_Variant_init(out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_String *testArray;
-    testArray = (UA_String*)(out->data);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq((char)testArray[0].data[0], '1');
-    ck_assert_int_eq((char)testArray[1].data[0], '2');
-    ck_assert_int_eq((char)testArray[2].data[0], '3');
-    ck_assert_int_eq((char)testArray[3].data[0], '4');
-    ck_assert_int_eq((char)testArray[4].data[0], '5');
-    ck_assert_int_eq((char)testArray[5].data[0], '6');
-    ck_assert_int_eq((char)testArray[6].data[0], '7');
-    ck_assert_int_eq((char)testArray[7].data[0], '8');
-    ck_assert_int_eq(out->arrayDimensionsSize, 2);
-    ck_assert_int_eq(out->arrayDimensions[0], 2);
-    ck_assert_int_eq(out->arrayDimensions[1], 4);
-    ck_assert_int_eq(out->arrayLength, 8);
-    ck_assert_int_eq(out->type->typeIndex, 11);
-    UA_Variant_delete(out);
-}
-END_TEST
-
-START_TEST(UA_VariantStringArrayNull_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_String *testArray;
-    testArray = (UA_String*)(out.data);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_ptr_eq(testArray[0].data, NULL);
-    ck_assert_ptr_eq(testArray[1].data, NULL);
-    ck_assert_ptr_eq(testArray[2].data, NULL);
-    ck_assert_ptr_eq(testArray[3].data, NULL);
-    ck_assert_ptr_eq(testArray[4].data, NULL);
-    ck_assert_ptr_eq(testArray[5].data, NULL);
-    ck_assert_ptr_eq(testArray[6].data, NULL);
-    ck_assert_ptr_eq(testArray[7].data, NULL);
-    ck_assert_int_eq(out.arrayDimensionsSize, 2);
-    ck_assert_int_eq(out.arrayDimensions[0], 2);
-    ck_assert_int_eq(out.arrayDimensions[1], 4);
-    ck_assert_int_eq(out.arrayLength, 8);
-    ck_assert_int_eq(out.type->typeIndex, 11);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_VariantLocalizedTextArrayNull_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_LocalizedText *testArray;
-    testArray = (UA_LocalizedText*)(out.data);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_ptr_eq(testArray[0].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[1].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[2].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[3].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[4].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[5].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[6].locale.data, NULL);
-    ck_assert_ptr_eq(testArray[7].locale.data, NULL);
-    ck_assert_int_eq(out.arrayDimensionsSize, 2);
-    ck_assert_int_eq(out.arrayDimensions[0], 2);
-    ck_assert_int_eq(out.arrayDimensions[1], 4);
-    ck_assert_int_eq(out.arrayLength, 8);
-    ck_assert_int_eq(out.type->typeIndex, 20);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_VariantVariantArrayNull_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_Variant *testArray;
-    testArray = (UA_Variant*)(out.data);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(!testArray[0].type);
-    ck_assert_int_eq(out.arrayDimensionsSize, 2);
-    ck_assert_int_eq(out.arrayDimensions[0], 2);
-    ck_assert_int_eq(out.arrayDimensions[1], 4);
-    ck_assert_int_eq(out.arrayLength, 8);
-    ck_assert_int_eq(out.type->typeIndex, 21);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-
-
-START_TEST(UA_VariantVariantArrayEmpty_json_decode) {
-    // given
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[]}");
-
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.arrayLength, 0);
-    ck_assert_ptr_eq(out.data, UA_EMPTY_ARRAY_SENTINEL);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_VariantStringArray_WithoutDimension_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_String *testArray;
-    testArray = (UA_String*)(out.data);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq((char)testArray[0].data[0], '1');
-    ck_assert_int_eq((char)testArray[1].data[0], '2');
-    ck_assert_int_eq((char)testArray[2].data[0], '3');
-    ck_assert_int_eq((char)testArray[3].data[0], '4');
-    ck_assert_int_eq((char)testArray[4].data[0], '5');
-    ck_assert_int_eq((char)testArray[5].data[0], '6');
-    ck_assert_int_eq((char)testArray[6].data[0], '7');
-    ck_assert_int_eq((char)testArray[7].data[0], '8');
-    ck_assert_int_eq(out.arrayDimensionsSize, 0);
-    ck_assert_int_eq(out.arrayLength, 8);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_Variant_BooleanArray_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":[true, false, true]}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_Boolean *testArray;
-    testArray = (UA_Boolean*)(out.data);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    //decoded as False
-    ck_assert_int_eq(testArray[0], 1);
-    ck_assert_int_eq(testArray[1], 0);
-    ck_assert_int_eq(testArray[2], 1);
-    ck_assert_int_eq(out.arrayDimensionsSize, 0);
-    ck_assert_int_eq(out.arrayLength, 3);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BOOLEAN);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Variant_bad1_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":\"\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    UA_Variant_deleteMembers(&out);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-}
-END_TEST
-
-START_TEST(UA_Variant_ExtensionObjectWrap_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1236}}}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.type->typeIndex, UA_TYPES_VIEWDESCRIPTION);
-    UA_ViewDescription *vd = (UA_ViewDescription*)out.data;
-    ck_assert_int_eq(vd->viewId.identifier.numeric, 99999);
-    ck_assert_int_eq(vd->viewVersion, 1236);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-
-
-
-START_TEST(UA_duplicate_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":false, \"Type\":1}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_wrongBoolean_json_decode) {
-    // given
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":\"asdfaaaaaaaaaaaaaaaaaaaa\"}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-
-START_TEST(UA_DataTypeAttributes_json_decode) {
-    // given
-    UA_DataTypeAttributes out;
-    UA_DataTypeAttributes_init(&out);
-    UA_ByteString buf = UA_STRING("{\"SpecifiedAttributes\":1,"
-            "\"DisplayName\":{\"Locale\":\"t1\",\"Text\":\"t2\"},"
-            "\"Description\":{\"Locale\":\"t3\",\"Text\":\"t4\"},"
-            "\"WriteMask\":53,"
-            "\"UserWriteMask\":63,"
-            "\"IsAbstract\":false}");
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.isAbstract, 0);
-    ck_assert_int_eq(out.writeMask, 53);
-    ck_assert_int_eq(out.userWriteMask, 63);
-    ck_assert_int_eq(out.specifiedAttributes, 1);
-    ck_assert_int_eq(out.displayName.locale.data[1], '1');
-    ck_assert_int_eq(out.displayName.text.data[1], '2');
-    ck_assert_int_eq(out.description.locale.data[1], '3');
-    ck_assert_int_eq(out.description.text.data[1], '4');
-    UA_DataTypeAttributes_deleteMembers(&out);
-}
-END_TEST
-
-//-------------------MISC heap free test cases--------------------------
-START_TEST(UA_VariantStringArrayBad_shouldFreeArray_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);                         //not a string     V
-    UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",true,\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_VariantFuzzer1_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);         
-    UA_ByteString buf = UA_STRING("\\x0a{\"Type\",\"Bode\",\"Body\":{\"se\":}}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-
-
-//This test succeeds: Double will be parsed to zero if unparsable
-// TODO: Verify against the spec
-START_TEST(UA_VariantFuzzer2_json_decode) {
-    // given
-    
-    UA_Variant out;
-    UA_Variant_init(&out);         
-    UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":2E+}");
-    //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
-
-    // when
-    
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    // then
-    ck_assert(retval == UA_STATUSCODE_GOOD || retval == UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Variant_Bad_Type_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    UA_ByteString buf = UA_STRING("{\"Type\":1000,\"Body\":0}");
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-
-    UA_Variant_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Variant_Bad_Type2_decode) {
-    for(int i = 0; i < 100; i++){
-        UA_Variant out;
-        UA_Variant_init(&out);
-        char str[80];
-        sprintf(str, "{\"Type\":%d}", i);
-        UA_ByteString buf = UA_STRING(str);
-        // when
-
-        UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-        // then
-        ck_assert_int_eq(retval, retval);
-        UA_Variant_deleteMembers(&out);
-    }
-}
-END_TEST
-
-START_TEST(UA_Variant_Null_decode) {
-    for(int i = 0; i < 100; i++){
-        UA_Variant out;
-        UA_Variant_init(&out);
-        char str[80];
-        sprintf(str, "{\"Type\":%d, \"Body:\":null}", i);
-        UA_ByteString buf = UA_STRING(str);
-        // when
-
-        UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-        // then
-        ck_assert_int_eq(retval, retval);
-        UA_Variant_deleteMembers(&out);
-    }
-}
-END_TEST
-
-START_TEST(UA_Variant_Malformed_decode) {
-    for(int i = 0; i < 100; i++){
-        UA_Variant out;
-        UA_Variant_init(&out);
-        char str[80];
-        sprintf(str, "{\"Type\":%d, \"Body:\"}", i);
-        UA_ByteString buf = UA_STRING(str);
-        // when
-
-        UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-        // then
-        ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-        UA_Variant_deleteMembers(&out);
-    }
-}
-END_TEST
-
-START_TEST(UA_Variant_Malformed2_decode) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    char str[80];
-    sprintf(str, "{\"Type\":, \"Body:\"}");
-    UA_ByteString buf = UA_STRING(str);
-    // when
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
-    UA_Variant_deleteMembers(&out);
-
-}
-END_TEST
-
-START_TEST(UA_JsonHelper) {
-    // given
-    
-    CtxJson ctx;
-    memset(&ctx, 0, sizeof(ctx));
-    ck_assert_int_eq(writeJsonArrStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    ck_assert_int_eq(writeJsonObjStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    ck_assert_int_eq(writeJsonObjEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    ck_assert_int_eq(writeJsonArrEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-    ck_assert_int_eq(writeJsonNull(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
-
-    ctx.calcOnly = true;
-    ctx.end = (const UA_Byte*)(uintptr_t)SIZE_MAX;
-    ck_assert_int_eq(calcJsonArrStart(&ctx), UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(calcJsonObjStart(&ctx), UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(calcJsonObjEnd(&ctx), UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(calcJsonArrEnd(&ctx), UA_STATUSCODE_GOOD);
-}   
-END_TEST
-
-
-static Suite *testSuite_builtin_json(void) {
-    Suite *s = suite_create("Built-in Data Types 62541-6 Json");
-    
-    TCase *tc_json_encode = tcase_create("json_encode");
-    tcase_add_test(tc_json_encode, UA_Boolean_true_json_encode);
-    tcase_add_test(tc_json_encode, UA_Boolean_false_json_encode);
-    tcase_add_test(tc_json_encode, UA_Boolean_true_bufferTooSmall_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_String_json_encode);
-    tcase_add_test(tc_json_encode, UA_String_Empty_json_encode);
-    tcase_add_test(tc_json_encode, UA_String_Null_json_encode);
-    tcase_add_test(tc_json_encode, UA_String_escapesimple_json_encode);
-    tcase_add_test(tc_json_encode, UA_String_escapeutf_json_encode);
-    tcase_add_test(tc_json_encode, UA_String_special_json_encode);
-
-    
-    tcase_add_test(tc_json_encode, UA_Byte_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Byte_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Byte_smallbuf_Number_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_SByte_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_SByte_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_SByte_Zero_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_SByte_smallbuf_Number_json_encode);
-    
- 
-    tcase_add_test(tc_json_encode, UA_UInt16_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_UInt16_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_UInt16_smallbuf_Number_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_Int16_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int16_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int16_Zero_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int16_smallbuf_Number_json_encode);
-    
-    
-    tcase_add_test(tc_json_encode, UA_UInt32_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_UInt32_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_UInt32_smallbuf_Number_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_Int32_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int32_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int32_Zero_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int32_smallbuf_Number_json_encode);
-    
-    
-    tcase_add_test(tc_json_encode, UA_UInt64_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_UInt64_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_UInt64_smallbuf_Number_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_Int64_Max_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int64_Min_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int64_Zero_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Int64_smallbuf_Number_json_encode);
-    
-    //Double Float
-    tcase_add_test(tc_json_encode, UA_Double_json_encode);
-    tcase_add_test(tc_json_encode, UA_Double_onesmallest_json_encode);
-    tcase_add_test(tc_json_encode, UA_Double_pluszero_json_encode);
-    tcase_add_test(tc_json_encode, UA_Double_minuszero_json_encode);
-    tcase_add_test(tc_json_encode, UA_Double_plusInf_json_encode);
-    tcase_add_test(tc_json_encode, UA_Double_minusInf_json_encode);
-    tcase_add_test(tc_json_encode, UA_Double_nan_json_encode);
-    tcase_add_test(tc_json_encode, UA_Float_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Float_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_DoubleInf_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_DoubleNan_json_encode);
-
-
-    
-    //LocalizedText
-    tcase_add_test(tc_json_encode, UA_LocText_json_encode);
-    tcase_add_test(tc_json_encode, UA_LocText_NonReversible_json_encode);
-    tcase_add_test(tc_json_encode, UA_LocText_smallBuffer_json_encode);
-    
-    //Guid
-    tcase_add_test(tc_json_encode, UA_Guid_json_encode);
-    tcase_add_test(tc_json_encode, UA_Guid_smallbuf_json_encode);
-    
-    //DateTime
-    tcase_add_test(tc_json_encode, UA_DateTime_json_encode);
-    tcase_add_test(tc_json_encode, UA_DateTime_with_nanoseconds_json_encode);
-    
-    
-    //StatusCode
-    tcase_add_test(tc_json_encode, UA_StatusCode_json_encode);
-    tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_json_encode);
-    tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_good_json_encode);
-    tcase_add_test(tc_json_encode, UA_StatusCode_smallbuf_json_encode);
-    
-    
-    //NodeId
-    tcase_add_test(tc_json_encode, UA_NodeId_Numeric_json_encode);
-    tcase_add_test(tc_json_encode, UA_NodeId_Numeric_Namespace_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_NodeId_String_json_encode);
-    tcase_add_test(tc_json_encode, UA_NodeId_String_Namespace_json_encode);
-    tcase_add_test(tc_json_encode, UA_NodeId_Guid_json_encode);
-    tcase_add_test(tc_json_encode, UA_NodeId_Guid_Namespace_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_NodeId_ByteString_json_encode);
-    tcase_add_test(tc_json_encode, UA_NodeId_ByteString_Namespace_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_NodeId_NonReversible_Numeric_Namespace_json_encode);
-    
-    //ExpandedNodeId
-    tcase_add_test(tc_json_encode, UA_ExpandedNodeId_json_encode);
-    tcase_add_test(tc_json_encode, UA_ExpandedNodeId_MissingNamespaceUri_json_encode);
-    tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Ns1_json_encode);
-    tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Namespace_json_encode);
-    tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode);
-    
-    
-    //DiagnosticInfo
-    tcase_add_test(tc_json_encode, UA_DiagInfo_json_encode);
-    tcase_add_test(tc_json_encode, UA_DiagInfo_withInner_json_encode);
-    tcase_add_test(tc_json_encode, UA_DiagInfo_withTwoInner_json_encode);
-    tcase_add_test(tc_json_encode, UA_DiagInfo_noFields_json_encode);
-    tcase_add_test(tc_json_encode, UA_DiagInfo_smallBuffer_json_encode);
-    
-    
-    //ByteString
-    tcase_add_test(tc_json_encode, UA_ByteString_json_encode);
-    tcase_add_test(tc_json_encode, UA_ByteString2_json_encode);
-    tcase_add_test(tc_json_encode, UA_ByteString3_json_encode);
-
-    
-    //QualifiedName
-    tcase_add_test(tc_json_encode, UA_QualName_json_encode);
-    tcase_add_test(tc_json_encode, UA_QualName_NonReversible_json_encode);
-    tcase_add_test(tc_json_encode, UA_QualName_NonReversible_Namespace_json_encode);
-    tcase_add_test(tc_json_encode, UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode);
-           
-    //Variant -REVERSIBLE-
-    tcase_add_test(tc_json_encode, UA_Variant_Bool_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Number_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Double_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Double2_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Double3_json_encode);
-
-    tcase_add_test(tc_json_encode, UA_Variant_NodeId_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_LocText_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_QualName_json_encode);
-    
-    //Array
-    tcase_add_test(tc_json_encode, UA_Variant_Array_UInt16_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Array_Byte_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Array_String_json_encode);
-    
-    //Matrix
-    tcase_add_test(tc_json_encode, UA_Variant_Matrix_UInt16_json_encode);
-    
-    //Wrap
-    tcase_add_test(tc_json_encode, UA_Variant_Wrap_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_json_encode);
-    
-    //Variant -NON-REVERSIBLE-
-    tcase_add_test(tc_json_encode, UA_Variant_StatusCode_NonReversible_json_encode);
-    
-    //Array
-    tcase_add_test(tc_json_encode, UA_Variant_Array_String_NonReversible_json_encode);
-    
-    //Matrix
-    tcase_add_test(tc_json_encode, UA_Variant_Matrix_String_NonReversible_json_encode);
-    tcase_add_test(tc_json_encode, UA_Variant_Matrix_NodeId_NonReversible_json_encode);
-    
-    //Wrap non reversible
-    tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_NonReversible_json_encode);
-    
-    
-    //ExtensionObject
-    tcase_add_test(tc_json_encode, UA_ExtensionObject_json_encode);
-    tcase_add_test(tc_json_encode, UA_ExtensionObject_xml_json_encode);
-    tcase_add_test(tc_json_encode, UA_ExtensionObject_byteString_json_encode);
-    
-    tcase_add_test(tc_json_encode, UA_ExtensionObject_NonReversible_StatusCode_json_encode);
-    
-    //DataValue
-    tcase_add_test(tc_json_encode, UA_DataValue_json_encode);
-    tcase_add_test(tc_json_encode, UA_DataValue_null_json_encode);
-
-    tcase_add_test(tc_json_encode, UA_MessageReadResponse_json_encode);
-    tcase_add_test(tc_json_encode, UA_ViewDescription_json_encode);
-    tcase_add_test(tc_json_encode, UA_WriteRequest_json_encode);
-    tcase_add_test(tc_json_encode, UA_VariableAttributes_json_encode);
-
-    suite_add_tcase(s, tc_json_encode);
-    
-    TCase *tc_json_decode = tcase_create("json_decode");
-    
-    
-    tcase_add_test(tc_json_decode, UA_SByte_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_SByte_Max_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_Byte_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_Byte_Max_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_Int16_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_Int16_Max_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_UInt16_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_UInt16_Max_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_UInt32_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_UInt32_Max_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_Int32_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_Int32_Max_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_Int64_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_Int64_Max_json_decode);
-    tcase_add_test(tc_json_decode, UA_Int64_Overflow_json_decode);
-    tcase_add_test(tc_json_decode, UA_Int64_TooBig_json_decode);
-    tcase_add_test(tc_json_decode, UA_Int64_NoDigit_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_UInt64_Min_json_decode);
-    tcase_add_test(tc_json_decode, UA_UInt64_Max_json_decode);
-    tcase_add_test(tc_json_decode, UA_UInt64_Overflow_json_decode);
-
-    
-    
-    tcase_add_test(tc_json_decode, UA_Float_json_decode);
-    tcase_add_test(tc_json_decode, UA_Float_json_one_decode);
-
-    tcase_add_test(tc_json_decode, UA_Float_json_inf_decode);
-    tcase_add_test(tc_json_decode, UA_Float_json_neginf_decode);
-    tcase_add_test(tc_json_decode, UA_Float_json_nan_decode);
-    tcase_add_test(tc_json_decode, UA_Float_json_negnan_decode);
-
-    
-    tcase_add_test(tc_json_decode, UA_Double_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_one_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_corrupt_json_decode);
-
-    tcase_add_test(tc_json_decode, UA_Double_onepointsmallest_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_nan_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_negnan_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_negzero_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_zero_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_inf_json_decode);
-    tcase_add_test(tc_json_decode, UA_Double_neginf_json_decode);
-    
-    
-    //String
-    tcase_add_test(tc_json_decode, UA_String_json_decode);
-    tcase_add_test(tc_json_decode, UA_String_empty_json_decode);
-    tcase_add_test(tc_json_decode, UA_String_unescapeBS_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_String_escape_unicode_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_String_escape2_json_decode);
-    tcase_add_test(tc_json_decode, UA_String_surrogatePair_json_decode);
-    
-    //ByteString
-    tcase_add_test(tc_json_decode, UA_ByteString_json_decode);
-    tcase_add_test(tc_json_decode, UA_ByteString_bad_json_decode);
-    tcase_add_test(tc_json_decode, UA_ByteString_null_json_decode);
-    
-    
-    //DateTime
-    tcase_add_test(tc_json_decode, UA_DateTime_json_decode);
-    tcase_add_test(tc_json_decode, UA_DateTime_micro_json_decode);
-    
-    
-    //Guid
-    tcase_add_test(tc_json_decode, UA_Guid_json_decode);
-    tcase_add_test(tc_json_decode, UA_Guid_lower_json_decode);
-    tcase_add_test(tc_json_decode, UA_Guid_tooShort_json_decode);
-    tcase_add_test(tc_json_decode, UA_Guid_tooLong_json_decode);
-    tcase_add_test(tc_json_decode, UA_Guid_wrong_json_decode);
-    
-    
-    //StatusCode
-    tcase_add_test(tc_json_decode, UA_StatusCode_2_json_decode);
-    tcase_add_test(tc_json_decode, UA_StatusCode_3_json_decode);
-    tcase_add_test(tc_json_decode, UA_StatusCode_0_json_decode);
-    
-    
-    //QualName
-    tcase_add_test(tc_json_decode, UA_QualifiedName_json_decode);
-    tcase_add_test(tc_json_decode, UA_QualifiedName_null_json_decode);
-    
-    
-    //LocalizedText
-    tcase_add_test(tc_json_decode, UA_LocalizedText_json_decode);
-    tcase_add_test(tc_json_decode, UA_LocalizedText_missing_json_decode);
-    tcase_add_test(tc_json_decode, UA_LocalizedText_null_json_decode);
-    
-
-    //-NodeId-
-    tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_json_decode);
-    tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_Namespace_json_decode);
-
-    tcase_add_test(tc_json_decode, UA_NodeId_String_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_NodeId_Guid_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_NodeId_ByteString_json_decode);
-    
-    
-    //expandednodeid
-    tcase_add_test(tc_json_decode, UA_ExpandedNodeId_Nummeric_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExpandedNodeId_ByteString_json_decode);
-    
-    //Diaginfo
-    tcase_add_test(tc_json_decode, UA_DiagnosticInfo_json_decode);
-    tcase_add_test(tc_json_decode, UA_DiagnosticInfo_null_json_decode);
-    
-    
-    //Variant
-    tcase_add_test(tc_json_decode, UA_VariantBool_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantBoolNull_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantStringArray_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantStringArrayNull_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantLocalizedTextArrayNull_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantVariantArrayNull_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantVariantArrayEmpty_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantStringArray_WithoutDimension_json_decode);
-    tcase_add_test(tc_json_decode, UA_Variant_BooleanArray_json_decode);
-    tcase_add_test(tc_json_decode, UA_Variant_bad1_json_decode);
-    tcase_add_test(tc_json_decode, UA_Variant_ExtensionObjectWrap_json_decode);
-    
-    //DataValue
-    tcase_add_test(tc_json_decode, UA_DataValue_json_decode);
-    tcase_add_test(tc_json_decode, UA_DataValueMissingFields_json_decode);
-    tcase_add_test(tc_json_decode, UA_DataValue_null_json_decode);
-            
-    //extensionobject
-    tcase_add_test(tc_json_decode, UA_ExtensionObject_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedByteString_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedXml_json_decode);
-    tcase_add_test(tc_json_decode, UA_ExtensionObject_Unkown_json_decode);
-    
-    
-    //Others
-    tcase_add_test(tc_json_decode, UA_duplicate_json_decode);
-    tcase_add_test(tc_json_decode, UA_wrongBoolean_json_decode);
-    
-    tcase_add_test(tc_json_decode, UA_ViewDescription_json_decode);
-    tcase_add_test(tc_json_decode, UA_DataTypeAttributes_json_decode);
-    
-    
-    tcase_add_test(tc_json_decode, UA_VariantStringArrayBad_shouldFreeArray_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantFuzzer1_json_decode);
-    tcase_add_test(tc_json_decode, UA_VariantFuzzer2_json_decode);
-
-    tcase_add_test(tc_json_decode, UA_Variant_Bad_Type_decode);
-    tcase_add_test(tc_json_decode, UA_Variant_Bad_Type2_decode);
-
-    tcase_add_test(tc_json_decode, UA_Variant_Null_decode);
-
-
-    tcase_add_test(tc_json_decode, UA_Variant_Malformed_decode);
-    tcase_add_test(tc_json_decode, UA_Variant_Malformed2_decode);
-
-
-    suite_add_tcase(s, tc_json_decode);
-    
-    TCase *tc_json_helper = tcase_create("json_helper");
-    tcase_add_test(tc_json_decode, UA_JsonHelper);
-    suite_add_tcase(s, tc_json_helper);
-    return s;
-}
-
-int main(void) {
-    int      number_failed = 0;
-    Suite   *s;
-    SRunner *sr;
-
-    s  = testSuite_builtin_json();
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
diff --git a/ext/open62541/tests/check_types_custom.c b/ext/open62541/tests/check_types_custom.c
deleted file mode 100644
index ed299ad..0000000
--- a/ext/open62541/tests/check_types_custom.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public 
- * License, v. 2.0. If a copy of the MPL was not distributed with this 
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_types_encoding_binary.h"
-
-#include "check.h"
-
-#ifdef __clang__
-//required for ck_assert_ptr_eq and const casting
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers"
-#endif
-
-/* The standard-defined datatypes are stored in the global array UA_TYPES. User
- * can create their own UA_CUSTOM_TYPES array (the name doesn't matter) and
- * provide it to the server / client. The type will be automatically decoded if
- * possible.
- */
-
-/* The custom datatype for describing a 3d position */
-
-typedef struct {
-    UA_Float x;
-    UA_Float y;
-    UA_Float z;
-} Point;
-
-/* The datatype description for the Point datatype */
-
-#define padding_y offsetof(Point,y) - offsetof(Point,x) - sizeof(UA_Float)
-#define padding_z offsetof(Point,z) - offsetof(Point,y) - sizeof(UA_Float)
-
-static UA_DataTypeMember members[3] = {
-    /* x */
-    {
-        UA_TYPENAME("x") /* .memberName */
-        UA_TYPES_FLOAT,  /* .memberTypeIndex, points into UA_TYPES since
-                            .namespaceZero is true */
-        0,               /* .padding */
-        true,            /* .namespaceZero, see .memberTypeIndex */
-        false            /* .isArray */
-    },
-
-    /* y */
-    {
-        UA_TYPENAME("y")
-        UA_TYPES_FLOAT, padding_y, true, false
-    },
-
-    /* z */
-    {
-        UA_TYPENAME("y")
-        UA_TYPES_FLOAT, padding_z, true, false
-    }
-};
-
-static const UA_DataType PointType = {
-    UA_TYPENAME("Point")             /* .typeName */
-    {1, UA_NODEIDTYPE_NUMERIC, {1}}, /* .typeId */
-    sizeof(Point),                   /* .memSize */
-    0,                               /* .typeIndex, in the array of custom types */
-    UA_DATATYPEKIND_STRUCTURE,       /* .typeKind */
-    true,                            /* .pointerFree */
-    false,                           /* .overlayable (depends on endianness and
-                                         the absence of padding) */
-    3,                               /* .membersSize */
-    0,                               /* .binaryEncodingId, the numeric
-                                         identifier used on the wire (the
-                                         namespaceindex is from .typeId) */
-    members
-};
-
-const UA_DataTypeArray customDataTypes = {NULL, 1, &PointType};
-
-START_TEST(parseCustomScalar) {
-    Point p;
-    p.x = 1.0;
-    p.y = 2.0;
-    p.z = 3.0;
-    
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setScalar(&var, &p, &PointType);
-
-    size_t buflen = UA_calcSizeBinary(&var, &UA_TYPES[UA_TYPES_VARIANT]);
-    UA_ByteString buf;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&buf, buflen);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Byte *pos = buf.data;
-    const UA_Byte *end = &buf.data[buf.length];
-    retval = UA_encodeBinary(&var, &UA_TYPES[UA_TYPES_VARIANT],
-                             &pos, &end, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant var2;
-    size_t offset = 0;
-    retval = UA_decodeBinary(&buf, &offset, &var2, &UA_TYPES[UA_TYPES_VARIANT], &customDataTypes);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(var2.type == &PointType);
-
-    Point *p2 = (Point*)var2.data;
-    ck_assert(p.x == p2->x);
-        
-    UA_Variant_deleteMembers(&var2);
-    UA_ByteString_deleteMembers(&buf);
-} END_TEST
-
-START_TEST(parseCustomScalarExtensionObject) {
-    Point p;
-    p.x = 1.0;
-    p.y = 2.0;
-    p.z = 3.0;
-
-    UA_ExtensionObject eo;
-    UA_ExtensionObject_init(&eo);
-
-    eo.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    eo.content.decoded.data = &p;
-    eo.content.decoded.type = &PointType;
-
-    size_t buflen = UA_calcSizeBinary(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    UA_ByteString buf;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&buf, buflen);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buf.data;
-    const UA_Byte *bufEnd = &buf.data[buf.length];
-    retval = UA_encodeBinary(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], &bufPos, &bufEnd, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ExtensionObject eo2;
-    size_t offset = 0;
-    retval = UA_decodeBinary(&buf, &offset, &eo2, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], &customDataTypes);
-    ck_assert_int_eq(offset, (uintptr_t)(bufPos - buf.data));
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(eo2.encoding, UA_EXTENSIONOBJECT_DECODED);
-    ck_assert(eo2.content.decoded.type == &PointType);
-
-    Point *p2 = (Point*)eo2.content.decoded.data;
-    ck_assert(p.x == p2->x);
-        
-    UA_ExtensionObject_deleteMembers(&eo2);
-    UA_ByteString_deleteMembers(&buf);
-} END_TEST
-
-START_TEST(parseCustomArray) {
-    Point ps[10];
-    for(size_t i = 0; i < 10; ++i) {
-        ps[i].x = (UA_Float)(1*i);
-        ps[i].y = (UA_Float)(2*i);
-        ps[i].z = (UA_Float)(3*i);
-    }
-
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_Variant_setArray(&var, (void*)ps, 10, &PointType);
-
-    size_t buflen = UA_calcSizeBinary(&var, &UA_TYPES[UA_TYPES_VARIANT]);
-    UA_ByteString buf;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&buf, buflen);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Byte *pos = buf.data;
-    const UA_Byte *end = &buf.data[buf.length];
-    retval = UA_encodeBinary(&var, &UA_TYPES[UA_TYPES_VARIANT],
-                             &pos, &end, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant var2;
-    size_t offset = 0;
-    retval = UA_decodeBinary(&buf, &offset, &var2, &UA_TYPES[UA_TYPES_VARIANT], &customDataTypes);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(var2.type == &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-    ck_assert_int_eq(var2.arrayLength, 10);
-
-    for (size_t i = 0; i < 10; i++) {
-        UA_ExtensionObject *eo = &((UA_ExtensionObject*)var2.data)[i];
-        ck_assert_int_eq(eo->encoding, UA_EXTENSIONOBJECT_DECODED);
-        ck_assert(eo->content.decoded.type == &PointType);
-        Point *p2 = (Point*)eo->content.decoded.data;
-
-        // we need to cast floats to int to avoid comparison of floats
-        // which may result into false results
-        ck_assert((int)p2->x == (int)ps[i].x);
-        ck_assert((int)p2->y == (int)ps[i].y);
-        ck_assert((int)p2->z == (int)ps[i].z);
-    }
-        
-    UA_Variant_deleteMembers(&var2);
-    UA_ByteString_deleteMembers(&buf);
-} END_TEST
-
-int main(void) {
-    Suite *s  = suite_create("Test Custom DataType Encoding");
-    TCase *tc = tcase_create("test cases");
-    tcase_add_test(tc, parseCustomScalar);
-    tcase_add_test(tc, parseCustomScalarExtensionObject);
-    tcase_add_test(tc, parseCustomArray);
-    suite_add_tcase(s, tc);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all (sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
diff --git a/ext/open62541/tests/check_types_memory.c b/ext/open62541/tests/check_types_memory.c
deleted file mode 100644
index 1971df0..0000000
--- a/ext/open62541/tests/check_types_memory.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#define _XOPEN_SOURCE 500
-#include <open62541/server.h>
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-#include <open62541/util.h>
-
-#include "ua_types_encoding_binary.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "check.h"
-
-/* Define types to a dummy value if they are not available (e.g. not built with
- * NS0 full) */
-#ifndef UA_TYPES_UNION
-#define UA_TYPES_UNION UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_HISTORYREADDETAILS
-#define UA_TYPES_HISTORYREADDETAILS UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_NOTIFICATIONDATA
-#define UA_TYPES_NOTIFICATIONDATA UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_MONITORINGFILTER
-#define UA_TYPES_MONITORINGFILTER UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_MONITORINGFILTERRESULT
-#define UA_TYPES_MONITORINGFILTERRESULT UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_DATASETREADERMESSAGEDATATYPE
-#define UA_TYPES_DATASETREADERMESSAGEDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_WRITERGROUPTRANSPORTDATATYPE
-#define UA_TYPES_WRITERGROUPTRANSPORTDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_CONNECTIONTRANSPORTDATATYPE
-#define UA_TYPES_CONNECTIONTRANSPORTDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_WRITERGROUPMESSAGEDATATYPE
-#define UA_TYPES_WRITERGROUPMESSAGEDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_READERGROUPTRANSPORTDATATYPE
-#define UA_TYPES_READERGROUPTRANSPORTDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_PUBLISHEDDATASETSOURCEDATATYPE
-#define UA_TYPES_PUBLISHEDDATASETSOURCEDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_DATASETREADERTRANSPORTDATATYPE
-#define UA_TYPES_DATASETREADERTRANSPORTDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_DATASETWRITERTRANSPORTDATATYPE
-#define UA_TYPES_DATASETWRITERTRANSPORTDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_SUBSCRIBEDDATASETDATATYPE
-#define UA_TYPES_SUBSCRIBEDDATASETDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_READERGROUPMESSAGEDATATYPE
-#define UA_TYPES_READERGROUPMESSAGEDATATYPE UA_TYPES_COUNT
-#endif
-#ifndef UA_TYPES_DATASETWRITERMESSAGEDATATYPE
-#define UA_TYPES_DATASETWRITERMESSAGEDATATYPE UA_TYPES_COUNT
-#endif
-
-START_TEST(newAndEmptyObjectShallBeDeleted) {
-    // given
-    void *obj = UA_new(&UA_TYPES[_i]);
-    // then
-    ck_assert_ptr_ne(obj, NULL);
-    // finally
-    UA_delete(obj, &UA_TYPES[_i]);
-}
-END_TEST
-
-START_TEST(arrayCopyShallMakeADeepCopy) {
-    // given
-    UA_String a1[3];
-    a1[0] = (UA_String){1, (UA_Byte*)"a"};
-    a1[1] = (UA_String){2, (UA_Byte*)"bb"};
-    a1[2] = (UA_String){3, (UA_Byte*)"ccc"};
-    // when
-    UA_String *a2;
-    UA_Int32 retval = UA_Array_copy((const void *)a1, 3, (void **)&a2, &UA_TYPES[UA_TYPES_STRING]);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(a1[0].length, 1);
-    ck_assert_int_eq(a1[1].length, 2);
-    ck_assert_int_eq(a1[2].length, 3);
-    ck_assert_int_eq(a1[0].length, a2[0].length);
-    ck_assert_int_eq(a1[1].length, a2[1].length);
-    ck_assert_int_eq(a1[2].length, a2[2].length);
-    ck_assert_ptr_ne(a1[0].data, a2[0].data);
-    ck_assert_ptr_ne(a1[1].data, a2[1].data);
-    ck_assert_ptr_ne(a1[2].data, a2[2].data);
-    ck_assert_int_eq(a1[0].data[0], a2[0].data[0]);
-    ck_assert_int_eq(a1[1].data[0], a2[1].data[0]);
-    ck_assert_int_eq(a1[2].data[0], a2[2].data[0]);
-    // finally
-    UA_Array_delete((void *)a2, 3, &UA_TYPES[UA_TYPES_STRING]);
-}
-END_TEST
-
-START_TEST(encodeShallYieldDecode) {
-    /* floating point types may change the representaton due to several possible NaN values. */
-    if(_i != UA_TYPES_FLOAT || _i != UA_TYPES_DOUBLE ||
-       _i != UA_TYPES_CREATESESSIONREQUEST || _i != UA_TYPES_CREATESESSIONRESPONSE ||
-       _i != UA_TYPES_VARIABLEATTRIBUTES || _i != UA_TYPES_READREQUEST ||
-       _i != UA_TYPES_MONITORINGPARAMETERS || _i != UA_TYPES_MONITOREDITEMCREATERESULT ||
-       _i != UA_TYPES_CREATESUBSCRIPTIONREQUEST || _i != UA_TYPES_CREATESUBSCRIPTIONRESPONSE)
-        return;
-
-    // given
-    UA_ByteString msg1, msg2;
-    void *obj1 = UA_new(&UA_TYPES[_i]);
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&msg1, 65000); // fixed buf size
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Byte *pos = msg1.data;
-    const UA_Byte *end = &msg1.data[msg1.length];
-    retval = UA_encodeBinary(obj1, &UA_TYPES[_i],
-                             &pos, &end, NULL, NULL);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_delete(obj1, &UA_TYPES[_i]);
-        UA_ByteString_deleteMembers(&msg1);
-        return;
-    }
-
-    // when
-    void *obj2 = UA_new(&UA_TYPES[_i]);
-    size_t offset = 0;
-    retval = UA_decodeBinary(&msg1, &offset, obj2, &UA_TYPES[_i], NULL);
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, "could not decode idx=%d,nodeid=%i",
-                  _i, UA_TYPES[_i].typeId.identifier.numeric);
-    ck_assert(!memcmp(obj1, obj2, UA_TYPES[_i].memSize)); // bit identical decoding
-    retval = UA_ByteString_allocBuffer(&msg2, 65000);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    pos = msg2.data;
-    end = &msg2.data[msg2.length];
-    retval = UA_encodeBinary(obj2, &UA_TYPES[_i], &pos, &end, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // then
-    msg1.length = offset;
-    msg2.length = offset;
-    ck_assert_msg(UA_ByteString_equal(&msg1, &msg2) == true,
-                  "messages differ idx=%d,nodeid=%i", _i,
-                  UA_TYPES[_i].typeId.identifier.numeric);
-
-    // finally
-    UA_delete(obj1, &UA_TYPES[_i]);
-    UA_delete(obj2, &UA_TYPES[_i]);
-    UA_ByteString_deleteMembers(&msg1);
-    UA_ByteString_deleteMembers(&msg2);
-}
-END_TEST
-
-START_TEST(decodeShallFailWithTruncatedBufferButSurvive) {
-    //Skip test for void*
-    if (
-#ifdef UA_ENABLE_DISCOVERY
-        _i == UA_TYPES_DISCOVERYCONFIGURATION ||
-#endif
-        _i == UA_TYPES_FILTEROPERAND ||
-        _i == UA_TYPES_UNION ||
-#ifdef UA_TYPES_FRAME
-        _i == UA_TYPES_FRAME ||
-        _i == UA_TYPES_ORIENTATION ||
-        _i == UA_TYPES_VECTOR ||
-        _i == UA_TYPES_CARTESIANCOORDINATES ||
-#endif
-        _i == UA_TYPES_HISTORYREADDETAILS ||
-        _i == UA_TYPES_NOTIFICATIONDATA ||
-        _i == UA_TYPES_MONITORINGFILTER ||
-        _i == UA_TYPES_MONITORINGFILTERRESULT ||
-        _i == UA_TYPES_DATASETREADERMESSAGEDATATYPE ||
-        _i == UA_TYPES_WRITERGROUPTRANSPORTDATATYPE ||
-        _i == UA_TYPES_CONNECTIONTRANSPORTDATATYPE ||
-        _i == UA_TYPES_WRITERGROUPMESSAGEDATATYPE ||
-        _i == UA_TYPES_READERGROUPTRANSPORTDATATYPE ||
-        _i == UA_TYPES_PUBLISHEDDATASETSOURCEDATATYPE ||
-        _i == UA_TYPES_DATASETREADERTRANSPORTDATATYPE ||
-        _i == UA_TYPES_DATASETWRITERTRANSPORTDATATYPE ||
-        _i == UA_TYPES_SUBSCRIBEDDATASETDATATYPE ||
-        _i == UA_TYPES_READERGROUPMESSAGEDATATYPE ||
-        _i == UA_TYPES_DATASETWRITERMESSAGEDATATYPE)
-        return;
-    // given
-    UA_ByteString msg1;
-    void *obj1 = UA_new(&UA_TYPES[_i]);
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&msg1, 65000); // fixed buf size
-    UA_Byte *pos = msg1.data;
-    const UA_Byte *end = &msg1.data[msg1.length];
-    retval |= UA_encodeBinary(obj1, &UA_TYPES[_i], &pos, &end, NULL, NULL);
-    UA_delete(obj1, &UA_TYPES[_i]);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ByteString_deleteMembers(&msg1);
-        return; // e.g. variants cannot be encoded after an init without failing (no datatype set)
-    }
-
-    size_t half = (uintptr_t)(pos - msg1.data) / 2;
-    msg1.length = half;
-
-    // when
-    void *obj2 = UA_new(&UA_TYPES[_i]);
-    size_t offset = 0;
-    retval = UA_decodeBinary(&msg1, &offset, obj2, &UA_TYPES[_i], NULL);
-    ck_assert_int_ne(retval, UA_STATUSCODE_GOOD);
-    UA_delete(obj2, &UA_TYPES[_i]);
-    UA_ByteString_deleteMembers(&msg1);
-}
-END_TEST
-
-#define RANDOM_TESTS 1000
-
-START_TEST(decodeScalarBasicTypeFromRandomBufferShallSucceed) {
-    // given
-    void *obj1 = NULL;
-    UA_ByteString msg1;
-    UA_Int32 retval = UA_STATUSCODE_GOOD;
-    UA_Int32 buflen = 256;
-    retval = UA_ByteString_allocBuffer(&msg1, buflen); // fixed size
-#ifdef _WIN32
-    srand(42);
-#else
-    srandom(42);
-#endif
-    for(int n = 0;n < RANDOM_TESTS;n++) {
-        for(UA_Int32 i = 0;i < buflen;i++) {
-#ifdef _WIN32
-            UA_UInt32 rnd;
-            rnd = rand();
-            msg1.data[i] = rnd;
-#else
-            msg1.data[i] = (UA_Byte)random();  // when
-#endif
-        }
-        size_t pos = 0;
-        obj1 = UA_new(&UA_TYPES[_i]);
-        retval |= UA_decodeBinary(&msg1, &pos, obj1, &UA_TYPES[_i], NULL);
-        //then
-        ck_assert_msg(retval == UA_STATUSCODE_GOOD,
-                      "Decoding %d from random buffer",
-                      UA_TYPES[_i].typeId.identifier.numeric);
-        // finally
-        UA_delete(obj1, &UA_TYPES[_i]);
-    }
-    UA_ByteString_deleteMembers(&msg1);
-}
-END_TEST
-
-START_TEST(decodeComplexTypeFromRandomBufferShallSurvive) {
-    // given
-    UA_ByteString msg1;
-    UA_Int32 retval = UA_STATUSCODE_GOOD;
-    UA_Int32 buflen = 256;
-    retval = UA_ByteString_allocBuffer(&msg1, buflen); // fixed size
-#ifdef _WIN32
-    srand(42);
-#else
-    srandom(42);
-#endif
-    // when
-    for(int n = 0;n < RANDOM_TESTS;n++) {
-        for(UA_Int32 i = 0;i < buflen;i++) {
-#ifdef _WIN32
-            UA_UInt32 rnd;
-            rnd = rand();
-            msg1.data[i] = rnd;
-#else
-            msg1.data[i] = (UA_Byte)random();  // when
-#endif
-        }
-        size_t pos = 0;
-        void *obj1 = UA_new(&UA_TYPES[_i]);
-        retval |= UA_decodeBinary(&msg1, &pos, obj1, &UA_TYPES[_i], NULL);
-        UA_delete(obj1, &UA_TYPES[_i]);
-    }
-
-    // finally
-    UA_ByteString_deleteMembers(&msg1);
-}
-END_TEST
-
-START_TEST(calcSizeBinaryShallBeCorrect) {
-    /* Empty variants (with no type defined) cannot be encoded. This is
-     * intentional. Discovery configuration is just a base class and void * */
-    if(_i == UA_TYPES_VARIANT ||
-       _i == UA_TYPES_VARIABLEATTRIBUTES ||
-       _i == UA_TYPES_VARIABLETYPEATTRIBUTES ||
-       _i == UA_TYPES_FILTEROPERAND ||
-#ifdef UA_ENABLE_DISCOVERY
-       _i == UA_TYPES_DISCOVERYCONFIGURATION ||
-#endif
-       _i == UA_TYPES_UNION ||
-#ifdef UA_TYPES_FRAME
-       _i == UA_TYPES_FRAME ||
-       _i == UA_TYPES_ORIENTATION ||
-       _i == UA_TYPES_VECTOR ||
-       _i == UA_TYPES_CARTESIANCOORDINATES ||
-#endif
-       _i == UA_TYPES_HISTORYREADDETAILS ||
-       _i == UA_TYPES_NOTIFICATIONDATA ||
-       _i == UA_TYPES_MONITORINGFILTER ||
-        _i == UA_TYPES_MONITORINGFILTERRESULT ||
-        _i == UA_TYPES_DATASETREADERMESSAGEDATATYPE ||
-        _i == UA_TYPES_WRITERGROUPTRANSPORTDATATYPE ||
-        _i == UA_TYPES_CONNECTIONTRANSPORTDATATYPE ||
-        _i == UA_TYPES_WRITERGROUPMESSAGEDATATYPE ||
-        _i == UA_TYPES_READERGROUPTRANSPORTDATATYPE ||
-        _i == UA_TYPES_PUBLISHEDDATASETSOURCEDATATYPE ||
-        _i == UA_TYPES_DATASETREADERTRANSPORTDATATYPE ||
-        _i == UA_TYPES_DATASETWRITERTRANSPORTDATATYPE ||
-        _i == UA_TYPES_SUBSCRIBEDDATASETDATATYPE ||
-        _i == UA_TYPES_READERGROUPMESSAGEDATATYPE ||
-        _i == UA_TYPES_DATASETWRITERMESSAGEDATATYPE)
-        return;
-    void *obj = UA_new(&UA_TYPES[_i]);
-    size_t predicted_size = UA_calcSizeBinary(obj, &UA_TYPES[_i]);
-    ck_assert_int_ne(predicted_size, 0);
-    UA_ByteString msg;
-    UA_StatusCode retval = UA_ByteString_allocBuffer(&msg, predicted_size);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Byte *pos = msg.data;
-    const UA_Byte *end = &msg.data[msg.length];
-    retval = UA_encodeBinary(obj, &UA_TYPES[_i], &pos, &end, NULL, NULL);
-    if(retval)
-        printf("%i\n",_i);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq((uintptr_t)(pos - msg.data), predicted_size);
-    UA_delete(obj, &UA_TYPES[_i]);
-    UA_ByteString_deleteMembers(&msg);
-}
-END_TEST
-
-int main(void) {
-    int number_failed = 0;
-    SRunner *sr;
-
-    Suite *s  = suite_create("testMemoryHandling");
-    TCase *tc = tcase_create("Empty Objects");
-    tcase_add_loop_test(tc, newAndEmptyObjectShallBeDeleted, UA_TYPES_BOOLEAN, UA_TYPES_COUNT - 1);
-    tcase_add_test(tc, arrayCopyShallMakeADeepCopy);
-    tcase_add_loop_test(tc, encodeShallYieldDecode, UA_TYPES_BOOLEAN, UA_TYPES_COUNT - 1);
-    suite_add_tcase(s, tc);
-    tc = tcase_create("Truncated Buffers");
-    tcase_add_loop_test(tc, decodeShallFailWithTruncatedBufferButSurvive,
-                        UA_TYPES_BOOLEAN, UA_TYPES_COUNT - 1);
-    suite_add_tcase(s, tc);
-
-    tc = tcase_create("Fuzzing with Random Buffers");
-    tcase_add_loop_test(tc, decodeScalarBasicTypeFromRandomBufferShallSucceed,
-                        UA_TYPES_BOOLEAN, UA_TYPES_DOUBLE);
-    tcase_add_loop_test(tc, decodeComplexTypeFromRandomBufferShallSurvive,
-                        UA_TYPES_NODEID, UA_TYPES_COUNT - 1);
-    suite_add_tcase(s, tc);
-
-    tc = tcase_create("Test calcSizeBinary");
-    tcase_add_loop_test(tc, calcSizeBinaryShallBeCorrect, UA_TYPES_BOOLEAN, UA_TYPES_COUNT - 1);
-    suite_add_tcase(s, tc);
-
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all (sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/check_types_range.c b/ext/open62541/tests/check_types_range.c
deleted file mode 100644
index e18f441..0000000
--- a/ext/open62541/tests/check_types_range.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_server_internal.h"
-
-#include "check.h"
-
-START_TEST(parseRange) {
-    UA_NumericRange range;
-    UA_String str = UA_STRING("1:2,0:3,5");
-    UA_StatusCode retval = UA_NumericRange_parseFromString(&range, &str);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(range.dimensionsSize,3);
-    ck_assert_int_eq(range.dimensions[0].min,1);
-    ck_assert_int_eq(range.dimensions[0].max,2);
-    ck_assert_int_eq(range.dimensions[1].min,0);
-    ck_assert_int_eq(range.dimensions[1].max,3);
-    ck_assert_int_eq(range.dimensions[2].min,5);
-    ck_assert_int_eq(range.dimensions[2].max,5);
-    UA_free(range.dimensions);
-} END_TEST
-
-START_TEST(parseRangeMinEqualMax) {
-    UA_NumericRange range;
-    UA_String str = UA_STRING("1:2,1");
-    UA_StatusCode retval = UA_NumericRange_parseFromString(&range, &str);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(range.dimensionsSize,2);
-    ck_assert_int_eq(range.dimensions[0].min,1);
-    ck_assert_int_eq(range.dimensions[0].max,2);
-    ck_assert_int_eq(range.dimensions[1].min,1);
-    ck_assert_int_eq(range.dimensions[1].max,1);
-    UA_free(range.dimensions);
-} END_TEST
-
-START_TEST(copySimpleArrayRange) {
-    UA_Variant v, v2;
-    UA_Variant_init(&v);
-    UA_Variant_init(&v2);
-    UA_UInt32 arr[5] = {1,2,3,4,5};
-    UA_Variant_setArray(&v, arr, 5, &UA_TYPES[UA_TYPES_UINT32]);
-
-    UA_NumericRange r;
-    UA_String sr = UA_STRING("1:3");
-    UA_StatusCode retval = UA_NumericRange_parseFromString(&r, &sr);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Variant_copyRange(&v, &v2, r);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(3, v2.arrayLength);
-    ck_assert_int_eq(2, *(UA_UInt32*)v2.data);
-
-    UA_Variant_deleteMembers(&v2);
-    UA_free(r.dimensions);
-}
-END_TEST
-
-START_TEST(copyIntoStringArrayRange) {
-    UA_Variant v, v2;
-    UA_Variant_init(&v);
-    UA_Variant_init(&v2);
-    UA_String arr[2];
-    arr[0] = UA_STRING("abcd");
-    arr[1] = UA_STRING("wxyz");
-    UA_Variant_setArray(&v, arr, 5, &UA_TYPES[UA_TYPES_STRING]);
-
-    UA_NumericRange r;
-    UA_String sr = UA_STRING("0:1,1:2");
-    UA_StatusCode retval = UA_NumericRange_parseFromString(&r, &sr);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Variant_copyRange(&v, &v2, r);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(2, v2.arrayLength);
-
-    UA_String s1 = UA_STRING("bc");
-    UA_String s2 = UA_STRING("xy");
-    UA_String *arr2 = (UA_String*)v2.data;
-    ck_assert(UA_String_equal(&arr2[0], &s1));
-    ck_assert(UA_String_equal(&arr2[1], &s2));
-
-    UA_Variant_deleteMembers(&v2);
-    UA_free(r.dimensions);
-}
-END_TEST
-
-int main(void) {
-    Suite *s  = suite_create("Test Variant Range Access");
-    TCase *tc = tcase_create("test cases");
-    tcase_add_test(tc, parseRange);
-    tcase_add_test(tc, parseRangeMinEqualMax);
-    tcase_add_test(tc, copySimpleArrayRange);
-    tcase_add_test(tc, copyIntoStringArrayRange);
-    suite_add_tcase(s, tc);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all (sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/check_utils.c b/ext/open62541/tests/check_utils.c
deleted file mode 100644
index 09d4a0c..0000000
--- a/ext/open62541/tests/check_utils.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-
-#include "ua_util_internal.h"
-
-#include <stdlib.h>
-
-#include "check.h"
-
-START_TEST(EndpointUrl_split) {
-    UA_String hostname = UA_STRING_NULL;
-    UA_String path = UA_STRING_NULL;
-    UA_UInt16 port = 0;
-
-    // check for too short url
-    UA_String endPointUrl = UA_STRING("inv.ali:/");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-
-    // check for opc.tcp:// protocol
-    endPointUrl = UA_STRING("inv.ali://");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-
-    // empty url
-    endPointUrl = UA_STRING("opc.tcp://");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-    ck_assert(UA_String_equal(&hostname, &UA_STRING_NULL));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // only hostname
-    endPointUrl = UA_STRING("opc.tcp://hostname");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
-    UA_String expected = UA_STRING("hostname");
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // empty port
-    endPointUrl = UA_STRING("opc.tcp://hostname:");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // specific port
-    endPointUrl = UA_STRING("opc.tcp://hostname:1234");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_GOOD);
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 1234);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // IPv6
-    endPointUrl = UA_STRING("opc.tcp://[2001:0db8:85a3::8a2e:0370:7334]:1234/path");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
-    expected = UA_STRING("[2001:0db8:85a3::8a2e:0370:7334]");
-    UA_String expectedPath = UA_STRING("path");
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 1234);
-    ck_assert(UA_String_equal(&path, &expectedPath));
-
-    // invalid IPv6: missing ]
-    endPointUrl = UA_STRING("opc.tcp://[2001:0db8:85a3::8a2e:0370:7334");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-
-    // empty hostname
-    endPointUrl = UA_STRING("opc.tcp://:");
-    port = 0;
-    path = UA_STRING_NULL;
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-    ck_assert(UA_String_equal(&hostname, &UA_STRING_NULL));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // empty hostname and no port
-    endPointUrl = UA_STRING("opc.tcp:///");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
-    ck_assert(UA_String_equal(&hostname, &UA_STRING_NULL));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // overlength port
-    endPointUrl = UA_STRING("opc.tcp://hostname:12345678");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-
-    // port not a number
-    endPointUrl = UA_STRING("opc.tcp://hostname:6x6");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
-                      UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
-    expected = UA_STRING("hostname");
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // no port but path
-    endPointUrl = UA_STRING("opc.tcp://hostname/");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 0);
-    ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
-
-    // port and path
-    endPointUrl = UA_STRING("opc.tcp://hostname:1234/path");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 1234);
-    ck_assert(UA_String_equal(&path, &expectedPath));
-
-    // port and path with a slash
-    endPointUrl = UA_STRING("opc.tcp://hostname:1234/path/");
-    ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
-    ck_assert(UA_String_equal(&hostname, &expected));
-    ck_assert_uint_eq(port, 1234);
-    ck_assert(UA_String_equal(&path, &expectedPath));
-}
-END_TEST
-
-START_TEST(EndpointUrl_ethernet) {
-    UA_String target;
-    UA_UInt16 vid = 0;
-    UA_Byte pcp = 0;
-    UA_String expected;
-
-    // check for too short url
-    UA_String endPointUrl = UA_STRING("inv.ali:/");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_BADINTERNALERROR);
-    ck_assert_uint_eq(vid, 0);
-    ck_assert_uint_eq(pcp, 0);
-
-    // long enough, but malformed
-    endPointUrl = UA_STRING("opc.eth.//target:");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_BADINTERNALERROR);
-
-    // valid without vid and pcp but leading ':'
-    endPointUrl = UA_STRING("opc.eth://target:");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_BADINTERNALERROR);
-    ck_assert_uint_eq(vid, 0);
-    ck_assert_uint_eq(pcp, 0);
-
-    // without pcp and vid as non decimal
-    endPointUrl = UA_STRING("opc.eth://target:abc");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_BADINTERNALERROR);
-    ck_assert_uint_eq(vid, 0);
-    ck_assert_uint_eq(pcp, 0);
-
-    // pcp as non decimal
-    endPointUrl = UA_STRING("opc.eth://target:100.abc");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_BADINTERNALERROR);
-    ck_assert_uint_eq(vid, 100);
-    ck_assert_uint_eq(pcp, 0);
-
-    // valid without pcp but leading '.'
-    endPointUrl = UA_STRING("opc.eth://target:100.");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_BADINTERNALERROR);
-    ck_assert_uint_eq(vid, 100);
-    ck_assert_uint_eq(pcp, 0);
-
-    // valid without pcp
-    endPointUrl = UA_STRING("opc.eth://target:100");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_GOOD);
-    expected = UA_STRING("target");
-    ck_assert(UA_String_equal(&target, &expected));
-    ck_assert_uint_eq(vid, 100);
-    ck_assert_uint_eq(pcp, 0);
-
-    // valid
-    endPointUrl = UA_STRING("opc.eth://target:100.7");
-    ck_assert_uint_eq(UA_parseEndpointUrlEthernet(&endPointUrl, &target, &vid, &pcp),
-                      UA_STATUSCODE_GOOD);
-    expected = UA_STRING("target");
-    ck_assert(UA_String_equal(&target, &expected));
-    ck_assert_uint_eq(vid, 100);
-    ck_assert_uint_eq(pcp, 7);
-}
-END_TEST
-
-START_TEST(readNumber) {
-    UA_UInt32 result;
-    ck_assert_uint_eq(UA_readNumber((UA_Byte*)"x", 1, &result), 0);
-
-    ck_assert_uint_eq(UA_readNumber((UA_Byte*)"1x", 2, &result), 1);
-    ck_assert_uint_eq(result, 1);
-
-    ck_assert_uint_eq(UA_readNumber((UA_Byte*)"123456789", 9, &result), 9);
-    ck_assert_uint_eq(result, 123456789);
-}
-END_TEST
-
-START_TEST(readNumberWithBase) {
-    UA_UInt32 result;
-    ck_assert_uint_eq(UA_readNumberWithBase((UA_Byte*)"g", 1, &result, 16), 0);
-
-    ck_assert_uint_eq(UA_readNumberWithBase((UA_Byte*)"f", 1, &result, 16), 1);
-    ck_assert_uint_eq(result, 15);
-
-    ck_assert_uint_eq(UA_readNumberWithBase((UA_Byte*)"F", 1, &result, 16), 1);
-    ck_assert_uint_eq(result, 15);
-
-    ck_assert_uint_eq(UA_readNumberWithBase((UA_Byte*)"1x", 2, &result, 16), 1);
-    ck_assert_uint_eq(result, 1);
-
-    ck_assert_uint_eq(UA_readNumberWithBase((UA_Byte*)"12345678", 9, &result, 16), 8);
-    ck_assert_uint_eq(result, 0x12345678);
-
-    ck_assert_uint_eq(UA_readNumberWithBase((UA_Byte*)"123456789", 9, &result, 8), 7);
-    ck_assert_uint_eq(result, 01234567);
-}
-END_TEST
-
-
-START_TEST(StatusCode_msg) {
-#ifndef UA_ENABLE_STATUSCODE_DESCRIPTIONS
-    return;
-#endif
-        // first element in table
-    ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_GOOD), "Good");
-
-        // just some randomly picked status codes
-    ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_BADNOCOMMUNICATION),
-                     "BadNoCommunication");
-
-    ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_GOODNODATA), "GoodNoData");
-
-        // last element in table
-    ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_BADMAXCONNECTIONSREACHED),
-                     "BadMaxConnectionsReached");
-
-        // an invalid status code
-    ck_assert_str_eq(UA_StatusCode_name(0x80123456), "Unknown StatusCode");
-}
-END_TEST
-
-
-static void assertNodeIdString(const UA_String *gotStr, const char* expectedStr) {
-    size_t expectedStringLength = strlen(expectedStr);
-    ck_assert_uint_eq(gotStr->length, expectedStringLength);
-    char *gotChars = (char*)UA_malloc(gotStr->length+1);
-    memcpy(gotChars, gotStr->data, gotStr->length);
-    gotChars[gotStr->length] = 0;
-    ck_assert_str_eq(gotChars, expectedStr);
-    UA_free(gotChars);
-}
-
-START_TEST(idToStringNull) {
-    UA_String str = UA_STRING_NULL;
-    ck_assert_int_eq(UA_NodeId_toString(NULL, &str), UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(idToStringNumeric) {
-    UA_NodeId n;
-    UA_String str = UA_STRING_NULL;
-
-    n = UA_NODEID_NUMERIC(0,0);
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "i=0");
-
-    n = UA_NODEID_NUMERIC(12345,1234567890);
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=12345;i=1234567890");
-
-    n = UA_NODEID_NUMERIC(0xFFFF,0xFFFFFFFF);
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=65535;i=4294967295");
-
-    UA_String_deleteMembers(&str);
-} END_TEST
-
-START_TEST(idToStringString) {
-    UA_NodeId n;
-    UA_String str = UA_STRING_NULL;
-
-    n = UA_NODEID_STRING(0,"");
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "s=");
-
-    n = UA_NODEID_STRING(54321,"Some String");
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=54321;s=Some String");
-
-    n = UA_NODEID_STRING(0,"Some String");
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "s=Some String");
-
-    UA_String_deleteMembers(&str);
-} END_TEST
-
-START_TEST(idToStringGuid) {
-    UA_NodeId n;
-    UA_String str = UA_STRING_NULL;
-
-    UA_Guid g = UA_GUID_NULL;
-
-    n = UA_NODEID_GUID(0,UA_GUID_NULL);
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "g=00000000-0000-0000-0000-000000000000");
-
-    g.data1 = 0xA123456C;
-    g.data2 = 0x0ABC;
-    g.data3 = 0x1A2B;
-    g.data4[0] = 0x81;
-    g.data4[1] = 0x5F;
-    g.data4[2] = 0x68;
-    g.data4[3] = 0x72;
-    g.data4[4] = 0x12;
-    g.data4[5] = 0xAA;
-    g.data4[6] = 0xEE;
-    g.data4[7] = 0x1B;
-
-    n = UA_NODEID_GUID(65535,g);
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=65535;g=a123456c-0abc-1a2b-815f-687212aaee1b");
-
-    g.data1 = 0xFFFFFFFF;
-    g.data2 = 0xFFFF;
-    g.data3 = 0xFFFF;
-    g.data4[0] = 0xFF;
-    g.data4[1] = 0xFF;
-    g.data4[2] = 0xFF;
-    g.data4[3] = 0xFF;
-    g.data4[4] = 0xFF;
-    g.data4[5] = 0xFF;
-    g.data4[6] = 0xFF;
-    g.data4[7] = 0xFF;
-
-    n = UA_NODEID_GUID(65535,g);
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=65535;g=ffffffff-ffff-ffff-ffff-ffffffffffff");
-
-    UA_String_deleteMembers(&str);
-} END_TEST
-
-START_TEST(idToStringByte) {
-    UA_NodeId n;
-    UA_String str = UA_STRING_NULL;
-
-    n.namespaceIndex = 0;
-    n.identifierType = UA_NODEIDTYPE_BYTESTRING;
-    n.identifier.byteString.data = NULL;
-    n.identifier.byteString.length = 0;
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "b=");
-
-    UA_ByteString bs = UA_BYTESTRING_NULL;
-
-    bs.length = 1;
-    bs.data = (UA_Byte*)UA_malloc(bs.length);
-    bs.data[0] = 0x00;
-    n.identifier.byteString = bs;
-    n.namespaceIndex = 123;
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=123;b=AA==");
-    UA_free(bs.data);
-
-    bs.length = 1;
-    bs.data = (UA_Byte*)UA_malloc(bs.length);
-    bs.data[0] = 0x2C;
-    n.identifier.byteString = bs;
-    n.namespaceIndex = 123;
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=123;b=LA==");
-    UA_free(bs.data);
-
-    bs.length = 5;
-    bs.data = (UA_Byte*)UA_malloc(bs.length);
-    bs.data[0] = 0x21;
-    bs.data[1] = 0x83;
-    bs.data[2] = 0xE0;
-    bs.data[3] = 0x54;
-    bs.data[4] = 0x78;
-    n.identifier.byteString = bs;
-    n.namespaceIndex = 599;
-    UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=599;b=IYPgVHg=");
-    UA_free(bs.data);
-
-    UA_String_deleteMembers(&str);
-} END_TEST
-
-
-START_TEST(idOrderNs) {
-    UA_NodeId id_ns1 = UA_NODEID_NUMERIC(1, 12345);
-    UA_NodeId id_ns3 = UA_NODEID_NUMERIC(3, 12345);
-
-    ck_assert(UA_NodeId_order(&id_ns1, &id_ns1) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_ns1, &id_ns3) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_ns3, &id_ns1) == UA_ORDER_MORE);
-} END_TEST
-
-START_TEST(idOrderIdentifier) {
-    UA_NodeId id_num = UA_NODEID_NUMERIC(1, 12345);
-    UA_NodeId id_str = UA_NODEID_STRING(1, "asdf");
-
-    ck_assert(UA_NodeId_order(&id_num, &id_num) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_num, &id_str) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_str, &id_num) == UA_ORDER_MORE);
-} END_TEST
-
-START_TEST(idOrderNumeric) {
-    UA_NodeId id_num_12345 = UA_NODEID_NUMERIC(1, 12345);
-    UA_NodeId id_num_23456 = UA_NODEID_NUMERIC(1, 23456);
-
-    ck_assert(UA_NodeId_order(&id_num_12345, &id_num_12345) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_num_12345, &id_num_23456) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_num_23456, &id_num_12345) == UA_ORDER_MORE);
-} END_TEST
-
-START_TEST(idOrderGuid) {
-
-    // See also https://github.com/open62541/open62541/pull/2904#issuecomment-514111395
-
-    // 00000000-FFFF-FFFF-FFFFFFFFFFFF,
-    UA_Guid guid1 = {
-            0,
-            0xffff,
-            0xffff,
-            { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
-    };
-    // 00000001-0000-0000-000000000000
-    UA_Guid guid2 = {
-            0x1,
-            0,
-            0,
-            { 0, 0, 0, 0, 0, 0, 0, 0 }
-    };
-    // 00000000-0000-FFFF-FFFFFFFFFFFF
-    UA_Guid guid3 = {
-            0,
-            0,
-            0xffff,
-            { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
-    };
-    // 00000000-0001-0000-000000000000
-    UA_Guid guid4 = {
-            0,
-            0x1,
-            0,
-            { 0, 0, 0, 0, 0, 0, 0, 0 }
-    };
-    // 00000000-0000-0000-FFFFFFFFFFFF
-    UA_Guid guid5 = {
-            0,
-            0,
-            0,
-            { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }
-    };
-    // 00000000-0000-0001-000000000000
-    UA_Guid guid6 = {
-            0,
-            0,
-            0x1,
-            { 0, 0, 0, 0, 0, 0, 0, 0 }
-    };
-    // 00000000-0000-0000-000000000000
-    UA_Guid guid7 = {
-            0,
-            0,
-            0,
-            { 0, 0, 0, 0, 0, 0, 0, 0 }
-    };
-    // 00000000-0000-0000-000000000001
-    UA_Guid guid8 = {
-            0,
-            0,
-            0,
-            { 0, 0, 0, 0, 0, 0, 0, 0x1 }
-    };
-
-
-    UA_NodeId id_guid_1 = UA_NODEID_GUID(1, guid1);
-    UA_NodeId id_guid_2 = UA_NODEID_GUID(1, guid2);
-    ck_assert(UA_NodeId_order(&id_guid_1, &id_guid_1) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_guid_1, &id_guid_2) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_guid_2, &id_guid_1) == UA_ORDER_MORE);
-
-    UA_NodeId id_guid_3 = UA_NODEID_GUID(1, guid3);
-    UA_NodeId id_guid_4 = UA_NODEID_GUID(1, guid4);
-    ck_assert(UA_NodeId_order(&id_guid_3, &id_guid_3) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_guid_3, &id_guid_4) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_guid_4, &id_guid_3) == UA_ORDER_MORE);
-
-    UA_NodeId id_guid_5 = UA_NODEID_GUID(1, guid5);
-    UA_NodeId id_guid_6 = UA_NODEID_GUID(1, guid6);
-    ck_assert(UA_NodeId_order(&id_guid_5, &id_guid_5) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_guid_5, &id_guid_2) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_guid_6, &id_guid_5) == UA_ORDER_MORE);
-
-    UA_NodeId id_guid_7 = UA_NODEID_GUID(1, guid7);
-    UA_NodeId id_guid_8 = UA_NODEID_GUID(1, guid8);
-    ck_assert(UA_NodeId_order(&id_guid_7, &id_guid_7) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_guid_7, &id_guid_8) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_guid_8, &id_guid_7) == UA_ORDER_MORE);
-
-} END_TEST
-
-START_TEST(idOrderString) {
-    UA_NodeId id_str_a = UA_NODEID_STRING(1, "aaaaa");
-    UA_NodeId id_str_b = UA_NODEID_STRING(1, "baa");
-
-    ck_assert(UA_NodeId_order(&id_str_a, &id_str_a) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_str_a, &id_str_b) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_str_b, &id_str_a) == UA_ORDER_MORE);
-
-    UA_NodeId id_str_c = UA_NODEID_STRING(1, "cddd");
-    UA_NodeId id_str_d = UA_NODEID_STRING(1, "dddd");
-
-    ck_assert(UA_NodeId_order(&id_str_c, &id_str_c) == UA_ORDER_EQ);
-    ck_assert(UA_NodeId_order(&id_str_c, &id_str_d) == UA_ORDER_LESS);
-    ck_assert(UA_NodeId_order(&id_str_d, &id_str_c) == UA_ORDER_MORE);
-} END_TEST
-
-
-static Suite* testSuite_Utils(void) {
-    Suite *s = suite_create("Utils");
-    TCase *tc_endpointUrl_split = tcase_create("EndpointUrl_split");
-    tcase_add_test(tc_endpointUrl_split, EndpointUrl_split);
-    suite_add_tcase(s,tc_endpointUrl_split);
-    TCase *tc_endpointUrl_ethernet = tcase_create("EndpointUrl_ethernet");
-    tcase_add_test(tc_endpointUrl_ethernet, EndpointUrl_ethernet);
-    suite_add_tcase(s,tc_endpointUrl_ethernet);
-    TCase *tc_utils = tcase_create("Utils");
-    tcase_add_test(tc_utils, readNumber);
-    tcase_add_test(tc_utils, readNumberWithBase);
-    tcase_add_test(tc_utils, StatusCode_msg);
-    suite_add_tcase(s,tc_utils);
-
-
-    TCase *tc1 = tcase_create("test nodeid string");
-    tcase_add_test(tc1, idToStringNull);
-    tcase_add_test(tc1, idToStringNumeric);
-    tcase_add_test(tc1, idToStringString);
-    tcase_add_test(tc1, idToStringGuid);
-    tcase_add_test(tc1, idToStringByte);
-    suite_add_tcase(s, tc1);
-
-    TCase *tc2 = tcase_create("test nodeid order");
-    tcase_add_test(tc1, idOrderNs);
-    tcase_add_test(tc1, idOrderIdentifier);
-    tcase_add_test(tc1, idOrderNumeric);
-    tcase_add_test(tc1, idOrderGuid);
-    tcase_add_test(tc1, idOrderString);
-    suite_add_tcase(s, tc2);
-
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Utils();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client.c b/ext/open62541/tests/client/check_client.c
deleted file mode 100644
index 48b5360..0000000
--- a/ext/open62541/tests/client/check_client.c
+++ /dev/null
@@ -1,369 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-#include "ua_server_internal.h"
-
-#include <check.h>
-#include <stdlib.h>
-
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-static void
-addVariable(size_t size) {
-    /* Define the attribute of the myInteger variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32* array = (UA_Int32*)UA_malloc(size * sizeof(UA_Int32));
-    memset(array, 0, size * sizeof(UA_Int32));
-    UA_Variant_setArray(&attr.value, array, size, &UA_TYPES[UA_TYPES_INT32]);
-
-    char name[] = "my.variable";
-    attr.description = UA_LOCALIZEDTEXT("en-US", name);
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", name);
-    attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-
-    /* Add the variable node to the information model */
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, name);
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, name);
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                              parentReferenceNodeId, myIntegerName,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                              attr, NULL, NULL);
-
-    UA_free(array);
-}
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-    addVariable(16366);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(Client_connect) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_connect_username) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect_username(client, "opc.tcp://localhost:4840", "user1", "password");
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_endpoints) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_StatusCode retval = UA_Client_getEndpoints(client, "opc.tcp://localhost:4840",
-                                                  &endpointArraySize, &endpointArray);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(endpointArraySize > 0);
-
-    UA_Array_delete(endpointArray,endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_endpoints_empty) {
-    /* Issue a getEndpoints call with empty endpointUrl.
-     * Using UA_Client_getEndpoints automatically passes the client->endpointUrl as requested endpointUrl.
-     * The spec says:
-     * The Server should return a suitable default URL if it does not recognize the HostName in the URL.
-     *
-     * See https://github.com/open62541/open62541/issues/775
-     */
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_GetEndpointsRequest request;
-    UA_GetEndpointsRequest_init(&request);
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-
-    UA_GetEndpointsResponse response;
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]);
-
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    ck_assert(response.endpointsSize > 0);
-
-    UA_GetEndpointsResponse_deleteMembers(&response);
-    UA_GetEndpointsRequest_deleteMembers(&request);
-
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_read) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant val;
-    UA_NodeId nodeId = UA_NODEID_STRING(1, "my.variable");
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_renewSecureChannel) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* Forward the time */
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_fakeSleep((UA_UInt32)((UA_Double)cc->secureChannelLifeTime * 0.8));
-
-    /* Now read */
-    UA_Variant val;
-    UA_NodeId nodeId = UA_NODEID_STRING(1, "my.variable");
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-
-} END_TEST
-
-START_TEST(Client_renewSecureChannelWithActiveSubscription) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    cc->secureChannelLifeTime = 10000;
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    request.requestedLifetimeCount = 1000;
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-
-    (void)response;
-
-    for(int i = 0; i < 15; ++i) {
-        UA_sleep_ms(1000);
-        retval = UA_Client_run_iterate(client, 0);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-} END_TEST
-
-START_TEST(Client_reconnect) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant val;
-    UA_NodeId nodeId = UA_NODEID_STRING(1, "my.variable");
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    // restart server to test reconnect
-    teardown();
-    setup();
-
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADCONNECTIONCLOSED);
-
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_msg(retval == UA_STATUSCODE_GOOD, UA_StatusCode_name(retval));
-
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_delete_without_connect) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    ck_assert(client != NULL);
-    UA_Client_delete(client);
-}
-END_TEST
-
-// TODO ACTIVATE THE TESTS WHEN SESSION RECOVERY IS GOOD
-#ifdef UA_SESSION_RECOVERY
-
-START_TEST(Client_activateSessionClose) {
-    // restart server
-    teardown();
-    setup();
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 0);
-
-    UA_ClientConfig clientConfig = UA_ClientConfig_default;
-    UA_Client *client = UA_Client_new(clientConfig);
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 1);
-
-    UA_Variant val;
-    UA_NodeId nodeId = UA_NODEID_STRING(1, "my.variable");
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 1);
-
-    nodeId = UA_NODEID_STRING(1, "my.variable");
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 0);
-}
-END_TEST
-
-START_TEST(Client_activateSessionTimeout) {
-    // restart server
-    teardown();
-    setup();
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 0);
-
-    UA_Client *client = UA_Client_new(UA_ClientConfig_default);
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 1);
-
-    UA_Variant val;
-    UA_Variant_init(&val);
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    /* Simulate network cable unplugged (no response from server) */
-    UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-    UA_Variant_init(&val);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADCONNECTIONCLOSED);
-
-    ck_assert_msg(UA_Client_getState(client) == UA_CLIENTSTATE_DISCONNECTED);
-
-    UA_Client_recvTesting_result = UA_STATUSCODE_GOOD;
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 1);
-
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_delete(client);
-
-    ck_assert_uint_eq(server->sessionManager.currentSessionCount, 0);
-}
-END_TEST
-
-#endif /* UA_SESSION_RECOVERY */
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Client");
-    TCase *tc_client = tcase_create("Client Basic");
-    tcase_add_checked_fixture(tc_client, setup, teardown);
-    tcase_add_test(tc_client, Client_connect);
-    tcase_add_test(tc_client, Client_connect_username);
-    tcase_add_test(tc_client, Client_delete_without_connect);
-    tcase_add_test(tc_client, Client_endpoints);
-    tcase_add_test(tc_client, Client_endpoints_empty);
-    tcase_add_test(tc_client, Client_read);
-    suite_add_tcase(s,tc_client);
-    TCase *tc_client_reconnect = tcase_create("Client Reconnect");
-    tcase_add_checked_fixture(tc_client_reconnect, setup, teardown);
-    tcase_add_test(tc_client_reconnect, Client_renewSecureChannel);
-    tcase_add_test(tc_client_reconnect, Client_renewSecureChannelWithActiveSubscription);
-    tcase_add_test(tc_client_reconnect, Client_reconnect);
-#ifdef UA_SESSION_RECOVERY
-    tcase_add_test(tc_client_reconnect, Client_activateSessionClose);
-    tcase_add_test(tc_client_reconnect, Client_activateSessionTimeout);
-#endif /* UA_SESSION_RECOVERY */
-    suite_add_tcase(s,tc_client_reconnect);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client_async.c b/ext/open62541/tests/client/check_client_async.c
deleted file mode 100644
index c17dd3e..0000000
--- a/ext/open62541/tests/client/check_client_async.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel_async.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_ServerConfig *config;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while (running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void asyncReadCallback(UA_Client *client, void *userdata,
-        UA_UInt32 requestId, const UA_ReadResponse *response) {
-    UA_UInt16 *asyncCounter = (UA_UInt16*) userdata;
-    if (response->responseHeader.serviceResult == UA_STATUSCODE_BADTIMEOUT) {
-        (*asyncCounter) = 9999;
-        UA_fakeSleep(10);
-    } else {
-        (*asyncCounter)++;
-        UA_fakeSleep(10);
-    }
-}
-
-static void asyncReadValueAtttributeCallback(UA_Client *client, void *userdata,
-        UA_UInt32 requestId, UA_Variant *var) {
-    UA_UInt16 *asyncCounter = (UA_UInt16*) userdata;
-    (*asyncCounter)++;
-    UA_fakeSleep(10);
-}
-
-START_TEST(Client_highlevel_async_readValue) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig *clientConfig = UA_Client_getConfig(client);
-        UA_ClientConfig_setDefault(clientConfig);
-        clientConfig->outStandingPublishRequests = 0;
-
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Client_recv = client->connection.recv;
-        client->connection.recv = UA_Client_recvTesting;
-
-        UA_UInt16 asyncCounter = 0;
-
-        UA_UInt32 reqId = 0;
-        retval = UA_Client_readValueAttribute_async(client,
-                UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME),
-                (UA_ClientAsyncReadValueAttributeCallback) asyncReadValueAtttributeCallback,
-                (void*)&asyncCounter, &reqId);
-
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        /* Process async responses during 1s */
-        UA_Client_run_iterate(client, 999 + 1);
-
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(asyncCounter, 1);
-
-        /* Simulate network cable unplugged (no response from server) */
-        UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-} END_TEST
-
-START_TEST(Client_read_async) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig *clientConfig = UA_Client_getConfig(client);
-        UA_ClientConfig_setDefault(clientConfig);
-
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_UInt16 asyncCounter = 0;
-
-        UA_ReadRequest rr;
-        UA_ReadRequest_init(&rr);
-
-        UA_ReadValueId rvid;
-        UA_ReadValueId_init(&rvid);
-        rvid.attributeId = UA_ATTRIBUTEID_VALUE;
-        rvid.nodeId = UA_NODEID_NUMERIC(0,
-                UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-
-        rr.nodesToRead = &rvid;
-        rr.nodesToReadSize = 1;
-
-        /* Send 100 requests */
-        for (size_t i = 0; i < 100; i++) {
-            retval = __UA_Client_AsyncService(client, &rr,
-                    &UA_TYPES[UA_TYPES_READREQUEST],
-                    (UA_ClientAsyncServiceCallback) asyncReadCallback,
-                    &UA_TYPES[UA_TYPES_READRESPONSE], &asyncCounter, NULL);
-            ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        }
-
-        /* Process async responses during 1s */
-        retval = UA_Client_run_iterate(client, 999);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(asyncCounter, 100);
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }END_TEST
-
-START_TEST(Client_read_async_timed) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig *clientConfig = UA_Client_getConfig(client);
-        UA_ClientConfig_setDefault(clientConfig);
-        clientConfig->outStandingPublishRequests = 0;
-
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Client_recv = client->connection.recv;
-        client->connection.recv = UA_Client_recvTesting;
-
-        UA_UInt16 asyncCounter = 0;
-
-        UA_ReadRequest rr;
-        UA_ReadRequest_init(&rr);
-
-        UA_ReadValueId rvid;
-        UA_ReadValueId_init(&rvid);
-        rvid.attributeId = UA_ATTRIBUTEID_VALUE;
-        rvid.nodeId = UA_NODEID_NUMERIC(0,
-                UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-
-        rr.nodesToRead = &rvid;
-        rr.nodesToReadSize = 1;
-
-        retval = __UA_Client_AsyncServiceEx(client, &rr,
-                &UA_TYPES[UA_TYPES_READREQUEST],
-                (UA_ClientAsyncServiceCallback) asyncReadCallback,
-                &UA_TYPES[UA_TYPES_READRESPONSE], &asyncCounter, NULL, 999);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        /* Process async responses during 1s */
-        retval = UA_Client_run_iterate(client, 999 + 1);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(asyncCounter, 1);
-
-        /* Simulate network cable unplugged (no response from server) */
-        UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-        retval = __UA_Client_AsyncServiceEx(client, &rr,
-                &UA_TYPES[UA_TYPES_READREQUEST],
-                (UA_ClientAsyncServiceCallback) asyncReadCallback,
-                &UA_TYPES[UA_TYPES_READRESPONSE], &asyncCounter, NULL, 100);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        /* Process async responses during 1s */
-        UA_Client_run_iterate(client, 100 + 1);
-        ck_assert_uint_eq(asyncCounter, 9999);
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }END_TEST
-
-static UA_Boolean inactivityCallbackTriggered = false;
-
-static void inactivityCallback(UA_Client *client) {
-    inactivityCallbackTriggered = true;
-}
-
-START_TEST(Client_connectivity_check) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig *clientConfig = UA_Client_getConfig(client);
-        UA_ClientConfig_setDefault(clientConfig);
-        clientConfig->outStandingPublishRequests = 0;
-        clientConfig->inactivityCallback = inactivityCallback;
-        clientConfig->connectivityCheckInterval = 1000;
-
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Client_recv = client->connection.recv;
-        client->connection.recv = UA_Client_recvTesting;
-
-        inactivityCallbackTriggered = false;
-
-        retval = UA_Client_run_iterate(client, 1000 + 1);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(inactivityCallbackTriggered, false);
-
-        /* Simulate network cable unplugged (no response from server) */
-        UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-        retval = UA_Client_run_iterate(client,
-                (UA_UInt16) (1000 + 1 + clientConfig->timeout));
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(inactivityCallbackTriggered, true);
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }END_TEST
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Client");
-    TCase *tc_client = tcase_create("Client Basic");
-    tcase_add_checked_fixture(tc_client, setup, teardown);
-    tcase_add_test(tc_client, Client_read_async);
-    tcase_add_test(tc_client, Client_read_async_timed);
-    tcase_add_test(tc_client, Client_connectivity_check);
-    tcase_add_test(tc_client, Client_highlevel_async_readValue);
-
-    suite_add_tcase(s, tc_client);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client_async_connect.c b/ext/open62541/tests/client/check_client_async_connect.c
deleted file mode 100644
index aa98850..0000000
--- a/ext/open62541/tests/client/check_client_async_connect.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel_async.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-
-#include <check.h>
-#include <stdlib.h>
-
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void
-onConnect(UA_Client *Client, void *connected,
-          UA_UInt32 requestId, void *response) {
-    if (UA_Client_getState (Client) == UA_CLIENTSTATE_SESSION)
-        *(UA_Boolean *)connected = true;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-    /* Waiting server is up */
-    UA_comboSleep(1000);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void
-asyncBrowseCallback(UA_Client *Client, void *userdata,
-                  UA_UInt32 requestId, UA_BrowseResponse *response) {
-    UA_UInt16 *asyncCounter = (UA_UInt16*)userdata;
-    (*asyncCounter)++;
-}
-
-START_TEST(Client_connect_async){
-    UA_StatusCode retval;
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_Boolean connected = false;
-    UA_Client_connect_async(client, "opc.tcp://localhost:4840", onConnect, &connected);
-    /*Windows needs time to response*/
-    UA_sleep_ms(100);
-    UA_UInt32 reqId = 0;
-    UA_UInt16 asyncCounter = 0;
-    UA_BrowseRequest bReq;
-    UA_BrowseRequest_init (&bReq);
-    bReq.requestedMaxReferencesPerNode = 0;
-    bReq.nodesToBrowse = UA_BrowseDescription_new ();
-    bReq.nodesToBrowseSize = 1;
-    bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER);
-    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; /* return everything */
-    /* Connected gets updated when client is connected */
-
-    do {
-        if(connected) {
-            /* If not connected requests are not sent */
-            UA_Client_sendAsyncBrowseRequest (client, &bReq, asyncBrowseCallback,
-                                              &asyncCounter, &reqId);
-        }
-        /* Manual clock for unit tests */
-        UA_comboSleep(20);
-        retval = UA_Client_run_iterate(client, 0);
-        /*fix infinite loop, but why is server occasionally shut down in Appveyor?!*/
-        if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED)
-            break;
-    } while(reqId < 10);
-
-    UA_BrowseRequest_deleteMembers(&bReq);
-    ck_assert_uint_eq(connected, true);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    /* With default setting the client uses 4 requests to connect */
-    ck_assert_uint_eq(asyncCounter, 10-4);
-    UA_Client_disconnect(client);
-    UA_Client_delete (client);
-}
-END_TEST
-
-START_TEST(Client_no_connection) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_Boolean connected = false;
-    UA_StatusCode retval =
-        UA_Client_connect_async(client, "opc.tcp://localhost:4840", onConnect, &connected);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-    //simulating unconnected server
-    UA_Client_recvTesting_result = UA_STATUSCODE_BADCONNECTIONCLOSED;
-    retval = UA_Client_run_iterate(client, 0);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADCONNECTIONCLOSED);
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_without_run_iterate) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_Boolean connected = false;
-    UA_Client_connect_async(client, "opc.tcp://localhost:4840", onConnect, &connected);
-    UA_Client_delete(client);
-}
-END_TEST
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Client");
-    TCase *tc_client_connect = tcase_create("Client Connect Async");
-    tcase_add_checked_fixture(tc_client_connect, setup, teardown);
-    tcase_add_test(tc_client_connect, Client_connect_async);
-    tcase_add_test(tc_client_connect, Client_no_connection);
-    tcase_add_test(tc_client_connect, Client_without_run_iterate);
-    suite_add_tcase(s,tc_client_connect);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client_highlevel.c b/ext/open62541/tests/client/check_client_highlevel.c
deleted file mode 100644
index e86d0e1..0000000
--- a/ext/open62541/tests/client/check_client_highlevel.c
+++ /dev/null
@@ -1,1090 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include <check.h>
-
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-UA_Client *client;
-
-#define CUSTOM_NS "http://open62541.org/ns/test"
-#define CUSTOM_NS_UPPER "http://open62541.org/ns/Test"
-
-THREAD_CALLBACK(serverloop) {
-    while (running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    ck_assert_uint_eq(2, UA_Server_addNamespace(server, CUSTOM_NS));
-
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-
-static void teardown(void) {
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(Misc_State) {
-    UA_ClientState state = UA_Client_getState(client);
-    ck_assert_uint_eq(state, UA_CLIENTSTATE_SESSION);
-}
-END_TEST
-
-START_TEST(Misc_NamespaceGetIndex) {
-    UA_UInt16 idx;
-    UA_String ns = UA_STRING(CUSTOM_NS);
-    UA_StatusCode retval = UA_Client_NamespaceGetIndex(client, &ns, &idx);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(idx, 2);
-
-    // namespace uri is case sensitive
-    ns = UA_STRING(CUSTOM_NS_UPPER);
-    retval = UA_Client_NamespaceGetIndex(client, &ns, &idx);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADNOTFOUND);
-} END_TEST
-
-UA_NodeId newReferenceTypeId;
-UA_NodeId newObjectTypeId;
-UA_NodeId newDataTypeId;
-UA_NodeId newVariableTypeId;
-UA_NodeId newObjectId;
-UA_NodeId newVariableId;
-UA_NodeId newMethodId;
-UA_NodeId newViewId;
-
-#ifdef UA_ENABLE_NODEMANAGEMENT
-
-START_TEST(Node_Add) {
-    UA_StatusCode retval;
-
-    // Create custom reference type 'HasSubSubType' as child of HasSubtype
-    {
-        UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Some HasSubSubType");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "HasSubSubType");
-        retval = UA_Client_addReferenceTypeNode(client, UA_NODEID_NULL,
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                                UA_QUALIFIEDNAME(1, "HasSubSubType"), attr,
-                                                &newReferenceTypeId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // Create TestObjectType SubType within BaseObjectType
-    {
-        UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Some TestObjectType");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "TestObjectType");
-        retval = UA_Client_addObjectTypeNode(client, UA_NODEID_NULL,
-                                             UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                             UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                             UA_QUALIFIEDNAME(1, "TestObjectType"), attr, &newObjectTypeId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    /* Minimal nodeset does not contain UA_NS0ID_INTEGER node */
-    #ifdef UA_GENERATED_NAMESPACE_ZERO
-    // Create Int128 DataType within Integer Datatype
-    {
-        UA_DataTypeAttributes attr = UA_DataTypeAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Some Int128");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Int128");
-        retval = UA_Client_addDataTypeNode(client, UA_NODEID_NULL,
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_INTEGER),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                           UA_QUALIFIEDNAME(1, "Int128"), attr, &newDataTypeId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-    #endif
-
-    // Create PointType VariableType within BaseDataVariableType
-    {
-        UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default;
-        attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-        attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-        UA_UInt32 arrayDims[1] = {2};
-        attr.arrayDimensions = arrayDims;
-        attr.arrayDimensionsSize = 1;
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "PointType");
-
-        /* a matching default value is required */
-        UA_Double zero[2] = {0.0, 0.0};
-        UA_Variant_setArray(&attr.value, zero, 2, &UA_TYPES[UA_TYPES_INT32]);
-        retval = UA_Client_addVariableTypeNode(client, UA_NODEID_NULL,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE),
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                               UA_QUALIFIEDNAME(1, "PointType"), attr, &newVariableTypeId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Coordinates Object within ObjectsFolder
-    {
-        UA_ObjectAttributes attr = UA_ObjectAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Some Coordinates");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Coordinates");
-        retval = UA_Client_addObjectNode(client, UA_NODEID_NULL,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         UA_QUALIFIEDNAME(1, "Coordinates"),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), attr, &newObjectId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Variable 'Top' within Coordinates Object
-    {
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Top Coordinate");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Top");
-        UA_Int32 values[2] = {10, 20};
-        UA_Variant_setArray(&attr.value, values, 2, &UA_TYPES[UA_TYPES_INT32]);
-        attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-        attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-        UA_UInt32 arrayDims[1] = {2};
-        attr.arrayDimensions = arrayDims;
-        attr.arrayDimensionsSize = 1;
-        retval = UA_Client_addVariableNode(client, UA_NODEID_NULL,
-                                           newObjectId,
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                           UA_QUALIFIEDNAME(1, "Top"),
-                                           newVariableTypeId, attr, &newVariableId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Method 'Dummy' within Coordinates Object.
-    {
-        UA_MethodAttributes attr = UA_MethodAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Dummy method");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Dummy");
-        attr.executable = true;
-        attr.userExecutable = true;
-        retval = UA_Client_addMethodNode(client, UA_NODEID_NULL,
-                                         newObjectId,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT),
-                                         UA_QUALIFIEDNAME(1, "Dummy"),
-                                         attr, &newMethodId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create View 'AllTopCoordinates' whithin Views Folder
-    {
-        UA_ViewAttributes attr = UA_ViewAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "List of all top coordinates");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "AllTopCoordinates");
-        retval = UA_Client_addViewNode(client, UA_NODEID_NULL,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_VIEWSFOLDER),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                       UA_QUALIFIEDNAME(1, "AllTopCoordinates"),
-                                       attr, &newViewId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    UA_ExpandedNodeId target = UA_EXPANDEDNODEID_NULL;
-    target.nodeId = newObjectId;
-
-    // Add 'Top' to view
-    retval = UA_Client_addReference(client, newViewId, UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                    UA_TRUE, UA_STRING_NULL, target, UA_NODECLASS_VARIABLE);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // Delete 'Top' from view
-    retval = UA_Client_deleteReference(client, newViewId,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                       true, target, true);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // Delete 'AllTopCoordinates' view
-    retval = UA_Client_deleteNode(client, newViewId, UA_TRUE);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-unsigned int iteratedNodeCount = 0;
-UA_NodeId iteratedNodes[4];
-
-static UA_StatusCode
-nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle) {
-    if (isInverse || (referenceTypeId.identifierType == UA_NODEIDTYPE_NUMERIC &&
-                      referenceTypeId.identifier.numeric == UA_NS0ID_HASTYPEDEFINITION))
-        return UA_STATUSCODE_GOOD;
-
-    if (iteratedNodeCount >= 4)
-        return UA_STATUSCODE_BADINDEXRANGEINVALID;
-
-    UA_NodeId_copy(&childId, &iteratedNodes[iteratedNodeCount]);
-    iteratedNodeCount++;
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-START_TEST(Node_Browse) {
-    // Browse node in server folder
-    UA_BrowseRequest bReq;
-    UA_BrowseRequest_init(&bReq);
-    // normally is set to 0, to get all the nodes, but we want to test browse next
-    bReq.requestedMaxReferencesPerNode = 1;
-    bReq.nodesToBrowse = UA_BrowseDescription_new();
-    bReq.nodesToBrowseSize = 1;
-    bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL;
-
-    UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);
-    ck_assert_uint_eq(bResp.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bResp.resultsSize, 1);
-    ck_assert_uint_eq(bResp.results[0].statusCode, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bResp.results[0].referencesSize, 1);
-
-    /* References might have a different order in generated nodesets */
-    /* UA_ReferenceDescription *ref = &(bResp.results[0].references[0]); */
-    /* ck_assert_uint_eq(ref->nodeId.nodeId.identifier.numeric, UA_NS0ID_SERVERTYPE); */
-
-    // browse next
-    UA_BrowseNextRequest bNextReq;
-    UA_BrowseNextRequest_init(&bNextReq);
-    // normally is set to 0, to get all the nodes, but we want to test browse next
-    bNextReq.releaseContinuationPoints = UA_FALSE;
-    bNextReq.continuationPoints = &bResp.results[0].continuationPoint;
-    bNextReq.continuationPointsSize = 1;
-
-    UA_BrowseNextResponse bNextResp = UA_Client_Service_browseNext(client, bNextReq);
-
-    ck_assert_uint_eq(bNextResp.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bNextResp.resultsSize, 1);
-    ck_assert_uint_eq(bNextResp.results[0].statusCode, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bNextResp.results[0].referencesSize, 1);
-
-    /* ref = &(bNextResp.results[0].references[0]); */
-    /* ck_assert_uint_eq(ref->nodeId.nodeId.identifier.numeric, UA_NS0ID_SERVER_NAMESPACEARRAY); */
-
-    UA_BrowseNextResponse_deleteMembers(&bNextResp);
-
-    bNextResp = UA_Client_Service_browseNext(client, bNextReq);
-    ck_assert_uint_eq(bNextResp.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bNextResp.resultsSize, 1);
-    ck_assert_uint_eq(bNextResp.results[0].statusCode, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bNextResp.results[0].referencesSize, 1);
-
-    /* ref = &(bNextResp.results[0].references[0]); */
-    /* ck_assert_uint_eq(ref->nodeId.nodeId.identifier.numeric, UA_NS0ID_SERVER_SERVERARRAY); */
-
-    UA_BrowseNextResponse_deleteMembers(&bNextResp);
-
-    // release continuation point. Result is then empty
-    bNextReq.releaseContinuationPoints = UA_TRUE;
-    bNextResp = UA_Client_Service_browseNext(client, bNextReq);
-    UA_BrowseNextResponse_deleteMembers(&bNextResp);
-    ck_assert_uint_eq(bNextResp.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(bNextResp.resultsSize, 0);
-
-    UA_BrowseRequest_deleteMembers(&bReq);
-    UA_BrowseResponse_deleteMembers(&bResp);
-    // already deleted by browse request
-    bNextReq.continuationPoints = NULL;
-    bNextReq.continuationPointsSize = 0;
-    UA_BrowseNextRequest_deleteMembers(&bNextReq);
-}
-END_TEST
-
-START_TEST(Node_Register) {
-    UA_RegisterNodesRequest req;
-    UA_RegisterNodesRequest_init(&req);
-
-    req.nodesToRegister = UA_NodeId_new();
-    req.nodesToRegister[0] = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    req.nodesToRegisterSize = 1;
-
-    UA_RegisterNodesResponse res = UA_Client_Service_registerNodes(client, req);
-
-    ck_assert_uint_eq(res.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(res.registeredNodeIdsSize, 1);
-
-    UA_UnregisterNodesRequest reqUn;
-    UA_UnregisterNodesRequest_init(&reqUn);
-
-    reqUn.nodesToUnregister = UA_NodeId_new();
-    reqUn.nodesToUnregister[0] = res.registeredNodeIds[0];
-    reqUn.nodesToUnregisterSize = 1;
-
-    UA_UnregisterNodesResponse resUn = UA_Client_Service_unregisterNodes(client, reqUn);
-    ck_assert_uint_eq(resUn.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    UA_UnregisterNodesRequest_deleteMembers(&reqUn);
-    UA_UnregisterNodesResponse_deleteMembers(&resUn);
-    UA_RegisterNodesRequest_deleteMembers(&req);
-    UA_RegisterNodesResponse_deleteMembers(&res);
-}
-END_TEST
-
-
-
-// NodeIds for ReadWrite testing
-UA_NodeId nodeReadWriteUnitTest;
-UA_NodeId nodeReadWriteArray;
-UA_NodeId nodeReadWriteInt;
-UA_NodeId nodeReadWriteGeneric;
-UA_NodeId nodeReadWriteTestObjectType;
-UA_NodeId nodeReadWriteTestHasSubSubType;
-UA_NodeId nodeReadWriteView;
-UA_NodeId nodeReadWriteMethod;
-
-#ifdef UA_ENABLE_NODEMANAGEMENT
-
-START_TEST(Node_AddReadWriteNodes) {
-    UA_StatusCode retval;
-    // Create a folder with two variables for testing
-
-    // create Coordinates Object within ObjectsFolder
-    {
-        UA_ObjectAttributes attr = UA_ObjectAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "UnitTest");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "UnitTest");
-        retval = UA_Client_addObjectNode(client, UA_NODEID_NULL,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         UA_QUALIFIEDNAME(1, "UnitTest"),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE),
-                                         attr, &nodeReadWriteUnitTest);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Variable 'Top' within UnitTest Object
-    {
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Array");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Array");
-        attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-        attr.writeMask = UA_WRITEMASK_ARRRAYDIMENSIONS;
-
-        UA_Int32 values[2];
-        values[0] = 10;
-        values[1] = 20;
-
-        UA_Variant_setArray(&attr.value, values, 2, &UA_TYPES[UA_TYPES_INT32]);
-        attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-        attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-        UA_UInt32 arrayDims[1] = {2};
-        attr.arrayDimensions = arrayDims;
-        attr.arrayDimensionsSize = 1;
-
-        retval = UA_Client_addVariableNode(client, UA_NODEID_NULL,
-                                           nodeReadWriteUnitTest,
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                           UA_QUALIFIEDNAME(1, "Array"),
-                                           UA_NODEID_NULL, attr, &nodeReadWriteArray);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Variable 'Int' within UnitTest Object
-    {
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Int");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Int");
-        attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-        attr.writeMask = 0xFFFFFFFF;
-
-        UA_Int32 int_value = 5678;
-        UA_Variant_setScalar(&attr.value, &int_value, &UA_TYPES[UA_TYPES_INT32]);
-        attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-
-        retval = UA_Client_addVariableNode(client, UA_NODEID_NULL,
-                                           nodeReadWriteUnitTest,
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                           UA_QUALIFIEDNAME(1, "Int"),
-                                           UA_NODEID_NULL, attr, &nodeReadWriteInt);
-
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Variable 'Generic' within UnitTest Object
-    {
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Generic");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Generic");
-        attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-        attr.writeMask = 0xFFFFFFFF;
-
-        // generic datatype
-        attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
-
-        retval = UA_Client_addVariableNode(client, UA_NODEID_NULL,
-                                           nodeReadWriteUnitTest,
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                           UA_QUALIFIEDNAME(1, "Generic"),
-                                           UA_NODEID_NULL, attr, &nodeReadWriteGeneric);
-
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // create Method 'Dummy' within Coordinates Object.
-    {
-        UA_MethodAttributes attr = UA_MethodAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Dummy method");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "Dummy");
-        attr.executable = true;
-        attr.userExecutable = true;
-        attr.writeMask = 0xFFFFFFFF;
-        retval = UA_Client_addMethodNode(client, UA_NODEID_NULL,
-                                         nodeReadWriteUnitTest,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT),
-                                         UA_QUALIFIEDNAME(1, "Dummy"),
-                                         attr, &nodeReadWriteMethod);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // Create TestObjectType SubType within BaseObjectType
-    {
-        UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Some TestObjectType");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "TestObjectType");
-        attr.writeMask = 0xFFFFFFFF;
-        retval = UA_Client_addObjectTypeNode(client, UA_NODEID_NULL,
-                                             UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                             UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                             UA_QUALIFIEDNAME(1, "TestObjectType"), attr, &nodeReadWriteTestObjectType);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // Create custom reference type 'HasSubSubType' as child of HasSubtype
-    {
-        UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "Some HasSubSubType");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "HasSubSubType");
-        attr.inverseName = UA_LOCALIZEDTEXT("en-US", "HasParentParentType");
-        attr.writeMask = 0xFFFFFFFF;
-        retval = UA_Client_addReferenceTypeNode(client, UA_NODEID_NULL,
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                                UA_QUALIFIEDNAME(1, "HasSubSubType"), attr,
-                                                &nodeReadWriteTestHasSubSubType);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-
-    // create View 'AllTopCoordinates' whithin Views Folder
-    {
-        UA_ViewAttributes attr = UA_ViewAttributes_default;
-        attr.description = UA_LOCALIZEDTEXT("en-US", "List of all top coordinates");
-        attr.displayName = UA_LOCALIZEDTEXT("en-US", "AllTopCoordinates");
-        attr.writeMask = 0xFFFFFFFF;
-        retval = UA_Client_addViewNode(client, UA_NODEID_NULL,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_VIEWSFOLDER),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                       UA_QUALIFIEDNAME(1, "AllTopCoordinates"),
-                                       attr, &nodeReadWriteView);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-        
-    // iterate over children
-    retval = UA_Client_forEachChildNodeCall(client, nodeReadWriteUnitTest, nodeIter, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_NodeId_equal(&nodeReadWriteArray, &iteratedNodes[0]));
-    ck_assert(UA_NodeId_equal(&nodeReadWriteInt, &iteratedNodes[1]));
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_Id) {
-    UA_NodeId newNodeId;
-
-    // read to check if node id was changed
-    UA_StatusCode retval = UA_Client_readNodeIdAttribute(client, nodeReadWriteInt, &newNodeId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_NodeId_equal(&newNodeId, &nodeReadWriteInt));
-
-    newNodeId.identifier.numeric = 900;
-    retval = UA_Client_writeNodeIdAttribute(client, nodeReadWriteInt, &newNodeId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-
-}
-END_TEST
-
-static void checkNodeClass(UA_Client *clientNc, const UA_NodeId nodeId, const UA_NodeClass expectedClass) {
-    UA_NodeClass nodeClass = UA_NODECLASS_UNSPECIFIED;
-    UA_StatusCode retval = UA_Client_readNodeClassAttribute(clientNc, nodeId, &nodeClass);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(nodeClass, expectedClass);
-}
-
-START_TEST(Node_ReadWrite_Class) {
-    checkNodeClass(client, nodeReadWriteInt, UA_NODECLASS_VARIABLE);
-    checkNodeClass(client, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), UA_NODECLASS_OBJECT);
-
-    /* Minimal nodeset does not contain UA_NS0ID_SERVER_GETMONITOREDITEMS node */
-#if defined(UA_ENABLE_METHODCALLS) && defined(UA_GENERATED_NAMESPACE_ZERO)
-    checkNodeClass(client, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), UA_NODECLASS_METHOD);
-#endif
-
-    UA_NodeClass newClass = UA_NODECLASS_METHOD;
-    UA_StatusCode retval = UA_Client_writeNodeClassAttribute(client, nodeReadWriteInt, &newClass);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_BrowseName) {
-
-    UA_QualifiedName browseName;
-    UA_StatusCode retval = UA_Client_readBrowseNameAttribute(client, nodeReadWriteInt, &browseName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_QualifiedName orig = UA_QUALIFIEDNAME(1, "Int");
-    ck_assert_int_eq(browseName.namespaceIndex, orig.namespaceIndex);
-    ck_assert(UA_String_equal(&browseName.name, &orig.name));
-
-    UA_QualifiedName_deleteMembers(&browseName);
-
-    browseName = UA_QUALIFIEDNAME(1,"Int-Changed");
-
-    retval = UA_Client_writeBrowseNameAttribute(client, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), &browseName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADUSERACCESSDENIED);
-
-    retval = UA_Client_writeBrowseNameAttribute(client, nodeReadWriteInt, &browseName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_QualifiedName browseNameChangedRead;
-    retval = UA_Client_readBrowseNameAttribute(client, nodeReadWriteInt, &browseNameChangedRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(browseName.namespaceIndex, browseNameChangedRead.namespaceIndex);
-    ck_assert(UA_String_equal(&browseName.name, &browseNameChangedRead.name));
-
-    UA_QualifiedName_deleteMembers(&browseNameChangedRead);
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_DisplayName) {
-
-    UA_LocalizedText displayName;
-    UA_StatusCode retval = UA_Client_readDisplayNameAttribute(client, nodeReadWriteInt, &displayName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_LocalizedText orig = UA_LOCALIZEDTEXT("en-US", "Int");
-    ck_assert(UA_String_equal(&displayName.locale, &orig.locale));
-    ck_assert(UA_String_equal(&displayName.text, &orig.text));
-    UA_LocalizedText_deleteMembers(&displayName);
-
-    UA_LocalizedText newLocale = UA_LOCALIZEDTEXT("en-US", "Int-Changed");
-
-    retval = UA_Client_writeDisplayNameAttribute(client, nodeReadWriteInt, &newLocale);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_LocalizedText displayNameChangedRead;
-    retval = UA_Client_readDisplayNameAttribute(client, nodeReadWriteInt, &displayNameChangedRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_String_equal(&newLocale.locale, &displayNameChangedRead.locale));
-    ck_assert(UA_String_equal(&newLocale.text, &displayNameChangedRead.text));
-    UA_LocalizedText_deleteMembers(&displayNameChangedRead);
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_Description) {
-
-    UA_LocalizedText description;
-    UA_StatusCode retval = UA_Client_readDescriptionAttribute(client, nodeReadWriteInt, &description);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_LocalizedText orig = UA_LOCALIZEDTEXT("en-US", "Int");
-    ck_assert(UA_String_equal(&description.locale, &orig.locale));
-    ck_assert(UA_String_equal(&description.text, &orig.text));
-    UA_LocalizedText_deleteMembers(&description);
-
-    UA_LocalizedText newLocale = UA_LOCALIZEDTEXT("en-US", "Int-Changed");
-
-    retval = UA_Client_writeDescriptionAttribute(client, nodeReadWriteInt, &newLocale);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_LocalizedText descriptionChangedRead;
-    retval = UA_Client_readDescriptionAttribute(client, nodeReadWriteInt, &descriptionChangedRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_String_equal(&newLocale.locale, &descriptionChangedRead.locale));
-    ck_assert(UA_String_equal(&newLocale.text, &descriptionChangedRead.text));
-    UA_LocalizedText_deleteMembers(&descriptionChangedRead);
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_WriteMask) {
-
-    UA_UInt32 writeMask;
-    UA_StatusCode retval = UA_Client_readWriteMaskAttribute(client, nodeReadWriteInt, &writeMask);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(writeMask, 0xFFFFFFFF);
-
-    // Disable a random write mask bit
-    UA_UInt32 newMask = 0xFFFFFFFF & ~UA_WRITEMASK_BROWSENAME;
-
-    retval = UA_Client_writeWriteMaskAttribute(client, nodeReadWriteInt, &newMask);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_UInt32 writeMaskChangedRead;
-    retval = UA_Client_readWriteMaskAttribute(client, nodeReadWriteInt, &writeMaskChangedRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(writeMaskChangedRead, newMask);
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_UserWriteMask) {
-
-    UA_UInt32 userWriteMask;
-    UA_StatusCode retval = UA_Client_readUserWriteMaskAttribute(client, nodeReadWriteInt, &userWriteMask);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(userWriteMask, 0xFFFFFFFF & ~UA_WRITEMASK_BROWSENAME);
-
-    // Disable a random write mask bit
-    UA_UInt32 newMask = 0xFFFFFFFF & ~UA_WRITEMASK_DISPLAYNAME;
-
-    retval = UA_Client_writeUserWriteMaskAttribute(client, nodeReadWriteInt, &newMask);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_IsAbstract) {
-
-    UA_Boolean isAbstract;
-    UA_StatusCode retval = UA_Client_readIsAbstractAttribute(client, nodeReadWriteInt, &isAbstract);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
-    retval = UA_Client_readIsAbstractAttribute(client, nodeReadWriteTestObjectType, &isAbstract);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(isAbstract, UA_FALSE);
-
-    UA_Boolean newIsAbstract = UA_TRUE;
-
-    retval = UA_Client_writeIsAbstractAttribute(client, nodeReadWriteTestObjectType, &newIsAbstract);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readIsAbstractAttribute(client, nodeReadWriteTestObjectType, &isAbstract);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(isAbstract, newIsAbstract);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_Symmetric) {
-
-    UA_Boolean symmetric;
-    UA_StatusCode retval = UA_Client_readSymmetricAttribute(client, nodeReadWriteInt, &symmetric);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
-    retval = UA_Client_readSymmetricAttribute(client, nodeReadWriteTestHasSubSubType, &symmetric);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(symmetric, UA_FALSE);
-
-    UA_Boolean newSymmetric = UA_TRUE;
-
-    retval = UA_Client_writeSymmetricAttribute(client, nodeReadWriteTestHasSubSubType, &newSymmetric);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readSymmetricAttribute(client, nodeReadWriteTestHasSubSubType, &symmetric);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(symmetric, newSymmetric);
-}
-END_TEST
-
-
-START_TEST(Node_ReadWrite_InverseName) {
-
-    UA_LocalizedText inverseName;
-    UA_StatusCode retval = UA_Client_readInverseNameAttribute(client, nodeReadWriteTestHasSubSubType, &inverseName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_LocalizedText orig = UA_LOCALIZEDTEXT("en-US", "HasParentParentType");
-    ck_assert(UA_String_equal(&inverseName.locale, &orig.locale));
-    ck_assert(UA_String_equal(&inverseName.text, &orig.text));
-    UA_LocalizedText_deleteMembers(&inverseName);
-
-    UA_LocalizedText newLocale = UA_LOCALIZEDTEXT("en-US", "HasParentParentType-Changed");
-
-    retval = UA_Client_writeInverseNameAttribute(client, nodeReadWriteTestHasSubSubType, &newLocale);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_LocalizedText inverseNameChangedRead;
-    retval = UA_Client_readInverseNameAttribute(client, nodeReadWriteTestHasSubSubType, &inverseNameChangedRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_String_equal(&newLocale.locale, &inverseNameChangedRead.locale));
-    ck_assert(UA_String_equal(&newLocale.text, &inverseNameChangedRead.text));
-    UA_LocalizedText_deleteMembers(&inverseNameChangedRead);
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_ContainsNoLoops) {
-
-    UA_Boolean containsNoLoops;
-    UA_StatusCode retval = UA_Client_readContainsNoLoopsAttribute(client, nodeReadWriteTestHasSubSubType, &containsNoLoops);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
-    retval = UA_Client_readContainsNoLoopsAttribute(client, nodeReadWriteView, &containsNoLoops);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(containsNoLoops, UA_FALSE);
-
-    UA_Boolean newContainsNoLoops = UA_TRUE;
-
-    retval = UA_Client_writeContainsNoLoopsAttribute(client, nodeReadWriteView, &newContainsNoLoops);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readContainsNoLoopsAttribute(client, nodeReadWriteView, &containsNoLoops);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(containsNoLoops, newContainsNoLoops);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_EventNotifier) {
-
-    UA_Byte eventNotifier = 0;
-    UA_StatusCode retval = UA_Client_readEventNotifierAttribute(client, nodeReadWriteTestHasSubSubType, &eventNotifier);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
-    retval = UA_Client_readEventNotifierAttribute(client, nodeReadWriteView, &eventNotifier);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(eventNotifier, 0);
-
-    UA_Byte newEventNotifier = 1;
-
-    retval = UA_Client_writeEventNotifierAttribute(client, nodeReadWriteView, &newEventNotifier);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readEventNotifierAttribute(client, nodeReadWriteView, &eventNotifier);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(eventNotifier, newEventNotifier);
-}
-END_TEST
-
-
-START_TEST(Node_ReadWrite_Value) {
-
-    UA_Int32 value = 0;
-    UA_Variant *val = UA_Variant_new();
-    UA_StatusCode retval = UA_Client_readValueAttribute(client, nodeReadWriteInt, val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_Variant_isScalar(val) && val->type == &UA_TYPES[UA_TYPES_INT32]);
-    value = *(UA_Int32*)val->data;
-    ck_assert_int_eq(value, 5678);
-    UA_Variant_delete(val);
-
-    /* Write attribute */
-    value++;
-    val = UA_Variant_new();
-    UA_Variant_setScalarCopy(val, &value, &UA_TYPES[UA_TYPES_INT32]);
-    retval = UA_Client_writeValueAttribute(client, nodeReadWriteInt, val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_delete(val);
-
-    /* Read again to check value */
-    val = UA_Variant_new();
-    retval = UA_Client_readValueAttribute(client, nodeReadWriteInt, val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_Variant_isScalar(val) && val->type == &UA_TYPES[UA_TYPES_INT32]);
-    value = *(UA_Int32*)val->data;
-    ck_assert_int_eq(value, 5679);
-    UA_Variant_delete(val);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_DataType) {
-    UA_NodeId dataType;
-
-    // read to check if node id was changed
-    UA_StatusCode retval = UA_Client_readDataTypeAttribute(client, nodeReadWriteInt, &dataType);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert(UA_NodeId_equal(&dataType, &UA_TYPES[UA_TYPES_INT32].typeId));
-
-    UA_NodeId newDataType = UA_TYPES[UA_TYPES_VARIANT].typeId;
-    retval = UA_Client_writeDataTypeAttribute(client, nodeReadWriteGeneric, &newDataType);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readDataTypeAttribute(client, nodeReadWriteGeneric, &dataType);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(UA_NodeId_equal(&dataType, &newDataType));
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_ValueRank) {
-
-    UA_Int32 valueRank = UA_VALUERANK_ONE_OR_MORE_DIMENSIONS;
-    UA_StatusCode retval = UA_Client_readValueRankAttribute(client, nodeReadWriteGeneric, &valueRank);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(valueRank, UA_VALUERANK_ANY);
-
-    // set the value to a scalar
-    UA_Double val = 0.0;
-    UA_Variant value;
-    UA_Variant_setScalar(&value, &val, &UA_TYPES[UA_TYPES_DOUBLE]);
-    retval = UA_Client_writeValueAttribute(client, nodeReadWriteGeneric, &value);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // we want an array
-    UA_Int32 newValueRank = UA_VALUERANK_ONE_DIMENSION;
-
-    // shall fail when the value is not compatible
-    retval = UA_Client_writeValueRankAttribute(client, nodeReadWriteGeneric, &newValueRank);
-    ck_assert(retval != UA_STATUSCODE_GOOD);
-
-    // set the value to an array
-    UA_Double vec[3] = {0.0, 0.0, 0.0};
-    UA_Variant_setArray(&value, vec, 3, &UA_TYPES[UA_TYPES_DOUBLE]);
-    retval = UA_Client_writeValueAttribute(client, nodeReadWriteGeneric, &value);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // try again
-    retval = UA_Client_writeValueRankAttribute(client, nodeReadWriteGeneric, &newValueRank);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readValueRankAttribute(client, nodeReadWriteGeneric, &valueRank);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(valueRank, newValueRank);
-
-
-    // set the value to no array
-    UA_Variant_init(&value);
-    retval = UA_Client_writeValueAttribute(client, nodeReadWriteGeneric, &value);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-
-START_TEST(Node_ReadWrite_ArrayDimensions) {
-    UA_UInt32 *arrayDimsRead;
-    size_t arrayDimsReadSize;
-    UA_StatusCode retval = UA_Client_readArrayDimensionsAttribute(client, nodeReadWriteGeneric,
-                                                                  &arrayDimsReadSize, &arrayDimsRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(arrayDimsReadSize, 0);
-
-    // Set a vector of size 1 as the value
-    UA_Double vec2[2] = {0.0, 0.0};
-    UA_Variant value;
-    UA_Variant_setArray(&value, vec2, 2, &UA_TYPES[UA_TYPES_DOUBLE]);
-    retval = UA_Client_writeValueAttribute(client, nodeReadWriteGeneric, &value);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // writing the array dimensions shall fail at first
-    // because the current value is not conformant
-    UA_UInt32 arrayDimsNew[] = {1};
-    retval = UA_Client_writeArrayDimensionsAttribute(client, nodeReadWriteGeneric, 1, arrayDimsNew);
-    ck_assert(retval != UA_STATUSCODE_GOOD);
-
-    // Set a vector of size 1 as the value
-    UA_Double vec1[1] = {0.0};
-    UA_Variant_setArray(&value, vec1, 1, &UA_TYPES[UA_TYPES_DOUBLE]);
-    retval = UA_Client_writeValueAttribute(client, nodeReadWriteGeneric, &value);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // Now we can set matching array-dimensions
-    retval = UA_Client_writeArrayDimensionsAttribute(client, nodeReadWriteGeneric, 1, arrayDimsNew);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readArrayDimensionsAttribute(client, nodeReadWriteGeneric,
-                                                    &arrayDimsReadSize, &arrayDimsRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(arrayDimsReadSize, 1);
-    ck_assert_int_eq(arrayDimsRead[0], 1);
-    UA_Array_delete(arrayDimsRead, arrayDimsReadSize, &UA_TYPES[UA_TYPES_UINT32]);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_AccessLevel) {
-
-    UA_Byte accessLevel;
-    UA_StatusCode retval = UA_Client_readAccessLevelAttribute(client, nodeReadWriteInt, &accessLevel);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(accessLevel, UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE);
-
-    UA_Byte newMask = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD;
-
-    retval = UA_Client_writeAccessLevelAttribute(client, nodeReadWriteInt, &newMask);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Byte accessLevelChangedRead;
-    retval = UA_Client_readAccessLevelAttribute(client, nodeReadWriteInt, &accessLevelChangedRead);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(accessLevelChangedRead, newMask);
-
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_UserAccessLevel) {
-
-    UA_Byte userAccessLevel;
-    UA_StatusCode retval = UA_Client_readUserAccessLevelAttribute(client, nodeReadWriteInt, &userAccessLevel);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    ck_assert_int_eq(userAccessLevel, UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD);
-
-    UA_Byte newMask = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD;
-
-    retval = UA_Client_writeUserAccessLevelAttribute(client, nodeReadWriteInt, &newMask);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_MinimumSamplingInterval) {
-
-    UA_Double minimumSamplingInterval = 0;
-    UA_StatusCode retval = UA_Client_readMinimumSamplingIntervalAttribute(client, nodeReadWriteGeneric, &minimumSamplingInterval);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(minimumSamplingInterval == 0);
-
-    // we want an array
-    UA_Double newMinimumSamplingInterval = 1;
-
-    retval = UA_Client_writeMinimumSamplingIntervalAttribute(client, nodeReadWriteGeneric, &newMinimumSamplingInterval);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readMinimumSamplingIntervalAttribute(client, nodeReadWriteGeneric, &minimumSamplingInterval);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(minimumSamplingInterval == newMinimumSamplingInterval);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_Historizing) {
-
-    UA_Boolean historizing;
-    UA_StatusCode retval = UA_Client_readHistorizingAttribute(client, nodeReadWriteInt, &historizing);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(historizing, UA_FALSE);
-
-    UA_Boolean newHistorizing = UA_TRUE;
-
-    retval = UA_Client_writeHistorizingAttribute(client, nodeReadWriteInt, &newHistorizing);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readHistorizingAttribute(client, nodeReadWriteInt, &historizing);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(historizing, newHistorizing);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_Executable) {
-
-    UA_Boolean executable;
-    UA_StatusCode retval = UA_Client_readExecutableAttribute(client, nodeReadWriteMethod, &executable);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(executable, UA_TRUE);
-
-    UA_Boolean newExecutable = UA_FALSE;
-
-    retval = UA_Client_writeExecutableAttribute(client, nodeReadWriteMethod, &newExecutable);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_readExecutableAttribute(client, nodeReadWriteMethod, &executable);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(executable, newExecutable);
-}
-END_TEST
-
-START_TEST(Node_ReadWrite_UserExecutable) {
-
-    UA_Boolean userExecutable;
-    UA_StatusCode retval = UA_Client_readUserExecutableAttribute(client, nodeReadWriteMethod, &userExecutable);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(userExecutable, UA_FALSE);
-
-    UA_Boolean newUserExecutable = UA_TRUE;
-
-    retval = UA_Client_writeUserExecutableAttribute(client, nodeReadWriteMethod, &newUserExecutable);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-
-}
-END_TEST
-
-#endif
-
-static Suite *testSuite_Client(void) {
-    Suite *s = suite_create("Client Highlevel");
-    TCase *tc_misc = tcase_create("Client Highlevel Misc");
-    tcase_add_checked_fixture(tc_misc, setup, teardown);
-    tcase_add_test(tc_misc, Misc_State);
-    tcase_add_test(tc_misc, Misc_NamespaceGetIndex);
-    suite_add_tcase(s, tc_misc);
-
-    TCase *tc_nodes = tcase_create("Client Highlevel Node Management");
-    tcase_add_checked_fixture(tc_nodes, setup, teardown);
-#ifdef UA_ENABLE_NODEMANAGEMENT
-    tcase_add_test(tc_nodes, Node_Add);
-#endif
-    tcase_add_test(tc_nodes, Node_Browse);
-    tcase_add_test(tc_nodes, Node_Register);
-    suite_add_tcase(s, tc_nodes);
-
-#ifdef UA_ENABLE_NODEMANAGEMENT
-    TCase *tc_readwrite = tcase_create("Client Highlevel Read/Write");
-    tcase_add_unchecked_fixture(tc_readwrite, setup, teardown);
-    // first add some nodes where we test on
-    tcase_add_test(tc_readwrite, Node_AddReadWriteNodes);
-    // Now run all the read write tests
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Id);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Class);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_BrowseName);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_DisplayName);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Description);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_WriteMask);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_UserWriteMask);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_IsAbstract);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Symmetric);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_InverseName);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_ContainsNoLoops);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_EventNotifier);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Value);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_DataType);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_ValueRank);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_ArrayDimensions);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_AccessLevel);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_UserAccessLevel);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_MinimumSamplingInterval);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Historizing);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_Executable);
-    tcase_add_test(tc_readwrite, Node_ReadWrite_UserExecutable);
-    suite_add_tcase(s, tc_readwrite);
-#endif
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client_historical_data.c b/ext/open62541/tests/client/check_client_historical_data.c
deleted file mode 100644
index b3ba714..0000000
--- a/ext/open62541/tests/client/check_client_historical_data.c
+++ /dev/null
@@ -1,672 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/plugin/historydata/history_data_backend.h>
-#include <open62541/plugin/historydata/history_data_backend_memory.h>
-#include <open62541/plugin/historydata/history_data_gathering_default.h>
-#include <open62541/plugin/historydata/history_database_default.h>
-#include <open62541/plugin/historydatabase.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-
-#include <check.h>
-
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-#ifdef UA_ENABLE_HISTORIZING
-#include "historical_read_test_data.h"
-#endif
-#include <stddef.h>
-
-static UA_Server *server;
-#ifdef UA_ENABLE_HISTORIZING
-static UA_HistoryDataGathering *gathering;
-#endif
-static UA_Boolean running;
-static THREAD_HANDLE server_thread;
-
-static UA_Client *client;
-static UA_NodeId parentNodeId;
-static UA_NodeId parentReferenceNodeId;
-static UA_NodeId outNodeId;
-#ifdef UA_ENABLE_HISTORIZING
-static UA_HistoryDataBackend serverBackend;
-
-// to receive data after we inserted data, we need in datavalue more space
-struct ReceiveTupel {
-    UA_DateTime timestamp;
-    UA_Int64 value;
-};
-
-static const size_t receivedDataSize = (sizeof(testData) / sizeof(testData[0])) + 10;
-static struct ReceiveTupel receivedTestData[(sizeof(testData) / sizeof(testData[0])) + 10];
-static size_t receivedTestDataPos;
-#endif
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-#ifdef UA_ENABLE_HISTORIZING
-static UA_Boolean
-fillHistoricalDataBackend(UA_HistoryDataBackend backend);
-static void resetReceiveBuffer(void) {
-    receivedTestDataPos = 0;
-    memset(receivedTestData, 0, sizeof(receivedTestData));
-}
-
-static void fillInt64DataValue(UA_DateTime timestamp, UA_Int64 value,
-                               UA_DataValue *dataValue) {
-    UA_DataValue_init(dataValue);
-    dataValue->hasValue = true;
-    UA_Int64 d = value;
-    UA_Variant_setScalarCopy(&dataValue->value, &d, &UA_TYPES[UA_TYPES_INT64]);
-    dataValue->hasSourceTimestamp = true;
-    dataValue->sourceTimestamp = timestamp;
-    dataValue->hasServerTimestamp = true;
-    dataValue->serverTimestamp = timestamp;
-    dataValue->hasStatus = true;
-    dataValue->status = UA_STATUSCODE_GOOD;
-}
-#endif
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-#ifdef UA_ENABLE_HISTORIZING
-    resetReceiveBuffer();
-    gathering = (UA_HistoryDataGathering*)UA_calloc(1, sizeof(UA_HistoryDataGathering));
-    *gathering = UA_HistoryDataGathering_Default(1);
-    config->historyDatabase = UA_HistoryDatabase_default(*gathering);
-#endif
-
-    UA_StatusCode retval = UA_Server_run_startup(server);
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    THREAD_CREATE(server_thread, serverloop);
-    /* Define the attribute of the uint32 variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_UInt32 myUint32 = 40;
-    UA_Variant_setScalar(&attr.value, &myUint32, &UA_TYPES[UA_TYPES_UINT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD | UA_ACCESSLEVELMASK_HISTORYWRITE;
-    attr.historizing = true;
-
-    /* Add the variable node to the information model */
-    UA_NodeId uint32NodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName uint32Name = UA_QUALIFIEDNAME(1, "the answer");
-    parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId_init(&outNodeId);
-    ck_assert_uint_eq(UA_Server_addVariableNode(server,
-                                                uint32NodeId,
-                                                parentNodeId,
-                                                parentReferenceNodeId,
-                                                uint32Name,
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                attr,
-                                                NULL,
-                                                &outNodeId)
-                      , UA_STATUSCODE_GOOD);
-
-#ifdef UA_ENABLE_HISTORIZING
-    UA_HistorizingNodeIdSettings setting;
-    serverBackend = UA_HistoryDataBackend_Memory(1, 100);
-    setting.historizingBackend = serverBackend;
-    setting.maxHistoryDataResponseSize = 100;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    retval = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert(fillHistoricalDataBackend(setting.historizingBackend));
-#endif
-
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-}
-
-static void
-teardown(void)
-{
-    /* cleanup */
-#ifdef UA_ENABLE_HISTORIZING
-    UA_HistoryDataBackend_Memory_deleteMembers(&serverBackend);
-#endif
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    UA_NodeId_deleteMembers(&parentNodeId);
-    UA_NodeId_deleteMembers(&parentReferenceNodeId);
-    UA_NodeId_deleteMembers(&outNodeId);
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-#ifdef UA_ENABLE_HISTORIZING
-    UA_free(gathering);
-#endif
-}
-
-#ifdef UA_ENABLE_HISTORIZING
-
-#include <stdio.h>
-#include "ua_session.h"
-
-static UA_Boolean
-fillHistoricalDataBackend(UA_HistoryDataBackend backend)
-{
-    fprintf(stderr, "Adding to historical data backend: ");
-    for (size_t i = 0; i < testDataSize; ++i) {
-        fprintf(stderr, "%lld, ", (long long)testData[i]);
-        UA_DataValue value;
-        fillInt64DataValue(testData[i], testData[i], &value);
-        if (backend.serverSetHistoryData(server, backend.context, NULL, NULL, &outNodeId, UA_FALSE, &value) != UA_STATUSCODE_GOOD) {
-            fprintf(stderr, "\n");
-            UA_DataValue_deleteMembers(&value);
-            return false;
-        }
-        UA_DataValue_deleteMembers(&value);
-    }
-    fprintf(stderr, "\n");
-    return true;
-}
-
-static UA_Boolean checkTestData(UA_Boolean inverse, UA_DateTime *dataA, struct ReceiveTupel *dataB, size_t dataSize) {
-    for (size_t i = 0; i < dataSize; ++i) {
-        if (!inverse && dataA[i] != dataB[i].timestamp)
-            return false;
-        if (inverse && dataA[i] != dataB[dataSize-i-1].timestamp)
-            return false;
-    }
-    return true;
-}
-
-static UA_Boolean checkModifiedData(UA_DateTime *dataA, size_t dataASize, struct ReceiveTupel *dataB, size_t dataBSize) {
-    for (size_t i = 0; i < dataBSize; ++i) {
-        UA_Boolean found = UA_FALSE;
-        for (size_t j = 0; j < dataASize; ++j) {
-            if (dataA[j] == dataB[i].timestamp)
-                found = UA_TRUE;
-        }
-        if (found && dataB[i].timestamp == dataB[i].value) {
-            return false;
-        }
-        if (!found && dataB[i].timestamp != dataB[i].value) {
-            return false;
-        }
-    }
-    return true;
-}
-
-static UA_Boolean
-receiveCallback(UA_Client *clt,
-                const UA_NodeId *nodeId,
-                UA_Boolean moreDataAvailable,
-                const UA_ExtensionObject *_data,
-                void *callbackContext) {
-    UA_HistoryData *data = (UA_HistoryData*)_data->content.decoded.data;
-    fprintf(stderr, "Received %lu at pos %lu. moreDataAvailable %d. Data: ", (unsigned long)data->dataValuesSize, (unsigned long)receivedTestDataPos, moreDataAvailable);
-    if (receivedTestDataPos + data->dataValuesSize > receivedDataSize)
-        return false;
-    for (size_t i = 0; i < data->dataValuesSize; ++i) {
-        receivedTestData[i+receivedTestDataPos].timestamp = data->dataValues[i].sourceTimestamp;
-        receivedTestData[i+receivedTestDataPos].value = *((UA_Int64*)data->dataValues[i].value.data);
-        fprintf(stderr, "%lld/%lld, ",
-                (long long)receivedTestData[i+receivedTestDataPos].timestamp,
-                (long long)receivedTestData[i+receivedTestDataPos].value);
-    }
-    fprintf(stderr, "\n");
-    receivedTestDataPos += data->dataValuesSize;
-    return true;
-}
-
-START_TEST(Client_HistorizingReadRawAll)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(testDataSize, receivedTestDataPos);
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-}
-END_TEST
-
-START_TEST(Client_HistorizingReadRawOne)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  1,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(testDataSize, receivedTestDataPos);
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-}
-END_TEST
-
-START_TEST(Client_HistorizingReadRawTwo)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  2,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(testDataSize, receivedTestDataPos);
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-}
-END_TEST
-START_TEST(Client_HistorizingReadRawAllInv)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_STOP_TIME,
-                                                  TESTDATA_START_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)true);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(testDataSize, receivedTestDataPos);
-    ck_assert(checkTestData(true, testData, receivedTestData, testDataSize));
-}
-END_TEST
-
-START_TEST(Client_HistorizingReadRawOneInv)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_STOP_TIME,
-                                                  TESTDATA_START_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  1,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)true);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(testDataSize, receivedTestDataPos);
-    ck_assert(checkTestData(true, testData, receivedTestData, testDataSize));
-}
-END_TEST
-
-START_TEST(Client_HistorizingReadRawTwoInv)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_STOP_TIME,
-                                                  TESTDATA_START_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  2,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)true);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(testDataSize, receivedTestDataPos);
-    ck_assert(checkTestData(true, testData, receivedTestData, testDataSize));
-}
-END_TEST
-
-START_TEST(Client_HistorizingInsertRawSuccess)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-    resetReceiveBuffer();
-    // insert values to the database
-    for (size_t i = 0; i < testInsertDataSuccessSize; ++i) {
-        UA_DataValue value;
-        fillInt64DataValue(testInsertDataSuccess[i], 0, &value);
-        ret = UA_Client_HistoryUpdate_insert(client, &outNodeId, &value);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        UA_DataValue_deleteMembers(&value);
-    }
-    // check result
-    ret = UA_Client_HistoryRead_raw(client,
-                                    &outNodeId,
-                                    receiveCallback,
-                                    TESTDATA_START_TIME,
-                                    TESTDATA_STOP_TIME,
-                                    UA_STRING_NULL,
-                                    false,
-                                    100,
-                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                    (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(receivedTestDataPos, testInsertResultDataSize);
-    ck_assert(checkTestData(false, testInsertResultData, receivedTestData, receivedTestDataPos));
-    ck_assert(checkModifiedData(testInsertDataSuccess, testInsertDataSuccessSize, receivedTestData, receivedTestDataPos));
-}
-END_TEST
-
-START_TEST(Client_HistorizingReplaceRawSuccess)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-    resetReceiveBuffer();
-    // replace values to the database
-    for (size_t i = 0; i < testReplaceDataSuccessSize; ++i) {
-        UA_DataValue value;
-        fillInt64DataValue(testReplaceDataSuccess[i], 0, &value);
-        ret = UA_Client_HistoryUpdate_replace(client, &outNodeId, &value);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        UA_DataValue_deleteMembers(&value);
-    }
-    // check result
-    ret = UA_Client_HistoryRead_raw(client,
-                                    &outNodeId,
-                                    receiveCallback,
-                                    TESTDATA_START_TIME,
-                                    TESTDATA_STOP_TIME,
-                                    UA_STRING_NULL,
-                                    false,
-                                    100,
-                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                    (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(receivedTestDataPos, testDataSize);
-    ck_assert(checkTestData(false, testData, receivedTestData, receivedTestDataPos));
-    ck_assert(checkModifiedData(testReplaceDataSuccess, testReplaceDataSuccessSize, receivedTestData, receivedTestDataPos));
-}
-END_TEST
-
-START_TEST(Client_HistorizingUpdateRawSuccess)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-    resetReceiveBuffer();
-    // insert values to the database
-    for (size_t i = 0; i < testInsertDataSuccessSize; ++i) {
-        UA_DataValue value;
-        fillInt64DataValue(testInsertDataSuccess[i], 0, &value);
-        ret = UA_Client_HistoryUpdate_update(client, &outNodeId, &value);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOODENTRYINSERTED));
-        UA_DataValue_deleteMembers(&value);
-    }
-    // replace values to the database
-    for (size_t i = 0; i < testReplaceDataSuccessSize; ++i) {
-        UA_DataValue value;
-        fillInt64DataValue(testReplaceDataSuccess[i], 0, &value);
-        ret = UA_Client_HistoryUpdate_update(client, &outNodeId, &value);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOODENTRYREPLACED));
-        UA_DataValue_deleteMembers(&value);
-    }
-    // check result
-    ret = UA_Client_HistoryRead_raw(client,
-                                    &outNodeId,
-                                    receiveCallback,
-                                    TESTDATA_START_TIME,
-                                    TESTDATA_STOP_TIME,
-                                    UA_STRING_NULL,
-                                    false,
-                                    100,
-                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                    (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(receivedTestDataPos, testInsertResultDataSize);
-    ck_assert(checkTestData(false, testInsertResultData, receivedTestData, receivedTestDataPos));
-}
-END_TEST
-
-START_TEST(Client_HistorizingDeleteRaw)
-{
-    for (size_t i = 0; i < testDeleteRangeDataSize; ++i) {
-        fprintf(stderr, "Client_HistorizingDeleteRaw: Testing %lu: {%lld, %lld, %lu, %s}\n",
-                (unsigned long)i,
-                (long long)testDeleteRangeData[i].start,
-                (long long)testDeleteRangeData[i].end,
-                (unsigned long)testDeleteRangeData[i].historySize,
-                UA_StatusCode_name(testDeleteRangeData[i].statusCode));
-        resetReceiveBuffer();
-        serverBackend.removeDataValue(server,
-                                      serverBackend.context,
-                                      NULL,
-                                      NULL,
-                                      &outNodeId,
-                                      TESTDATA_START_TIME,
-                                      TESTDATA_STOP_TIME);
-        fillHistoricalDataBackend(serverBackend);
-        // check result
-        UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                        &outNodeId,
-                                        receiveCallback,
-                                        TESTDATA_START_TIME,
-                                        TESTDATA_STOP_TIME,
-                                        UA_STRING_NULL,
-                                        false,
-                                        100,
-                                        UA_TIMESTAMPSTORETURN_BOTH,
-                                        (void*)false);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        ck_assert(checkTestData(false, testData, receivedTestData, receivedTestDataPos));
-        resetReceiveBuffer();
-
-        ret = UA_Client_HistoryUpdate_deleteRaw(client,
-                                                &outNodeId,
-                                                testDeleteRangeData[i].start,
-                                                testDeleteRangeData[i].end);
-        if (ret != testDeleteRangeData[i].statusCode)
-                fprintf(stderr, "Error: ret %s != statusCode%s\n", UA_StatusCode_name(ret), UA_StatusCode_name(testDeleteRangeData[i].statusCode));
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(testDeleteRangeData[i].statusCode));
-
-        // check result
-        ret = UA_Client_HistoryRead_raw(client,
-                                        &outNodeId,
-                                        receiveCallback,
-                                        TESTDATA_START_TIME,
-                                        TESTDATA_STOP_TIME,
-                                        UA_STRING_NULL,
-                                        false,
-                                        100,
-                                        UA_TIMESTAMPSTORETURN_BOTH,
-                                        (void*)false);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        if (receivedTestDataPos != testDeleteRangeData[i].historySize)
-                fprintf(stderr, "Error: receivedTestDataPos != testDeleteRangeData[i].historySize\n");
-        ck_assert_uint_eq(receivedTestDataPos, testDeleteRangeData[i].historySize);
-    }
-}
-END_TEST
-
-START_TEST(Client_HistorizingInsertRawFail)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-    resetReceiveBuffer();
-    // insert values to the database
-    for (size_t i = 0; i < testReplaceDataSuccessSize; ++i) {
-        UA_DataValue value;
-        fillInt64DataValue(testReplaceDataSuccess[i], 0, &value);
-        ret = UA_Client_HistoryUpdate_insert(client, &outNodeId, &value);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_BADENTRYEXISTS));
-        UA_DataValue_deleteMembers(&value);
-    }
-    // check result
-    ret = UA_Client_HistoryRead_raw(client,
-                                    &outNodeId,
-                                    receiveCallback,
-                                    TESTDATA_START_TIME,
-                                    TESTDATA_STOP_TIME,
-                                    UA_STRING_NULL,
-                                    false,
-                                    100,
-                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                    (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(receivedTestDataPos, testDataSize);
-    ck_assert(checkTestData(false, testData, receivedTestData, receivedTestDataPos));
-    ck_assert(checkModifiedData(NULL, 0, receivedTestData, receivedTestDataPos));
-}
-END_TEST
-
-START_TEST(Client_HistorizingReplaceRawFail)
-{
-    UA_StatusCode ret = UA_Client_HistoryRead_raw(client,
-                                                  &outNodeId,
-                                                  receiveCallback,
-                                                  TESTDATA_START_TIME,
-                                                  TESTDATA_STOP_TIME,
-                                                  UA_STRING_NULL,
-                                                  false,
-                                                  100,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert(checkTestData(false, testData, receivedTestData, testDataSize));
-    resetReceiveBuffer();
-    // replace values to the database
-    for (size_t i = 0; i < testInsertDataSuccessSize; ++i) {
-        UA_DataValue value;
-        fillInt64DataValue(testInsertDataSuccess[i], 0, &value);
-        ret = UA_Client_HistoryUpdate_replace(client, &outNodeId, &value);
-        ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_BADNOENTRYEXISTS));
-        UA_DataValue_deleteMembers(&value);
-    }
-    // check result
-    ret = UA_Client_HistoryRead_raw(client,
-                                    &outNodeId,
-                                    receiveCallback,
-                                    TESTDATA_START_TIME,
-                                    TESTDATA_STOP_TIME,
-                                    UA_STRING_NULL,
-                                    false,
-                                    100,
-                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                    (void*)false);
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_uint_eq(receivedTestDataPos, testDataSize);
-    ck_assert(checkTestData(false, testData, receivedTestData, receivedTestDataPos));
-    ck_assert(checkModifiedData(NULL, 0, receivedTestData, receivedTestDataPos));
-}
-END_TEST
-
-#endif /*UA_ENABLE_HISTORIZING*/
-
-static Suite* testSuite_Client(void)
-{
-    Suite *s = suite_create("Client Historical Data");
-    TCase *tc_client = tcase_create("Client Historical Data read_raw");
-    tcase_add_checked_fixture(tc_client, setup, teardown);
-#ifdef UA_ENABLE_HISTORIZING
-    tcase_add_test(tc_client, Client_HistorizingReadRawAll);
-    tcase_add_test(tc_client, Client_HistorizingReadRawOne);
-    tcase_add_test(tc_client, Client_HistorizingReadRawTwo);
-    tcase_add_test(tc_client, Client_HistorizingReadRawAllInv);
-    tcase_add_test(tc_client, Client_HistorizingReadRawOneInv);
-    tcase_add_test(tc_client, Client_HistorizingReadRawTwoInv);
-    tcase_add_test(tc_client, Client_HistorizingInsertRawSuccess);
-    tcase_add_test(tc_client, Client_HistorizingReplaceRawSuccess);
-    tcase_add_test(tc_client, Client_HistorizingUpdateRawSuccess);
-    tcase_add_test(tc_client, Client_HistorizingDeleteRaw);
-    tcase_add_test(tc_client, Client_HistorizingInsertRawFail);
-    tcase_add_test(tc_client, Client_HistorizingReplaceRawFail);
-#endif /* UA_ENABLE_HISTORIZING */
-    suite_add_tcase(s, tc_client);
-
-    return s;
-}
-
-int main(void)
-{
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client_securechannel.c b/ext/open62541/tests/client/check_client_securechannel.c
deleted file mode 100644
index 4bed0fe..0000000
--- a/ext/open62541/tests/client/check_client_securechannel.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-
-#include "check.h"
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-    UA_realSleep(100);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(SecureChannel_timeout_max) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ClientConfig *cconfig = UA_Client_getConfig(client);
-    UA_fakeSleep(cconfig->secureChannelLifeTime);
-
-    UA_Variant val;
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-/* Send the next message after the securechannel timed out */
-START_TEST(SecureChannel_timeout_fail) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ClientConfig *cconfig = UA_Client_getConfig(client);
-    UA_fakeSleep(cconfig->secureChannelLifeTime + 1);
-    UA_realSleep(50 + 1); // UA_MAXTIMEOUT+1 wait to be sure UA_Server_run_iterate can be completely executed
-
-    UA_Variant val;
-    UA_Variant_init(&val);
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert(retval != UA_STATUSCODE_GOOD);
-
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-/* Send an async message and receive the response when the securechannel timed out */
-START_TEST(SecureChannel_networkfail) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ReadRequest rq;
-    UA_ReadRequest_init(&rq);
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    rq.nodesToRead = &rvi;
-    rq.nodesToReadSize = 1;
-
-    /* Forward the clock after recv in the client */
-    UA_ClientConfig *cconfig = UA_Client_getConfig(client);
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-    UA_Client_recvSleepDuration = cconfig->secureChannelLifeTime + 1;
-
-    UA_Variant val;
-    UA_Variant_init(&val);
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert(retval == UA_STATUSCODE_BADSECURECHANNELCLOSED);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(SecureChannel_reconnect) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    
-    client->state = UA_CLIENTSTATE_CONNECTED;
-
-    retval = UA_Client_disconnect(client);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ClientConfig *cconfig = UA_Client_getConfig(client);
-    UA_fakeSleep(cconfig->secureChannelLifeTime + 1);
-    UA_realSleep(50 + 1);
-
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(SecureChannel_cableunplugged) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant val;
-    UA_Variant_init(&val);
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    /* Simulate network cable unplugged (no response from server) */
-    UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-
-    UA_Variant_init(&val);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADCONNECTIONCLOSED);
-
-    ck_assert(UA_Client_getState(client) == UA_CLIENTSTATE_DISCONNECTED);
-
-    UA_Client_recvTesting_result = UA_STATUSCODE_GOOD;
-
-    UA_Client_delete(client);
-}
-END_TEST
-
-int main(void) {
-    TCase *tc_sc = tcase_create("Client SecureChannel");
-    tcase_add_checked_fixture(tc_sc, setup, teardown);
-    tcase_add_test(tc_sc, SecureChannel_timeout_max);
-    tcase_add_test(tc_sc, SecureChannel_timeout_fail);
-    tcase_add_test(tc_sc, SecureChannel_networkfail);
-    tcase_add_test(tc_sc, SecureChannel_reconnect);
-    tcase_add_test(tc_sc, SecureChannel_cableunplugged);
-
-    Suite *s = suite_create("Client");
-    suite_add_tcase(s, tc_sc);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/check_client_subscriptions.c b/ext/open62541/tests/client/check_client_subscriptions.c
deleted file mode 100644
index 1e2fb28..0000000
--- a/ext/open62541/tests/client/check_client_subscriptions.c
+++ /dev/null
@@ -1,588 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "check.h"
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-    config->maxPublishReqPerSession = 5;
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-UA_Boolean notificationReceived = false;
-UA_UInt32 countNotificationReceived = 0;
-UA_Double publishingInterval = 500.0;
-
-static void
-dataChangeHandler(UA_Client *client, UA_UInt32 subId, void *subContext,
-                  UA_UInt32 monId, void *monContext, UA_DataValue *value) {
-    notificationReceived = true;
-    countNotificationReceived++;
-}
-
-START_TEST(Client_subscription) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 subId = response.subscriptionId;
-
-    // a valid UA_Client_Subscriptions_modify
-    UA_ModifySubscriptionRequest modifySubscriptionRequest;
-    UA_ModifySubscriptionRequest_init(&modifySubscriptionRequest);
-    modifySubscriptionRequest.subscriptionId = response.subscriptionId;
-    modifySubscriptionRequest.requestedPublishingInterval = response.revisedPublishingInterval;
-    modifySubscriptionRequest.requestedLifetimeCount = response.revisedLifetimeCount;
-    modifySubscriptionRequest.requestedMaxKeepAliveCount = response.revisedMaxKeepAliveCount;
-    UA_ModifySubscriptionResponse modifySubscriptionResponse = UA_Client_Subscriptions_modify(client,modifySubscriptionRequest);
-    ck_assert_int_eq(modifySubscriptionResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    // an invalid UA_Client_Subscriptions_modify
-    modifySubscriptionRequest.subscriptionId = 99999; // invalid
-    modifySubscriptionResponse = UA_Client_Subscriptions_modify(client,modifySubscriptionRequest);
-    ck_assert_int_eq(modifySubscriptionResponse.responseHeader.serviceResult, UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID);
-
-    /* monitor the server state */
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-
-    UA_MonitoredItemCreateResult monResponse =
-        UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  monRequest, NULL, dataChangeHandler, NULL);
-    ck_assert_uint_eq(monResponse.statusCode, UA_STATUSCODE_GOOD);
-    UA_UInt32 monId = monResponse.monitoredItemId;
-
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-
-    notificationReceived = false;
-
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-
-    retval = UA_Client_MonitoredItems_deleteSingle(client, subId, monId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_Subscriptions_deleteSingle(client, subId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_subscription_createDataChanges) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 subId = response.subscriptionId;
-
-    UA_MonitoredItemCreateRequest items[3];
-    UA_UInt32 newMonitoredItemIds[3];
-    UA_Client_DataChangeNotificationCallback callbacks[3];
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[3];
-    void *contexts[3];
-
-    /* monitor the server state */
-    items[0] = UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-    callbacks[0] = dataChangeHandler;
-    contexts[0] = NULL;
-    deleteCallbacks[0] = NULL;
-
-    /* monitor invalid node */
-    items[1] = UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, 999999));
-    callbacks[1] = dataChangeHandler;
-    contexts[1] = NULL;
-    deleteCallbacks[1] = NULL;
-
-    /* monitor current time */
-    items[2] = UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME));
-    callbacks[2] = dataChangeHandler;
-    contexts[2] = NULL;
-    deleteCallbacks[2] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = items;
-    createRequest.itemsToCreateSize = 3;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 3);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    ck_assert_uint_eq(createResponse.results[1].statusCode, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    newMonitoredItemIds[1] = createResponse.results[1].monitoredItemId;
-    ck_assert_uint_eq(newMonitoredItemIds[1], 0);
-    ck_assert_uint_eq(createResponse.results[2].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[2] = createResponse.results[2].monitoredItemId;
-    ck_assert_uint_eq(createResponse.results[2].statusCode, UA_STATUSCODE_GOOD);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    notificationReceived = false;
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 3);
-
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 3;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 3);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.results[1], UA_STATUSCODE_BADMONITOREDITEMIDINVALID);
-    ck_assert_uint_eq(deleteResponse.results[2], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-
-    retval = UA_Client_Subscriptions_deleteSingle(client, subId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_subscription_keepAlive) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    request.requestedMaxKeepAliveCount = 1;
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 subId = response.subscriptionId;
-
-    /* monitor the server state */
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-
-    UA_MonitoredItemCreateResult monResponse =
-        UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  monRequest, NULL, dataChangeHandler, NULL);
-    ck_assert_uint_eq(monResponse.statusCode, UA_STATUSCODE_GOOD);
-    UA_UInt32 monId = monResponse.monitoredItemId;
-
-    /* Ensure that the subscription is late */
-    UA_fakeSleep((UA_UInt32)(publishingInterval + 1));
-
-    /* Manually send a publish request */
-    UA_PublishRequest pr;
-    UA_PublishRequest_init(&pr);
-    pr.subscriptionAcknowledgementsSize = 0;
-    UA_PublishResponse presponse;
-    UA_PublishResponse_init(&presponse);
-    __UA_Client_Service(client, &pr, &UA_TYPES[UA_TYPES_PUBLISHREQUEST],
-                        &presponse, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-    ck_assert_uint_eq(presponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(presponse.notificationMessage.notificationDataSize, 1);
-    UA_PublishResponse_deleteMembers(&presponse);
-    UA_PublishRequest_deleteMembers(&pr);
-
-    UA_fakeSleep((UA_UInt32)(publishingInterval + 1));
-
-    UA_PublishRequest_init(&pr);
-    pr.subscriptionAcknowledgementsSize = 0;
-    UA_PublishResponse_init(&presponse);
-    __UA_Client_Service(client, &pr, &UA_TYPES[UA_TYPES_PUBLISHREQUEST],
-                        &presponse, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-
-    ck_assert_uint_eq(presponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(presponse.notificationMessage.notificationDataSize, 0);
-    UA_PublishResponse_deleteMembers(&presponse);
-    UA_PublishRequest_deleteMembers(&pr);
-
-    retval = UA_Client_MonitoredItems_deleteSingle(client, subId, monId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_Subscriptions_deleteSingle(client, subId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_subscription_connectionClose) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    /* monitor the server state */
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-
-    UA_MonitoredItemCreateResult monResponse =
-        UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  monRequest, NULL, dataChangeHandler, NULL);
-    ck_assert_uint_eq(monResponse.statusCode, UA_STATUSCODE_GOOD);
-
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 60));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* Simulate BADCONNECTIONCLOSE */
-    UA_Client_recvTesting_result = UA_STATUSCODE_BADCONNECTIONCLOSED;
-
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 60));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADCONNECTIONCLOSED);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(Client_subscription_without_notification) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    request.requestedMaxKeepAliveCount = 1;
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 subId = response.subscriptionId;
-
-    /* monitor the server state */
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-    monRequest.requestedParameters.samplingInterval = 99999999.0;
-
-    UA_MonitoredItemCreateResult monResponse =
-        UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  monRequest, NULL, dataChangeHandler, NULL);
-    UA_UInt32 monId = monResponse.monitoredItemId;
-    ck_assert_uint_eq(monResponse.statusCode, UA_STATUSCODE_GOOD);
-
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-
-    notificationReceived = false;
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-
-    notificationReceived = false;
-    retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, false);
-
-    retval = UA_Client_MonitoredItems_deleteSingle(client, subId, monId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Client_Subscriptions_deleteSingle(client, subId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-static UA_ClientState callbackClientState;
-
-static void
-stateCallback (UA_Client *client, UA_ClientState clientState){
-    callbackClientState = clientState;
-
-    if (clientState == UA_CLIENTSTATE_SESSION){
-        /* A new session was created. We need to create the subscription. */
-        UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-        request.requestedMaxKeepAliveCount = 1;
-        UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                                NULL, NULL, NULL);
-        ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-        UA_UInt32 subId = response.subscriptionId;
-        ck_assert_uint_ne(subId, 0);
-
-        /* Add a MonitoredItem */
-        UA_MonitoredItemCreateRequest monRequest =
-            UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME));
-    
-        UA_MonitoredItemCreateResult monResponse =
-            UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                      UA_TIMESTAMPSTORETURN_BOTH,
-                                                      monRequest, NULL, dataChangeHandler, NULL);
-        ck_assert_uint_eq(monResponse.statusCode, UA_STATUSCODE_GOOD);
-        UA_UInt32 monId = monResponse.monitoredItemId;
-
-        ck_assert_uint_ne(monId, 0);
-    }
-}
-
-static UA_Boolean inactivityCallbackCalled = false;
-
-static void
-subscriptionInactivityCallback (UA_Client *client, UA_UInt32 subId, void *subContext) {
-    inactivityCallbackCalled = true;
-}
-
-START_TEST(Client_subscription_async_sub) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    /* Set stateCallback */
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    cc->stateCallback = stateCallback;
-    cc->subscriptionInactivityCallback = subscriptionInactivityCallback;
-    inactivityCallbackCalled = false;
-
-    /* Activate background publish request */
-    cc->outStandingPublishRequests = 10;
-
-    ck_assert_uint_eq(callbackClientState, UA_CLIENTSTATE_DISCONNECTED);
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(callbackClientState, UA_CLIENTSTATE_SESSION);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-
-    countNotificationReceived = 0;
-
-    notificationReceived = false;
-    UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    notificationReceived = false;
-    UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    notificationReceived = false;
-    UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 3);
-
-    notificationReceived = false;
-    UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 4);
-
-    notificationReceived = false;
-    UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 5);
-
-    ck_assert_uint_lt(client->config.outStandingPublishRequests, 10);
-
-    notificationReceived = false;
-    /* Simulate network cable unplugged (no response from server) */
-    UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-    UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 1));
-    ck_assert_uint_eq(notificationReceived, false);
-    ck_assert_uint_eq(callbackClientState, UA_CLIENTSTATE_SESSION);
-
-    /* Simulate network cable unplugged (no response from server) */
-    ck_assert_uint_eq(inactivityCallbackCalled, false);
-    UA_Client_recvTesting_result = UA_STATUSCODE_GOODNONCRITICALTIMEOUT;
-    UA_Client_run_iterate(client, (UA_UInt16)cc->timeout);
-    ck_assert_uint_eq(inactivityCallbackCalled, true);
-    ck_assert_uint_eq(callbackClientState, UA_CLIENTSTATE_SESSION);
-
-    UA_Client_delete(client);
-}
-END_TEST
-
-#ifdef UA_ENABLE_METHODCALLS
-START_TEST(Client_methodcall) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    /* monitor the server state */
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-
-    UA_MonitoredItemCreateResult monResponse =
-        UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  monRequest, NULL, NULL, NULL);
-    ck_assert_uint_eq(monResponse.statusCode, UA_STATUSCODE_GOOD);
-
-/* Minimal nodeset does not contain any method we can call here */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_UInt32 monId = monResponse.monitoredItemId;
-    UA_UInt32 subId = response.subscriptionId;
-
-    /* call a method to get monitored item id */
-    UA_Variant input;
-    UA_Variant_init(&input);
-    UA_Variant_setScalarCopy(&input, &subId, &UA_TYPES[UA_TYPES_UINT32]);
-    size_t outputSize;
-    UA_Variant *output;
-    retval = UA_Client_call(client, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
-                UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), 1, &input, &outputSize, &output);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(outputSize, 2);
-
-    ck_assert_uint_eq(output[0].arrayLength, 1);
-
-    ck_assert_uint_eq(*((UA_UInt32*)output[0].data), monId);
-
-    UA_Array_delete(output, outputSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    UA_Variant_deleteMembers(&input);
-
-    /* call with invalid subscription id */
-    UA_Variant_init(&input);
-    subId = 0;
-    UA_Variant_setScalarCopy(&input, &subId, &UA_TYPES[UA_TYPES_UINT32]);
-    retval = UA_Client_call(client, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
-                UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), 1, &input, &outputSize, &output);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID);
-
-    UA_Variant_deleteMembers(&input);
-#endif
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-#endif /* UA_ENABLE_METHODCALLS */
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Client Subscription");
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    TCase *tc_client = tcase_create("Client Subscription Basic");
-    tcase_add_checked_fixture(tc_client, setup, teardown);
-    tcase_add_test(tc_client, Client_subscription);
-    tcase_add_test(tc_client, Client_subscription_connectionClose);
-    tcase_add_test(tc_client, Client_subscription_createDataChanges);
-    tcase_add_test(tc_client, Client_subscription_keepAlive);
-    tcase_add_test(tc_client, Client_subscription_without_notification);
-    tcase_add_test(tc_client, Client_subscription_async_sub);
-    suite_add_tcase(s,tc_client);
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-
-#if defined(UA_ENABLE_SUBSCRIPTIONS) && defined(UA_ENABLE_METHODCALLS)
-    TCase *tc_client2 = tcase_create("Client Subscription + Method Call of GetMonitoredItmes");
-    tcase_add_checked_fixture(tc_client2, setup, teardown);
-    tcase_add_test(tc_client2, Client_methodcall);
-    suite_add_tcase(s,tc_client2);
-#endif
-
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/client/historical_read_test_data.h b/ext/open62541/tests/client/historical_read_test_data.h
deleted file mode 100644
index 7263ddc..0000000
--- a/ext/open62541/tests/client/historical_read_test_data.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-/* Data in this header is gathered from OPC Unified Architecture, Part 11, Release
-1.03 Page 5-6 from OPC Foundation */
-
-#ifndef UA_HISTORICAL_READ_TEST_DATA_H_
-#define UA_HISTORICAL_READ_TEST_DATA_H_
-
-#include <open62541/types.h>
-
-#include <limits.h>
-
-#define TESTDATA_START_TIME 1
-#define TESTDATA_STOP_TIME 601
-static UA_DateTime testData[] = {
-    100,
-    200,
-    300,
-    400,
-    500
-};
-static const size_t testDataSize = (sizeof(testData) / sizeof(testData[0]));
-
-static UA_DateTime testInsertDataSuccess[] = {
-    50,
-    250,
-    550
-};
-static const size_t testInsertDataSuccessSize = (sizeof(testInsertDataSuccess) / sizeof(testInsertDataSuccess[0]));
-
-
-static UA_DateTime testInsertResultData[] = {
-    50,
-    100,
-    200,
-    250,
-    300,
-    400,
-    500,
-    550
-};
-static size_t testInsertResultDataSize = (sizeof(testInsertResultData) / sizeof(testInsertResultData[0]));
-
-static UA_DateTime testReplaceDataSuccess[] = {
-    100,
-    300,
-    500
-};
-static const size_t testReplaceDataSuccessSize = (sizeof(testReplaceDataSuccess) / sizeof(testReplaceDataSuccess[0]));
-
-struct DeleteRange {
-    UA_DateTime start;
-    UA_DateTime end;
-    size_t historySize;
-    UA_StatusCode statusCode;
-};
-
-static struct DeleteRange testDeleteRangeData[] = {
-{200, 400, 3, UA_STATUSCODE_GOOD},
-{100, 400, 2, UA_STATUSCODE_GOOD},
-{200, 500, 2, UA_STATUSCODE_GOOD},
-{100, 500, 1, UA_STATUSCODE_GOOD},
-{100, 550, 0, UA_STATUSCODE_GOOD},
-{50, 550, 0, UA_STATUSCODE_GOOD},
-{500, 550, 4, UA_STATUSCODE_GOOD},
-{50, 150, 4, UA_STATUSCODE_GOOD},
-{100, 100, 4, UA_STATUSCODE_GOOD},
-{500, 500, 4, UA_STATUSCODE_GOOD},
-{200, 200, 4, UA_STATUSCODE_GOOD},
-{50, 50, 5, UA_STATUSCODE_BADNODATA},
-{550, 550, 5, UA_STATUSCODE_BADNODATA},
-{150, 150, 5, UA_STATUSCODE_BADNODATA},
-{200, 100, 5, UA_STATUSCODE_BADTIMESTAMPNOTSUPPORTED},
-{LLONG_MIN, LLONG_MAX, 0, UA_STATUSCODE_GOOD},
-{0, LLONG_MAX, 0, UA_STATUSCODE_GOOD},
-{LLONG_MIN, 0, 5, UA_STATUSCODE_BADNODATA},
-{0, 0, 5, UA_STATUSCODE_BADNODATA},
-{50, 75, 5, UA_STATUSCODE_BADNODATA},
-{50, 100, 5, UA_STATUSCODE_BADNODATA},
-{550, 600, 5, UA_STATUSCODE_BADNODATA}
-};
-static const size_t testDeleteRangeDataSize = (sizeof(testDeleteRangeData) / sizeof(testDeleteRangeData[0]));
-
-#endif /*UA_HISTORICAL_READ_TEST_DATA_H_*/
diff --git a/ext/open62541/tests/encryption/certificates.h b/ext/open62541/tests/encryption/certificates.h
deleted file mode 100644
index 11d226c..0000000
--- a/ext/open62541/tests/encryption/certificates.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef CERTIFICATES_H_
-#define CERTIFICATES_H_
-
-#include <open62541/types.h>
-
-_UA_BEGIN_DECLS
-
-#define KEY_DER_LENGTH 1193
-UA_Byte KEY_DER_DATA[1193] = {
-    0x30, 0x82, 0x04, 0xa5, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe0, 0xc9, 0x91, 0x62, 
-    0xcd, 0x91, 0x68, 0x75, 0x2c, 0x32, 0x7a, 0xdd, 0xf1, 0xd6, 0x64, 0x77, 0x8b, 0x72, 0x9e, 0x14, 
-    0x2a, 0x62, 0x08, 0xd1, 0x89, 0x7d, 0xe2, 0x17, 0xdc, 0xb3, 0xda, 0xbc, 0x3a, 0x9f, 0x84, 0x03, 
-    0xd3, 0x2e, 0x68, 0xbe, 0xc1, 0x57, 0xcb, 0x2a, 0xe2, 0xd6, 0xcf, 0xc4, 0x7f, 0xbd, 0x53, 0x3f, 
-    0xeb, 0x39, 0x98, 0x69, 0xb0, 0x40, 0x14, 0xbf, 0xf5, 0x5a, 0x23, 0x23, 0xf4, 0x4c, 0xf8, 0xf1, 
-    0x03, 0x56, 0x6d, 0x7d, 0x1b, 0x93, 0xd7, 0x0f, 0xc1, 0x8c, 0x70, 0xe0, 0x2c, 0x55, 0x7e, 0xa1, 
-    0xfc, 0x05, 0xe9, 0xd7, 0xea, 0xb1, 0x5c, 0x0f, 0x9b, 0xac, 0x6a, 0x2e, 0xb4, 0xc5, 0xbf, 0x41, 
-    0x8f, 0xda, 0xfc, 0x85, 0xc6, 0xaa, 0x25, 0xe4, 0xb9, 0x9a, 0xc6, 0xd8, 0x9a, 0x31, 0x8a, 0x17, 
-    0x8b, 0x8c, 0x4e, 0x20, 0xd9, 0x71, 0xfc, 0x66, 0x3a, 0xfd, 0x49, 0x95, 0x54, 0xa8, 0xaf, 0x42, 
-    0x5e, 0xba, 0x26, 0xe6, 0xd3, 0xa0, 0xd2, 0x02, 0x3b, 0x51, 0x8b, 0x39, 0xd3, 0x97, 0xd2, 0xe4, 
-    0xd1, 0x01, 0x65, 0xab, 0x8e, 0xa2, 0x80, 0x5b, 0x5e, 0xbb, 0x11, 0x7f, 0x50, 0x1b, 0x2b, 0x0d, 
-    0x20, 0x40, 0xb5, 0xbf, 0xd1, 0x32, 0xfa, 0x25, 0xe1, 0x0d, 0x75, 0xfc, 0x11, 0xcf, 0x21, 0xdd, 
-    0x45, 0x16, 0xe4, 0x56, 0x58, 0x49, 0x33, 0xca, 0xaf, 0xe3, 0x17, 0x7b, 0x7a, 0x8f, 0xb1, 0xec, 
-    0x1c, 0x4d, 0xa2, 0xc2, 0xce, 0x8b, 0x19, 0x4b, 0xc0, 0xc4, 0x36, 0x6a, 0x7c, 0x5b, 0x89, 0x14, 
-    0x98, 0xcb, 0xa9, 0xca, 0x66, 0xf2, 0xaa, 0xf9, 0x12, 0x40, 0x0e, 0x6a, 0x78, 0x4d, 0x1f, 0x54, 
-    0x3c, 0x03, 0x7a, 0x91, 0xf5, 0xb7, 0x3d, 0xe2, 0xfc, 0x65, 0xb7, 0xaa, 0xa9, 0x39, 0x68, 0xa7, 
-    0xdb, 0x29, 0xc1, 0x40, 0x0b, 0x4e, 0xfb, 0xce, 0x74, 0xa5, 0x46, 0xb9, 0x02, 0x03, 0x01, 0x00, 
-    0x01, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb4, 0xc8, 0x07, 0x60, 0x01, 0xd9, 0xb6, 0xbb, 0xbd, 0x8e, 
-    0xdf, 0x97, 0xcd, 0xde, 0x51, 0xb0, 0x7e, 0xfa, 0xf0, 0x3d, 0x61, 0x94, 0xb4, 0x68, 0xe8, 0x7d, 
-    0xd0, 0x2e, 0xc6, 0xb5, 0xf2, 0xed, 0xbc, 0xeb, 0xfb, 0x3d, 0x24, 0x43, 0x47, 0xc4, 0x5a, 0x34, 
-    0x64, 0x56, 0x1a, 0x57, 0x0e, 0x83, 0x87, 0x04, 0x59, 0x86, 0xa7, 0x84, 0x0b, 0x9a, 0xbc, 0x3f, 
-    0xdd, 0x30, 0x40, 0x7f, 0x7c, 0x91, 0x76, 0xf1, 0xcc, 0xa7, 0xf0, 0xba, 0x3a, 0x96, 0x0a, 0x6e, 
-    0xcc, 0xe0, 0x84, 0x15, 0x91, 0xd6, 0x08, 0x71, 0xbd, 0xc5, 0x42, 0xad, 0xf2, 0xd2, 0x4e, 0x92, 
-    0xd3, 0x6a, 0x4e, 0x15, 0xcc, 0xd3, 0xc1, 0x58, 0xe4, 0x27, 0x33, 0x2d, 0xb8, 0x37, 0x52, 0x7e, 
-    0x16, 0xb9, 0xab, 0xb7, 0xd9, 0xc1, 0xeb, 0xc8, 0x79, 0xb9, 0xd3, 0xe6, 0x44, 0x13, 0x51, 0x2d, 
-    0xc6, 0x02, 0xe5, 0xe0, 0x3c, 0xa3, 0x15, 0x9b, 0x49, 0xae, 0x85, 0xbe, 0x8c, 0x84, 0xf9, 0x87, 
-    0x5d, 0x91, 0x9e, 0xf4, 0xf9, 0xf2, 0x8d, 0x81, 0x77, 0x7c, 0xfc, 0x60, 0x09, 0x48, 0x43, 0x2e, 
-    0xbb, 0xaf, 0xc9, 0xd6, 0x90, 0x2d, 0x40, 0x80, 0x59, 0xbd, 0x3b, 0x04, 0xda, 0x50, 0x2a, 0x53, 
-    0xf5, 0xc0, 0x97, 0x54, 0x04, 0x14, 0xb1, 0x8e, 0xd1, 0x6b, 0x53, 0x9e, 0xa4, 0xaa, 0x5e, 0x6e, 
-    0x1c, 0x11, 0x6b, 0x0a, 0xc4, 0xec, 0x5b, 0x77, 0xa8, 0x00, 0x83, 0x77, 0xdb, 0xf4, 0xfb, 0x00, 
-    0xf4, 0x06, 0x57, 0x25, 0x8e, 0x1c, 0x87, 0xb4, 0xbe, 0xb8, 0x04, 0x35, 0x93, 0x67, 0xaa, 0x36, 
-    0xa5, 0x62, 0xe4, 0xf6, 0xcb, 0xc8, 0xa6, 0x58, 0x77, 0x96, 0xc4, 0x6c, 0x0b, 0xc8, 0x41, 0xe2, 
-    0x36, 0x01, 0x94, 0xa5, 0xe9, 0x46, 0x17, 0xd3, 0x0b, 0x18, 0x7e, 0x06, 0x88, 0x9b, 0x7e, 0xdd, 
-    0x92, 0x20, 0xc6, 0xe3, 0x7e, 0xb1, 0x02, 0x81, 0x81, 0x00, 0xf5, 0xa6, 0xda, 0x32, 0xb9, 0x37, 
-    0x61, 0xe9, 0x7c, 0x99, 0xf7, 0x4a, 0x37, 0xee, 0x52, 0x30, 0x4f, 0xbf, 0x57, 0x6f, 0xfe, 0x20, 
-    0xdc, 0xa3, 0xfe, 0x51, 0xbf, 0x72, 0x13, 0x8a, 0xb1, 0xd7, 0x99, 0x7d, 0x67, 0xa8, 0xd4, 0xb0, 
-    0x35, 0x40, 0x7c, 0xc8, 0xdc, 0x03, 0x6b, 0x90, 0xb5, 0x65, 0x04, 0x7f, 0x97, 0x8b, 0xa8, 0x69, 
-    0x20, 0x04, 0xcb, 0x48, 0x39, 0xb7, 0x57, 0xe0, 0xd9, 0xbb, 0x15, 0xe1, 0x59, 0x16, 0xf3, 0xe1, 
-    0xab, 0x91, 0xea, 0x8a, 0x88, 0xad, 0x8d, 0xa3, 0x24, 0x4a, 0x35, 0xa5, 0xd2, 0x32, 0x19, 0x66, 
-    0xa8, 0xbb, 0x32, 0x9d, 0xf4, 0x94, 0x99, 0xc1, 0x2e, 0x2b, 0xf8, 0x98, 0x6a, 0x6e, 0x72, 0x77, 
-    0xd0, 0xc9, 0xfc, 0x5f, 0xd7, 0x69, 0xd1, 0x08, 0x12, 0xbf, 0x81, 0xc1, 0xa1, 0x1b, 0x3b, 0x41, 
-    0xb0, 0x24, 0x11, 0x0a, 0x65, 0xab, 0x81, 0x39, 0xb3, 0xd5, 0x02, 0x81, 0x81, 0x00, 0xea, 0x41, 
-    0xb5, 0xed, 0xac, 0xa0, 0x43, 0xd7, 0xde, 0x1e, 0x6b, 0x95, 0xbe, 0x88, 0x02, 0xaf, 0x2f, 0xbb, 
-    0x37, 0xf7, 0x2f, 0xf6, 0x4f, 0xa0, 0xaa, 0x43, 0x03, 0x7d, 0x33, 0xdd, 0x1e, 0x7a, 0xba, 0xa0, 
-    0x10, 0x77, 0x1f, 0x4a, 0xc9, 0x88, 0x58, 0x9d, 0x81, 0x3a, 0xe8, 0xac, 0x86, 0x2f, 0x80, 0x6c, 
-    0xc7, 0xa0, 0xe5, 0xed, 0x8d, 0x90, 0xa9, 0xa7, 0x36, 0x23, 0xd7, 0xb5, 0x89, 0xfc, 0xad, 0x4d, 
-    0xae, 0x0e, 0xec, 0xdc, 0xe7, 0x7e, 0x69, 0xfe, 0x62, 0x4b, 0x81, 0xfe, 0x52, 0x81, 0x77, 0x6a, 
-    0x35, 0xab, 0x52, 0x6f, 0x56, 0x41, 0x6c, 0x57, 0x3d, 0x75, 0x92, 0x14, 0x42, 0xa2, 0xc9, 0x50, 
-    0x52, 0x57, 0x9f, 0x26, 0x3c, 0xcd, 0x61, 0xa9, 0xda, 0x9b, 0x2c, 0xda, 0xc1, 0xd0, 0x26, 0x07, 
-    0x90, 0x15, 0x8c, 0x81, 0xe2, 0xde, 0xc0, 0x98, 0x58, 0x9d, 0x96, 0x0f, 0xcd, 0x55, 0x02, 0x81, 
-    0x81, 0x00, 0x87, 0xfb, 0xf8, 0x77, 0xf1, 0xcd, 0xf5, 0xb6, 0xa1, 0xd2, 0x3d, 0x71, 0x69, 0x6a, 
-    0xd5, 0x36, 0x87, 0x3e, 0xdd, 0xb1, 0x52, 0x55, 0x70, 0xae, 0x9b, 0x9f, 0x37, 0x42, 0x78, 0x0c, 
-    0xe4, 0x0b, 0xfc, 0x9c, 0xce, 0x20, 0x48, 0xb4, 0xce, 0x95, 0xc7, 0x3e, 0x0d, 0x85, 0x1b, 0x2b, 
-    0x7d, 0x2e, 0xd1, 0x81, 0xac, 0x2b, 0x94, 0x6b, 0xb5, 0x5c, 0xd2, 0x07, 0x46, 0x63, 0xf7, 0x12, 
-    0xb2, 0x94, 0xfd, 0x34, 0xc4, 0xf3, 0x8e, 0xc8, 0x13, 0x08, 0xf0, 0x74, 0x05, 0xdb, 0x45, 0x37, 
-    0xd5, 0x63, 0xfb, 0x34, 0xb3, 0x1a, 0x26, 0xb3, 0x8c, 0x9e, 0x2c, 0x14, 0x02, 0x8b, 0xac, 0x5d, 
-    0xa3, 0x28, 0x96, 0x32, 0x11, 0x60, 0xd8, 0x9e, 0xf9, 0x06, 0x87, 0x5d, 0xaa, 0xca, 0x99, 0xfb, 
-    0x45, 0x1d, 0x9c, 0x3f, 0xca, 0xe6, 0x5f, 0x34, 0x2a, 0xc4, 0x9c, 0x66, 0x4c, 0x07, 0xd7, 0xbe, 
-    0x50, 0x8d, 0x02, 0x81, 0x80, 0x51, 0xdb, 0x96, 0x6c, 0x30, 0x37, 0x6c, 0x9d, 0xa1, 0x43, 0x76, 
-    0x0a, 0xc4, 0xa2, 0x98, 0x75, 0x89, 0x33, 0x5d, 0xd2, 0x25, 0xd3, 0x67, 0x6d, 0xd8, 0x31, 0x44, 
-    0xa5, 0xda, 0x9a, 0xb9, 0x0c, 0xdf, 0xec, 0x10, 0xf4, 0xdf, 0x5d, 0x6d, 0xe1, 0x14, 0x3e, 0x2d, 
-    0xab, 0x5d, 0x24, 0xf4, 0x5a, 0xe3, 0x00, 0xa0, 0x1d, 0x8c, 0x5b, 0x1f, 0x6d, 0xde, 0xaa, 0xcc, 
-    0x93, 0x67, 0xcc, 0x4b, 0x24, 0x9d, 0x96, 0x98, 0x6d, 0x24, 0xbd, 0xe8, 0xb2, 0xd6, 0xed, 0x0a, 
-    0x82, 0x22, 0x31, 0xb1, 0xb9, 0x05, 0xf6, 0x7a, 0x3c, 0x9c, 0xb8, 0xc5, 0x26, 0x65, 0x6a, 0x72, 
-    0xd2, 0x83, 0xb2, 0x4a, 0xba, 0xc1, 0xa8, 0x2c, 0xad, 0xeb, 0xb2, 0x1b, 0xeb, 0x14, 0xe6, 0x9a, 
-    0xba, 0x40, 0xc9, 0x4c, 0x92, 0xa4, 0xc7, 0x5d, 0xc4, 0xf9, 0xed, 0x65, 0x4e, 0xbb, 0x74, 0x40, 
-    0xfb, 0x08, 0x36, 0x0b, 0x65, 0x02, 0x81, 0x81, 0x00, 0xeb, 0x60, 0x01, 0x21, 0x22, 0xa1, 0xde, 
-    0x89, 0x62, 0xfa, 0x68, 0x03, 0x09, 0xf1, 0xa6, 0x14, 0xf0, 0xbe, 0xf7, 0x71, 0x3a, 0x01, 0x85, 
-    0x1f, 0x2c, 0x86, 0xde, 0x4a, 0xfb, 0x35, 0x16, 0xc4, 0x84, 0x22, 0x83, 0x49, 0xeb, 0x0d, 0xf7, 
-    0x33, 0x47, 0x8f, 0x96, 0x37, 0x32, 0xd3, 0xd2, 0xec, 0xea, 0x0f, 0xd0, 0xde, 0x0d, 0x27, 0x9e, 
-    0xc1, 0xf1, 0xe0, 0x39, 0xa6, 0x3e, 0x6c, 0xd4, 0x39, 0xdf, 0xde, 0xbd, 0x4c, 0xb8, 0xe7, 0xb7, 
-    0x4e, 0x2a, 0x32, 0x92, 0x83, 0xd3, 0x12, 0xb9, 0xa1, 0x91, 0x52, 0x46, 0x24, 0x58, 0x05, 0x35, 
-    0x22, 0x5f, 0x10, 0x3c, 0x13, 0x5b, 0xbe, 0x47, 0x5e, 0xbf, 0x85, 0xd6, 0xac, 0xfc, 0xbb, 0xd9, 
-    0x91, 0xf9, 0x50, 0x8f, 0xfc, 0xc2, 0x2c, 0x81, 0x5c, 0xa5, 0xc3, 0xc2, 0x15, 0xbe, 0xf4, 0x72, 
-    0xfd, 0x4d, 0xf0, 0x10, 0x6f, 0xe5, 0xbf, 0x8c, 0xb1  
-    };
-
-#define CERT_DER_LENGTH 968
-UA_Byte CERT_DER_DATA[968] = {
-    0x30, 0x82, 0x03, 0xc4, 0x30, 0x82, 0x02, 0xac, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 
-    0xa7, 0x17, 0x44, 0x2f, 0x8e, 0x6b, 0x74, 0xba, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 
-    0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x39, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 
-    0x04, 0x06, 0x13, 0x02, 0x44, 0x45, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 
-    0x09, 0x6f, 0x70, 0x65, 0x6e, 0x36, 0x32, 0x35, 0x34, 0x31, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 
-    0x55, 0x04, 0x03, 0x0c, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x36, 0x32, 0x35, 0x34, 0x31, 0x2e, 0x6f, 
-    0x72, 0x67, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x33, 0x32, 0x38, 0x30, 0x38, 0x33, 0x33, 
-    0x35, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x38, 0x30, 0x33, 0x32, 0x35, 0x30, 0x38, 0x33, 0x33, 0x35, 
-    0x37, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x44, 
-    0x45, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x6f, 0x70, 0x65, 0x6e, 
-    0x36, 0x32, 0x35, 0x34, 0x31, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x19, 
-    0x6f, 0x70, 0x65, 0x6e, 0x36, 0x32, 0x35, 0x34, 0x31, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x40, 
-    0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 
-    0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 
-    0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe0, 0xc9, 0x91, 0x62, 0xcd, 0x91, 
-    0x68, 0x75, 0x2c, 0x32, 0x7a, 0xdd, 0xf1, 0xd6, 0x64, 0x77, 0x8b, 0x72, 0x9e, 0x14, 0x2a, 0x62, 
-    0x08, 0xd1, 0x89, 0x7d, 0xe2, 0x17, 0xdc, 0xb3, 0xda, 0xbc, 0x3a, 0x9f, 0x84, 0x03, 0xd3, 0x2e, 
-    0x68, 0xbe, 0xc1, 0x57, 0xcb, 0x2a, 0xe2, 0xd6, 0xcf, 0xc4, 0x7f, 0xbd, 0x53, 0x3f, 0xeb, 0x39, 
-    0x98, 0x69, 0xb0, 0x40, 0x14, 0xbf, 0xf5, 0x5a, 0x23, 0x23, 0xf4, 0x4c, 0xf8, 0xf1, 0x03, 0x56, 
-    0x6d, 0x7d, 0x1b, 0x93, 0xd7, 0x0f, 0xc1, 0x8c, 0x70, 0xe0, 0x2c, 0x55, 0x7e, 0xa1, 0xfc, 0x05, 
-    0xe9, 0xd7, 0xea, 0xb1, 0x5c, 0x0f, 0x9b, 0xac, 0x6a, 0x2e, 0xb4, 0xc5, 0xbf, 0x41, 0x8f, 0xda, 
-    0xfc, 0x85, 0xc6, 0xaa, 0x25, 0xe4, 0xb9, 0x9a, 0xc6, 0xd8, 0x9a, 0x31, 0x8a, 0x17, 0x8b, 0x8c, 
-    0x4e, 0x20, 0xd9, 0x71, 0xfc, 0x66, 0x3a, 0xfd, 0x49, 0x95, 0x54, 0xa8, 0xaf, 0x42, 0x5e, 0xba, 
-    0x26, 0xe6, 0xd3, 0xa0, 0xd2, 0x02, 0x3b, 0x51, 0x8b, 0x39, 0xd3, 0x97, 0xd2, 0xe4, 0xd1, 0x01, 
-    0x65, 0xab, 0x8e, 0xa2, 0x80, 0x5b, 0x5e, 0xbb, 0x11, 0x7f, 0x50, 0x1b, 0x2b, 0x0d, 0x20, 0x40, 
-    0xb5, 0xbf, 0xd1, 0x32, 0xfa, 0x25, 0xe1, 0x0d, 0x75, 0xfc, 0x11, 0xcf, 0x21, 0xdd, 0x45, 0x16, 
-    0xe4, 0x56, 0x58, 0x49, 0x33, 0xca, 0xaf, 0xe3, 0x17, 0x7b, 0x7a, 0x8f, 0xb1, 0xec, 0x1c, 0x4d, 
-    0xa2, 0xc2, 0xce, 0x8b, 0x19, 0x4b, 0xc0, 0xc4, 0x36, 0x6a, 0x7c, 0x5b, 0x89, 0x14, 0x98, 0xcb, 
-    0xa9, 0xca, 0x66, 0xf2, 0xaa, 0xf9, 0x12, 0x40, 0x0e, 0x6a, 0x78, 0x4d, 0x1f, 0x54, 0x3c, 0x03, 
-    0x7a, 0x91, 0xf5, 0xb7, 0x3d, 0xe2, 0xfc, 0x65, 0xb7, 0xaa, 0xa9, 0x39, 0x68, 0xa7, 0xdb, 0x29, 
-    0xc1, 0x40, 0x0b, 0x4e, 0xfb, 0xce, 0x74, 0xa5, 0x46, 0xb9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 
-    0x81, 0xc2, 0x30, 0x81, 0xbf, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 
-    0x60, 0x6e, 0x44, 0x94, 0xa8, 0xa2, 0x4e, 0x7a, 0x3e, 0xe2, 0x4b, 0x84, 0x5e, 0xec, 0x01, 0xc9, 
-    0xa3, 0xf9, 0x69, 0xaf, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 
-    0x14, 0x53, 0x77, 0xe0, 0xa2, 0xf2, 0x49, 0x38, 0xcf, 0x71, 0x58, 0x0a, 0x67, 0xa6, 0xc0, 0x17, 
-    0xd7, 0xb5, 0xdc, 0x52, 0x4b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 
-    0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x05, 0xe0, 0x30, 0x1d, 0x06, 
-    0x03, 0x55, 0x1d, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 
-    0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x46, 0x06, 0x03, 
-    0x55, 0x1d, 0x11, 0x04, 0x3f, 0x30, 0x3d, 0x82, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 
-    0x73, 0x74, 0x82, 0x06, 0x64, 0x65, 0x62, 0x69, 0x61, 0x6e, 0x87, 0x04, 0x7f, 0x00, 0x00, 0x01, 
-    0x87, 0x04, 0x00, 0x00, 0x00, 0x00, 0x86, 0x1c, 0x75, 0x72, 0x6e, 0x3a, 0x75, 0x6e, 0x63, 0x6f, 
-    0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 
-    0x74, 0x69, 0x6f, 0x6e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 
-    0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa4, 0xc1, 0x4f, 0x0e, 0xfe, 0xce, 0x2d, 0x91, 
-    0x8a, 0x51, 0x25, 0xd2, 0x6c, 0x07, 0x86, 0x95, 0xba, 0xc5, 0xe0, 0xad, 0x9b, 0x09, 0x3e, 0x7f, 
-    0x36, 0xc4, 0xa8, 0x10, 0x5b, 0x33, 0x77, 0xe5, 0xb5, 0x3b, 0xd8, 0x98, 0x7c, 0x42, 0x05, 0xcb, 
-    0xb7, 0x91, 0x07, 0x3f, 0x47, 0xff, 0x13, 0x15, 0x45, 0xff, 0x05, 0x03, 0x3d, 0xed, 0x63, 0x96, 
-    0x3a, 0x5c, 0xf8, 0x59, 0xd0, 0xbc, 0x68, 0x8c, 0xfb, 0xf8, 0x29, 0x07, 0x76, 0x63, 0xa7, 0x39, 
-    0xc1, 0x82, 0xc1, 0x10, 0x8b, 0x17, 0xf2, 0x1d, 0x14, 0xdd, 0x88, 0xe7, 0xdc, 0x2f, 0xa7, 0x9d, 
-    0xa3, 0xaa, 0xfd, 0x1a, 0x70, 0xce, 0x57, 0xb5, 0x9f, 0xc3, 0x7b, 0xd0, 0xc0, 0x6f, 0x73, 0x81, 
-    0x74, 0x41, 0x93, 0x0d, 0x0d, 0x1a, 0x95, 0xf6, 0xe4, 0x1c, 0x04, 0x2b, 0x37, 0x4f, 0xf9, 0x99, 
-    0x82, 0x57, 0xf0, 0x4f, 0x14, 0xcb, 0x0f, 0x3d, 0x1a, 0x52, 0x69, 0x18, 0x3f, 0xbe, 0x1c, 0x1c, 
-    0x1b, 0xca, 0xbd, 0xe7, 0xe0, 0x81, 0x44, 0x6d, 0x4a, 0x08, 0x8a, 0xe2, 0x7e, 0x59, 0x9f, 0x89, 
-    0x44, 0x7e, 0x4d, 0xaf, 0x5a, 0x8e, 0xe8, 0xd2, 0x2e, 0x98, 0x72, 0x86, 0xef, 0x7b, 0xcf, 0x88, 
-    0xd0, 0xe2, 0xd5, 0xd9, 0xd5, 0x19, 0xa2, 0x8c, 0xf4, 0x40, 0x98, 0x86, 0x32, 0x9f, 0x3e, 0x25, 
-    0x05, 0xd0, 0xdc, 0xf8, 0x1a, 0x0f, 0xdf, 0xc0, 0x54, 0x46, 0x20, 0xbd, 0xd4, 0xf6, 0xf5, 0xdd, 
-    0x10, 0x2e, 0xa7, 0x1a, 0xf4, 0xbb, 0xed, 0x5d, 0xf3, 0x1c, 0x96, 0x44, 0x81, 0x69, 0xd4, 0x0b, 
-    0xbe, 0x59, 0x07, 0x1b, 0x7f, 0x93, 0xc3, 0x4e, 0x7b, 0x32, 0x51, 0xd0, 0x13, 0x47, 0x57, 0x52, 
-    0xf0, 0x5c, 0x54, 0x36, 0x22, 0xb6, 0xf5, 0x67, 0xbb, 0xd3, 0xa6, 0x43, 0xf0, 0xca, 0x98, 0x91, 
-    0xda, 0x31, 0x3e, 0xd2, 0x8c, 0xfe, 0xd7, 0x51  
-    };
-
-_UA_END_DECLS
-
-#endif /* CERTIFICATES_H_ */
diff --git a/ext/open62541/tests/encryption/check_encryption_basic128rsa15.c b/ext/open62541/tests/encryption/check_encryption_basic128rsa15.c
deleted file mode 100644
index fe95e8d..0000000
--- a/ext/open62541/tests/encryption/check_encryption_basic128rsa15.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- *
- */
-
-#include <open62541/client_config_default.h>
-#include <open62541/plugin/securitypolicy_default.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-#include "ua_server_internal.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "certificates.h"
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-
-    /* Load certificate and private key */
-    UA_ByteString certificate;
-    certificate.length = CERT_DER_LENGTH;
-    certificate.data = CERT_DER_DATA;
-
-    UA_ByteString privateKey;
-    privateKey.length = KEY_DER_LENGTH;
-    privateKey.data = KEY_DER_DATA;
-
-    /* Load the trustlist */
-    size_t trustListSize = 0;
-    UA_ByteString *trustList = NULL;
-
-    /* Load the issuerList */
-    size_t issuerListSize = 0;
-    UA_ByteString *issuerList = NULL;
-
-    /* TODO test trustList
-    if(argc > 3)
-        trustListSize = (size_t)argc-3;
-    UA_STACKARRAY(UA_ByteString, trustList, trustListSize);
-    for(size_t i = 0; i < trustListSize; i++)
-        trustList[i] = loadFile(argv[i+3]);
-    */
-
-    /* Loading of a revocation list currently unsupported */
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    server = UA_Server_new();
-    UA_ServerConfig_setDefaultWithSecurityPolicies(UA_Server_getConfig(server),
-                                                   4840, &certificate, &privateKey,
-                                                   trustList, trustListSize,
-                                                   issuerList, issuerListSize,
-                                                   revocationList, revocationListSize);
-
-    for(size_t i = 0; i < trustListSize; i++)
-        UA_ByteString_deleteMembers(&trustList[i]);
-
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(encryption_connect) {
-    UA_Client *client = NULL;
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_ByteString *trustList = NULL;
-    size_t trustListSize = 0;
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    /* Load certificate and private key */
-    UA_ByteString certificate;
-    certificate.length = CERT_DER_LENGTH;
-    certificate.data = CERT_DER_DATA;
-    ck_assert_int_ne(certificate.length, 0);
-
-    UA_ByteString privateKey;
-    privateKey.length = KEY_DER_LENGTH;
-    privateKey.data = KEY_DER_DATA;
-    ck_assert_int_ne(privateKey.length, 0);
-
-    /* The Get endpoint (discovery service) is done with
-     * security mode as none to see the server's capability
-     * and certificate */
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    ck_assert(client != NULL);
-    UA_StatusCode retval = UA_Client_getEndpoints(client, "opc.tcp://localhost:4840",
-                                                  &endpointArraySize, &endpointArray);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(endpointArraySize > 0);
-
-    UA_Array_delete(endpointArray, endpointArraySize,
-                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-
-    /* TODO test trustList Load revocationList is not supported now
-    if(argc > MIN_ARGS) {
-        trustListSize = (size_t)argc-MIN_ARGS;
-        retval = UA_ByteString_allocBuffer(trustList, trustListSize);
-        if(retval != UA_STATUSCODE_GOOD) {
-            cleanupClient(client, remoteCertificate);
-            return (int)retval;
-        }
-
-        for(size_t trustListCount = 0; trustListCount < trustListSize; trustListCount++) {
-            trustList[trustListCount] = loadFile(argv[trustListCount+3]);
-        }
-    }
-    */
-
-    UA_Client_delete(client);
-
-    /* Secure client initialization */
-    client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,
-                                         trustList, trustListSize,
-                                         revocationList, revocationListSize);
-    cc->securityPolicyUri =
-        UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15");
-    ck_assert(client != NULL);
-
-    for(size_t deleteCount = 0; deleteCount < trustListSize; deleteCount++) {
-        UA_ByteString_deleteMembers(&trustList[deleteCount]);
-    }
-
-    /* Secure client connect */
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant val;
-    UA_Variant_init(&val);
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-static Suite* testSuite_encryption(void) {
-    Suite *s = suite_create("Encryption");
-    TCase *tc_encryption = tcase_create("Encryption basic128rsa15");
-    tcase_add_checked_fixture(tc_encryption, setup, teardown);
-#ifdef UA_ENABLE_ENCRYPTION
-    tcase_add_test(tc_encryption, encryption_connect);
-#endif /* UA_ENABLE_ENCRYPTION */
-    suite_add_tcase(s,tc_encryption);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_encryption();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/encryption/check_encryption_basic256sha256.c b/ext/open62541/tests/encryption/check_encryption_basic256sha256.c
deleted file mode 100644
index 8ff39c2..0000000
--- a/ext/open62541/tests/encryption/check_encryption_basic256sha256.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2019 (c) Kalycito Infotech Private Limited
- *
- */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/securitypolicy.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-#include "ua_server_internal.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "certificates.h"
-#include "check.h"
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-
-    /* Load certificate and private key */
-    UA_ByteString certificate;
-    certificate.length = CERT_DER_LENGTH;
-    certificate.data = CERT_DER_DATA;
-
-    UA_ByteString privateKey;
-    privateKey.length = KEY_DER_LENGTH;
-    privateKey.data = KEY_DER_DATA;
-
-    /* Load the trustlist */
-    size_t trustListSize = 0;
-    UA_ByteString *trustList = NULL;
-
-    /* Load the issuerList */
-    size_t issuerListSize = 0;
-    UA_ByteString *issuerList = NULL;
-
-    /* TODO test trustList
-    if(argc > 3)
-        trustListSize = (size_t)argc-3;
-    UA_STACKARRAY(UA_ByteString, trustList, trustListSize);
-    for(size_t i = 0; i < trustListSize; i++)
-        trustList[i] = loadFile(argv[i+3]);
-    */
-
-    /* Loading of a revocation list currently unsupported */
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    server = UA_Server_new();
-    UA_ServerConfig_setDefaultWithSecurityPolicies(UA_Server_getConfig(server),
-                                                   4840, &certificate, &privateKey,
-                                                   trustList, trustListSize,
-                                                   issuerList, issuerListSize,
-                                                   revocationList, revocationListSize);
-
-    for(size_t i = 0; i < trustListSize; i++)
-        UA_ByteString_deleteMembers(&trustList[i]);
-
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(encryption_connect) {
-    UA_Client *client = NULL;
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_ByteString *trustList = NULL;
-    size_t trustListSize = 0;
-    UA_ByteString *revocationList = NULL;
-    size_t revocationListSize = 0;
-
-    /* Load certificate and private key */
-    UA_ByteString certificate;
-    certificate.length = CERT_DER_LENGTH;
-    certificate.data = CERT_DER_DATA;
-    ck_assert_int_ne(certificate.length, 0);
-
-    UA_ByteString privateKey;
-    privateKey.length = KEY_DER_LENGTH;
-    privateKey.data = KEY_DER_DATA;
-    ck_assert_int_ne(privateKey.length, 0);
-
-    /* The Get endpoint (discovery service) is done with
-     * security mode as none to see the server's capability
-     * and certificate */
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    ck_assert(client != NULL);
-    UA_StatusCode retval = UA_Client_getEndpoints(client, "opc.tcp://localhost:4840",
-                                                  &endpointArraySize, &endpointArray);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(endpointArraySize > 0);
-
-    UA_Array_delete(endpointArray, endpointArraySize,
-                    &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-
-    /* TODO test trustList Load revocationList is not supported now
-    if(argc > MIN_ARGS) {
-        trustListSize = (size_t)argc-MIN_ARGS;
-        retval = UA_ByteString_allocBuffer(trustList, trustListSize);
-        if(retval != UA_STATUSCODE_GOOD) {
-            cleanupClient(client, remoteCertificate);
-            return (int)retval;
-        }
-
-        for(size_t trustListCount = 0; trustListCount < trustListSize; trustListCount++) {
-            trustList[trustListCount] = loadFile(argv[trustListCount+3]);
-        }
-    }
-    */
-
-    UA_Client_delete(client);
-
-    /* Secure client initialization */
-    client = UA_Client_new();
-    UA_ClientConfig *cc = UA_Client_getConfig(client);
-    UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,
-                                         trustList, trustListSize,
-                                         revocationList, revocationListSize);
-    cc->securityPolicyUri =
-        UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256");
-    ck_assert(client != NULL);
-
-    for(size_t deleteCount = 0; deleteCount < trustListSize; deleteCount++) {
-        UA_ByteString_deleteMembers(&trustList[deleteCount]);
-    }
-
-    /* Secure client connect */
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Variant val;
-    UA_Variant_init(&val);
-    UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-    retval = UA_Client_readValueAttribute(client, nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&val);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-END_TEST
-
-static Suite* testSuite_encryption(void) {
-    Suite *s = suite_create("Encryption");
-    TCase *tc_encryption = tcase_create("Encryption basic256sha256");
-    tcase_add_checked_fixture(tc_encryption, setup, teardown);
-#ifdef UA_ENABLE_ENCRYPTION
-    tcase_add_test(tc_encryption, encryption_connect);
-#endif /* UA_ENABLE_ENCRYPTION */
-    suite_add_tcase(s,tc_encryption);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_encryption();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/fuzz/CMakeLists.txt b/ext/open62541/tests/fuzz/CMakeLists.txt
deleted file mode 100644
index d695f45..0000000
--- a/ext/open62541/tests/fuzz/CMakeLists.txt
+++ /dev/null
@@ -1,111 +0,0 @@
-get_property(open62541_BUILD_INCLUDE_DIRS TARGET open62541 PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
-include_directories(${open62541_BUILD_INCLUDE_DIRS})
-# ua_server_internal.h
-include_directories("${PROJECT_SOURCE_DIR}/src")
-include_directories("${PROJECT_SOURCE_DIR}/src/server")
-# testing_clock.h
-include_directories("${PROJECT_SOURCE_DIR}/tests/testing-plugins")
-
-if(NOT MSVC)
-    add_definitions(-Wno-deprecated-declarations)
-endif()
-
-if (UA_BUILD_FUZZING_CORPUS)
-    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-
-    add_definitions(-DUA_CORPUS_OUTPUT_DIR="${PROJECT_BINARY_DIR}/corpus/custom")
-    file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/corpus/custom)
-
-    add_executable(corpus_generator ua_debug_dump_pkgs_file.c corpus_generator.c)
-    target_link_libraries(corpus_generator open62541 ${open62541_LIBRARIES})
-    assign_source_group(corpus_generator)
-    set_target_properties(corpus_generator PROPERTIES FOLDER "open62541/corpus_generator")
-    set_target_properties(corpus_generator PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
-    return()
-endif()
-
-
-remove_definitions(-std=c99 -Wmissing-prototypes -Wstrict-prototypes)
-set (CMAKE_CXX_STANDARD 11)
-
-if (NOT UA_BUILD_OSS_FUZZ)
-
-    if(NOT "x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang")
-        MESSAGE(FATAL_ERROR "To build fuzzing, you need to use Clang as the compiler")
-    endif()
-
-    # oss-fuzz builds already include these flags
-    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
-        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O1 -fsanitize=address")
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O1 -fsanitize=address")
-    else()
-        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -gline-tables-only -fsanitize=address -fsanitize-address-use-after-scope -fsanitize-coverage=trace-pc-guard,trace-cmp")
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -gline-tables-only -fsanitize=address -fsanitize-address-use-after-scope -fsanitize-coverage=trace-pc-guard,trace-cmp")
-    endif()
-    set(LIBS Fuzzer)
-    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
-else()
-    set(LIBS $ENV{LIB_FUZZING_ENGINE})
-    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $ENV{OUT})
-endif()
-list(APPEND LIBS "${open62541_LIBRARIES}")
-
-# Use different plugins for testing
-set(fuzzing_plugin_sources ${PROJECT_SOURCE_DIR}/arch/network_tcp.c
-    ${PROJECT_SOURCE_DIR}/tests/testing-plugins/testing_clock.c
-    ${PROJECT_SOURCE_DIR}/tests/testing-plugins/testing_networklayers.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_log_stdout.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_config_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_nodestore_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_accesscontrol_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/ua_pki_default.c
-    ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_none.c
-)
-
-if(UA_ENABLE_ENCRYPTION)
-  list(APPEND fuzzing_plugin_sources
-       ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/securitypolicy_mbedtls_common.c
-              ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c
-              ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic256.c
-              ${PROJECT_SOURCE_DIR}/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c)
-endif()
-
-add_library(open62541-fuzzplugins OBJECT
-            ${fuzzing_plugin_sources}
-            ${PROJECT_SOURCE_DIR}/arch/${UA_ARCHITECTURE}/ua_architecture_functions.c)
-add_dependencies(open62541-fuzzplugins open62541)
-
-# the fuzzer test are built directly on the open62541 object files. so they can
-# access symbols that are hidden/not exported to the shared library
-
-set(FUZZER_TARGETS)
-
-macro(add_fuzzer FUZZER_NAME FUZZER_SOURCE)
-    add_executable(${FUZZER_NAME} $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-fuzzplugins> ${FUZZER_SOURCE} ${ARGN})
-    target_link_libraries(${FUZZER_NAME} ${LIBS})
-    target_include_directories(${FUZZER_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/src/server)
-    assign_source_group(${FUZZER_SOURCE})
-    list(APPEND FUZZER_TARGETS ${FUZZER_NAME})
-endmacro()
-
-# Add new fuzzers here
-add_fuzzer(fuzz_binary_message fuzz_binary_message.cc)
-add_fuzzer(fuzz_binary_decode fuzz_binary_decode.cc)
-add_fuzzer(fuzz_src_ua_util fuzz_src_ua_util.cc)
-
-if(UA_ENABLE_JSON_ENCODING)
-    add_fuzzer(fuzz_json_decode fuzz_json_decode.cc)
-    add_fuzzer(fuzz_json_decode_encode fuzz_json_decode_encode.cc)
-endif()
-
-file(GLOB CORPUS_FILES ${PROJECT_SOURCE_DIR}/tests/fuzz/fuzz_binary_message_corpus/generated/*)
-
-SET(CORPUS_CMDS "")
-FOREACH(f ${CORPUS_FILES})
-    LIST(APPEND CORPUS_CMDS COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/fuzz_binary_message "${f}")
-ENDFOREACH(f)
-
-add_custom_target(run_fuzzer ${CORPUS_CMDS}
-                  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                  DEPENDS ${FUZZER_TARGETS}
-                  ${MAYBE_USES_TERMINAL})
diff --git a/ext/open62541/tests/fuzz/README.md b/ext/open62541/tests/fuzz/README.md
deleted file mode 100644
index 7cda5f1..0000000
--- a/ext/open62541/tests/fuzz/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-I Can haz fuzz
-==============
-
-open62541 is continuously tested with the awesome oss-fuzz project from Google:
-https://github.com/google/oss-fuzz
-
-Currently tested is processing of binary messages and encoding/decoding of
-binary encoded data.
-
-Reproduce locally
------------------
-
-### Reproduce build failure
-
-You can just execute the script under `tests/fuzz/check_build.sh`, which does the following:
-
-```bash
-# clone oss-fuzz repo
-cd oss-fuzz
-# Change $OPEN62541_DIR to your local checkout of open62541
-python infra/helper.py build_fuzzers --sanitizer address open62541 $OPEN62541_DIR && python infra/helper.py check_build --sanitizer address open62541
-```
-
-### Reproduce issues
-
-Download the testcase file and store it e.g. in your Download folder.
-
-```bash
-# clone oss-fuzz repo
-cd oss-fuzz
-# Change $OPEN62541_DIR to your local checkout of open62541
-# And change $DOWNLOADS to your download location
-python infra/helper.py build_fuzzers --sanitizer address open62541 $OPEN62541_DIR && python infra/helper.py reproduce open62541 fuzz_binary_decode $DOWNLOADS/clusterfuzz-testcase-minimized-fuzz_binary_decode-5686300273803264
-```
-
-Status
-------
-
-* [Build status](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
-* [Open issues](https://bugs.chromium.org/p/oss-fuzz/issues/list?q=label:Proj-open62541)
-
-Update the corpus
------------------
-
-To update the current corpus used for fuzzing you need to follow these steps.
-It will execute all the unit tests, dump the received data packages to a directory
-and then update and merge the corpus.
-
-1. The script will create two directories: `open62541/build_fuzz` and `open62541/build_corpus`.
-   Make sure that these directories are not existing or do not contain any important data.
-
-2. Run the generate script:
-
-   `open62541/tests/fuzz/generate_corpus.sh`
-   
-   This script will build all the unit tests, dump the packages and then merge the current 
-   corpus with the new packages. 
-    
-3. If there is new coverage with the generated data there will be new files in the directory:
-
-   `open62541/fuzz/fuzz_binary_message_corpus/generated`
-   
-   Commit the new files and then you can delete the build directories created in step 1.
diff --git a/ext/open62541/tests/fuzz/check_build.sh b/ext/open62541/tests/fuzz/check_build.sh
deleted file mode 100644
index 32587cd..0000000
--- a/ext/open62541/tests/fuzz/check_build.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-git clone https://github.com/google/oss-fuzz $HOME/oss-fuzz
-python $HOME/oss-fuzz/infra/helper.py build_fuzzers --sanitizer address open62541 $TRAVIS_BUILD_DIR && python $HOME/oss-fuzz/infra/helper.py check_build --sanitizer address open62541
diff --git a/ext/open62541/tests/fuzz/corpus_generator.c b/ext/open62541/tests/fuzz/corpus_generator.c
deleted file mode 100644
index 4096d17..0000000
--- a/ext/open62541/tests/fuzz/corpus_generator.c
+++ /dev/null
@@ -1,597 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
- * This code is used to generate a binary file for every request type
- * which can be sent from a client to the server.
- * These files form the basic corpus for fuzzing the server.
- * This script is intended to be executed manually and then commit the new
- * corpus to the repository.
- */
-
-#ifndef UA_DEBUG_DUMP_PKGS_FILE
-#error UA_DEBUG_DUMP_PKGS_FILE must be defined
-#endif
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "client/ua_client_internal.h"
-#include <server/ua_server_internal.h>
-
-#include <dirent.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <sys/stat.h>
-
-UA_Server *server;
-UA_Boolean running;
-pthread_t server_thread;
-
-static void * serverloop(void *_) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return NULL;
-}
-
-static void start_server(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->applicationDescription.applicationType = UA_APPLICATIONTYPE_SERVER;
-    config->discovery.mdnsEnable = true;
-    config->discovery.mdns.mdnsServerName = UA_String_fromChars("Sample Multicast Server");
-
-    UA_Server_run_startup(server);
-    pthread_create(&server_thread, NULL, serverloop, NULL);
-}
-
-static void teardown_server(void) {
-    running = false;
-    pthread_join(server_thread, NULL);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void emptyCorpusDir(void) {
-    DIR *theFolder = opendir(UA_CORPUS_OUTPUT_DIR);
-    struct dirent *next_file;
-    char filepath[400];
-
-    while ( (next_file = readdir(theFolder)) != NULL ) {
-        // build the path for each file in the folder
-        sprintf(filepath, "%s/%s", UA_CORPUS_OUTPUT_DIR, next_file->d_name);
-        remove(filepath);
-    }
-    closedir(theFolder);
-}
-
-#define ASSERT_GOOD(X) if (X != UA_STATUSCODE_GOOD) return X;
-
-/*************************************************
- * The following list of client requests is based
- * on ua_server_binary.c:getServicePointers to
- * cover all possible services and their inputs
- ************************************************/
-
-static UA_StatusCode
-findServersRequest(UA_Client *client) {
-    UA_ApplicationDescription* applicationDescriptionArray = NULL;
-    size_t applicationDescriptionArraySize = 0;
-
-    size_t serverUrisSize = 1;
-    UA_String *serverUris = UA_String_new();
-    serverUris[0] = UA_String_fromChars("urn:some:server:uri");
-
-    size_t localeIdsSize = 1;
-    UA_String *localeIds = UA_String_new();
-    localeIds[0] = UA_String_fromChars("en");
-
-    ASSERT_GOOD(UA_Client_findServers(client, "opc.tcp://localhost:4840",
-                                  serverUrisSize, serverUris, localeIdsSize, localeIds,
-                                  &applicationDescriptionArraySize, &applicationDescriptionArray));
-
-    UA_Array_delete(serverUris, serverUrisSize, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Array_delete(localeIds, localeIdsSize, &UA_TYPES[UA_TYPES_STRING]);
-    UA_Array_delete(applicationDescriptionArray, applicationDescriptionArraySize,
-                    &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-findServersOnNetworkRequest(UA_Client *client) {
-    UA_ServerOnNetwork* serverOnNetwork = NULL;
-    size_t serverOnNetworkSize = 0;
-
-
-    size_t  serverCapabilityFilterSize = 2;
-    UA_String *serverCapabilityFilter = (UA_String*)UA_malloc(sizeof(UA_String) * serverCapabilityFilterSize);
-    serverCapabilityFilter[0] = UA_String_fromChars("LDS");
-    serverCapabilityFilter[1] = UA_String_fromChars("NA");
-
-
-    ASSERT_GOOD(UA_Client_findServersOnNetwork(client, "opc.tcp://localhost:4840", 0, 0,
-                                           serverCapabilityFilterSize, serverCapabilityFilter,
-                                           &serverOnNetworkSize, &serverOnNetwork));
-
-    UA_Array_delete(serverCapabilityFilter, serverCapabilityFilterSize,
-                        &UA_TYPES[UA_TYPES_STRING]);
-    UA_Array_delete(serverOnNetwork, serverOnNetworkSize, &UA_TYPES[UA_TYPES_SERVERONNETWORK]);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-initUaRegisterServer(UA_RegisteredServer *requestServer) {
-    requestServer->isOnline = UA_TRUE;
-    requestServer->serverUri = server->config.applicationDescription.applicationUri;
-    requestServer->productUri = server->config.applicationDescription.productUri;
-    requestServer->serverType = server->config.applicationDescription.applicationType;
-    requestServer->gatewayServerUri = server->config.applicationDescription.gatewayServerUri;
-
-    // create the semaphore
-    int fd = open("/tmp/open62541-corpus-semaphore", O_RDWR|O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
-    close(fd);
-    requestServer->semaphoreFilePath = UA_STRING("/tmp/open62541-corpus-semaphore");
-
-    requestServer->serverNames = &server->config.applicationDescription.applicationName;
-    requestServer->serverNamesSize = 1;
-
-    size_t nl_discurls = server->config.networkLayersSize;
-    requestServer->discoveryUrls = (UA_String*)UA_malloc(sizeof(UA_String) * nl_discurls);
-    requestServer->discoveryUrlsSize = nl_discurls;
-    for(size_t i = 0; i < nl_discurls; ++i) {
-        UA_ServerNetworkLayer *nl = &server->config.networkLayers[i];
-        requestServer->discoveryUrls[i] = nl->discoveryUrl;
-    }
-
-}
-
-static UA_StatusCode
-registerServerRequest(UA_Client *client) {
-    /* Prepare the request. Do not cleanup the request after the service call,
-     * as the members are stack-allocated or point into the server config. */
-    UA_RegisterServerRequest request;
-    UA_RegisterServerRequest_init(&request);
-    /* Copy from RegisterServer2 request */
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-
-    initUaRegisterServer(&request.server);
-
-
-    UA_RegisterServerResponse response;
-    UA_RegisterServerResponse_init(&response);
-
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]);
-
-    UA_free(request.server.discoveryUrls);
-    ASSERT_GOOD(response.responseHeader.serviceResult);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-registerServer2Request(UA_Client *client) {
-    /* Prepare the request. Do not cleanup the request after the service call,
-     * as the members are stack-allocated or point into the server config. */
-    UA_RegisterServer2Request request;
-    UA_RegisterServer2Request_init(&request);
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-
-    initUaRegisterServer(&request.server);
-
-    request.discoveryConfigurationSize = 1;
-    request.discoveryConfiguration = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(&request.discoveryConfiguration[0]);
-    // Set to NODELETE so that we can just use a pointer to the mdns config
-    request.discoveryConfiguration[0].encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
-    request.discoveryConfiguration[0].content.decoded.type = &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION];
-    request.discoveryConfiguration[0].content.decoded.data = &server->config.discovery.mdns;
-
-    // First try with RegisterServer2, if that isn't implemented, use RegisterServer
-    UA_RegisterServer2Response response;
-    UA_RegisterServer2Response_init(&response);
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST],
-                        &response, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]);
-
-    ASSERT_GOOD(response.responseHeader.serviceResult);
-    UA_free(request.server.discoveryUrls);
-    UA_ExtensionObject_delete(request.discoveryConfiguration);
-
-    UA_RegisterServer2Response_deleteMembers(&response);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-readValueRequest(UA_Client *client) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME);
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_BOTH);
-    ASSERT_GOOD(resp.status);
-
-    UA_DataValue_deleteMembers(&resp);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeValueRequest(UA_Client *client) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en-EN", "MyServer");
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    wValue.attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
-    ASSERT_GOOD(UA_Server_write(server, &wValue));
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-browseAndBrowseNextRequest(UA_Client *client) {
-    // Browse node in server folder
-    UA_BrowseRequest bReq;
-    UA_BrowseRequest_init(&bReq);
-    // normally is set to 0, to get all the nodes, but we want to test browse next
-    bReq.requestedMaxReferencesPerNode = 1;
-    bReq.nodesToBrowse = UA_BrowseDescription_new();
-    bReq.nodesToBrowseSize = 1;
-    bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL;
-
-    UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);
-    ASSERT_GOOD(bResp.responseHeader.serviceResult);
-
-    // browse next
-    UA_BrowseNextRequest bNextReq;
-    UA_BrowseNextRequest_init(&bNextReq);
-    // normally is set to 0, to get all the nodes, but we want to test browse next
-    bNextReq.releaseContinuationPoints = UA_FALSE;
-    bNextReq.continuationPoints = &bResp.results[0].continuationPoint;
-    bNextReq.continuationPointsSize = 1;
-
-    UA_BrowseNextResponse bNextResp = UA_Client_Service_browseNext(client, bNextReq);
-    ASSERT_GOOD(bNextResp.responseHeader.serviceResult);
-
-    UA_BrowseNextResponse_deleteMembers(&bNextResp);
-
-    bNextResp = UA_Client_Service_browseNext(client, bNextReq);
-    ASSERT_GOOD(bNextResp.responseHeader.serviceResult);
-
-    UA_BrowseNextResponse_deleteMembers(&bNextResp);
-
-    // release continuation point. Result is then empty
-    bNextReq.releaseContinuationPoints = UA_TRUE;
-    bNextResp = UA_Client_Service_browseNext(client, bNextReq);
-    UA_BrowseNextResponse_deleteMembers(&bNextResp);
-    ASSERT_GOOD(bNextResp.responseHeader.serviceResult);
-
-    UA_BrowseRequest_deleteMembers(&bReq);
-    UA_BrowseResponse_deleteMembers(&bResp);
-    // already deleted by browse request
-    bNextReq.continuationPoints = NULL;
-    bNextReq.continuationPointsSize = 0;
-    UA_BrowseNextRequest_deleteMembers(&bNextReq);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-registerUnregisterNodesRequest(UA_Client *client) {
-    UA_RegisterNodesRequest req;
-    UA_RegisterNodesRequest_init(&req);
-
-    req.nodesToRegister = UA_NodeId_new();
-    req.nodesToRegister[0] = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    req.nodesToRegisterSize = 1;
-
-    UA_RegisterNodesResponse res = UA_Client_Service_registerNodes(client, req);
-    ASSERT_GOOD(res.responseHeader.serviceResult);
-
-    UA_UnregisterNodesRequest reqUn;
-    UA_UnregisterNodesRequest_init(&reqUn);
-
-    reqUn.nodesToUnregister = UA_NodeId_new();
-    reqUn.nodesToUnregister[0] = res.registeredNodeIds[0];
-    reqUn.nodesToUnregisterSize = 1;
-
-    UA_UnregisterNodesResponse resUn = UA_Client_Service_unregisterNodes(client, reqUn);
-    ASSERT_GOOD(resUn.responseHeader.serviceResult);
-
-    UA_UnregisterNodesRequest_deleteMembers(&reqUn);
-    UA_UnregisterNodesResponse_deleteMembers(&resUn);
-    UA_RegisterNodesRequest_deleteMembers(&req);
-    UA_RegisterNodesResponse_deleteMembers(&res);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-translateBrowsePathsToNodeIdsRequest(UA_Client *client) {
-    // Just for testing we want to translate the following path to its corresponding node id
-    // /Objects/Server/ServerStatus/State
-    // Equals the following node IDs:
-    // /85/2253/2256/2259
-
-    #define BROWSE_PATHS_SIZE 3
-    char *paths[BROWSE_PATHS_SIZE] = {"Server", "ServerStatus", "State"};
-    UA_UInt32 ids[BROWSE_PATHS_SIZE] = {UA_NS0ID_ORGANIZES, UA_NS0ID_HASCOMPONENT, UA_NS0ID_HASCOMPONENT};
-    UA_BrowsePath browsePath;
-    UA_BrowsePath_init(&browsePath);
-    browsePath.startingNode = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    browsePath.relativePath.elements = (UA_RelativePathElement*)UA_Array_new(BROWSE_PATHS_SIZE, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]);
-    browsePath.relativePath.elementsSize = BROWSE_PATHS_SIZE;
-
-    for(size_t i = 0; i < BROWSE_PATHS_SIZE; i++) {
-        UA_RelativePathElement *elem = &browsePath.relativePath.elements[i];
-        elem->referenceTypeId = UA_NODEID_NUMERIC(0, ids[i]);
-        elem->targetName = UA_QUALIFIEDNAME_ALLOC(0, paths[i]);
-    }
-
-    UA_TranslateBrowsePathsToNodeIdsRequest request;
-    UA_TranslateBrowsePathsToNodeIdsRequest_init(&request);
-    request.browsePaths = &browsePath;
-    request.browsePathsSize = 1;
-
-    UA_TranslateBrowsePathsToNodeIdsResponse response = UA_Client_Service_translateBrowsePathsToNodeIds(client, request);
-    ASSERT_GOOD(response.responseHeader.serviceResult);
-
-    UA_BrowsePath_deleteMembers(&browsePath);
-    UA_TranslateBrowsePathsToNodeIdsResponse_deleteMembers(&response);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-
-static void
-monitoredItemHandler(UA_Client *client, UA_UInt32 subId, void *subContext,
-                     UA_UInt32 monId, void *monContext, UA_DataValue *value) {
-}
-
-static UA_StatusCode
-subscriptionRequests(UA_Client *client) {
-    UA_UInt32 subId;
-    // createSubscriptionRequest
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-
-    ASSERT_GOOD(response.responseHeader.serviceResult);
-    subId = response.subscriptionId;
-
-    // modifySubscription
-    UA_ModifySubscriptionRequest modifySubscriptionRequest;
-    UA_ModifySubscriptionRequest_init(&modifySubscriptionRequest);
-    modifySubscriptionRequest.subscriptionId = subId;
-    modifySubscriptionRequest.maxNotificationsPerPublish = request.maxNotificationsPerPublish;
-    modifySubscriptionRequest.priority = request.priority;
-    modifySubscriptionRequest.requestedLifetimeCount = request.requestedLifetimeCount;
-    modifySubscriptionRequest.requestedMaxKeepAliveCount = request.requestedMaxKeepAliveCount;
-    modifySubscriptionRequest.requestedPublishingInterval = request.requestedPublishingInterval;
-    UA_ModifySubscriptionResponse modifySubscriptionResponse;
-    __UA_Client_Service(client, &modifySubscriptionRequest, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST],
-                        &modifySubscriptionResponse, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]);
-    ASSERT_GOOD(modifySubscriptionResponse.responseHeader.serviceResult);
-    UA_ModifySubscriptionRequest_deleteMembers(&modifySubscriptionRequest);
-    UA_ModifySubscriptionResponse_deleteMembers(&modifySubscriptionResponse);
-
-    // setPublishingMode
-    UA_SetPublishingModeRequest setPublishingModeRequest;
-    UA_SetPublishingModeRequest_init(&setPublishingModeRequest);
-    setPublishingModeRequest.subscriptionIdsSize = 1;
-    setPublishingModeRequest.subscriptionIds = UA_UInt32_new();
-    setPublishingModeRequest.subscriptionIds[0] = subId;
-    setPublishingModeRequest.publishingEnabled = UA_TRUE;
-    UA_SetPublishingModeResponse setPublishingModeResponse;
-    __UA_Client_Service(client, &setPublishingModeRequest, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST],
-                        &setPublishingModeResponse, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]);
-    ASSERT_GOOD(setPublishingModeResponse.responseHeader.serviceResult);
-    UA_SetPublishingModeRequest_deleteMembers(&setPublishingModeRequest);
-    UA_SetPublishingModeResponse_deleteMembers(&setPublishingModeResponse);
-    
-
-    // createMonitoredItemsRequest
-    UA_UInt32 monId;
-    UA_MonitoredItemCreateRequest monRequest =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
-
-    UA_MonitoredItemCreateResult monResponse =
-        UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,
-                                                  UA_TIMESTAMPSTORETURN_BOTH,
-                                                  monRequest, NULL, monitoredItemHandler, NULL);
-
-    ASSERT_GOOD(monResponse.statusCode);
-    monId = monResponse.monitoredItemId;
-
-    // publishRequest
-    UA_PublishRequest publishRequest;
-    UA_PublishRequest_init(&publishRequest);
-    ASSERT_GOOD(UA_Client_preparePublishRequest(client, &publishRequest));
-    UA_PublishResponse publishResponse;
-    __UA_Client_Service(client, &publishRequest, &UA_TYPES[UA_TYPES_PUBLISHREQUEST],
-                        &publishResponse, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
-    // here we don't care about the return value since it may be UA_STATUSCODE_BADMESSAGENOTAVAILABLE
-    // ASSERT_GOOD(publishResponse.responseHeader.serviceResult);
-    UA_PublishRequest_deleteMembers(&publishRequest);
-    UA_PublishResponse_deleteMembers(&publishResponse);
-
-    // republishRequest
-    UA_RepublishRequest republishRequest;
-    UA_RepublishRequest_init(&republishRequest);
-    republishRequest.retransmitSequenceNumber = 0;
-    republishRequest.subscriptionId = subId;
-    UA_RepublishResponse republishResponse;
-    __UA_Client_Service(client, &republishRequest, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST],
-                        &republishResponse, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]);
-    // here we don't care about the return value since it may be UA_STATUSCODE_BADMESSAGENOTAVAILABLE
-    // ASSERT_GOOD(republishResponse.responseHeader.serviceResult);
-    UA_RepublishRequest_deleteMembers(&republishRequest);
-    UA_RepublishResponse_deleteMembers(&republishResponse);
-
-    // modifyMonitoredItems
-    UA_ModifyMonitoredItemsRequest modifyMonitoredItemsRequest;
-    UA_ModifyMonitoredItemsRequest_init(&modifyMonitoredItemsRequest);
-    modifyMonitoredItemsRequest.subscriptionId = subId;
-    modifyMonitoredItemsRequest.itemsToModifySize = 1;
-    modifyMonitoredItemsRequest.itemsToModify = UA_MonitoredItemModifyRequest_new();
-    modifyMonitoredItemsRequest.itemsToModify[0].monitoredItemId = monId;
-    UA_MonitoringParameters_init(&modifyMonitoredItemsRequest.itemsToModify[0].requestedParameters);
-    UA_ModifyMonitoredItemsResponse modifyMonitoredItemsResponse;
-    __UA_Client_Service(client, &modifyMonitoredItemsRequest, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST],
-                        &modifyMonitoredItemsResponse, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]);
-    ASSERT_GOOD(modifyMonitoredItemsResponse.responseHeader.serviceResult);
-    UA_ModifyMonitoredItemsRequest_deleteMembers(&modifyMonitoredItemsRequest);
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyMonitoredItemsResponse);
-    
-    // setMonitoringMode
-    UA_SetMonitoringModeRequest setMonitoringModeRequest;
-    UA_SetMonitoringModeRequest_init(&setMonitoringModeRequest);
-    setMonitoringModeRequest.subscriptionId = subId;
-    setMonitoringModeRequest.monitoredItemIdsSize = 1;
-    setMonitoringModeRequest.monitoredItemIds = UA_UInt32_new();
-    setMonitoringModeRequest.monitoredItemIds[0] = monId;
-    setMonitoringModeRequest.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_SetMonitoringModeResponse setMonitoringModeResponse;
-    __UA_Client_Service(client, &setMonitoringModeRequest, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST],
-                        &setMonitoringModeResponse, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]);
-    ASSERT_GOOD(setMonitoringModeResponse.responseHeader.serviceResult);
-    UA_SetMonitoringModeRequest_deleteMembers(&setMonitoringModeRequest);
-    UA_SetMonitoringModeResponse_deleteMembers(&setMonitoringModeResponse);
-
-    // deleteMonitoredItemsRequest
-    ASSERT_GOOD(UA_Client_MonitoredItems_deleteSingle(client, subId, monId));
-
-
-    // deleteSubscriptionRequest
-    ASSERT_GOOD(UA_Client_Subscriptions_deleteSingle(client, subId));
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-callRequest(UA_Client *client) {
-    /* Set up the request */
-    UA_CallRequest request;
-    UA_CallRequest_init(&request);
-    UA_CallMethodRequest item;
-    UA_CallMethodRequest_init(&item);
-    item.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
-    item.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-
-    UA_Variant input;
-    UA_UInt32 subId = 12345;
-    UA_Variant_init(&input);
-    UA_Variant_setScalarCopy(&input, &subId, &UA_TYPES[UA_TYPES_UINT32]);
-    item.inputArgumentsSize = 1;
-    item.inputArguments = &input;
-
-    request.methodsToCall = &item;
-    request.methodsToCallSize = 1;
-
-    /* Call the service */
-    UA_CallResponse response = UA_Client_Service_call(client, request);
-    ASSERT_GOOD(response.responseHeader.serviceResult);
-
-    UA_CallResponse_deleteMembers(&response);
-    UA_Variant_deleteMembers(&input);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-nodemanagementRequests(UA_Client *client) {
-    UA_ObjectAttributes attr = UA_ObjectAttributes_default;
-    attr.description = UA_LOCALIZEDTEXT("en-US", "Some Coordinates");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Coordinates");
-
-    UA_NodeId newObjectId;
-    ASSERT_GOOD(UA_Client_addObjectNode(client, UA_NODEID_NULL,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                     UA_QUALIFIEDNAME(1, "Coordinates"),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), attr, &newObjectId));
-
-    UA_ExpandedNodeId target = UA_EXPANDEDNODEID_NULL;
-    target.nodeId = newObjectId;
-    ASSERT_GOOD(UA_Client_addReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                       UA_TRUE, UA_STRING_NULL, target, UA_NODECLASS_OBJECT));
-
-    ASSERT_GOOD(UA_Client_deleteReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                          true, target, true));
-
-    ASSERT_GOOD(UA_Client_deleteNode(client, newObjectId, UA_TRUE));
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-executeClientServices(UA_Client *client) {
-    ASSERT_GOOD(findServersRequest(client));
-    ASSERT_GOOD(findServersOnNetworkRequest(client));
-    ASSERT_GOOD(registerServerRequest(client));
-    ASSERT_GOOD(registerServer2Request(client));
-    ASSERT_GOOD(readValueRequest(client));
-    ASSERT_GOOD(writeValueRequest(client));
-    ASSERT_GOOD(browseAndBrowseNextRequest(client));
-    ASSERT_GOOD(registerUnregisterNodesRequest(client));
-    ASSERT_GOOD(translateBrowsePathsToNodeIdsRequest(client));
-    ASSERT_GOOD(subscriptionRequests(client));
-    ASSERT_GOOD(callRequest(client));
-    ASSERT_GOOD(nodemanagementRequests(client));
-
-    return UA_STATUSCODE_GOOD;
-}
-
-int main(void) {
-    emptyCorpusDir();
-    start_server();
-
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    // this will also call getEndpointsRequest
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if(retval == UA_STATUSCODE_GOOD)
-        retval = executeClientServices(client);
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-
-    if(retval == UA_STATUSCODE_GOOD) {
-        // now also connect with user/pass so that fuzzer also knows how to do that
-        client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        retval = UA_Client_connect_username(client, "opc.tcp://localhost:4840", "user", "password");
-        retval = retval == UA_STATUSCODE_BADUSERACCESSDENIED ? UA_STATUSCODE_GOOD : retval;
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }
-
-    teardown_server();
-
-    if(retval != UA_STATUSCODE_GOOD) {
-        printf("\n--------- AN ERROR OCCURRED ----------\nStatus = %s\n", UA_StatusCode_name(retval));
-        exit(1);
-    } else {
-        printf("\n--------- SUCCESS -------\nThe corpus is stored in %s", UA_CORPUS_OUTPUT_DIR);
-    }
-    return 0;
-}
diff --git a/ext/open62541/tests/fuzz/custom_memory_manager.c b/ext/open62541/tests/fuzz/custom_memory_manager.c
deleted file mode 100644
index 05e1000..0000000
--- a/ext/open62541/tests/fuzz/custom_memory_manager.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Stefan Profanter, fortiss GmbH
- */
-
-/**
- * This memory manager allows to manually reduce the available RAM.
- *
- * It keeps track of malloc and free calls and counts the available RAM.
- * If the requested memory allocation results in hitting the limit,
- * it will return NULL and prevent the new allocation.
- */
-
-#include "custom_memory_manager.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <limits.h>
-
-#include <pthread.h>
-
-pthread_mutex_t mutex;
-
-struct UA_mm_entry {
-    size_t size;
-    void* address;
-    struct UA_mm_entry *next;
-    struct UA_mm_entry *prev;
-};
-
-unsigned long long totalMemorySize = 0;
-unsigned long long memoryLimit = ULONG_MAX;
-
-/*
- * Head and Tail of the double linked list
- */
-struct UA_mm_entry *address_map_first = NULL;
-struct UA_mm_entry *address_map_last = NULL;
-
-void UA_memoryManager_setLimit(unsigned long long newLimit) {
-    memoryLimit = newLimit;
-    //printf("MemoryManager: Setting memory limit to %lld\n", newLimit);
-}
-
-int UA_memoryManager_setLimitFromLast4Bytes(const uint8_t *data, size_t size) {
-    if (size <4)
-        return 0;
-    // just cast the last 4 bytes to uint32
-    const uint32_t *newLimit = (const uint32_t*)(uintptr_t)&(data[size-4]);
-    UA_memoryManager_setLimit(*newLimit);
-    return 1;
-}
-
-/**
- * Add address entry to the linked list after it was allocated.
- *
- * @param size Size of the allocated memory block
- * @param addr Address of the allocated memory block
- * @return 1 on success, 0 if it failed
- */
-static int addToMap(size_t size, void *addr) {
-    struct UA_mm_entry *newEntry = (struct UA_mm_entry*)malloc(sizeof(struct UA_mm_entry));
-    if (!newEntry) {
-        //printf("MemoryManager: Could not allocate memory");
-        return 0;
-    }
-    newEntry->size = size;
-    newEntry->address = addr;
-    newEntry->next = NULL;
-    pthread_mutex_lock(&mutex);
-    newEntry->prev = address_map_last;
-    if (address_map_last)
-        address_map_last->next = newEntry;
-    address_map_last = newEntry;
-    totalMemorySize += size;
-    if (address_map_first == NULL) {
-        address_map_first = newEntry;
-    }
-    pthread_mutex_unlock(&mutex);
-    //printf("Total size (malloc): %lld And new address: %p Entry %p\n", totalMemorySize, addr, (void*)newEntry);
-
-    return 1;
-}
-
-/**
- * Remove entry from the list before the memory block is freed.
- *
- * @param addr Address of the memory block which is freed.
- *
- * @return 1 on success, 0 if the memory block was not found in the list.
- */
-static int removeFromMap(void *addr) {
-    if (addr == NULL)
-        return 1;
-
-
-    pthread_mutex_lock(&mutex);
-
-    struct UA_mm_entry *e = address_map_last;
-
-    while (e) {
-        if (e->address == addr) {
-            if (e == address_map_first)
-                address_map_first = e->next;
-            if (e == address_map_last)
-                address_map_last = e->prev;
-            if (e->prev) {
-                e->prev->next = e->next;
-            }
-            if (e->next) {
-                e->next->prev = e->prev;
-            }
-            totalMemorySize -= e->size;
-
-            //printf("Total size (free): %lld after addr %p and deleting %p\n", totalMemorySize, addr, (void*)e);
-            free(e);
-            pthread_mutex_unlock(&mutex);
-            return 1;
-        }
-        e = e->prev;
-    }
-    pthread_mutex_unlock(&mutex);
-    printf("MemoryManager: Entry with address %p not found", addr);
-    return 0;
-}
-
-void* UA_memoryManager_malloc(size_t size) {
-    if (totalMemorySize + size > memoryLimit)
-        return NULL;
-    void *addr = malloc(size);
-    if (!addr)
-        return NULL;
-    addToMap(size, addr);
-    return addr;
-}
-
-void* UA_memoryManager_calloc(size_t num, size_t size) {
-    if (totalMemorySize + (size * num) > memoryLimit)
-        return NULL;
-    void *addr = calloc(num, size);
-    if (!addr)
-        return NULL;
-    addToMap(size*num, addr);
-    return addr;
-}
-
-void* UA_memoryManager_realloc(void *ptr, size_t new_size) {
-    removeFromMap(ptr);
-    if (totalMemorySize + new_size > memoryLimit)
-        return NULL;
-    void *addr = realloc(ptr, new_size);
-    if (!addr)
-        return NULL;
-    addToMap(new_size, addr);
-    return addr;
-
-}
-
-void UA_memoryManager_free(void* ptr) {
-    removeFromMap(ptr);
-    free(ptr);
-}
-
diff --git a/ext/open62541/tests/fuzz/custom_memory_manager.h b/ext/open62541/tests/fuzz/custom_memory_manager.h
deleted file mode 100644
index 89c0347..0000000
--- a/ext/open62541/tests/fuzz/custom_memory_manager.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Stefan Profanter, fortiss GmbH
- */
-
-#ifndef OPEN62541_CUSTOM_MEMORY_MANAGER_H
-#define OPEN62541_CUSTOM_MEMORY_MANAGER_H
-
-#include <open62541/types.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Set memory limit for memory manager.
- * This allows to reduce the available memory (RAM) for fuzzing tests.
- *
- * @param maxMemory Available memory in bytes
- */
-void UA_EXPORT UA_memoryManager_setLimit(unsigned long long maxMemory);
-
-/**
- * Extract the memory limit from the last four bytes of the byte array.
- * The last four bytes will simply be casted to a uint32_t and that value
- * represents the new memory limit.
- *
- * @param data byte array
- * @param size size of the byte array
- * @return 1 on success, 0 if the byte array is too short
- */
-int UA_EXPORT UA_memoryManager_setLimitFromLast4Bytes(const uint8_t *data, size_t size);
-
-_UA_END_DECLS
-
-#endif /* OPEN62541_CUSTOM_MEMORY_MANAGER_H */
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_decode.cc b/ext/open62541/tests/fuzz/fuzz_binary_decode.cc
deleted file mode 100644
index 3057618..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_decode.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "custom_memory_manager.h"
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "ua_server_internal.h"
-#include "ua_types_encoding_binary.h"
-
-
-static UA_Boolean tortureEncoding(const uint8_t *data, size_t size, size_t *newOffset) {
-    *newOffset = 0;
-    if (size <= 2)
-        return UA_FALSE;
-
-    // get some random type
-    uint16_t typeIndex = (uint16_t)(data[0] | data[1] << 8);
-    data += 2;
-    size -= 2;
-
-    if (typeIndex >= UA_TYPES_COUNT)
-        return UA_FALSE;
-
-    void *dst = UA_new(&UA_TYPES[typeIndex]);
-
-    if (!dst)
-        return UA_FALSE;
-
-    const UA_ByteString binary = {
-            size, //length
-            (UA_Byte *) (void *) data
-    };
-
-    UA_StatusCode ret = UA_decodeBinary(&binary, newOffset, dst, &UA_TYPES[typeIndex], NULL);
-
-    if (ret == UA_STATUSCODE_GOOD) {
-        // copy the datatype to test
-        void *dstCopy = UA_new(&UA_TYPES[typeIndex]);
-        if (!dstCopy)
-            return UA_FALSE;
-        UA_copy(dst, dstCopy, &UA_TYPES[typeIndex]);
-        UA_delete(dstCopy, &UA_TYPES[typeIndex]);
-
-        // now also test encoding
-        UA_ByteString encoded;
-        UA_ByteString_allocBuffer(&encoded, *newOffset);
-        const UA_Byte *end = &encoded.data[*newOffset];
-        UA_Byte *pos = encoded.data;
-        ret = UA_encodeBinary(dst, &UA_TYPES[typeIndex], &pos, &end, NULL, NULL);
-        if (ret == UA_STATUSCODE_GOOD) {
-            // do nothing
-        }
-        UA_ByteString_deleteMembers(&encoded);
-    }
-    UA_delete(dst, &UA_TYPES[typeIndex]);
-
-    return UA_TRUE;
-}
-
-static UA_Boolean tortureExtensionObject(const uint8_t *data, size_t size, size_t *newOffset) {
-    *newOffset = 0;
-    // check if there is still enough data to create an extension object
-    // we need at least a nodeid.numeric which equals to 4 bytes
-    if (size < 4)
-        return UA_FALSE;
-
-    UA_UInt32 identifier = (UA_UInt32)(data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24);
-    size-= 4;
-
-
-    UA_NodeId objectId = UA_NODEID_NUMERIC(0, identifier);
-
-    UA_ExtensionObject obj;
-    UA_ExtensionObject_init(&obj);
-    obj.encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-    obj.content.encoded.typeId = objectId;
-    obj.content.encoded.body.length = size;
-    obj.content.encoded.body.data = (UA_Byte*)(void*)data; // discard const. We are sure that we don't change it
-
-    const UA_DataType *type = UA_findDataTypeByBinary(&obj.content.encoded.typeId);
-
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-    if (type) {
-        void *dstCopy = UA_new(type);
-        if (!dstCopy)
-            return UA_FALSE;
-        ret = UA_decodeBinary(&obj.content.encoded.body, newOffset, dstCopy, type, NULL);
-
-        if (ret == UA_STATUSCODE_GOOD) {
-            UA_Variant var;
-            UA_Variant_init(&var);
-            UA_Variant_setScalar(&var, dstCopy, type);
-        }
-        UA_delete(dstCopy, type);
-    }
-    return ret==UA_STATUSCODE_GOOD;
-}
-
-/*
-** Main entry point.  The fuzzer invokes this function with each
-** fuzzed input.
-*/
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-
-    if (!UA_memoryManager_setLimitFromLast4Bytes(data, size))
-        return 0;
-    size -= 4;
-
-    size_t offset;
-    if (!tortureEncoding(data, size, &offset)) {
-        return 0;
-    }
-    if (offset >= size)
-        return 0;
-
-
-    tortureExtensionObject(&data[offset], size-offset, &offset);
-
-
-    return 0;
-}
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message.cc b/ext/open62541/tests/fuzz/fuzz_binary_message.cc
deleted file mode 100644
index 599aad6..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "custom_memory_manager.h"
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "ua_server_internal.h"
-
-#include "testing_networklayers.h"
-
-#define RECEIVE_BUFFER_SIZE 65535
-
-/*
-** Main entry point.  The fuzzer invokes this function with each
-** fuzzed input.
-*/
-extern "C" int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-
-    if (!UA_memoryManager_setLimitFromLast4Bytes(data, size))
-        return 0;
-    size -= 4;
-
-    UA_Connection c = createDummyConnection(RECEIVE_BUFFER_SIZE, NULL);
-    UA_Server *server = UA_Server_new();
-    if(!server) {
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not create server instance using UA_Server_new");
-        return 0;
-    }
-
-    UA_StatusCode retval = UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Server_delete(server);
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not set the server config");
-        return 0;
-    }
-
-    // we need to copy the message because it will be freed in the processing function
-    UA_ByteString msg = UA_ByteString();
-    retval = UA_ByteString_allocBuffer(&msg, size);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Server_delete(server);
-        UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
-                     "Could not allocate message buffer");
-        return 0;
-    }
-    memcpy(msg.data, data, size);
-
-    UA_Server_processBinaryMessage(server, &c, &msg);
-    // if we got an invalid chunk, the message is not deleted, so delete it here
-    UA_ByteString_deleteMembers(&msg);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-    c.close(&c);
-    UA_Connection_deleteMembers(&c);
-    return 0;
-}
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message.options b/ext/open62541/tests/fuzz/fuzz_binary_message.options
deleted file mode 100644
index 5992b0e..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-dict = fuzz_binary_message_header.dict
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/1d6d4004d0a22c324410fd9df02d7477c1c66f79 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/1d6d4004d0a22c324410fd9df02d7477c1c66f79
deleted file mode 100644
index 55b3f9b..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/1d6d4004d0a22c324410fd9df02d7477c1c66f79
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2469be236b03b891b0371fc00f659be7ecaf48a5 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2469be236b03b891b0371fc00f659be7ecaf48a5
deleted file mode 100644
index 300915d..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2469be236b03b891b0371fc00f659be7ecaf48a5
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2bb7608575acec126e3dd72a71c98b45756cdc17 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2bb7608575acec126e3dd72a71c98b45756cdc17
deleted file mode 100644
index d1fe312..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2bb7608575acec126e3dd72a71c98b45756cdc17
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2e985938f94ec3ffb5d68fdea9f7a57527300c54 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2e985938f94ec3ffb5d68fdea9f7a57527300c54
deleted file mode 100644
index 7ec1331..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/2e985938f94ec3ffb5d68fdea9f7a57527300c54
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3571f2e3699024bbd13426c1c1e0fb6a2be080b7 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3571f2e3699024bbd13426c1c1e0fb6a2be080b7
deleted file mode 100644
index 60739c6..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3571f2e3699024bbd13426c1c1e0fb6a2be080b7
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3cbe2dd022994d8b2aecf44d85207c45d270283b b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3cbe2dd022994d8b2aecf44d85207c45d270283b
deleted file mode 100644
index 5703e9b..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3cbe2dd022994d8b2aecf44d85207c45d270283b
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3dd5bc5b48941232b09f72ff1fa2f53f1123695e b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3dd5bc5b48941232b09f72ff1fa2f53f1123695e
deleted file mode 100644
index 4ebde29..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/3dd5bc5b48941232b09f72ff1fa2f53f1123695e
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/4d008f20a34ba50a523a62d6b5449935f1ad3125 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/4d008f20a34ba50a523a62d6b5449935f1ad3125
deleted file mode 100644
index 28f3432..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/4d008f20a34ba50a523a62d6b5449935f1ad3125
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/55783816d6936aee3ce44915f575a621b8c41f88 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/55783816d6936aee3ce44915f575a621b8c41f88
deleted file mode 100644
index b966255..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/55783816d6936aee3ce44915f575a621b8c41f88
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/61861286a164b848cf3ba3460ac43de4299e055d b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/61861286a164b848cf3ba3460ac43de4299e055d
deleted file mode 100644
index ea74b45..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/61861286a164b848cf3ba3460ac43de4299e055d
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/6fdcec03ea094f77554f81c634d752d7372176f2 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/6fdcec03ea094f77554f81c634d752d7372176f2
deleted file mode 100644
index 18d53dd..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/6fdcec03ea094f77554f81c634d752d7372176f2
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/8c7195ba09cde70328ce616296580f88c1868ce9 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/8c7195ba09cde70328ce616296580f88c1868ce9
deleted file mode 100644
index cd56fdb..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/8c7195ba09cde70328ce616296580f88c1868ce9
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/8c8167bbf8c029729fde0630d4f00873058780a2 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/8c8167bbf8c029729fde0630d4f00873058780a2
deleted file mode 100644
index 582ff9a..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/8c8167bbf8c029729fde0630d4f00873058780a2
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/92f427417e4c921678f4a65a71dd77feadedb93b b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/92f427417e4c921678f4a65a71dd77feadedb93b
deleted file mode 100644
index c9a3942..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/92f427417e4c921678f4a65a71dd77feadedb93b
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/a64af70c8e80f73918426271b02f2a43dfdf3c58 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/a64af70c8e80f73918426271b02f2a43dfdf3c58
deleted file mode 100644
index 8214147..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/a64af70c8e80f73918426271b02f2a43dfdf3c58
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/ad7eca3743c2383c57df920f02539f684b3ffcc3 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/ad7eca3743c2383c57df920f02539f684b3ffcc3
deleted file mode 100644
index b192943..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/ad7eca3743c2383c57df920f02539f684b3ffcc3
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/af1c80d18c06c16ba6067c3cf9526e04c5682f5a b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/af1c80d18c06c16ba6067c3cf9526e04c5682f5a
deleted file mode 100644
index 4fdbb11..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/af1c80d18c06c16ba6067c3cf9526e04c5682f5a
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/b7568f0dc026fa16ca737c6643353ac75b79c149 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/b7568f0dc026fa16ca737c6643353ac75b79c149
deleted file mode 100644
index 786fa5c..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/b7568f0dc026fa16ca737c6643353ac75b79c149
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/ddf2be2fcdaa07a3d7adf0cd9d3c5c8339d97fff b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/ddf2be2fcdaa07a3d7adf0cd9d3c5c8339d97fff
deleted file mode 100644
index 949e200..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/ddf2be2fcdaa07a3d7adf0cd9d3c5c8339d97fff
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/e7710c8ad29b5310c48e3fcfdf01195c210048f6 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/e7710c8ad29b5310c48e3fcfdf01195c210048f6
deleted file mode 100644
index 7b09a58..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/e7710c8ad29b5310c48e3fcfdf01195c210048f6
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/fbef981b62c06122e22da3512d733cb51f093795 b/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/fbef981b62c06122e22da3512d733cb51f093795
deleted file mode 100644
index f9299f4..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_corpus/generated/fbef981b62c06122e22da3512d733cb51f093795
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tests/fuzz/fuzz_binary_message_header.dict b/ext/open62541/tests/fuzz/fuzz_binary_message_header.dict
deleted file mode 100644
index 9a107f0..0000000
--- a/ext/open62541/tests/fuzz/fuzz_binary_message_header.dict
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# AFL dictionary for OPC UA messages
-# -----------------------------
-#
-#
-# Stefan Profanter <git@s.profanter.me>
-#
-
-# Message header for final message (see Spec Part 6, Table 26)
-
-header_msg_final="MSGF"
-header_err_final="ERRF"
-header_opn_final="OPNF"
-header_hel_final="HELF"
-header_ack_final="ACKF"
-header_clo_final="CLOF"
-
-# Message header for message chunk (see Spec Part 6, Table 26)
-
-header_msg_chunk="MSGC"
-header_err_chunk="ERRC"
-header_opn_chunk="OPNC"
-header_hel_chunk="HELC"
-header_ack_chunk="ACKC"
-header_clo_chunk="CLOC"
-
-# Message header for message abort (see Spec Part 6, Table 26)
-
-header_msg_abort="MSGA"
-header_err_abort="ERRA"
-header_opn_abort="OPNA"
-header_hel_abort="HELA"
-header_ack_abort="ACKA"
-header_clo_abort="CLOA"
-
-# TODO add dict for Security Header and Sequence Header
\ No newline at end of file
diff --git a/ext/open62541/tests/fuzz/fuzz_json/json_corpus b/ext/open62541/tests/fuzz/fuzz_json/json_corpus
deleted file mode 100644
index f9b67aa..0000000
--- a/ext/open62541/tests/fuzz/fuzz_json/json_corpus
+++ /dev/null
@@ -1,65 +0,0 @@
-{"Locale":"t1","Text":"t2"}
-{"Id":42}
-{"Type":1,"Body":false}
-{"Value":{"Type":1,"Body":true}}
-{"Type":1, "Body":false, "Type":1}
-{"Type":1,"Body":[null, null, null]}
-{"Type":12,"Body":["1","2","3","4","5","6","7","8"]}
-{"Type":12,"Body":["1","2","3","4","5","6","7","8"],"Dimension":[2,4]}
-{"Encoding":2,"TypeId":{"Id":42},"Body":"<Element></Element>"}
-{"Encoding":1,"TypeId":{"Id":42},"Body":"YXNkZmFzZGY="}
-{"TypeId":{"Id":1},"Body":true}
-{"Type":23,"Body":null}
-{"Value":{"Type":1,"Body":true}}
-{"Value":{"Type":1,"Body":true},"Status":2153250816,"SourceTimestamp":"1970-01-15T06:56:07Z","SourcePicoseconds":0,"ServerTimestamp":"1970-01-15T06:56:07Z","ServerPicoseconds":0}
-{"Type":25,"Body":null}
-{"SymbolicId":13,""LocalizedText":14,""Locale":12,"AdditionalInfo":"additionalInfo",""InnerStatusCode":2155216896,""InnerDiagnosticInfo":{"AdditionalInfo":"INNER ADDITION INFO"}}
-{"IdType":3,"Id":"YXNkZmFzZGY=","Namespace":"test","ServerUri":13}
-{"IdType":1,"Id":"test","Namespace":"test","ServerUri":13}
-{"IdType":1,"Id":"test","Namespace":42}
-{"IdType":1,"Id":"test","Namespace":"abcdef"}
-{"IdType":1,"Id":"test"}
-{"Id":42}
-{"IdType":3,"Id":"YXNkZmFzZGY="}
-{"IdType":2,"Id":"00000001-0002-0003-0405-060708090A0B"}
-{"IdType":1,"Id":"test123"}
-{"Id":42,"Namespace":123}
-{"Id":42}
-{"Timestamp":"1970-01-15T06:56:07Z","ViewVersion":1236,"ViewId":{"Id":"00000009-0002-027C-F3BF-BB7BEEFEEFBE","IdType":2}}
-{"Type":21,"Body":null}
-{"Locale":"t1"}
-{"Locale":"t1","Text":"t2"}
-{"Type":20,"Body":null}
-{"Name":"derName","Uri":1}
-1970-01-02T01:02:03.042Z
-1970-01-02T01:02:03.005Z
-{"Type":19,"Body":0}
-{"Type":19,"Body":2}
-{"Type":14,"Body":"00000=01-0002-0003-0405-060708090A0B"}
-{"Type":14,"Body":"00000001-0002-0003-0405-060708090A0B00000001"}
-{"Type":14,"Body":"00000001-00"}
-{"Type":14,"Body":"00000001-0002-0003-0405-060708090A0B"}
-{"Type":15,"Body":null}
-{"Type":15,"Body":"YXNkZmFzZGY="}
-{"Type":12,"Body":"\\u002c"}
-{"Type":12,"Body":"ab\\tcdef"}
-{"Type":12,"Body":"abcdef"}
-{"Type":11,"Body":nan}
-{"Type":11,"Body":1.0000000000000002}
-{"Type":11,"Body":1}
-{"Type":11,"Body":1.1234}
-{"Type":10,"Body":1}
-{"Type":10,"Body":3.1415927410}
-{"Type":8,"Body":9223372036854775807}
-{"Type":8,"Body":-9223372036854775808}
-{"Type":6,"Body":2147483647}
-{"Type":6,"Body":-2147483648}
-{"Type":4,"Body":32767}
-{"Type":4,"Body":-32768}
-{"Type":2,"Body":127}
-{"Type":2,"Body":-128}
-{"Type":9,"Body":18446744073709551615}
-{"Type":9,"Body":0}
-{"Type":7,"Body":4294967295}
-{"Type":7,"Body":0}
-{"Type":5,"Body":65535}
\ No newline at end of file
diff --git a/ext/open62541/tests/fuzz/fuzz_json_decode.cc b/ext/open62541/tests/fuzz/fuzz_json_decode.cc
deleted file mode 100644
index 70e532a..0000000
--- a/ext/open62541/tests/fuzz/fuzz_json_decode.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Lukas Meling)
- */
-
-
-#include <open62541/types.h>
-#include <open62541/types_generated_handling.h>
-#include "ua_types_encoding_json.h"
-
-/*
-** Main entry point.  The fuzzer invokes this function with each
-** fuzzed input.
-*/
-extern "C" int
-LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
-    UA_ByteString buf;
-    buf.data = (UA_Byte*)data;
-    buf.length = size;
-
-    UA_Variant out;
-    UA_Variant_init(&out);
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
-    if(retval == UA_STATUSCODE_GOOD)
-        UA_Variant_deleteMembers(&out);
-
-    return 0;
-}
diff --git a/ext/open62541/tests/fuzz/fuzz_json_decode_encode.cc b/ext/open62541/tests/fuzz/fuzz_json_decode_encode.cc
deleted file mode 100644
index b0f4f82..0000000
--- a/ext/open62541/tests/fuzz/fuzz_json_decode_encode.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-#include <open62541/types.h>
-#include <open62541/types_generated_handling.h>
-#include "ua_types_encoding_json.h"
-
-/* Decode a message, then encode, decode, encode.
- * The two encodings must be bit-equal. */
-extern "C" int
-LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
-    UA_ByteString buf;
-    buf.data = (UA_Byte*)data;
-    buf.length = size;
-
-    UA_Variant value;
-    UA_Variant_init(&value);
-
-    UA_StatusCode retval = UA_decodeJson(&buf, &value, &UA_TYPES[UA_TYPES_VARIANT]);
-    if(retval != UA_STATUSCODE_GOOD)
-        return 0;
-
-    size_t jsonSize = UA_calcSizeJson(&value, &UA_TYPES[UA_TYPES_VARIANT],
-                                      NULL, 0, NULL, 0, true);
-
-    UA_ByteString buf2 = UA_BYTESTRING_NULL;
-    retval = UA_ByteString_allocBuffer(&buf2, jsonSize);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Variant_deleteMembers(&value);
-        return 0;
-    }
-
-    uint8_t *bufPos = buf2.data;
-    const uint8_t *bufEnd = &buf2.data[buf2.length];
-    retval = UA_encodeJson(&value, &UA_TYPES[UA_TYPES_VARIANT],
-                           &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-	UA_Variant_deleteMembers(&value);
-	if(retval != UA_STATUSCODE_GOOD || bufPos != bufEnd) {
-		return 0;
-	}
-
-    UA_Variant value2;
-    UA_Variant_init(&value2);
-
-    retval = UA_decodeJson(&buf2, &value2, &UA_TYPES[UA_TYPES_VARIANT]);
-    if(retval != UA_STATUSCODE_GOOD) {
-		return 0;
-	}
-
-    UA_ByteString buf3 = UA_BYTESTRING_NULL;
-    retval = UA_ByteString_allocBuffer(&buf3, jsonSize);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_Variant_deleteMembers(&value2);
-        UA_ByteString_deleteMembers(&buf2);
-        return 0;
-    }
-
-    bufPos = buf3.data;
-    bufEnd = &buf3.data[buf3.length];
-    retval = UA_encodeJson(&value2, &UA_TYPES[UA_TYPES_VARIANT],
-                           &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-	UA_Variant_deleteMembers(&value2);
-	if(retval != UA_STATUSCODE_GOOD) {
-		UA_ByteString_deleteMembers(&buf2);
-		UA_ByteString_deleteMembers(&buf3);
-		return 0;
-	}
-
-    UA_assert(buf2.length == buf3.length);
-    UA_assert(memcmp(buf2.data, buf3.data, buf2.length) == 0);
-    UA_ByteString_deleteMembers(&buf2);
-    UA_ByteString_deleteMembers(&buf3);
-    return 0;
-}
diff --git a/ext/open62541/tests/fuzz/fuzz_src_ua_util.cc b/ext/open62541/tests/fuzz/fuzz_src_ua_util.cc
deleted file mode 100644
index 5e4cace..0000000
--- a/ext/open62541/tests/fuzz/fuzz_src_ua_util.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "custom_memory_manager.h"
-
-#include <open62541/util.h>
-
-
-static int tortureParseEndpointUrl(const uint8_t *data, size_t size) {
-    const UA_String endpointUrl = {
-        size, (UA_Byte* )(void*)data
-    };
-
-    UA_String hostname;
-    UA_UInt16 port;
-    UA_String path;
-    UA_parseEndpointUrl(&endpointUrl, &hostname, &port, &path);
-    return 0;
-}
-
-static int tortureParseEndpointUrlEthernet(const uint8_t *data, size_t size) {
-    const UA_String endpointUrl = {
-        size, (UA_Byte* )(void*)data
-    };
-
-    UA_String target;
-    UA_UInt16 vid;
-    UA_Byte prid;
-    UA_parseEndpointUrlEthernet(&endpointUrl, &target, &vid, &prid);
-    return 0;
-}
-
-/*
-** Main entry point.  The fuzzer invokes this function with each
-** fuzzed input.
-*/
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-
-    if (!UA_memoryManager_setLimitFromLast4Bytes(data, size))
-        return 0;
-    size -= 4;
-
-    if (size == 0)
-        return 0;
-
-    // use first byte to decide which function should be fuzzed
-
-    const uint8_t select = data[0];
-
-    const uint8_t *newData = &data[1];
-    size_t  newSize = size-1;
-
-    switch(select) {
-        case 0:
-            return tortureParseEndpointUrl(newData, newSize);
-        case 1:
-            return tortureParseEndpointUrlEthernet(newData, newSize);
-        default:
-            return 0;
-    }
-
-}
diff --git a/ext/open62541/tests/fuzz/fuzz_src_ua_util.options b/ext/open62541/tests/fuzz/fuzz_src_ua_util.options
deleted file mode 100644
index ad22743..0000000
--- a/ext/open62541/tests/fuzz/fuzz_src_ua_util.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-dict = fuzz_src_ua_util_endpoints.dict
diff --git a/ext/open62541/tests/fuzz/fuzz_src_ua_util_endpoints.dict b/ext/open62541/tests/fuzz/fuzz_src_ua_util_endpoints.dict
deleted file mode 100644
index 14334b5..0000000
--- a/ext/open62541/tests/fuzz/fuzz_src_ua_util_endpoints.dict
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# AFL dictionary for OPC UA Endpoints
-# -----------------------------
-#
-#
-# Stefan Profanter <git@s.profanter.me>
-#
-
-endpoint_http="opc.http"
-endpoint_tcp="opc.tcp"
-endpoint_udp="opc.udp"
-endpoint_udp="opc.eth"
-endpoint_proto="://"
-endpoint_host="localhost"
-endpoint_delim="/"
-endpoint_port=":123"
diff --git a/ext/open62541/tests/fuzz/generate_corpus.sh b/ext/open62541/tests/fuzz/generate_corpus.sh
deleted file mode 100644
index cfd6d5e..0000000
--- a/ext/open62541/tests/fuzz/generate_corpus.sh
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-
-BASE_DIR="$( cd "$DIR/../../" && pwd )"
-
-BUILD_DIR_FUZZ_MODE="$DIR/../../build_fuzz"
-if [ ! -d "$BUILD_DIR_FUZZ_MODE" ]; then
-    mkdir $BUILD_DIR_FUZZ_MODE
-fi
-BUILD_DIR_FUZZ_MODE="$( cd "$DIR/../../build_fuzz" && pwd )"
-
-BUILD_DIR_CORPUS="$DIR/../../build_corpus"
-if [ ! -d "$BUILD_DIR_CORPUS" ]; then
-    mkdir $BUILD_DIR_CORPUS
-fi
-BUILD_DIR_CORPUS="$( cd "$DIR/../../build_corpus" && pwd )"
-
-cd $BUILD_DIR_CORPUS
-if [ -d "$BUILD_DIR_CORPUS/corpus" ]; then
-    rm -rf "$BUILD_DIR_CORPUS/corpus"
-fi
-
-if [ -z ${TRAVIS+x} ]; then
-	export CC=clang
-	export CXX=clang++
-else
-	# Travis needs a specific
-	export CC=clang-6.0
-	export CXX=clang++-6.0
-fi
-# First build and run the unit tests without any specific fuzz settings
-cmake -DUA_BUILD_FUZZING_CORPUS=ON -DUA_BUILD_UNIT_TESTS=ON -DUA_ENABLE_DISCOVERY_MULTICAST=ON -DUA_ENABLE_ENCRYPTION=ON ..
-make -j && make test ARGS="-V"
-if [ $? -ne 0 ] ; then exit 1 ; fi
-# Run our special generator
-$BUILD_DIR_CORPUS/bin/corpus_generator
-if [ $? -ne 0 ] ; then exit 1 ; fi
-
-# Now build the fuzzer executables
-cd $BUILD_DIR_FUZZ_MODE
-cmake -DUA_BUILD_FUZZING=ON ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-
-merge_corpus() {
-    local fuzzer="$1"
-    local corpus_existing="$2"
-    local corpus_new="$3"
-
-
-    if [ -d "$corpus_existing" ]; then
-        echo "Merging ${corpus_new} into ${corpus_existing}"
-        "$fuzzer" -merge=1 "$corpus_existing" "${corpus_new}"
-    else
-        echo "Copying ${corpus_new} into ${corpus_existing}"
-        cp -r ${corpus_new} ${corpus_existing}
-    fi
-}
-
-
-# Iterate over all files and combine single message files to a full interaction, i.e.,
-# After running the corpus generator, the output directory contains single files for each
-# message (HEL, OPN, MSG..., CLO). Fuzzer needs these files to be combined into one single file
-
-
-
-
-
-CORPUS_SINGLE=$BUILD_DIR_CORPUS/corpus
-CORPUS_COMBINED=$BUILD_DIR_CORPUS/corpus_combined
-
-if [ -d  $CORPUS_COMBINED ]; then
-	rm -r $CORPUS_COMBINED
-fi
-mkdir $CORPUS_COMBINED
-
-
-
-
-
-# iterate over all the subdirectories
-subDirs=$(find $CORPUS_SINGLE -maxdepth 1 -mindepth 1 -type d)
-for dirPath in $subDirs; do
-	# if empty, skip
-	if ! [ -n "$(ls -A $dirPath)" ]; then
-		#echo "Skipping empty $dirPath"
-		continue
-	fi
-
-	dir=$(basename $dirPath)
-	dirPathTmp=$CORPUS_COMBINED/${dir}
-	if [ -d  $dirPathTmp ]; then
-		rm -r $dirPathTmp
-	fi
-	mkdir $dirPathTmp
-
-	# The files are ordered by interaction. So we start with the first file
-	# and combine all of them until we get the CLO file.
-	# Then we start a new file and combine them again.
-
-	currCount=1
-
-	for binFile in `ls $dirPath/*.bin | sort -V`; do
-
-		#echo "Combining $binFile to $dirPathTmp/msg_${currCount}.bin"
-		cat $binFile >> $dirPathTmp/${dir}_msg_${currCount}.bin
-
-		# if it is a close message, start new message
-		if [[ "$binFile" == *clo.bin ]]; then
-			currCount=$((currCount+1))
-		fi
-	done
-done
-
-
-
-merge_corpus $BUILD_DIR_FUZZ_MODE/bin/fuzz_binary_message $BASE_DIR/tests/fuzz/fuzz_binary_message_corpus/generated $CORPUS_COMBINED
-if [ $? -ne 0 ] ; then exit 1 ; fi
diff --git a/ext/open62541/tests/fuzz/oss-fuzz-copy.sh b/ext/open62541/tests/fuzz/oss-fuzz-copy.sh
deleted file mode 100644
index 5080103..0000000
--- a/ext/open62541/tests/fuzz/oss-fuzz-copy.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-set -e
-
-# --------------------------------------------------------------------
-# Copies all the corpus files, dict and options to the $OUT directory.
-# This script is only used on oss-fuzz directly
-# --------------------------------------------------------------------
-
-fuzzerFiles=$(find $SRC/open62541/tests/fuzz/ -name "*.cc")
-
-for F in $fuzzerFiles; do
-	fuzzerName=$(basename $F .cc)
-
-	if [ -d "$SRC/open62541/tests/fuzz/${fuzzerName}_corpus" ]; then
-		zip -jr $OUT/${fuzzerName}_seed_corpus.zip $SRC/open62541/tests/fuzz/${fuzzerName}_corpus/
-	fi
-done
-
-cp $SRC/open62541/tests/fuzz/*.dict $SRC/open62541/tests/fuzz/*.options $OUT/
\ No newline at end of file
diff --git a/ext/open62541/tests/fuzz/ua_debug_dump_pkgs_file.c b/ext/open62541/tests/fuzz/ua_debug_dump_pkgs_file.c
deleted file mode 100644
index ee1783c..0000000
--- a/ext/open62541/tests/fuzz/ua_debug_dump_pkgs_file.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
- * This code is used to generate a binary file for every request type
- * which can be sent from a client to the server.
- * These files form the basic corpus for fuzzing the server.
- */
-
-#ifndef UA_DEBUG_DUMP_PKGS_FILE
-#error UA_DEBUG_DUMP_PKGS_FILE must be defined
-#endif
-
-#include <open62541/transport_generated_encoding_binary.h>
-#include <open62541/types.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "server/ua_server_internal.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-// This number is added to the end of every corpus data as 4 bytes.
-// It allows to generate valid corpus and then the fuzzer will use
-// these last 4 bytes to determine the simulated available RAM.
-// The fuzzer will then fiddle around with this number and (hopefully)
-// make it smaller, so that we can simulate Out-of-memory errors.
-#define UA_DUMP_RAM_SIZE 8 * 1024 * 1024
-
-unsigned int UA_dump_chunkCount = 0;
-
-char *UA_dump_messageTypes[] = {"ack", "hel", "msg", "opn", "clo", "err", "unk"};
-
-struct UA_dump_filename {
-    const char *messageType;
-    char serviceName[100];
-};
-
-void UA_debug_dumpCompleteChunk(UA_Server *const server, UA_Connection *const connection,
-                                UA_ByteString *messageBuffer);
-
-/**
- * Gets a pointer to the string representing the given message type from UA_dump_messageTypes.
- * Used for naming the dumped file.
- */
-static const char *
-UA_debug_dumpGetMessageTypePrefix(UA_UInt32 messageType) {
-    switch(messageType & 0x00ffffff) {
-        case UA_MESSAGETYPE_ACK:
-            return UA_dump_messageTypes[0];
-        case UA_MESSAGETYPE_HEL:
-            return UA_dump_messageTypes[1];
-        case UA_MESSAGETYPE_MSG:
-            return UA_dump_messageTypes[2];
-        case UA_MESSAGETYPE_OPN:
-            return UA_dump_messageTypes[3];
-        case UA_MESSAGETYPE_CLO:
-            return UA_dump_messageTypes[4];
-        case UA_MESSAGETYPE_ERR:
-            return UA_dump_messageTypes[5];
-        default:
-            return UA_dump_messageTypes[6];
-    }
-}
-
-/**
- * Decode the request message type from the given byte string and
- * set the global requestServiceName variable to the name of the request.
- * E.g. `GetEndpointsRequest`
- */
-static UA_StatusCode
-UA_debug_dumpSetServiceName(const UA_ByteString *msg, char serviceNameTarget[100]) {
-    /* At 0, the nodeid starts... */
-    size_t offset = 0;
-
-    /* Decode the nodeid */
-    UA_NodeId requestTypeId;
-    UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestTypeId);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-    if(requestTypeId.identifierType != UA_NODEIDTYPE_NUMERIC || requestTypeId.namespaceIndex != 0) {
-        snprintf(serviceNameTarget, 100, "invalid_request_id");
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    const UA_DataType *requestType = NULL;
-
-    for (size_t i=0; i<UA_TYPES_COUNT; i++) {
-        if (UA_TYPES[i].binaryEncodingId == requestTypeId.identifier.numeric) {
-            requestType = &UA_TYPES[i];
-            break;
-        }
-    }
-    if (requestType == NULL) {
-        snprintf(serviceNameTarget, 100, "invalid_request_no_type");
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-
-    snprintf(serviceNameTarget, 100, "_%s", requestType->typeName);
-    return UA_STATUSCODE_GOOD;
-}
-
-/**
- * We need to decode the given binary message to get the name of the called service.
- * This method is used if the connection has no channel yet.
- */
-static UA_StatusCode
-UA_debug_dump_setName_withoutChannel(UA_Server *server, UA_Connection *connection,
-                                     UA_ByteString *message, struct UA_dump_filename* dump_filename) {
-    size_t offset = 0;
-    UA_TcpMessageHeader tcpMessageHeader;
-    UA_StatusCode retval =
-            UA_TcpMessageHeader_decodeBinary(message, &offset, &tcpMessageHeader);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    dump_filename->messageType =
-        UA_debug_dumpGetMessageTypePrefix(tcpMessageHeader.messageTypeAndChunkType & 0x00ffffff);
-
-    if ((tcpMessageHeader.messageTypeAndChunkType & 0x00ffffff) == UA_MESSAGETYPE_MSG) {
-        // this should not happen in normal operation
-        UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Got MSG package without channel.");
-        return UA_STATUSCODE_BADUNEXPECTEDERROR;
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-
-/**
- * We need to decode the given binary message to get the name of the called service.
- * This method is used if the connection an established secure channel.
- *
- * message is the decoded message starting at the nodeid of the content type.
- */
-static void
-UA_debug_dump_setName_withChannel(void *application, UA_SecureChannel *channel,
-                                  UA_MessageType messagetype, UA_UInt32 requestId,
-                                  const UA_ByteString *message) {
-    struct UA_dump_filename *dump_filename = (struct UA_dump_filename *)application;
-    dump_filename->messageType = UA_debug_dumpGetMessageTypePrefix(messagetype);
-    if(messagetype == UA_MESSAGETYPE_MSG)
-        UA_debug_dumpSetServiceName(message, dump_filename->serviceName);
-}
-
-/**
- * Called in processCompleteChunk for every complete chunk which is received by the server.
- *
- * It will first try to decode the message to get the name of the called service.
- * When we have a name the message is dumped as binary to that file.
- * If the file already exists a new file will be created with a counter at the end.
- */
-void
-UA_debug_dumpCompleteChunk(UA_Server *const server, UA_Connection *const connection,
-                           UA_ByteString *messageBuffer) {
-    struct UA_dump_filename dump_filename;
-    dump_filename.messageType = NULL;
-    dump_filename.serviceName[0] = 0;
-
-    if(!connection->channel) {
-        UA_debug_dump_setName_withoutChannel(server, connection, messageBuffer, &dump_filename);
-    } else {
-        UA_SecureChannel dummy = *connection->channel;
-        TAILQ_INIT(&dummy.messages);
-        UA_ByteString messageBufferCopy;
-        UA_ByteString_copy(messageBuffer, &messageBufferCopy);
-        UA_SecureChannel_decryptAddChunk(&dummy, &messageBufferCopy, UA_TRUE);
-        UA_SecureChannel_processCompleteMessages(&dummy, &dump_filename, UA_debug_dump_setName_withChannel);
-        UA_SecureChannel_deleteMessages(&dummy);
-        UA_ByteString_deleteMembers(&messageBufferCopy);
-    }
-
-    char fileName[250];
-    snprintf(fileName, sizeof(fileName), "%s/%05u_%s%s", UA_CORPUS_OUTPUT_DIR, ++UA_dump_chunkCount,
-             dump_filename.messageType ? dump_filename.messageType : "", dump_filename.serviceName);
-
-    char dumpOutputFile[266];
-    snprintf(dumpOutputFile, 255, "%s.bin", fileName);
-    // check if file exists and if yes create a counting filename to avoid overwriting
-    unsigned cnt = 1;
-    while ( access( dumpOutputFile, F_OK ) != -1 ) {
-        snprintf(dumpOutputFile, 266, "%s_%u.bin", fileName, cnt);
-        cnt++;
-    }
-
-    UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Dumping package %s", dumpOutputFile);
-
-    FILE *write_ptr = fopen(dumpOutputFile, "ab");
-    fwrite(messageBuffer->data, messageBuffer->length, 1, write_ptr); // write 10 bytes from our buffer
-    // add the available memory size. See the UA_DUMP_RAM_SIZE define for more info.
-    uint32_t ramSize = UA_DUMP_RAM_SIZE;
-    fwrite(&ramSize, sizeof(ramSize), 1, write_ptr);
-    fclose(write_ptr);
-}
diff --git a/ext/open62541/tests/multithreading/check_mt_addDeleteObject.c b/ext/open62541/tests/multithreading/check_mt_addDeleteObject.c
deleted file mode 100644
index a7a647a..0000000
--- a/ext/open62541/tests/multithreading/check_mt_addDeleteObject.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-#include "deviceObjectType.h"
-#include "mt_testing.h"
-
-#define NUMBER_OF_WORKERS 10
-#define ITERATIONS_PER_WORKER 10
-#define NUMBER_OF_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 10
-
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    defineObjectTypes();
-    addPumpTypeConstructor(tc.server);
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void checkServer(void) {
-    for (size_t i = 0; i < NUMBER_OF_WORKERS * ITERATIONS_PER_WORKER; i++) {
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Server %zu", i);
-        UA_NodeId reqNodeId = UA_NODEID_STRING(1, string_buf);
-        UA_NodeId resNodeId;
-        UA_StatusCode ret = UA_Server_readNodeId(tc.server, reqNodeId, &resNodeId);
-
-        ck_assert_int_eq(ret, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    }
-}
-
-static
-void server_addObject(void* value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Server %zu", number);
-    UA_NodeId reqId = UA_NODEID_STRING(1, string_buf);
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", string_buf);
-
-    //Entering the constructor of the object (callback to user space) it is possible that a thread deletes the object while initialization
-    UA_StatusCode retval = UA_Server_addObjectNode(tc.server, reqId,
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                            UA_QUALIFIEDNAME(1, string_buf),
-                            pumpTypeId,
-                            oAttr, NULL, NULL);
-    ck_assert(retval == UA_STATUSCODE_GOOD || retval ==  UA_STATUSCODE_BADNODEIDUNKNOWN);
-}
-
-
-static
-void server_deleteObject(void* value){
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Server %zu", number);
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-    do {
-        ret = UA_Server_deleteNode(tc.server, UA_NODEID_STRING(1, string_buf), true);
-        sleep(1); //for valgrind
-    } while (ret != UA_STATUSCODE_GOOD);
-}
-
-static
-void initTest(void) {
-    initThreadContext(NUMBER_OF_WORKERS, NUMBER_OF_CLIENTS, checkServer);
-
-    for (size_t i = 0; i < tc.numberOfWorkers; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_addObject);
-    }
-
-    for (size_t i = 0; i < tc.numberofClients; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, server_deleteObject);
-    }
-}
-
-START_TEST(addDeleteObjectTypeNodes) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Add-Delete nodes");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, addDeleteObjectTypeNodes);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/multithreading/check_mt_addObjectNode.c b/ext/open62541/tests/multithreading/check_mt_addObjectNode.c
deleted file mode 100644
index f087797..0000000
--- a/ext/open62541/tests/multithreading/check_mt_addObjectNode.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-#include "deviceObjectType.h"
-
-#define NUMBER_OF_WORKERS 10
-#define ITERATIONS_PER_WORKER 10
-#define NUMBER_OF_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 10
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    defineObjectTypes();
-    addPumpTypeConstructor(tc.server);
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static
-void checkServer(void) {
-    for (size_t i = 0; i < NUMBER_OF_WORKERS * ITERATIONS_PER_WORKER; i++) {
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Server %zu", i);
-        UA_NodeId reqNodeId = UA_NODEID_STRING(1, string_buf);
-        UA_NodeId resNodeId;
-        UA_StatusCode ret = UA_Server_readNodeId(tc.server, reqNodeId, &resNodeId);
-
-        ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-        ck_assert(UA_NodeId_equal(&reqNodeId, &resNodeId) == UA_TRUE);
-        UA_NodeId_deleteMembers(&resNodeId);
-    }
-
-    for (size_t i = 0; i < NUMBER_OF_CLIENTS * ITERATIONS_PER_CLIENT; i++) {
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Client %zu", i);
-        UA_NodeId reqNodeId = UA_NODEID_STRING(1, string_buf);
-        UA_NodeId resNodeId;
-        UA_StatusCode ret = UA_Server_readNodeId(tc.server, reqNodeId, &resNodeId);
-
-        ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-        ck_assert(UA_NodeId_equal(&reqNodeId, &resNodeId) == UA_TRUE);
-        UA_NodeId_deleteMembers(&resNodeId);
-    }
-}
-
-static
-void server_addObject(void* value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Server %zu", number);
-    UA_NodeId reqId = UA_NODEID_STRING(1, string_buf);
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", string_buf);
-    UA_StatusCode res = UA_Server_addObjectNode(tc.server, reqId,
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                UA_QUALIFIEDNAME(1, string_buf),
-                                pumpTypeId,
-                                oAttr, NULL, NULL);
-
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-}
-
-static
-void client_addObject(void* value){
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Client %zu", number);
-    UA_NodeId reqId = UA_NODEID_STRING(1, string_buf);
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", string_buf);
-    UA_StatusCode retval = UA_Client_addObjectNode(tc.clients[tmp.index], reqId,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         UA_QUALIFIEDNAME(1, string_buf), pumpTypeId, oAttr, NULL);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-
-static
-void initTest(void) {
-    initThreadContext(NUMBER_OF_WORKERS, NUMBER_OF_CLIENTS, checkServer);
-
-    for (size_t i = 0; i < tc.numberOfWorkers; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_addObject);
-    }
-
-    for (size_t i = 0; i < tc.numberofClients; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_addObject);
-    }
-}
-
-START_TEST(addObjectTypeNodes) {
-        startMultithreading();
-    }
-END_TEST
-
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Add object nodes");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, addObjectTypeNodes);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/multithreading/check_mt_addVariableNode.c b/ext/open62541/tests/multithreading/check_mt_addVariableNode.c
deleted file mode 100644
index 51ccde9..0000000
--- a/ext/open62541/tests/multithreading/check_mt_addVariableNode.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-#include "mt_testing.h"
-
-#define NUMBER_OF_WORKERS 10
-#define ITERATIONS_PER_WORKER 10
-#define NUMBER_OF_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 10
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static
-void checkServer(void) {
-    for (size_t i = 0; i < NUMBER_OF_WORKERS * ITERATIONS_PER_WORKER; i++) {
-        UA_ReadValueId rvi;
-        UA_ReadValueId_init(&rvi);
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Server %zu", i);
-        rvi.nodeId = UA_NODEID_STRING(1, string_buf);
-        rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataValue resp = UA_Server_read(tc.server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-        ck_assert_int_eq(resp.status, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(0, resp.value.arrayLength);
-        ck_assert(&UA_TYPES[UA_TYPES_INT32] == resp.value.type);
-        ck_assert_int_eq(42, *(UA_Int32* )resp.value.data);
-        UA_DataValue_deleteMembers(&resp);
-    }
-
-    for (size_t i = 0; i < NUMBER_OF_CLIENTS * ITERATIONS_PER_CLIENT; i++) {
-        UA_ReadValueId rvi;
-        UA_ReadValueId_init(&rvi);
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Client %zu", i);
-        rvi.nodeId = UA_NODEID_STRING(1, string_buf);
-        rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-        UA_DataValue resp = UA_Server_read(tc.server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-        ck_assert_int_eq(resp.status, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(2, resp.value.arrayLength);
-        ck_assert(&UA_TYPES[UA_TYPES_INT32] == resp.value.type);
-        ck_assert_int_eq(10, *(UA_Int32 *)resp.value.data);
-        ck_assert_int_eq(20, *((UA_Int32 *)resp.value.data + 1));
-        UA_DataValue_deleteMembers(&resp);
-    }
-}
-
-static
-void server_addVariable(void* value) {
-        ThreadContext tmp = (*(ThreadContext *) value);
-        size_t offset = tmp.index * tmp.upperBound;
-        size_t number = offset + tmp.counter;
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Server %zu", number);
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        UA_Int32 myInteger = 42;
-        UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-        attr.description = UA_LOCALIZEDTEXT("en-US",string_buf);
-        attr.displayName = UA_LOCALIZEDTEXT("en-US",string_buf);
-        attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-        attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-        UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, string_buf);
-        UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, string_buf);
-        UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-        UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-        UA_StatusCode ret = UA_Server_addVariableNode(tc.server, myIntegerNodeId, parentNodeId,
-                                                      parentReferenceNodeId, myIntegerName,
-                                                      UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);
-        ck_assert_uint_eq(ret, UA_STATUSCODE_GOOD);
-}
-
-static
-void client_addVariable(void* value){
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Client %zu", number);
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.description = UA_LOCALIZEDTEXT("en-US", string_buf);
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", string_buf);
-    UA_NodeId nodeId = UA_NODEID_STRING(1, string_buf);
-    UA_QualifiedName integerName = UA_QUALIFIEDNAME(1, string_buf);
-    UA_Int32 values[2] = {10, 20};
-    UA_Variant_setArray(&attr.value, values, 2, &UA_TYPES[UA_TYPES_INT32]);
-    attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 arrayDims[1] = {2};
-    attr.arrayDimensions = arrayDims;
-    attr.arrayDimensionsSize = 1;
-    UA_StatusCode retval = UA_Client_addVariableNode(tc.clients[tmp.index], nodeId,
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                               UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                               integerName,
-                                               UA_NODEID_NULL, attr, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-}
-
-static
-void initTest(void) {
-    initThreadContext(NUMBER_OF_WORKERS, NUMBER_OF_CLIENTS, checkServer);
-
-    for (size_t i = 0; i < tc.numberOfWorkers; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_addVariable);
-    }
-
-    for (size_t i = 0; i < tc.numberofClients; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_addVariable);
-    }
-}
-
-START_TEST(addVariableNodes) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Add variable nodes");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, addVariableNodes);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/multithreading/check_mt_addVariableTypeNode.c b/ext/open62541/tests/multithreading/check_mt_addVariableTypeNode.c
deleted file mode 100644
index 24d3905..0000000
--- a/ext/open62541/tests/multithreading/check_mt_addVariableTypeNode.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-#include "mt_testing.h"
-
-#define NUMBER_OF_WORKERS 10
-#define ITERATIONS_PER_WORKER 10
-#define NUMBER_OF_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 10
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void checkServer(void) {
-    for (size_t i = 0; i <  NUMBER_OF_WORKERS * ITERATIONS_PER_WORKER; i++) {
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Server %zu", i);
-        UA_NodeId reqNodeId = UA_NODEID_STRING(1, string_buf);
-        UA_NodeId resNodeId;
-        UA_StatusCode ret = UA_Server_readNodeId(tc.server, reqNodeId, &resNodeId);
-
-        ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-        ck_assert(UA_NodeId_equal(&reqNodeId, &resNodeId) == UA_TRUE);
-        UA_NodeId_deleteMembers(&resNodeId);
-    }
-
-    for (size_t i = 0; i < NUMBER_OF_CLIENTS * ITERATIONS_PER_CLIENT; i++) {
-        char string_buf[20];
-        snprintf(string_buf, sizeof(string_buf), "Client %zu", i);
-        UA_NodeId reqNodeId = UA_NODEID_STRING(1, string_buf);
-        UA_NodeId resNodeId;
-        UA_StatusCode ret = UA_Server_readNodeId(tc.server, reqNodeId, &resNodeId);
-
-        ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-        ck_assert(UA_NodeId_equal(&reqNodeId, &resNodeId) == UA_TRUE);
-        UA_NodeId_deleteMembers(&resNodeId);
-    }
-}
-
-static
-void server_addVariableType(void* value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Server %zu", number);
-    UA_NodeId myNodeId = UA_NODEID_STRING(1, string_buf);
-    UA_VariableTypeAttributes vtAttr = UA_VariableTypeAttributes_default;
-    vtAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vtAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 arrayDims[1] = {2};
-    vtAttr.arrayDimensions = arrayDims;
-    vtAttr.arrayDimensionsSize = 1;
-    vtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Type");
-
-    /* a matching default value is required */
-    UA_Double zero[2] = {0.0, 0.0};
-    UA_Variant_setArray(&vtAttr.value, zero, 2, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    UA_StatusCode res =
-            UA_Server_addVariableTypeNode(tc.server, myNodeId,
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                          UA_QUALIFIEDNAME(1, "2DPoint Type"), UA_NODEID_NULL,
-                                          vtAttr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-
-}
-
-static
-void client_addVariableType(void* value){
-    ThreadContext tmp = (*(ThreadContext *) value);
-    size_t offset = tmp.index * tmp.upperBound;
-    size_t number = offset + tmp.counter;
-    char string_buf[20];
-    snprintf(string_buf, sizeof(string_buf), "Client %zu", number);
-    UA_NodeId myNodeId = UA_NODEID_STRING(1, string_buf);
-
-    UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default;
-    attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
-    attr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 arrayDims[1] = {2};
-    attr.arrayDimensions = arrayDims;
-    attr.arrayDimensionsSize = 1;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "PointType");
-
-    /* a matching default value is required */
-    UA_Double zero[2] = {0.0, 0.0};
-    UA_Variant_setArray(&attr.value, zero, 2, &UA_TYPES[UA_TYPES_INT32]);
-    UA_StatusCode  retval = UA_Client_addVariableTypeNode(tc.clients[tmp.index], myNodeId,
-                                                          UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE),
-                                                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                                          UA_QUALIFIEDNAME(1, "PointType"), attr, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-}
-
-static
-void initTest(void) {
-    initThreadContext(NUMBER_OF_WORKERS, NUMBER_OF_CLIENTS, checkServer);
-    
-    for (size_t i = 0; i < tc.numberOfWorkers; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_addVariableType);
-    }
-
-    for (size_t i = 0; i < tc.numberofClients; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_addVariableType);
-    }
-}
-
-START_TEST(addVariableTypeNodes) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Add variable type nodes");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, addVariableTypeNodes);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/multithreading/check_mt_readValueAttribute.c b/ext/open62541/tests/multithreading/check_mt_readValueAttribute.c
deleted file mode 100644
index 9262bcc..0000000
--- a/ext/open62541/tests/multithreading/check_mt_readValueAttribute.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-#include "mt_testing.h"
-
-
-#define NUMBER_OF_WORKERS 10
-#define ITERATIONS_PER_WORKER 10
-#define NUMBER_OF_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 10
-
-UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-
-static
-void addVariableNode(void) {
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","Temperature");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","Temperature");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "Temperature");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode res =
-            UA_Server_addVariableNode(tc.server, pumpTypeId, parentNodeId,
-                                      parentReferenceNodeId, myIntegerName,
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                      attr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-}
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    addVariableNode();
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static
-void server_readValueAttribute(void * value) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = pumpTypeId;
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    // read 1
-    UA_DataValue resp = UA_Server_read(tc.server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    ck_assert_int_eq(true, resp.hasValue);
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_INT32] == resp.value.type);
-    ck_assert_int_eq(42, *(UA_Int32* )resp.value.data);
-    UA_DataValue_deleteMembers(&resp);
-
-    // read 2
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_StatusCode ret = UA_Server_readValue(tc.server, rvi.nodeId, &var);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, ret);
-    ck_assert_int_eq(42, *(UA_Int32 *)var.data);
-
-    UA_Variant_deleteMembers(&var);
-}
-
-
-static
-void client_readValueAttribute(void * value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    UA_Variant val;
-    UA_NodeId nodeId = pumpTypeId;
-    UA_StatusCode retval = UA_Client_readValueAttribute(tc.clients[tmp.index], nodeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(42, *(UA_Int32 *)val.data);
-    UA_Variant_deleteMembers(&val);
-}
-
-static
-void initTest(void) {
-    initThreadContext(NUMBER_OF_WORKERS, NUMBER_OF_CLIENTS, NULL);
-
-    for (size_t i = 0; i < tc.numberOfWorkers; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_readValueAttribute);
-    }
-
-    for (size_t i = 0; i < tc.numberofClients; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_readValueAttribute);
-    }
-}
-
-START_TEST(readValueAttribute) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Read Write attribute");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, readValueAttribute);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/multithreading/check_mt_readWriteDelete.c b/ext/open62541/tests/multithreading/check_mt_readWriteDelete.c
deleted file mode 100644
index 0e6f18d..0000000
--- a/ext/open62541/tests/multithreading/check_mt_readWriteDelete.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include <testing_clock.h>
-#include "thread_wrapper.h"
-#include "mt_testing.h"
-
-
-#define NUMBER_OF_READ_WORKERS 10
-#define NUMBER_OF_WRITE_WORKERS 10
-#define ITERATIONS_PER_WORKER 100
-
-#define NUMBER_OF_READ_CLIENTS 10
-#define NUMBER_OF_WRITE_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 100
-
-UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-
-static
-void AddVariableNode(void) {
-    /* Add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","Temperature");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","Temperature");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "Temperature");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-
-    UA_StatusCode res =
-            UA_Server_addVariableNode(tc.server, pumpTypeId, parentNodeId,
-                                      parentReferenceNodeId, myIntegerName,
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                      attr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-}
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    AddVariableNode();
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static
-void server_deleteValue(void *value) {
-    UA_StatusCode ret = UA_Server_deleteNode(tc.server, pumpTypeId, true);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, ret);
-}
-
-static
-void server_readValue(void *value) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = pumpTypeId;
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_StatusCode retval = UA_Server_readValue(tc.server, rvi.nodeId, &var);
-    if (retval == UA_STATUSCODE_GOOD) {
-        ck_assert_int_eq(42, *(UA_Int32 *)var.data);
-        UA_Variant_deleteMembers(&var);
-    }
-    else {
-        ck_assert_int_eq(retval, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    }
-}
-
-static
-void server_writeValue(void *value) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 testValue = 42;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.nodeId = pumpTypeId;
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(tc.server, &wValue);
-    ck_assert(retval == UA_STATUSCODE_BADNODEIDUNKNOWN || retval == UA_STATUSCODE_GOOD);
-}
-
-static
-void client_writeValue(void *value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    UA_Variant val;
-    UA_Int32 testValue = 42;
-    UA_Variant_setScalar(&val, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    UA_StatusCode  retval = UA_Client_writeValueAttribute(tc.clients[tmp.index], pumpTypeId, &val);
-    ck_assert(retval == UA_STATUSCODE_BADNODEIDUNKNOWN || retval == UA_STATUSCODE_GOOD);
-}
-
-static
-void client_readValue(void *value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    UA_Variant val;
-    UA_NodeId nodeId = pumpTypeId;
-    UA_StatusCode retval = UA_Client_readValueAttribute(tc.clients[tmp.index], nodeId, &val);
-    if (retval == UA_STATUSCODE_GOOD) {
-        ck_assert_int_eq(42, *(UA_Int32 *)val.data);
-        UA_Variant_deleteMembers(&val);
-    }
-    else {
-        ck_assert_int_eq(retval, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    }
-}
-
-
-static
-void initTest(void) {
-    initThreadContext(NUMBER_OF_READ_WORKERS + NUMBER_OF_WRITE_WORKERS + 1, NUMBER_OF_READ_CLIENTS + NUMBER_OF_WRITE_CLIENTS, NULL);
-
-    size_t i = 0;
-    for (; i < NUMBER_OF_READ_WORKERS; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_readValue);
-    }
-    for (; i < NUMBER_OF_READ_WORKERS + NUMBER_OF_WRITE_WORKERS; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_writeValue);
-    }
-
-    //Thread deleting the variable
-    setThreadContext(&tc.workerContext[tc.numberOfWorkers - 1], i, 1, server_deleteValue);
-
-    i = 0;
-    for (; i < NUMBER_OF_READ_CLIENTS; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_readValue);
-    }
-    for (; i < NUMBER_OF_READ_CLIENTS + NUMBER_OF_WRITE_CLIENTS; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_writeValue);
-    }
-}
-
-START_TEST(readWriteDelete) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Read-Write-Delete attribute");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, readWriteDelete);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
diff --git a/ext/open62541/tests/multithreading/check_mt_readWriteDeleteCallback.c b/ext/open62541/tests/multithreading/check_mt_readWriteDeleteCallback.c
deleted file mode 100644
index b67df78..0000000
--- a/ext/open62541/tests/multithreading/check_mt_readWriteDeleteCallback.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include <testing_clock.h>
-#include "thread_wrapper.h"
-#include "mt_testing.h"
-
-
-#define NUMBER_OF_READ_WORKERS 10
-#define NUMBER_OF_WRITE_WORKERS 10
-#define ITERATIONS_PER_WORKER 100
-
-#define NUMBER_OF_READ_CLIENTS 10
-#define NUMBER_OF_WRITE_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 100
-
-UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-UA_Int32 temperature = 42;
-
-UA_LOCK_TYPE(mu)
-
-static UA_StatusCode
-readTemperature(UA_Server *tmpServer,
-                const UA_NodeId *sessionId, void *sessionContext,
-                const UA_NodeId *nodeId, void *nodeContext,
-                UA_Boolean sourceTimeStamp, const UA_NumericRange *range,
-                UA_DataValue *dataValue) {
-    UA_LOCK(mu);
-    UA_Variant_setScalarCopy(&dataValue->value, &temperature, &UA_TYPES[UA_TYPES_INT32]);
-    UA_UNLOCK(mu);
-    dataValue->hasValue = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeTemperature(UA_Server *tmpServer,
-                 const UA_NodeId *sessionId, void *sessionContext,
-                 const UA_NodeId *nodeId, void *nodeContext,
-                 const UA_NumericRange *range, const UA_DataValue *data) {
-    UA_LOCK(mu);
-    temperature = *(UA_Int32 *) data->value.data;
-    UA_UNLOCK(mu);
-    return UA_STATUSCODE_GOOD;
-}
-
-static
-void AddVariableNode(void) {
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Temperature");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    UA_DataSource temperatureSource;
-    temperatureSource.read = readTemperature;
-    temperatureSource.write = writeTemperature;
-    UA_StatusCode retval = UA_Server_addDataSourceVariableNode(tc.server, pumpTypeId, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Temperature"),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr,
-                                                               temperatureSource, NULL, NULL);
-
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    AddVariableNode();
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static
-void server_deleteValue(void *value) {
-    //UA_fakeSleep(100);
-    UA_StatusCode ret = UA_Server_deleteNode(tc.server, pumpTypeId, true);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, ret);
-}
-
-static
-void server_readValue(void *value) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = pumpTypeId;
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_StatusCode retval = UA_Server_readValue(tc.server, rvi.nodeId, &var);
-    if (retval == UA_STATUSCODE_GOOD) {
-        ck_assert_int_eq(42, *(UA_Int32 *)var.data);
-        ck_assert_int_eq(UA_STATUSCODE_GOOD, retval);
-        UA_Variant_deleteMembers(&var);
-    }
-    else {
-        ck_assert_int_eq(retval, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    }
-}
-
-static
-void server_writeValue(void *value) {
-        UA_WriteValue wValue;
-        UA_WriteValue_init(&wValue);
-        UA_Int32 testValue = 42;
-        UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-        wValue.nodeId = pumpTypeId;
-        wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-        wValue.value.hasValue = true;
-        UA_StatusCode retval = UA_Server_write(tc.server, &wValue);
-        ck_assert(retval == UA_STATUSCODE_BADNODEIDUNKNOWN || retval == UA_STATUSCODE_GOOD);
-}
-
-static
-void client_writeValue(void *value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    UA_Variant val;
-    UA_Int32 testValue = 42;
-    UA_Variant_setScalar(&val, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    UA_StatusCode retval = UA_Client_writeValueAttribute(tc.clients[tmp.index], pumpTypeId, &val);
-    ck_assert(retval == UA_STATUSCODE_BADNODEIDUNKNOWN || retval == UA_STATUSCODE_GOOD);
-}
-
-static
-void client_readValue(void *value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    UA_Variant val;
-    UA_NodeId nodeId = pumpTypeId;
-    UA_StatusCode retval = UA_Client_readValueAttribute(tc.clients[tmp.index], nodeId, &val);
-    if (retval == UA_STATUSCODE_GOOD) {
-        ck_assert_int_eq(42, *(UA_Int32 *)val.data);
-        UA_Variant_deleteMembers(&val);
-    }
-    else {
-        ck_assert_int_eq(retval, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    }
-
-}
-
-static
-void initTest(void) {
-    UA_LOCK_INIT(mu);
-
-    initThreadContext(NUMBER_OF_READ_WORKERS + NUMBER_OF_WRITE_WORKERS + 1, NUMBER_OF_READ_CLIENTS + NUMBER_OF_WRITE_CLIENTS, NULL);
-
-    size_t i = 0;
-    for (; i < NUMBER_OF_READ_WORKERS; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_readValue);
-    }
-    for (; i < NUMBER_OF_READ_WORKERS + NUMBER_OF_WRITE_WORKERS; i++) {
-        setThreadContext(&tc.workerContext[i], i, ITERATIONS_PER_WORKER, server_writeValue);
-    }
-
-    //Thread deleting the variable
-    setThreadContext(&tc.workerContext[tc.numberOfWorkers - 1], i, 1, server_deleteValue);
-
-    i = 0;
-    for (; i < NUMBER_OF_READ_CLIENTS; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_readValue);
-    }
-    for (; i < NUMBER_OF_READ_CLIENTS + NUMBER_OF_WRITE_CLIENTS; i++) {
-        setThreadContext(&tc.clientContext[i], i, ITERATIONS_PER_CLIENT, client_writeValue);
-    }
-}
-
-START_TEST(readWriteDeleteCallback) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Read-Write-Delete-Callback");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, readWriteDeleteCallback);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
diff --git a/ext/open62541/tests/multithreading/check_mt_writeValueAttribute.c b/ext/open62541/tests/multithreading/check_mt_writeValueAttribute.c
deleted file mode 100644
index 8d6a8cd..0000000
--- a/ext/open62541/tests/multithreading/check_mt_writeValueAttribute.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-#include "mt_testing.h"
-
-#define NUMBER_OF_WORKERS 10
-#define ITERATIONS_PER_WORKER 10
-#define NUMBER_OF_CLIENTS 10
-#define ITERATIONS_PER_CLIENT 10
-
-UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-
-static
-void addVariableNode(void) {
-    /* Add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","Temperature");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","Temperature");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "Temperature");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-
-    UA_StatusCode res =
-            UA_Server_addVariableNode(tc.server, pumpTypeId, parentNodeId,
-                                      parentReferenceNodeId, myIntegerName,
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                      attr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-}
-
-static void setup(void) {
-    tc.running = true;
-    tc.server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(tc.server));
-    addVariableNode();
-    UA_Server_run_startup(tc.server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void checkServer(void) {
-    UA_Variant var;
-    UA_Variant_init(&var);
-    UA_StatusCode ret = UA_Server_readValue(tc.server, pumpTypeId, &var);
-    ck_assert_int_eq(42, *(UA_Int32 *)var.data);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, ret);
-    UA_Variant_deleteMembers(&var);
-}
-
-static
-void server_writeValueAttribute(void *value) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 testValue = 42;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.nodeId = pumpTypeId;
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(tc.server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-
-static
-void client_writeValueAttribute(void *value) {
-    ThreadContext tmp = (*(ThreadContext *) value);
-    UA_Variant val;
-    UA_Int32 testValue = 42;
-    UA_Variant_setScalar(&val, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    UA_StatusCode retval = UA_Client_writeValueAttribute(tc.clients[tmp.index], pumpTypeId, &val);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-
-static
-void initTest(void) {
-    tc.numberOfWorkers = NUMBER_OF_WORKERS;
-    tc.numberofClients = NUMBER_OF_CLIENTS;
-    tc.checkServerNodes = checkServer;
-    tc.workerContext = (ThreadContext*) UA_calloc(tc.numberOfWorkers, sizeof(ThreadContext));
-    tc.clients =  (UA_Client**) UA_calloc(tc.numberofClients, sizeof(UA_Client*));
-    tc.clientContext = (ThreadContext*) UA_calloc(tc.numberofClients, sizeof(ThreadContext));
-    for (size_t i = 0; i < tc.numberOfWorkers; i++) {
-        tc.workerContext[i].index = i;
-        tc.workerContext[i].upperBound = ITERATIONS_PER_WORKER;
-        tc.workerContext[i].func = server_writeValueAttribute;
-    }
-
-    for (size_t i = 0; i < tc.numberofClients; i++) {
-        tc.clientContext[i].index = i;
-        tc.clientContext[i].upperBound = ITERATIONS_PER_CLIENT;
-        tc.clientContext[i].func = client_writeValueAttribute;
-    }
-}
-
-START_TEST(writeValueAttribute) {
-        startMultithreading();
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Multithreading");
-    TCase *valueCallback = tcase_create("Write value attribute");
-    initTest();
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, writeValueAttribute);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
diff --git a/ext/open62541/tests/multithreading/deviceObjectType.h b/ext/open62541/tests/multithreading/deviceObjectType.h
deleted file mode 100644
index 925b187..0000000
--- a/ext/open62541/tests/multithreading/deviceObjectType.h
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef OPEN62541_MT_COMMON
-#define OPEN62541_MT_COMMON
-
-#include "mt_testing.h"
-
-UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-
-static void
-defineObjectTypes(void) {
-    UA_NodeId deviceTypeId;
-    UA_ObjectTypeAttributes dtAttr = UA_ObjectTypeAttributes_default;
-    dtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DeviceType");
-    UA_Server_addObjectTypeNode(tc.server, UA_NODEID_NULL,
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "DeviceType"), dtAttr,
-                                NULL, &deviceTypeId);
-
-    UA_VariableAttributes mnAttr = UA_VariableAttributes_default;
-    mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName");
-    UA_NodeId manufacturerNameId;
-    UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, deviceTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "ManufacturerName"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), mnAttr, NULL, &manufacturerNameId);
-
-    UA_Server_addReference(tc.server, manufacturerNameId,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-
-
-    UA_VariableAttributes modelAttr = UA_VariableAttributes_default;
-    modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName");
-    UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, deviceTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "ModelName"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), modelAttr, NULL, NULL);
-
-    UA_ObjectTypeAttributes ptAttr = UA_ObjectTypeAttributes_default;
-    ptAttr.displayName = UA_LOCALIZEDTEXT("en-US", "PumpType");
-    UA_Server_addObjectTypeNode(tc.server, pumpTypeId,
-                                deviceTypeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(1, "PumpType"), ptAttr,
-                                NULL, NULL);
-
-    UA_VariableAttributes statusAttr = UA_VariableAttributes_default;
-    statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status");
-    statusAttr.valueRank = UA_VALUERANK_SCALAR;
-    UA_NodeId statusId;
-    UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, pumpTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "Status"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), statusAttr, NULL, &statusId);
-
-    UA_Server_addReference(tc.server, statusId,
-                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                           UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-
-    UA_VariableAttributes rpmAttr = UA_VariableAttributes_default;
-    rpmAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MotorRPM");
-    rpmAttr.valueRank = UA_VALUERANK_SCALAR;
-    UA_Server_addVariableNode(tc.server, UA_NODEID_NULL, pumpTypeId,
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                              UA_QUALIFIEDNAME(1, "MotorRPMs"),
-                              UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), rpmAttr, NULL, NULL);
-}
-
-static UA_StatusCode
-pumpTypeConstructor(UA_Server *servertmp,
-                    const UA_NodeId *sessionId, void *sessionContext,
-                    const UA_NodeId *typeId, void *typeContext,
-                    const UA_NodeId *nodeId, void **nodeContext) {
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = UA_QUALIFIEDNAME(1, "Status");
-
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = *nodeId;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-
-    UA_BrowsePathResult bpr =
-            UA_Server_translateBrowsePathToNodeIds(tc.server, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD ||
-       bpr.targetsSize < 1)
-        return bpr.statusCode;
-
-    /* Set the status value */
-    UA_Boolean status = true;
-    UA_Variant value;
-    UA_Variant_setScalar(&value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    UA_Server_writeValue(tc.server, bpr.targets[0].targetId.nodeId, value);
-    UA_BrowsePathResult_clear(&bpr);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-addPumpTypeConstructor(UA_Server *servertmp) {
-    UA_NodeTypeLifecycle lifecycle;
-    lifecycle.constructor = pumpTypeConstructor;
-    lifecycle.destructor = NULL;
-    UA_Server_setNodeTypeLifecycle(tc.server, pumpTypeId, lifecycle);
-}
-
-#endif //OPEN62541_MT_COMMON
diff --git a/ext/open62541/tests/multithreading/mt_testing.h b/ext/open62541/tests/multithreading/mt_testing.h
deleted file mode 100644
index b77723e..0000000
--- a/ext/open62541/tests/multithreading/mt_testing.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef OPEN62541_MT_TESTING_H
-#define OPEN62541_MT_TESTING_H
-
-#include <open62541/server_config_default.h>
-
-#define THREAD_CALLBACK_PARAM(name, param) static void * name(void *param)
-#define THREAD_CREATE_PARAM(handle, callback, param) pthread_create(&(handle), NULL, callback, (void*) &(param))
-
-typedef struct {
-    void (*func)(void *param); //function to execute
-    size_t counter; //index of the iteration
-    size_t index; // index within workerContext array of global TestContext
-    size_t upperBound; //number of iterations each thread schould execute func
-    THREAD_HANDLE handle;
-} ThreadContext;
-
-typedef struct {
-    size_t numberOfWorkers;
-    ThreadContext *workerContext;
-    size_t numberofClients;
-    ThreadContext *clientContext;
-    UA_Boolean running;
-    UA_Server *server;
-    UA_Client **clients;
-    void (*checkServerNodes)(void);
-} TestContext;
-
-TestContext tc;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(tc.running)
-        UA_Server_run_iterate(tc.server, true);
-    return 0;
-}
-
-static
-void teardown(void) {
-    for (size_t i = 0; i < tc.numberOfWorkers; i++)
-        THREAD_JOIN(tc.workerContext[i].handle);
-
-    for (size_t i = 0; i < tc.numberofClients; i++)
-        THREAD_JOIN(tc.clientContext[i].handle);
-
-    tc.running = false;
-    THREAD_JOIN(server_thread);
-    if (tc.checkServerNodes)
-        tc.checkServerNodes();
-    UA_Server_run_shutdown(tc.server);
-    UA_Server_delete(tc.server);
-}
-
-THREAD_CALLBACK_PARAM(workerLoop, val) {
-    ThreadContext tmp = (*(ThreadContext *) val);
-    for (size_t i = 0; i < tmp.upperBound; i++) {
-        tmp.counter = i;
-        tmp.func(&tmp);
-    }
-    return NULL;
-}
-
-THREAD_CALLBACK_PARAM(clientLoop, val) {
-    ThreadContext tmp = (*(ThreadContext *) val);
-    tc.clients[tmp.index] = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(tc.clients[tmp.index]));
-    UA_StatusCode retval = UA_Client_connect(tc.clients[tmp.index], "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    for(size_t i = 0; i < tmp.upperBound; i++) {
-        tmp.counter = i;
-        tmp.func(&tmp);
-    }
-    UA_Client_disconnect(tc.clients[tmp.index]);
-    UA_Client_delete(tc.clients[tmp.index]);
-    return NULL;
-}
-
-static UA_INLINE void
-initThreadContext(size_t numberOfWorkers, size_t numberOfClients, void (*checkServerNodes)(void)) {
-    tc.numberOfWorkers = numberOfWorkers;
-    tc.numberofClients = numberOfClients;
-    tc.checkServerNodes = checkServerNodes;
-    tc.workerContext = (ThreadContext*) UA_calloc(tc.numberOfWorkers, sizeof(ThreadContext));
-    tc.clients =  (UA_Client**) UA_calloc(tc.numberofClients, sizeof(UA_Client*));
-    tc.clientContext = (ThreadContext*) UA_calloc(tc.numberofClients, sizeof(ThreadContext));
-}
-
-static UA_INLINE void
-setThreadContext(ThreadContext *workerContext, size_t index, size_t upperBound, void (*func)(void *param)) {
-    workerContext->index = index;
-    workerContext->upperBound = upperBound;
-    workerContext->func = func;
-}
-
-static UA_INLINE void
-startMultithreading(void) {
-        for (size_t i = 0; i < tc.numberOfWorkers; i++)
-            THREAD_CREATE_PARAM(tc.workerContext[i].handle, workerLoop, tc.workerContext[i]);
-
-        for (size_t i = 0; i < tc.numberofClients; i++)
-            THREAD_CREATE_PARAM(tc.clientContext[i].handle, clientLoop, tc.clientContext[i]);
-}
-
-#endif //OPEN62541_MT_TESTING_H
diff --git a/ext/open62541/tests/nodeset-compiler/CMakeLists.txt b/ext/open62541/tests/nodeset-compiler/CMakeLists.txt
deleted file mode 100644
index e939ce7..0000000
--- a/ext/open62541/tests/nodeset-compiler/CMakeLists.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-include_directories("${PROJECT_BINARY_DIR}/src_generated/tests")
-
-###############################################
-# Test Companion Specs that need the full NS0 #
-###############################################
-
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-
-    set(GENERATE_OUTPUT_DIR "${CMAKE_BINARY_DIR}/src_generated/tests")
-
-    # Generate types and namespace for DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "tests-di"
-        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/OpcUaDiModel.csv"
-        FILE_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd"
-        NAMESPACE_IDX 2
-        OUTPUT_DIR "${GENERATE_OUTPUT_DIR}"
-        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-        INTERNAL
-    )
-
-    # Generate types and namespace for ADI
-    ua_generate_nodeset_and_datatypes(
-        NAME "tests-adi"
-        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/ADI/OpcUaAdiModel.csv"
-        FILE_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/ADI/Opc.Ua.Adi.Types.bsd"
-        NAMESPACE_IDX 3
-        OUTPUT_DIR "${GENERATE_OUTPUT_DIR}"
-        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/ADI/Opc.Ua.Adi.NodeSet2.xml"
-        DEPENDS "tests-di"
-        INTERNAL
-    )
-
-    add_executable(check_nodeset_compiler_adi check_nodeset_compiler_adi.c
-                   ${UA_NODESET_TESTS_DI_SOURCES}
-                   ${UA_NODESET_TESTS_ADI_SOURCES}
-                   ${UA_TYPES_TESTS_DI_SOURCES}
-                   ${UA_TYPES_TESTS_ADI_SOURCES}
-                   $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    add_dependencies(check_nodeset_compiler_adi open62541-generator-ns-tests-adi)
-    target_link_libraries(check_nodeset_compiler_adi ${LIBS})
-    add_test_valgrind(nodeset_compiler_adi ${TESTS_BINARY_DIR}/check_nodeset_compiler_adi)
-
-
-    # generate PLCopen namespace which is using DI
-    ua_generate_nodeset_and_datatypes(
-        NAME "tests-plc"
-        # PLCopen does not define custom types. Only generate the nodeset
-        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
-        # PLCopen depends on the di nodeset, which must be generated before
-        OUTPUT_DIR "${GENERATE_OUTPUT_DIR}"
-        DEPENDS "tests-di"
-        INTERNAL
-    )
-
-    add_executable(check_nodeset_compiler_plc check_nodeset_compiler_plc.c
-                   ${UA_NODESET_TESTS_DI_SOURCES}
-                   ${UA_NODESET_TESTS_PLC_SOURCES}
-                   ${UA_TYPES_TESTS_DI_SOURCES}
-                   ${UA_TYPES_TESTS_PLC_SOURCES}
-                   $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    add_dependencies(check_nodeset_compiler_plc open62541-generator-ns-tests-plc)
-    target_link_libraries(check_nodeset_compiler_plc ${LIBS})
-    add_test_valgrind(nodeset_compiler_plc ${TESTS_BINARY_DIR}/check_nodeset_compiler_plc)
-
-    
-endif()
-
-#generate testnodeset
-if(UA_NAMESPACE_ZERO STREQUAL "FULL")
-
-
-    # Generate types and namespace for ADI
-    ua_generate_nodeset_and_datatypes(
-        NAME "tests-testnodeset"
-        FILE_CSV "${PROJECT_SOURCE_DIR}/tests/nodeset-compiler/testnodeset.csv"
-        FILE_BSD "${PROJECT_SOURCE_DIR}/tests/nodeset-compiler/testtypes.bsd"
-        NAMESPACE_IDX 2
-        OUTPUT_DIR "${GENERATE_OUTPUT_DIR}"
-        FILE_NS "${PROJECT_SOURCE_DIR}/tests/nodeset-compiler/testnodeset.xml"
-    )
-
-    add_executable(check_nodeset_compiler_testnodeset check_nodeset_compiler_testnodeset.c
-                   ${UA_NODESET_TESTS_TESTNODESET_SOURCES}
-                   ${UA_TYPES_TESTS_TESTNODESET_SOURCES}
-                $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
-    add_dependencies(check_nodeset_compiler_testnodeset open62541-generator-ns-tests-testnodeset)
-    target_link_libraries(check_nodeset_compiler_testnodeset ${LIBS})
-    add_test_valgrind(nodeset_compiler_testnodeset ${TESTS_BINARY_DIR}/check_nodeset_compiler_testnodeset)
-endif()
diff --git a/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_adi.c b/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_adi.c
deleted file mode 100644
index 1a27469..0000000
--- a/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_adi.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "check.h"
-#include "namespace_tests_adi_generated.h"
-#include "namespace_tests_di_generated.h"
-#include "testing_clock.h"
-
-UA_Server *server = NULL;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-
-START_TEST(Server_addDiNodeset) {
-    UA_StatusCode retval = namespace_tests_di_generated(server);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(Server_addAdiNodeset) {
-    UA_StatusCode retval = namespace_tests_adi_generated(server);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Server Nodeset Compiler");
-    TCase *tc_server = tcase_create("Server DI and ADI nodeset");
-    tcase_add_unchecked_fixture(tc_server, setup, teardown);
-    tcase_add_test(tc_server, Server_addDiNodeset);
-    tcase_add_test(tc_server, Server_addAdiNodeset);
-    suite_add_tcase(s, tc_server);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_plc.c b/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_plc.c
deleted file mode 100644
index 849ed43..0000000
--- a/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_plc.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "check.h"
-#include "testing_clock.h"
-#include "tests/namespace_tests_di_generated.h"
-#include "tests/namespace_tests_plc_generated.h"
-#include "unistd.h"
-
-UA_Server *server = NULL;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(Server_addDiNodeset) {
-    UA_StatusCode retval = namespace_tests_di_generated(server);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(Server_addPlcNodeset) {
-    UA_StatusCode retval = namespace_tests_plc_generated(server);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Server Nodeset Compiler");
-    TCase *tc_server = tcase_create("Server DI and PLCopen nodeset");
-    tcase_add_unchecked_fixture(tc_server, setup, teardown);
-    tcase_add_test(tc_server, Server_addDiNodeset);
-    tcase_add_test(tc_server, Server_addPlcNodeset);
-    suite_add_tcase(s, tc_server);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_testnodeset.c b/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_testnodeset.c
deleted file mode 100644
index 6cbc555..0000000
--- a/ext/open62541/tests/nodeset-compiler/check_nodeset_compiler_testnodeset.c
+++ /dev/null
@@ -1,130 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "check.h"
-#include "testing_clock.h"
-#include "tests/namespace_tests_testnodeset_generated.h"
-#include "unistd.h"
-
-UA_Server *server = NULL;
-UA_DataTypeArray customTypesArray = { NULL, UA_TYPES_TESTS_TESTNODESET_COUNT, UA_TYPES_TESTS_TESTNODESET};
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-    config->customDataTypes = &customTypesArray;
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(Server_addTestNodeset) {
-    UA_StatusCode retval = namespace_tests_testnodeset_generated(server);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(checkScalarValues) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    // Point_scalar_Init
-    UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 10002), &out);
-    ck_assert(UA_Variant_isScalar(&out));
-    UA_Point *p = (UA_Point *)out.data;
-    ck_assert(p->x == (UA_Double)1.0);
-    ck_assert(p->y == (UA_Double)2.0);
-    UA_Variant_clear(&out);
-    // Point_scalar_noInit
-    UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 10005), &out);
-    ck_assert(out.data == NULL);
-    UA_Variant_clear(&out);
-}
-END_TEST
-
-START_TEST(check1dimValues) {
-    UA_Variant out;
-    UA_Variant_init(&out);
-    // Point_1dim_noInit
-    UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 10007), &out);
-    ck_assert(!UA_Variant_isScalar(&out));
-    ck_assert(out.arrayDimensionsSize == 0);
-    UA_Variant_clear(&out);
-    // Point_1dim_init
-    UA_Server_readValue(server, UA_NODEID_NUMERIC(2, 10004), &out);
-    UA_Point *p = (UA_Point *)out.data;
-    ck_assert(!UA_Variant_isScalar(&out));
-    ck_assert(out.arrayLength == 4);
-    ck_assert(out.arrayDimensionsSize == 0);    // For 1 dimension arrays, initializing arrayDimensionsSize may confuse some OPC clients.
-    ck_assert(p[0].x == (UA_Double)1.0);
-    ck_assert(p[3].y == (UA_Double)8.0);
-    UA_Variant_clear(&out);
-}
-END_TEST
-
-START_TEST(readValueRank) {
-    UA_Int32 rank;
-    UA_Variant dims;
-    // scalar
-    UA_Server_readValueRank(server, UA_NODEID_NUMERIC(2, 10002), &rank);
-    ck_assert_int_eq(rank, -1);
-    UA_Server_readValueRank(server, UA_NODEID_NUMERIC(2, 10002), &rank);
-    ck_assert_int_eq(rank, -1);
-    UA_Variant_init(&dims);
-    UA_Server_readArrayDimensions(server, UA_NODEID_NUMERIC(2, 10002), &dims);
-    ck_assert_int_eq(dims.arrayLength, 0);
-    UA_Variant_clear(&dims);
-    // 1-dim
-    UA_Server_readValueRank(server, UA_NODEID_NUMERIC(2, 10007), &rank);
-    ck_assert_int_eq(rank, 1);
-    UA_Server_readArrayDimensions(server, UA_NODEID_NUMERIC(2, 10007), &dims);
-    ck_assert_int_eq(dims.arrayLength, 1);
-    ck_assert_int_eq(*((UA_UInt32 *)dims.data), 0);
-    UA_Variant_clear(&dims);
-    UA_Server_readValueRank(server, UA_NODEID_NUMERIC(2, 10004), &rank);
-    ck_assert_int_eq(rank, 1);
-    UA_Server_readArrayDimensions(server, UA_NODEID_NUMERIC(2, 10004), &dims);
-    ck_assert_int_eq(dims.arrayLength, 1);
-    ck_assert_int_eq(*((UA_UInt32 *)dims.data), 4);
-    UA_Variant_clear(&dims);
-    // 2-dim
-    UA_Server_readValueRank(server, UA_NODEID_NUMERIC(2, 10006), &rank);
-    ck_assert_int_eq(rank, 2);
-    UA_Server_readArrayDimensions(server, UA_NODEID_NUMERIC(2, 10006), &dims);
-    ck_assert_int_eq(dims.arrayLength, 2);
-    UA_UInt32 *dimensions = (UA_UInt32 *)dims.data;
-    ck_assert_int_eq(dimensions[0], 2);
-    ck_assert_int_eq(dimensions[1], 2);
-    UA_Variant_clear(&dims);
-}
-END_TEST
-
-static Suite *testSuite_Client(void) {
-    Suite *s = suite_create("Server Nodeset Compiler");
-    TCase *tc_server = tcase_create("Server Testnodeset");
-    tcase_add_unchecked_fixture(tc_server, setup, teardown);
-    tcase_add_test(tc_server, Server_addTestNodeset);
-    tcase_add_test(tc_server, checkScalarValues);
-    tcase_add_test(tc_server, check1dimValues);
-    tcase_add_test(tc_server, readValueRank);
-    suite_add_tcase(s, tc_server);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/nodeset-compiler/testnodeset.csv b/ext/open62541/tests/nodeset-compiler/testnodeset.csv
deleted file mode 100644
index 295480a..0000000
--- a/ext/open62541/tests/nodeset-compiler/testnodeset.csv
+++ /dev/null
@@ -1,16 +0,0 @@
-Structs,5001,Object
-Point_Encoding_DefaultBinary,5002,Object
-BaseDataTypes,5100,Object
-BaseDataTypes_Double,5101,Variable
-BaseDataTypes_Uint32,5102,Variable
-Point,10001,DataType
-Structs_PointA,10002,Variable
-Structs_PointC_Array,10004,Variable
-Structs_PointB,10005,Variable
-Structs_InputArguments,11493,Variable
-Structs_StaticNodeIdTypes,15962,Variable
-Structs_StaticNodeIdTypes,15963,Variable
-BaseDataTypes_String1_scalar,16001,Variable
-BaseDataTypes_ByteString_Scalar,16002,Variable
-PointWithArray,3003,DataType
-NestedPoint,10008,DataType
\ No newline at end of file
diff --git a/ext/open62541/tests/nodeset-compiler/testnodeset.xml b/ext/open62541/tests/nodeset-compiler/testnodeset.xml
deleted file mode 100644
index 18d7f9a..0000000
--- a/ext/open62541/tests/nodeset-compiler/testnodeset.xml
+++ /dev/null
@@ -1,491 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:s1="http://yourorganisation.org/test/Types.xsd" xmlns:ua="http://unifiedautomation.com/Configuration/NodeSet.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-    <NamespaceUris>
-        <Uri>http://yourorganisation.org/test/</Uri>
-    </NamespaceUris>
-    <Aliases>
-        <Alias Alias="Int32">i=6</Alias>
-        <Alias Alias="UInt32">i=7</Alias>
-        <Alias Alias="Double">i=11</Alias>
-        <Alias Alias="Organizes">i=35</Alias>
-        <Alias Alias="HasModellingRule">i=37</Alias>
-        <Alias Alias="HasEncoding">i=38</Alias>
-        <Alias Alias="HasTypeDefinition">i=40</Alias>
-        <Alias Alias="HasSubtype">i=45</Alias>
-        <Alias Alias="HasComponent">i=47</Alias>
-        <Alias Alias="IdType">i=256</Alias>
-        <Alias Alias="Argument">i=296</Alias>
-        <Alias Alias="Point3D">ns=1;i=3002</Alias>
-        <Alias Alias="Point">ns=1;i=10001</Alias>
-    </Aliases>
-    <Extensions>
-        <Extension>
-            <ua:ModelInfo Tool="UaModeler" Hash="NY/CbF6sk/OjLXFpjvfTAA==" Version="1.6.2"/>
-        </Extension>
-    </Extensions>
-    <!-->Struct with builtin members<-->
-    <UADataType NodeId="ns=1;i=10001" BrowseName="1:Point">
-        <DisplayName>Point</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-        </References>
-        <Definition Name="1:Point">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-        </Definition>
-    </UADataType>
-    <UADataType NodeId="ns=1;i=10008" BrowseName="1:NestedPoint">
-        <DisplayName>NestedPoint</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-        </References>
-        <Definition Name="1:Point">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-            <Field DataType="ns=1;i=10001" Name="Point1" />
-        </Definition>
-    </UADataType>
-    <UAObject SymbolicName="DefaultBinary" NodeId="ns=1;i=5002" BrowseName="Default Binary">
-        <DisplayName>Default Binary</DisplayName>
-        <References>
-            <Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=10001</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=76</Reference>
-        </References>
-    </UAObject>    
-    <UAObject NodeId="ns=1;i=5100" BrowseName="1:BuiltinTypes">
-        <DisplayName>BuiltinTypes</DisplayName>
-        <References>
-            <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
-            <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-        </References>
-    </UAObject>
-    <UAVariable DataType="ByteString" NodeId="ns=1;i=16002" BrowseName="1:ByteString_scalar_init" AccessLevel="3">
-        <DisplayName>ByteString_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ByteString>SGVsbG9Xb3JsZA==</ByteString>
-        </Value>
-    </UAVariable>
-    <!--ValueRank>
-    OPC UA spec part 3, NodeClass Variable
-    -3: Scalar or 1-dim
-    -2: Any, value can be a scalar or an array with any number of dimensions
-    -1: scalar
-     0: value is array with one or more dimensions
-     1: array with one dimension
-     n>1: array with with the specified numbers of dimensions
-    <-->
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8001" BrowseName="1:Int32_scalar_noInit_withoutValueRank" AccessLevel="3">
-        <DisplayName>Int32_scalar_noInit_withoutValueRank</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8002" BrowseName="1:Int32_scalar_Init_ValueRank=-3" AccessLevel="3" ValueRank="-3">
-        <DisplayName>Int32_scalar_Init_ValueRank=-3</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>            
-            <Int32>1</Int32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8003" BrowseName="1:Int32_1dim_Init_ValueRank=-3" AccessLevel="3" ValueRank="-3">
-        <DisplayName>Int32_1dim_Init_ValueRank=-3</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ListOfInt32>
-                <Int32>1</Int32>
-                <Int32>2</Int32>
-            </ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8004" BrowseName="1:Int32_scalar_noInit_ValueRank=-2" AccessLevel="3" ValueRank="-2">
-        <DisplayName>Int32_scalar_noInit_ValueRank=-2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8005" BrowseName="1:Int32_scalar_noInit_ValueRank=-1" AccessLevel="3" ValueRank="-1">
-        <DisplayName>Int32_scalar_noInit_ValueRank=-1</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ListOfInt32>
-                <Int32>1</Int32>
-                <Int32>2</Int32>
-            </ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8006" BrowseName="1:Int32_OneOrMoreDim_noInit_ValueRank=0" AccessLevel="3" ValueRank="0">
-        <DisplayName>Int32_scalar_noInit_ValueRank=0</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8007" BrowseName="1:Int32_1dim_noInit_ValueRank=1" AccessLevel="3" ValueRank="1">
-        <DisplayName>Int32_1dim_noInit_ValueRank=1</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8008" BrowseName="1:Int32_2dim_noInit_ValueRank=2" AccessLevel="3" ValueRank="2">
-        <DisplayName>Int32_2dim_noInit_ValueRank=2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="Int32" NodeId="ns=1;i=8009" BrowseName="1:Int32_3dim_noInit_ValueRank=2" AccessLevel="3" ValueRank="3">
-        <DisplayName>Int32_3dim_noInit_ValueRank=2</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>        
-    </UAVariable>
-    <UAVariable DataType="String" NodeId="ns=1;i=16001" BrowseName="1:String_scalar_init" AccessLevel="3">
-        <DisplayName>String_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <uax:String>Hello World</uax:String>
-        </Value>
-    </UAVariable>
-    <UAObject NodeId="ns=1;i=5001" BrowseName="1:NotBuiltinTypes">
-        <DisplayName>NotBuiltinTypes</DisplayName>
-        <References>            
-            <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
-        </References>
-    </UAObject>   
-    <UAVariable DataType="Argument" NodeId="ns=1;i=11493" BrowseName="InputArguments_scalar_init">
-        <DisplayName>InputArguments_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>i=297</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <Argument xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-                        <Name>argName</Name>
-                        <DataType>
-                            <Identifier>i=1</Identifier>
-                        </DataType>
-                        <ValueRank>-1</ValueRank>                        
-                        <ArrayDimensions>0</ArrayDimensions>
-                        <Description>
-                            <Locale>en</Locale>
-                            <Text>myDescritipon</Text>
-                        </Description>
-                    </Argument>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" NodeId="ns=1;i=10002" BrowseName="1:Point_scalar_init" AccessLevel="3">
-        <DisplayName>Point_scalar_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>            
-        </References>
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                        <x>1</x>
-                        <y>2</y>
-                    </Point>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>
-    </UAVariable>
-    <!-->uninitialized scalar point<-->
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="-1" NodeId="ns=1;i=10005" BrowseName="1:Point_scalar_noInit" AccessLevel="3">
-        <DisplayName>Point_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="1" NodeId="ns=1;i=10007" BrowseName="1:Point_1dim_noInit" AccessLevel="3">
-        <DisplayName>Point_1dim_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="1" NodeId="ns=1;i=10004" ArrayDimensions="4" BrowseName="1:Point_1dim_init" AccessLevel="3">
-        <DisplayName>Point_1dim_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <Value>
-            <uax:ListOfExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>1</x>
-                            <y>2</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>3</x>
-                            <y>4</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>5</x>
-                            <y>6</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>i=0</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>7</x>
-                            <y>8</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-            </uax:ListOfExtensionObject>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="Point" ParentNodeId="ns=1;i=5001" ValueRank="2" NodeId="ns=1;i=10006" ArrayDimensions="2,2" BrowseName="1:Point_2dim_init" AccessLevel="3">
-        <DisplayName>Point_2dim_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <Value>
-            <uax:ListOfExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>1</x>
-                            <y>2</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>3</x>
-                            <y>4</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>5</x>
-                            <y>6</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-                <uax:ExtensionObject>
-                    <uax:TypeId>
-                        <uax:Identifier>ns=1;i=10001</uax:Identifier>
-                    </uax:TypeId>
-                    <uax:Body>
-                        <Point xmlns="http://yourorganisation.org/test/Types.xsd">
-                            <x>7</x>
-                            <y>8</y>
-                        </Point>
-                    </uax:Body>
-                </uax:ExtensionObject>
-            </uax:ListOfExtensionObject>
-        </Value>
-    </UAVariable>    
-    <UAVariable DataType="Double" ParentNodeId="ns=1;i=5100" NodeId="ns=1;i=5101" BrowseName="1:Double_init" AccessLevel="3">
-        <DisplayName>Double_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="HasModellingRule">i=78</Reference>
-        </References>
-        <Value>
-            <uax:Double>42</uax:Double>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="UInt32" ParentNodeId="ns=1;i=5100" ValueRank="1" NodeId="ns=1;i=5102" ArrayDimensions="3" BrowseName="1:UInt32_init" AccessLevel="3">
-        <DisplayName>UInt32_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-        </References>
-        <Value>
-            <uax:ListOfUInt32>
-                <uax:UInt32>1</uax:UInt32>
-                <uax:UInt32>2</uax:UInt32>
-                <uax:UInt32>3</uax:UInt32>
-            </uax:ListOfUInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="IdType" ParentNodeId="ns=1;i=5001" ValueRank="1" NodeId="ns=1;i=15962" ArrayDimensions="7" BrowseName="Enum_1dim_init">
-        <DisplayName>Enum_init</DisplayName>
-        <Description>A list of IdTypes for nodes which are the same in every server that exposes them.</Description>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-        </References>
-        <Value>
-            <uax:ListOfInt32>
-                <uax:Int32>0</uax:Int32>
-                <uax:Int32>1</uax:Int32>
-                <uax:Int32>3</uax:Int32>
-                <uax:Int32>4</uax:Int32>
-                <uax:Int32>5</uax:Int32>
-                <uax:Int32>6</uax:Int32>
-                <uax:Int32>7</uax:Int32>
-            </uax:ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UAVariable DataType="IdType" ParentNodeId="ns=1;i=5001" NodeId="ns=1;i=15963" BrowseName="Enum_scalar_noInit">
-        <DisplayName>Enum_scalar_noInit</DisplayName>
-        <Description>A list of IdTypes for nodes which are the same in every server that exposes them.</Description>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-        </References>
-    </UAVariable>
-    <UAVariable DataType="i=307" NodeId="ns=1;i=16003" BrowseName="1:ApplicationTye_1dim_noInit" UserAccessLevel="3" AccessLevel="3" ValueRank="1">
-        <DisplayName>ApplicationTye_1dim_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <ListOfInt32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-                <Int32>0</Int32>
-                <Int32>1</Int32>
-                <Int32>2</Int32>
-                <Int32>3</Int32>
-            </ListOfInt32>
-        </Value>
-    </UAVariable>
-    
-    <UAVariable DataType="Int32" ValueRank="2" NodeId="ns=1;i=6003" ArrayDimensions="3,2" BrowseName="1:Int32_2dim_init" AccessLevel="3">
-        <DisplayName>Int32_2dim_init</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5100</Reference>
-        </References>
-        <Value>
-            <uax:ListOfInt32>
-                <uax:Int32>11</uax:Int32>
-                <uax:Int32>21</uax:Int32>
-                <uax:Int32>31</uax:Int32>
-                <uax:Int32>12</uax:Int32>
-                <uax:Int32>22</uax:Int32>
-                <uax:Int32>32</uax:Int32>
-            </uax:ListOfInt32>
-        </Value>
-    </UAVariable>
-    <UADataType NodeId="ns=1;i=3003" BrowseName="1:PointWithArray">
-        <DisplayName>PointWithArray</DisplayName>
-        <References>
-            <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-        </References>
-        <Definition Name="1:PointWithArray">
-            <Field DataType="Double" Name="x"/>
-            <Field DataType="Double" Name="y"/>
-            <Field DataType="Double" Name="z"/>
-            <Field DataType="UInt32" Name="array1Size"/>
-            <Field DataType="Double" ValueRank="1" Name="array1"/>
-        </Definition>
-    </UADataType>
-    <UAVariable DataType="ns=1;i=3003" NodeId="ns=1;i=6008" BrowseName="1:PointWithArray_scalar_noInit" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>PointWithArray_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <!-->
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>ns=1;i=3003</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <PointWithArray xmlns="http://yourorganisation.org/exported2/Types.xsd">
-                        <x>1.1</x>
-                        <y>2.2</y>
-                        <z>3.3</z>
-                        <array1Size>1</array1Size>
-                        <array1><Double>1.1</Double></array1>
-                    </PointWithArray>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>-->
-    </UAVariable>
-    <UAVariable DataType="ns=1;i=10008" NodeId="ns=1;i=6009" BrowseName="1:NestedPoint_scalar_noInit" UserAccessLevel="3" AccessLevel="3">
-        <DisplayName>NestedPoint_scalar_noInit</DisplayName>
-        <References>
-            <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-            <Reference ReferenceType="Organizes" IsForward="false">ns=1;i=5001</Reference>
-        </References>
-        <!-->
-        <Value>
-            <uax:ExtensionObject>
-                <uax:TypeId>
-                    <uax:Identifier>ns=1;i=3003</uax:Identifier>
-                </uax:TypeId>
-                <uax:Body>
-                    <PointWithArray xmlns="http://yourorganisation.org/exported2/Types.xsd">
-                        <x>1.1</x>
-                        <y>2.2</y>
-                        <z>3.3</z>
-                        <array1Size>1</array1Size>
-                        <array1><Double>1.1</Double></array1>
-                    </PointWithArray>
-                </uax:Body>
-            </uax:ExtensionObject>
-        </Value>-->
-    </UAVariable>
-</UANodeSet>
diff --git a/ext/open62541/tests/nodeset-compiler/testtypes.bsd b/ext/open62541/tests/nodeset-compiler/testtypes.bsd
deleted file mode 100644
index 98bc2fb..0000000
--- a/ext/open62541/tests/nodeset-compiler/testtypes.bsd
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2018 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- * 
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- * 
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<opc:TypeDictionary
-  xmlns:opc="http://opcfoundation.org/BinarySchema/"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:ua="http://opcfoundation.org/UA/"
-  xmlns:tns="http://yourorganisation.org/test/"
-  DefaultByteOrder="LittleEndian"
-  TargetNamespace="http://yourorganisation.org/test/"
->
-  <opc:Import Namespace="http://opcfoundation.org/UA/" Location="Opc.Ua.BinarySchema.bsd"/>
-
-  <opc:StructuredType Name="Point" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NestedPoint" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-    <opc:Field Name="point1" TypeName="tns:Point" />
-  </opc:StructuredType>
-
-   <opc:StructuredType Name="PointWithArray" BaseType="ua:ExtensionObject">
-    <opc:Field Name="x" TypeName="opc:Double" />
-    <opc:Field Name="y" TypeName="opc:Double" />
-    <opc:Field Name="z" TypeName="opc:Double" />
-    <opc:Field Name="array1Size" TypeName="opc:UInt32" />
-    <opc:Field Name="array1" TypeName="opc:Double" LengthField="array1Size" />
-  </opc:StructuredType>
-
-</opc:TypeDictionary>
diff --git a/ext/open62541/tests/pubsub/check_pubsub_connection_udp.c b/ext/open62541/tests/pubsub/check_pubsub_connection_udp.c
deleted file mode 100644
index 7f71439..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_connection_udp.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(AddConnectionsWithMinimalValidConfiguration){
-    UA_StatusCode retVal;
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    retVal = UA_Server_addPubSubConnection(server, &connectionConfig, NULL);
-    ck_assert_int_eq(server->pubSubManager.connectionsSize, 1);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert(server->pubSubManager.connections[0].channel != NULL);
-    retVal = UA_Server_addPubSubConnection(server, &connectionConfig, NULL);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert(server->pubSubManager.connections[1].channel != NULL);
-    ck_assert_int_eq(server->pubSubManager.connectionsSize, 2);
-} END_TEST
-
-START_TEST(AddRemoveAddConnectionWithMinimalValidConfiguration){
-        UA_StatusCode retVal;
-        UA_PubSubConnectionConfig connectionConfig;
-        memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-        connectionConfig.name = UA_STRING("UADP Connection");
-        UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-        UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                             &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-        connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-        UA_NodeId connectionIdent;
-        retVal = UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdent);
-        ck_assert_int_eq(server->pubSubManager.connectionsSize, 1);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert(server->pubSubManager.connections[0].channel != NULL);
-        retVal |= UA_Server_removePubSubConnection(server, connectionIdent);
-        ck_assert_int_eq(server->pubSubManager.connectionsSize, 0);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal = UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdent);
-        ck_assert_int_eq(server->pubSubManager.connectionsSize, 1);
-        ck_assert(server->pubSubManager.connections[0].channel != NULL);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(AddConnectionWithInvalidAddress){
-    UA_StatusCode retVal;
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://256.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    retVal = UA_Server_addPubSubConnection(server, &connectionConfig, NULL);
-    ck_assert_int_eq(server->pubSubManager.connectionsSize, 0);
-    ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    retVal = UA_Server_addPubSubConnection(server, &connectionConfig, NULL);
-    ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(server->pubSubManager.connectionsSize, 0);
-} END_TEST
-
-START_TEST(AddConnectionWithUnknownTransportURL){
-        UA_StatusCode retVal;
-        UA_PubSubConnectionConfig connectionConfig;
-        memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-        connectionConfig.name = UA_STRING("UADP Connection");
-        UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-        UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                             &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-        connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/unknown-udp-uadp");
-        UA_NodeId connectionIdent;
-        retVal = UA_Server_addPubSubConnection(server, &connectionConfig, &connectionIdent);
-        ck_assert_int_eq(server->pubSubManager.connectionsSize, 0);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(AddConnectionWithNullConfig){
-        UA_StatusCode retVal;
-        retVal = UA_Server_addPubSubConnection(server, NULL, NULL);
-        ck_assert_int_eq(server->pubSubManager.connectionsSize, 0);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddSingleConnectionWithMaximalConfiguration){
-    UA_NetworkAddressUrlDataType networkAddressUrlData = {UA_STRING("127.0.0.1"), UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant address;
-    UA_Variant_setScalar(&address, &networkAddressUrlData, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    UA_KeyValuePair connectionOptions[3];
-    connectionOptions[0].key = UA_QUALIFIEDNAME(0, "ttl");
-    UA_UInt32 ttl = 10;
-    UA_Variant_setScalar(&connectionOptions[0].value, &ttl, &UA_TYPES[UA_TYPES_UINT32]);
-    connectionOptions[1].key = UA_QUALIFIEDNAME(0, "loopback");
-    UA_Boolean loopback = UA_FALSE;
-    UA_Variant_setScalar(&connectionOptions[1].value, &loopback, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    connectionOptions[2].key = UA_QUALIFIEDNAME(0, "reuse");
-    UA_Boolean reuse = UA_TRUE;
-    UA_Variant_setScalar(&connectionOptions[2].value, &reuse, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    UA_PubSubConnectionConfig connectionConf;
-    memset(&connectionConf, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConf.name = UA_STRING("UADP Connection");
-    connectionConf.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    connectionConf.enabled = true;
-    connectionConf.publisherId.numeric = 223344;
-    connectionConf.connectionPropertiesSize = 3;
-    connectionConf.connectionProperties = connectionOptions;
-    connectionConf.address = address;
-    UA_NodeId connection;
-    UA_StatusCode retVal = UA_Server_addPubSubConnection(server, &connectionConf, &connection);
-    ck_assert_int_eq(server->pubSubManager.connectionsSize, 1);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert(server->pubSubManager.connections[0].channel != NULL);
-} END_TEST
-
-START_TEST(GetMaximalConnectionConfigurationAndCompareValues){
-    UA_NetworkAddressUrlDataType networkAddressUrlData = {UA_STRING("127.0.0.1"), UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant address;
-    UA_Variant_setScalar(&address, &networkAddressUrlData, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    UA_KeyValuePair connectionOptions[3];
-    connectionOptions[0].key = UA_QUALIFIEDNAME(0, "ttl");
-    UA_UInt32 ttl = 10;
-    UA_Variant_setScalar(&connectionOptions[0].value, &ttl, &UA_TYPES[UA_TYPES_UINT32]);
-    connectionOptions[1].key = UA_QUALIFIEDNAME(0, "loopback");
-    UA_Boolean loopback = UA_FALSE;
-    UA_Variant_setScalar(&connectionOptions[1].value, &loopback, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    connectionOptions[2].key = UA_QUALIFIEDNAME(0, "reuse");
-    UA_Boolean reuse = UA_TRUE;
-    UA_Variant_setScalar(&connectionOptions[2].value, &reuse, &UA_TYPES[UA_TYPES_BOOLEAN]);
-
-    UA_PubSubConnectionConfig connectionConf;
-    memset(&connectionConf, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConf.name = UA_STRING("UADP Connection");
-    connectionConf.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    connectionConf.enabled = true;
-    connectionConf.publisherId.numeric = 223344;
-    connectionConf.connectionPropertiesSize = 3;
-    connectionConf.connectionProperties = connectionOptions;
-    connectionConf.address = address;
-    UA_NodeId connection;
-    UA_StatusCode retVal = UA_Server_addPubSubConnection(server, &connectionConf, &connection);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    retVal |= UA_Server_getPubSubConnectionConfig(server, connection, &connectionConfig);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert(connectionConfig.connectionPropertiesSize == connectionConf.connectionPropertiesSize);
-    ck_assert(UA_String_equal(&connectionConfig.name, &connectionConf.name) == UA_TRUE);
-    ck_assert(UA_String_equal(&connectionConfig.transportProfileUri, &connectionConf.transportProfileUri) == UA_TRUE);
-    UA_NetworkAddressUrlDataType networkAddressUrlDataCopy = *((UA_NetworkAddressUrlDataType *)connectionConfig.address.data);
-    ck_assert(UA_NetworkAddressUrlDataType_calcSizeBinary(&networkAddressUrlDataCopy) == UA_NetworkAddressUrlDataType_calcSizeBinary(&networkAddressUrlData));
-    for(size_t i = 0; i < connectionConfig.connectionPropertiesSize; i++){
-        ck_assert(UA_String_equal(&connectionConfig.connectionProperties[i].key.name, &connectionConf.connectionProperties[i].key.name) == UA_TRUE);
-        ck_assert(UA_Variant_calcSizeBinary(&connectionConfig.connectionProperties[i].value) == UA_Variant_calcSizeBinary(&connectionConf.connectionProperties[i].value));
-    }
-    UA_PubSubConnectionConfig_deleteMembers(&connectionConfig);
-    } END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_connections_minimal_config = tcase_create("Create PubSub UDP Connections with minimal valid config");
-    tcase_add_checked_fixture(tc_add_pubsub_connections_minimal_config, setup, teardown);
-    tcase_add_test(tc_add_pubsub_connections_minimal_config, AddConnectionsWithMinimalValidConfiguration);
-    tcase_add_test(tc_add_pubsub_connections_minimal_config, AddRemoveAddConnectionWithMinimalValidConfiguration);
-
-    TCase *tc_add_pubsub_connections_invalid_config = tcase_create("Create PubSub UDP Connections with invalid configurations");
-    tcase_add_checked_fixture(tc_add_pubsub_connections_invalid_config, setup, teardown);
-    tcase_add_test(tc_add_pubsub_connections_invalid_config, AddConnectionWithInvalidAddress);
-    tcase_add_test(tc_add_pubsub_connections_invalid_config, AddConnectionWithUnknownTransportURL);
-    tcase_add_test(tc_add_pubsub_connections_invalid_config, AddConnectionWithNullConfig);
-
-    TCase *tc_add_pubsub_connections_maximal_config = tcase_create("Create PubSub UDP Connections with maximal valid config");
-    tcase_add_checked_fixture(tc_add_pubsub_connections_maximal_config, setup, teardown);
-    tcase_add_test(tc_add_pubsub_connections_maximal_config, AddSingleConnectionWithMaximalConfiguration);
-    tcase_add_test(tc_add_pubsub_connections_maximal_config, GetMaximalConnectionConfigurationAndCompareValues);
-
-    Suite *s = suite_create("PubSub UDP connection creation");
-    suite_add_tcase(s, tc_add_pubsub_connections_minimal_config);
-    suite_add_tcase(s, tc_add_pubsub_connections_invalid_config);
-    suite_add_tcase(s, tc_add_pubsub_connections_maximal_config);
-    //suite_add_tcase(s, tc_decode);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_encoding.c b/ext/open62541/tests/pubsub/check_pubsub_encoding.c
deleted file mode 100644
index 361a7f2..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_encoding.c
+++ /dev/null
@@ -1,1380 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff)
- */
-
-#include <open62541/client.h>
-#include <open62541/types.h>
-
-#include "ua_pubsub_networkmessage.h"
-
-#include "check.h"
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantKeyFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    dmkf.data.keyFrameData.fieldCount = 1;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-
-    UA_Int32 iv = 27;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    //if (rv == UA_STATUSCODE_GOOD) {
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-    
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, 1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-
-    //}
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueKeyFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    dmkf.data.keyFrameData.fieldCount = 1;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-
-    UA_Int32 iv = 27;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    //if (rv == UA_STATUSCODE_GOOD) {
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, 1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    //}
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 anzFields = 2;
-    dmkf.data.keyFrameData.fieldCount = anzFields;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]);
-
-    UA_Double dv = 231.3;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    UA_UInt64 uiv = 98412;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]);
-    dmkf.data.keyFrameData.dataSetFields[1].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]);
-    ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]);
-    ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 anzFields = 2;
-    dmkf.data.keyFrameData.fieldCount = anzFields;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]);
-
-    UA_Double dv = 231.3;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    UA_UInt64 uiv = 98412;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]);
-    dmkf.data.keyFrameData.dataSetFields[1].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]);
-    ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]);
-    ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantDeltaFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmdf;
-    memset(&dmdf, 0, sizeof(UA_DataSetMessage));
-    dmdf.header.dataSetMessageValid = true;
-    dmdf.header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    dmdf.data.deltaFrameData.fieldCount = 1;
-    size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount;
-    dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_UInt16 fieldIndex = 1;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-
-    UA_Int32 iv = 58;
-    UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmdf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 1);
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(dmdf.data.deltaFrameData.deltaFrameFields);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueDeltaFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmdf;
-    memset(&dmdf, 0, sizeof(UA_DataSetMessage));
-    dmdf.header.dataSetMessageValid = true;
-    dmdf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    dmdf.data.deltaFrameData.fieldCount = 1;
-    size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount;
-    dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_UInt16 fieldIndex = 1;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-
-    UA_Int32 iv = 197;
-    UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmdf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 1);
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(dmdf.data.deltaFrameData.deltaFrameFields);
-}
-END_TEST
-
-START_TEST(UA_PubSub_Encode_WithBufferTooSmallShallReturnError) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    dmkf.data.keyFrameData.fieldCount = 1;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-
-    UA_Int32 iv = 27;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-
-    // to generate an error we make the buffer too small
-    msgSize -= 5;
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_ne(rv, UA_STATUSCODE_GOOD);
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_Decode_WithBufferTooSmallShallReturnError) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    dmkf.data.keyFrameData.fieldCount = 1;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-
-    UA_Int32 iv = 27;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    UA_ByteString buffer2;
-    UA_ByteString_init(&buffer2);
-    size_t shortLength = buffer.length - 4;
-    UA_ByteString_allocBuffer(&buffer2, shortLength);
-    for (size_t i = 0; i < shortLength; i++)
-    {
-        buffer2.data[i] = buffer.data[i];
-    }
-
-    rv = UA_NetworkMessage_decodeBinary(&buffer2, &offset, &m2);
-    ck_assert_int_ne(rv, UA_STATUSCODE_GOOD);
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_ByteString_deleteMembers(&buffer2);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmdf;
-    memset(&dmdf, 0, sizeof(UA_DataSetMessage));
-    dmdf.header.dataSetMessageValid = true;
-    dmdf.header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    dmdf.data.deltaFrameData.fieldCount = 2;
-    size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount;
-    dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_UInt16 fieldIndex1 = 1;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_UInt16 fieldIndex2 = 3;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue);
-
-    UA_Int32 iv = 58;
-    UA_Variant_setScalar(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-
-    UA_String testString = (UA_String) { 5, (UA_Byte*)"OPCUA" };
-    UA_Variant value;
-    UA_Variant_init(&value);
-    value.data = UA_malloc(sizeof(UA_String));
-    *((UA_String*)value.data) = testString;
-    value.type = &UA_TYPES[UA_TYPES_STRING];
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmdf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2);
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue);
-    // compare string value
-    UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data);
-    for (UA_Int32 i = 0; i < 5; i++)
-    {
-        ck_assert_int_eq(decodedString.data[i], testString.data[i]);
-    }
-    ck_assert_int_eq(decodedString.length, testString.length);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp);
-
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it.
-    UA_Variant_deleteMembers(&value);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(dmdf.data.deltaFrameData.deltaFrameFields);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrame) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    UA_DataSetMessage dmdf;
-    memset(&dmdf, 0, sizeof(UA_DataSetMessage));
-    dmdf.header.dataSetMessageValid = true;
-    dmdf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    dmdf.data.deltaFrameData.fieldCount = 2;
-    size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount;
-    dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_UInt16 fieldIndex1 = 1;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_UInt16 fieldIndex2 = 3;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue);
-
-    UA_Int32 iv = 193;
-    UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.sourceTimestamp = UA_DateTime_now();
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp = true;
-
-    UA_String testString = (UA_String) { 5, (UA_Byte*)"OPCUA" };
-    UA_Variant value;
-    UA_Variant_init(&value);
-    value.data = UA_malloc(sizeof(UA_String));
-    *((UA_String*)value.data) = testString;
-    value.type = &UA_TYPES[UA_TYPES_STRING];
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmdf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2);
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue);
-    // compare string value
-    UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data);
-    for (UA_Int32 i = 0; i < 5; i++)
-    {
-        ck_assert_int_eq(decodedString.data[i], testString.data[i]);
-    }
-    ck_assert_int_eq(decodedString.length, testString.length);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp);
-
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it.
-    UA_Variant_deleteMembers(&value);
-    UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(dmdf.data.deltaFrameData.deltaFrameFields);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameGroupHeader) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.groupHeaderEnabled = true;
-    m.groupHeader.writerGroupIdEnabled = true;
-    UA_UInt16 writerGroupId = 17;
-    m.groupHeader.writerGroupId = writerGroupId;
-    m.groupHeader.groupVersionEnabled = true;
-    UA_UInt32 groupVersion = 573354747; // das sollte irgendwann 2018 sein
-    m.groupHeader.groupVersion = groupVersion;
-
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-
-    UA_UInt16 anzFields = 2;
-    dmkf.data.keyFrameData.fieldCount = anzFields;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]);
-
-    UA_Double dv = 231.3;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    UA_UInt64 uiv = 98412;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]);
-    dmkf.data.keyFrameData.dataSetFields[1].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.groupHeader.writerGroupIdEnabled == m2.groupHeader.writerGroupIdEnabled);
-    ck_assert(m.groupHeader.groupVersionEnabled == m2.groupHeader.groupVersionEnabled);
-    ck_assert(m.groupHeader.networkMessageNumberEnabled == m2.groupHeader.networkMessageNumberEnabled);
-    ck_assert(m.groupHeader.sequenceNumberEnabled == m2.groupHeader.sequenceNumberEnabled);
-    ck_assert_uint_eq(m2.groupHeader.writerGroupId, writerGroupId);
-    ck_assert_uint_eq(m2.groupHeader.groupVersion, groupVersion);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]);
-    ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]);
-    ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFramePublDSCID) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.publisherIdEnabled = true;
-    m.publisherIdType = UA_PUBLISHERDATATYPE_UINT32;
-    UA_UInt32 publisherId = 1469;
-    m.publisherId.publisherIdUInt32 = publisherId;
-    m.dataSetClassIdEnabled = true;
-    UA_Guid dataSetClassId = UA_Guid_random();
-    m.dataSetClassId = dataSetClassId;
-
-    UA_DataSetMessage dmdf;
-    memset(&dmdf, 0, sizeof(UA_DataSetMessage));
-    dmdf.header.dataSetMessageValid = true;
-    dmdf.header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    dmdf.data.deltaFrameData.fieldCount = 2;
-    size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount;
-    dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_UInt16 fieldIndex1 = 1;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_UInt16 fieldIndex2 = 3;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue);
-
-    UA_Int32 iv = 58;
-    UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-
-    UA_String testString = (UA_String) { 5, (UA_Byte*)"OPCUA" };
-    UA_Variant value;
-    UA_Variant_init(&value);
-    value.data = UA_malloc(sizeof(UA_String));
-    *((UA_String*)value.data) = testString;
-    value.type = &UA_TYPES[UA_TYPES_STRING];
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmdf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(UA_Guid_equal(&m.dataSetClassId, &m2.dataSetClassId) == true);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert_int_eq(m2.publisherIdType, m.publisherIdType);
-    ck_assert_uint_eq(m2.publisherId.publisherIdUInt32, publisherId);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2);
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue);
-    // compare string value
-    UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data);
-    for (UA_Int32 i = 0; i < 5; i++)
-    {
-        ck_assert_int_eq(decodedString.data[i], testString.data[i]);
-    }
-    ck_assert_int_eq(decodedString.length, testString.length);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp);
-
-    ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it.
-    UA_Variant_deleteMembers(&value);
-    UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(dmdf.data.deltaFrameData.deltaFrameFields);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFramePH) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.payloadHeaderEnabled = true;
-    m.payloadHeader.dataSetPayloadHeader.count = 1;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16 *)UA_Array_new(m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-    UA_UInt16 dataSetWriterId = 1698;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0] = dataSetWriterId;
-
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 anzFields = 2;
-    dmkf.data.keyFrameData.fieldCount = anzFields;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]);
-
-    UA_Double dv = 231.3;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    UA_UInt64 uiv = 98412;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]);
-    dmkf.data.keyFrameData.dataSetFields[1].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert_uint_eq(m.payloadHeader.dataSetPayloadHeader.count, 1);
-    ck_assert_uint_eq(m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], dataSetWriterId);
-
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]);
-    ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]);
-    ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    UA_Array_delete(m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds, m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameTSProm) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.timestampEnabled = true;
-    UA_DateTime ts = UA_DateTime_now();
-    m.timestamp = ts;
-    m.promotedFieldsEnabled = true;
-    m.promotedFieldsSize = 1;
-    m.promotedFields = (UA_Variant*)UA_Array_new(m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    
-    UA_DataSetMessage dmkf;
-    memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    dmkf.header.dataSetMessageValid = true;
-    dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 anzFields = 2;
-    dmkf.data.keyFrameData.fieldCount = anzFields;
-    dmkf.data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]);
-
-    UA_Double dv = 231.3;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]);
-    dmkf.data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    UA_Variant_copy(&dmkf.data.keyFrameData.dataSetFields[0].value, &m.promotedFields[0]);
-
-    UA_UInt64 uiv = 98412;
-    UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]);
-    dmkf.data.keyFrameData.dataSetFields[1].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmkf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert_int_eq(m.timestamp, ts);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert_uint_eq(m2.promotedFieldsSize, 1);
-    ck_assert(*((UA_Double*)m2.promotedFields[0].data) == dv);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]);
-    ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]);
-    ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-
-    UA_Array_delete(m.promotedFields, m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]);
-    UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrameGHProm2) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.groupHeaderEnabled = true;
-    m.groupHeader.networkMessageNumberEnabled = true;
-    UA_UInt16 networkMessageNumber = 2175;
-    m.groupHeader.networkMessageNumber = networkMessageNumber;
-
-    m.promotedFieldsEnabled = true;
-    m.promotedFieldsSize = 2;
-    m.promotedFields = (UA_Variant*)UA_Array_new(m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]);
-
-    UA_DataSetMessage dmdf;
-    memset(&dmdf, 0, sizeof(UA_DataSetMessage));
-    dmdf.header.dataSetMessageValid = true;
-    dmdf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    dmdf.data.deltaFrameData.fieldCount = 2;
-    size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount;
-    dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_UInt16 fieldIndex1 = 1;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_UInt16 fieldIndex2 = 3;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2;
-    UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue);
-
-    UA_Int32 iv = 1573;
-    UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]);
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.sourceTimestamp = UA_DateTime_now();
-    dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp = true;
-
-    UA_Variant_copy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &m.promotedFields[0]);
-
-    UA_Float fv = 197.34f;
-    UA_Variant_setScalarCopy(&m.promotedFields[1], &fv, &UA_TYPES[UA_TYPES_FLOAT]);
-
-    UA_String testString = (UA_String) { 5, (UA_Byte*)"OPC24" };
-    UA_Variant value;
-    UA_Variant_init(&value);
-    value.data = UA_malloc(sizeof(UA_String));
-    *((UA_String*)value.data) = testString;
-    value.type = &UA_TYPES[UA_TYPES_STRING];
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value;
-    dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages = &dmdf;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.groupHeader.writerGroupIdEnabled == m2.groupHeader.writerGroupIdEnabled);
-    ck_assert(m.groupHeader.groupVersionEnabled == m2.groupHeader.groupVersionEnabled);
-    ck_assert(m.groupHeader.networkMessageNumberEnabled == m2.groupHeader.networkMessageNumberEnabled);
-    ck_assert_uint_eq(m2.groupHeader.networkMessageNumber, networkMessageNumber);
-    ck_assert(m.groupHeader.sequenceNumberEnabled == m2.groupHeader.sequenceNumberEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert_uint_eq(m2.promotedFieldsSize, 2);
-    ck_assert_int_eq(*((UA_Int32*)m2.promotedFields[0].data), iv);
-    ck_assert(*((UA_Float*)m2.promotedFields[1].data) == fv);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2);
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]);
-    ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-
-    ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue);
-    // compare string value
-    UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data);
-    for (UA_Int32 i = 0; i < 5; i++)
-    {
-        ck_assert_int_eq(decodedString.data[i], testString.data[i]);
-    }
-    ck_assert_int_eq(decodedString.length, testString.length);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp);
-
-    UA_Array_delete(m.promotedFields, m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]);
-    ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it.
-    UA_Variant_deleteMembers(&value);
-    UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(dmdf.data.deltaFrameData.deltaFrameFields);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode_ShallWorkOn2DSVariant) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.payloadHeaderEnabled = true;
-    m.payloadHeader.dataSetPayloadHeader.count = 2;
-    UA_UInt16 dsWriter1 = 4;
-    UA_UInt16 dsWriter2 = 7;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16 *)UA_Array_new(m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0] = dsWriter1;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[1] = dsWriter2;
-
-    size_t memsize = m.payloadHeader.dataSetPayloadHeader.count * sizeof(UA_DataSetMessage);
-    m.payload.dataSetPayload.dataSetMessages = (UA_DataSetMessage*)UA_malloc(memsize);
-    memset(m.payload.dataSetPayload.dataSetMessages, 0, memsize);
-
-    //UA_DataSetMessage dmkf;
-    //memset(&dmkf, 0, sizeof(UA_DataSetMessage));
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 fieldCountDS1 = 1;
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount = fieldCountDS1;
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0]);
-
-    UA_UInt32 iv = 27;
-    UA_Variant_setScalarCopy(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_UINT32]);
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid = true;
-    m.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME;
-    UA_UInt16 fieldCountDS2 = 2;
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount = fieldCountDS2;
-    memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount;
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-
-    UA_Guid gv = UA_Guid_random();
-    UA_UInt16 fieldIndex1 = 2;
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1;
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue);
-    UA_Variant_setScalar(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &gv, &UA_TYPES[UA_TYPES_GUID]);
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true;
-
-    UA_UInt16 fieldIndex2 = 5;
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2;
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue);
-    UA_Int64 iv64 = 152478978534;
-    UA_Variant_setScalar(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.value, &iv64, &UA_TYPES[UA_TYPES_INT64]);
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true;
-
-    UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE;
-    UA_ByteString buffer;
-    size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m);
-    rv = UA_ByteString_allocBuffer(&buffer, msgSize);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, msgSize);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-    rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd);
-
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    size_t offset = 0;
-    rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.version == m2.version);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert_uint_eq(m2.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], dsWriter1);
-    ck_assert_uint_eq(m2.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[1], dsWriter2);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, fieldCountDS1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT32]);
-    ck_assert_uint_eq(*(UA_UInt32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount, fieldCountDS2);
-
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue);
-    ck_assert_uint_eq(m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1);
-    ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_GUID]);
-    ck_assert(UA_Guid_equal((UA_Guid*)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, &gv) == true);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue);
-    ck_assert_uint_eq(m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2);
-    ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT64]);
-    ck_assert_int_eq(*(UA_Int64 *)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data, iv64);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp);
-
-    UA_Array_delete(m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds, m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-    UA_Array_delete(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields, m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_free(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields);
-    UA_NetworkMessage_deleteMembers(&m2);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_free(m.payload.dataSetPayload.dataSetMessages);
-    //UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-}
-END_TEST
-
-int main(void) {
-    TCase *tc_encode = tcase_create("encode");
-    tcase_add_test(tc_encode, UA_PubSub_Encode_WithBufferTooSmallShallReturnError);
-
-    TCase *tc_decode = tcase_create("decode");
-    tcase_add_test(tc_decode, UA_PubSub_Decode_WithBufferTooSmallShallReturnError);
-
-    TCase *tc_ende1 = tcase_create("encode_decode1DS");
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantKeyFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueKeyFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantDeltaFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueDeltaFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrame);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameGroupHeader);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFramePublDSCID);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFramePH);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameTSProm);
-    tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrameGHProm2);
-
-    TCase *tc_ende2 = tcase_create("encode_decode2DS");
-    tcase_add_test(tc_ende2, UA_PubSub_EnDecode_ShallWorkOn2DSVariant);
-    
-    Suite *s = suite_create("PubSub NetworkMessage");   
-    suite_add_tcase(s, tc_encode);
-    suite_add_tcase(s, tc_decode);
-    suite_add_tcase(s, tc_ende1);
-    suite_add_tcase(s, tc_ende2);
-    
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_encoding_json.c b/ext/open62541/tests/pubsub/check_pubsub_encoding_json.c
deleted file mode 100644
index 90484ab..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_encoding_json.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2018 Fraunhofer IOSB (Author: Lukas Meling)
- */
-
-#include <open62541/client.h>
-#include <open62541/types.h>
-#include <open62541/util.h>
-
-#include "ua_pubsub_networkmessage.h"
-
-#include <check.h>
-
-START_TEST(UA_PubSub_EncodeAllOptionalFields) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.payloadHeaderEnabled = true;
-    m.payloadHeader.dataSetPayloadHeader.count = 1;
-    UA_UInt16 dsWriter1 = 12345;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16 *)UA_Array_new(m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0] = dsWriter1;
-
-    size_t memsize = m.payloadHeader.dataSetPayloadHeader.count * sizeof(UA_DataSetMessage);
-    m.payload.dataSetPayload.dataSetMessages = (UA_DataSetMessage*)UA_malloc(memsize);
-    memset(m.payload.dataSetPayload.dataSetMessages, 0, memsize);
-
-    /* enable messageId */
-    m.messageIdEnabled = true;
-    m.messageId = UA_STRING_ALLOC("ABCDEFGH");
-
-    /* enable publisherId */
-    m.publisherIdEnabled = true;
-    m.publisherIdType = UA_PUBLISHERDATATYPE_UINT16;
-    m.publisherId.publisherIdUInt16 = 65535;
-
-    /* enable dataSetClassId */
-    m.dataSetClassIdEnabled = true;
-    m.dataSetClassId.data1 = 1;
-    m.dataSetClassId.data2 = 2;
-    m.dataSetClassId.data3 = 3;
-
-    /* DatasetMessage */
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 fieldCountDS1 = 1;
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount = fieldCountDS1;
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0]);
-
-    /* enable DataSetMessageSequenceNr */
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNrEnabled = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNr = 4711;
-
-    /* enable metaDataVersion */
-    m.payload.dataSetPayload.dataSetMessages[0].header.configVersionMajorVersionEnabled = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.configVersionMinorVersionEnabled = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.configVersionMajorVersion = 42;
-    m.payload.dataSetPayload.dataSetMessages[0].header.configVersionMinorVersion = 7;
-
-    /* enable timestamp */
-    m.payload.dataSetPayload.dataSetMessages[0].header.timestampEnabled = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.timestamp = 11111111111111;
-
-    /* enable status */
-    m.payload.dataSetPayload.dataSetMessages[0].header.statusEnabled = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.status = 12345;
-
-    /* Set fieldnames */
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames =
-        (UA_String*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_STRING]);
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[0] = UA_STRING_ALLOC("Field1");
-
-    UA_UInt32 iv = 27;
-    UA_Variant_setScalarCopy(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_UINT32]);
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    size_t size = UA_NetworkMessage_calcSizeJson(&m, NULL, 0, NULL, 0, true);
-    ck_assert_int_eq(size, 342);
-
-    UA_ByteString buffer;
-    UA_StatusCode rv = UA_ByteString_allocBuffer(&buffer, size+1);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, size+1);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-
-
-    rv = UA_NetworkMessage_encodeJson(&m, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-    *bufPos = 0;
-    // then
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    char* result = "{\"MessageId\":\"ABCDEFGH\",\"MessageType\":\"ua-data\",\"PublisherId\":65535,\"DataSetClassId\":\"00000001-0002-0003-0000-000000000000\",\"Messages\":[{\"DataSetWriterId\":12345,\"SequenceNumber\":4711,\"MetaDataVersion\":{\"MajorVersion\":42,\"MinorVersion\":7},\"Timestamp\":\"1601-01-13T20:38:32.1111111Z\",\"Status\":2764857,\"Payload\":{\"Field1\":{\"Type\":7,\"Body\":27}}}]}";
-    ck_assert_str_eq(result, (char*)buffer.data);
-
-    UA_ByteString_deleteMembers(&buffer);
-    UA_NetworkMessage_deleteMembers(&m);
-}
-END_TEST
-
-START_TEST(UA_PubSub_EnDecode) {
-    UA_NetworkMessage m;
-    memset(&m, 0, sizeof(UA_NetworkMessage));
-    m.version = 1;
-    m.networkMessageType = UA_NETWORKMESSAGE_DATASET;
-    m.payloadHeaderEnabled = true;
-    m.payloadHeader.dataSetPayloadHeader.count = 2;
-    UA_UInt16 dsWriter1 = 4;
-    UA_UInt16 dsWriter2 = 7;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16 *)UA_Array_new(m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]);
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0] = dsWriter1;
-    m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[1] = dsWriter2;
-
-    size_t memsize = m.payloadHeader.dataSetPayloadHeader.count * sizeof(UA_DataSetMessage);
-    m.payload.dataSetPayload.dataSetMessages = (UA_DataSetMessage*)UA_malloc(memsize);
-    memset(m.payload.dataSetPayload.dataSetMessages, 0, memsize);
-
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid = true;
-    m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding = UA_FIELDENCODING_VARIANT;
-    m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 fieldCountDS1 = 1;
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount = fieldCountDS1;
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields =
-        (UA_DataValue*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0]);
-
-    /* Set fieldnames */
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames =
-        (UA_String*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_STRING]);
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[0] = UA_STRING_ALLOC("Field1");
-
-    UA_UInt32 iv = 27;
-    UA_Variant_setScalarCopy(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_UINT32]);
-    m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid = true;
-    m.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding = UA_FIELDENCODING_DATAVALUE;
-    m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME;
-    UA_UInt16 fieldCountDS2 = 2;
-    m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.fieldCount = fieldCountDS2;
-    memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount;
-    m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize);
-     /* Set fieldnames */
-    m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.fieldNames =
-        (UA_String*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount, &UA_TYPES[UA_TYPES_STRING]);
-    m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.fieldNames[0] = UA_STRING_ALLOC("Field2.1");
-    m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.fieldNames[1] = UA_STRING_ALLOC("Field2.2");
-
-
-    UA_Guid gv = UA_Guid_random();
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.dataSetFields[0]);
-    UA_Variant_setScalarCopy(&m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.dataSetFields[0].value, &gv, &UA_TYPES[UA_TYPES_GUID]);
-    m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.dataSetFields[0].hasValue = true;
-
-    UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.dataSetFields[1]);
-    UA_Int64 iv64 = 152478978534;
-    UA_Variant_setScalarCopy(&m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.dataSetFields[1].value, &iv64, &UA_TYPES[UA_TYPES_INT64]);
-    m.payload.dataSetPayload.dataSetMessages[1].data.keyFrameData.dataSetFields[1].hasValue = true;
-
-    size_t size = UA_NetworkMessage_calcSizeJson(&m, NULL, 0, NULL, 0, true);
-
-    UA_ByteString buffer;
-    UA_StatusCode rv = UA_ByteString_allocBuffer(&buffer, size);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_Byte *bufPos = buffer.data;
-    memset(bufPos, 0, size);
-    const UA_Byte *bufEnd = &(buffer.data[buffer.length]);
-
-    rv = UA_NetworkMessage_encodeJson(&m, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-    //*bufPos = 0;
-    // then
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-
-    UA_NetworkMessage m2;
-    memset(&m2, 0, sizeof(UA_NetworkMessage));
-    rv = UA_NetworkMessage_decodeJson(&m2, &buffer);
-    ck_assert_int_eq(rv, UA_STATUSCODE_GOOD);
-    ck_assert(m.networkMessageType == m2.networkMessageType);
-    ck_assert(m.timestampEnabled == m2.timestampEnabled);
-    ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled);
-    ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled);
-    ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled);
-    ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled);
-    ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled);
-    ck_assert(m.securityEnabled == m2.securityEnabled);
-    ck_assert(m.chunkMessage == m2.chunkMessage);
-    ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled);
-    ck_assert_uint_eq(m2.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], dsWriter1);
-    ck_assert_uint_eq(m2.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[1], dsWriter2);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding);
-    ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, fieldCountDS1);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue);
-    ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT32]);
-    ck_assert_uint_eq(*(UA_UInt32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp);
-
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid);
-    ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp);
-    UA_ByteString_deleteMembers(&buffer);
-    UA_NetworkMessage_deleteMembers(&m);
-    UA_NetworkMessage_deleteMembers(&m2);
-}
-END_TEST
-
-
-START_TEST(UA_NetworkMessage_oneMessage_twoFields_json_decode) {
-    // given
-    UA_NetworkMessage out;
-    UA_ByteString buf = UA_STRING("{\"MessageId\":\"5ED82C10-50BB-CD07-0120-22521081E8EE\",\"MessageType\":\"ua-data\",\"Messages\":[{\"DataSetWriterId\":62541,\"MetaDataVersion\":{\"MajorVersion\":1478393530,\"MinorVersion\":12345},\"SequenceNumber\":4711,\"Payload\":{\"Test\":{\"Type\":5,\"Body\":42},\"Server localtime\":{\"Type\":13,\"Body\":\"2018-06-05T05:58:36.000Z\"}}}]}");
-    // when
-    UA_StatusCode retval = UA_NetworkMessage_decodeJson(&out, &buf);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-     //NetworkMessage
-    ck_assert_int_eq(out.chunkMessage, false);
-    ck_assert_int_eq(out.dataSetClassIdEnabled, false);
-    ck_assert_int_eq(out.groupHeaderEnabled, false);
-    ck_assert_int_eq(out.networkMessageType, UA_NETWORKMESSAGE_DATASET);
-    ck_assert_int_eq(out.picosecondsEnabled, false);
-    ck_assert_int_eq(out.promotedFieldsEnabled, false);
-    ck_assert_int_eq(out.securityEnabled, false);
-    ck_assert_int_eq(out.timestampEnabled, false);
-    ck_assert_int_eq(out.publisherIdEnabled, false);
-
-    ck_assert_int_eq(out.payloadHeaderEnabled, true);
-    ck_assert_int_eq(out.payloadHeader.dataSetPayloadHeader.count, 1);
-    ck_assert_int_eq(out.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], 62541);
-
-    //dataSetMessage
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNrEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNr, 4711);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageType, UA_DATASETMESSAGE_DATAKEYFRAME);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding, UA_FIELDENCODING_VARIANT);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.picoSecondsIncluded, false);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMinorVersionEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMajorVersionEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMinorVersion, 12345);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMajorVersion, 1478393530);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNr, 4711);
-    //ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetWriterId, 62541);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue, 1);
-    ck_assert_int_eq(*((UA_UInt16*)out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data), 42);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue, 1);
-    UA_DateTime *dt = (UA_DateTime*)out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data;
-    UA_DateTimeStruct dts = UA_DateTime_toStruct(*dt);
-    ck_assert_int_eq(dts.year, 2018);
-    ck_assert_int_eq(dts.month, 6);
-    ck_assert_int_eq(dts.day, 5);
-    ck_assert_int_eq(dts.hour, 5);
-    ck_assert_int_eq(dts.min, 58);
-    ck_assert_int_eq(dts.sec, 36);
-    ck_assert_int_eq(dts.milliSec, 0);
-    ck_assert_int_eq(dts.microSec, 0);
-    ck_assert_int_eq(dts.nanoSec, 0);
-
-    UA_NetworkMessage_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_NetworkMessage_json_decode) {
-    // given
-    UA_NetworkMessage out;
-    memset(&out,0,sizeof(UA_NetworkMessage));
-    UA_ByteString buf = UA_STRING("{\"MessageId\":\"5ED82C10-50BB-CD07-0120-22521081E8EE\",\"MessageType\":\"ua-data\",\"Messages\":[{\"MetaDataVersion\":{\"MajorVersion\": 47, \"MinorVersion\": 47},\"DataSetWriterId\":62541,\"Status\":22,\"SequenceNumber\":4711,\"Payload\":{\"Test\":{\"Type\":5,\"Body\":42},\"Server localtime\":{\"Type\":1,\"Body\":true}}}]}");
-    // when
-    UA_StatusCode retval = UA_NetworkMessage_decodeJson(&out, &buf);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    //NetworkMessage
-    ck_assert_int_eq(out.chunkMessage, false);
-    ck_assert_int_eq(out.dataSetClassIdEnabled, false);
-    ck_assert_int_eq(out.groupHeaderEnabled, false);
-    ck_assert_int_eq(out.networkMessageType, UA_NETWORKMESSAGE_DATASET);
-    ck_assert_int_eq(out.picosecondsEnabled, false);
-    ck_assert_int_eq(out.promotedFieldsEnabled, false);
-    ck_assert_int_eq(out.securityEnabled, false);
-    ck_assert_int_eq(out.timestampEnabled, false);
-    ck_assert_int_eq(out.publisherIdEnabled, false);
-
-    ck_assert_int_eq(out.payloadHeaderEnabled, true);
-    ck_assert_int_eq(out.payloadHeader.dataSetPayloadHeader.count, 1);
-    ck_assert_int_eq(out.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], 62541);
-
-    //dataSetMessage
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNrEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageSequenceNr, 4711);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageType, UA_DATASETMESSAGE_DATAKEYFRAME);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding, UA_FIELDENCODING_VARIANT);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.picoSecondsIncluded, false);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.statusEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.status, 22);
-
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMinorVersionEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMajorVersionEnabled, true);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMinorVersion, 47);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].header.configVersionMajorVersion, 47);
-
-    //dataSetFields
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue, true);
-    ck_assert_int_eq(*((UA_UInt16*)out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data), 42);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue, true);
-    ck_assert_int_eq(*((UA_Boolean*)out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data), 1);
-
-    UA_NetworkMessage_deleteMembers(&out);
-}
-END_TEST
-
-START_TEST(UA_Networkmessage_DataSetFieldsNull_json_decode) {
-    // given
-    UA_NetworkMessage out;
-    memset(&out, 0, sizeof(UA_NetworkMessage));
-    UA_ByteString buf = UA_STRING("{ \"MessageId\": \"32235546-05d9-4fd7-97df-ea3ff3408574\",  "
-            "\"MessageType\": \"ua-data\",  \"PublisherId\": \"MQTT-Localhost\",  "
-            "\"DataSetClassId\": \"00000005-cab9-4470-8f8a-2c1ead207e0e\",  \"Messages\": "
-            "[    {      \"DataSetWriterId\": 1,      \"SequenceNumber\": 224,     \"MetaDataVersion\": "
-            "{        \"MajorVersion\": 1,        \"MinorVersion\": 1      },\"Payload\":null}]}");
-    // when
-    UA_StatusCode retval = UA_NetworkMessage_decodeJson(&out, &buf);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(out.dataSetClassId.data1, 5);
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages->header.dataSetMessageSequenceNr, 224);
-    ck_assert_ptr_eq(out.payload.dataSetPayload.dataSetMessages->data.keyFrameData.dataSetFields, NULL);
-
-    UA_NetworkMessage_deleteMembers(&out);
-}
-END_TEST
-
-
-START_TEST(UA_NetworkMessage_fieldNames_json_decode) {
-    // given
-    UA_NetworkMessage out;
-    UA_ByteString buf = UA_STRING("{\"MessageId\":\"5ED82C10-50BB-CD07-0120-22521081E8EE\","
-            "\"MessageType\":\"ua-data\",\"Messages\":"
-            "[{\"DataSetWriterId\":62541,\"MetaDataVersion\":"
-            "{\"MajorVersion\":1478393530,\"MinorVersion\":12345},"
-            "\"SequenceNumber\":4711,\"Payload\":{\"Test\":{\"Type\":5,\"Body\":42},\"Test2\":"
-            "{\"Type\":13,\"Body\":\"2018-06-05T05:58:36.000Z\"}}}]}");
-    // when
-    UA_StatusCode retval = UA_NetworkMessage_decodeJson(&out, &buf);
-    // then
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-     //NetworkMessage
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[0].data[0], 'T');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[0].data[1], 'e');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[0].data[2], 's');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[0].data[3], 't');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[1].data[0], 'T');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[1].data[1], 'e');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[1].data[2], 's');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[1].data[3], 't');
-    ck_assert_int_eq(out.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldNames[1].data[4], '2');
-
-    UA_NetworkMessage_deleteMembers(&out);
-}
-END_TEST
-
-static Suite *testSuite_networkmessage(void) {
-    Suite *s = suite_create("Built-in Data Types 62541-6 Json");
-    TCase *tc_json_networkmessage = tcase_create("networkmessage_json");
-
-
-    tcase_add_test(tc_json_networkmessage, UA_PubSub_EncodeAllOptionalFields);
-    tcase_add_test(tc_json_networkmessage, UA_PubSub_EnDecode);
-    tcase_add_test(tc_json_networkmessage, UA_NetworkMessage_oneMessage_twoFields_json_decode);
-    tcase_add_test(tc_json_networkmessage, UA_NetworkMessage_json_decode);
-    tcase_add_test(tc_json_networkmessage, UA_Networkmessage_DataSetFieldsNull_json_decode);
-    tcase_add_test(tc_json_networkmessage, UA_NetworkMessage_fieldNames_json_decode);
-
-    suite_add_tcase(s, tc_json_networkmessage);
-    return s;
-}
-
-int main(void) {
-    int      number_failed = 0;
-    Suite   *s;
-    SRunner *sr;
-
-    s  = testSuite_networkmessage();
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_informationmodel.c b/ext/open62541/tests/pubsub/check_pubsub_informationmodel.c
deleted file mode 100644
index 25e64c8..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_informationmodel.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-#include <open62541/types.h>
-#include <open62541/types_generated.h>
-
-#include "ua_server_internal.h"
-
-#include <math.h>
-#include <string.h>
-
-#include "check.h"
-
-UA_Server *server = NULL;
-
-UA_NodeId connection1, connection2, writerGroup1, writerGroup2, writerGroup3,
-        publishedDataSet1, publishedDataSet2, dataSetWriter1, dataSetWriter2, dataSetWriter3;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void addPublishedDataSet(UA_String pdsName, UA_NodeId *assignedId){
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    pdsConfig.name = pdsName;
-    UA_Server_addPublishedDataSet(server, &pdsConfig, assignedId);
-}
-
-static void addPubSubConnection(UA_String connectionName, UA_String addressUrl, UA_NodeId *assignedId){
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = connectionName;
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, addressUrl};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_Server_addPubSubConnection(server, &connectionConfig, assignedId);
-}
-
-static void addWriterGroup(UA_NodeId parentConnection, UA_String name, UA_Duration interval, UA_NodeId *assignedId){
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-    writerGroupConfig.name = name;
-    writerGroupConfig.publishingInterval = interval;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    UA_Server_addWriterGroup(server, parentConnection, &writerGroupConfig, assignedId);
-}
-
-static void addDataSetWriter(UA_NodeId parentWriterGroup, UA_NodeId connectedPDS, UA_String name, UA_NodeId *assignedId){
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-    dataSetWriterConfig.name = name;
-    UA_Server_addDataSetWriter(server, parentWriterGroup, connectedPDS, &dataSetWriterConfig, assignedId);
-}
-
-static UA_Boolean doubleEqual(UA_Double a, UA_Double b, UA_Double maxAbsDelta){
-    return fabs(a-b) < maxAbsDelta;
-}
-
-static UA_NodeId
-findSingleChildNode(UA_Server *server_, UA_QualifiedName targetName, UA_NodeId referenceTypeId, UA_NodeId startingNode){
-    UA_NodeId resultNodeId;
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = referenceTypeId;
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = targetName;
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = startingNode;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-    UA_BrowsePathResult bpr =
-            UA_Server_translateBrowsePathToNodeIds(server_, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD ||
-       bpr.targetsSize < 1)
-        return UA_NODEID_NULL;
-    UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, &resultNodeId);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return resultNodeId;
-}
-
-static void setupBasicPubSubConfiguration(void){
-    addPubSubConnection(UA_STRING("Connection 1"), UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    addPubSubConnection(UA_STRING("Connection 2"), UA_STRING("opc.udp://224.0.0.22:4840/"), &connection2);
-    addPublishedDataSet(UA_STRING("PublishedDataSet 1"), &publishedDataSet1);
-    addPublishedDataSet(UA_STRING("PublishedDataSet 2"), &publishedDataSet2);
-    addWriterGroup(connection1, UA_STRING("WriterGroup 1"), 10, &writerGroup1);
-    addWriterGroup(connection1, UA_STRING("WriterGroup 2"), 100, &writerGroup2);
-    addWriterGroup(connection2, UA_STRING("WriterGroup 3"), 1000, &writerGroup3);
-    addDataSetWriter(writerGroup1, publishedDataSet1, UA_STRING("DataSetWriter 1"), &dataSetWriter1);
-    addDataSetWriter(writerGroup1, publishedDataSet2, UA_STRING("DataSetWriter 2"), &dataSetWriter2);
-    addDataSetWriter(writerGroup2, publishedDataSet2, UA_STRING("DataSetWriter 3"), &dataSetWriter3);
-}
-
-START_TEST(AddSignlePubSubConnectionAndCheckInformationModelRepresentation){
-    UA_String connectionName = UA_STRING("Connection 1");
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    UA_QualifiedName browseName;
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    retVal |= UA_Server_readBrowseName(server, connection1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &connectionName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddRemoveAddSignlePubSubConnectionAndCheckInformationModelRepresentation){
-    UA_String connectionName = UA_STRING("Connection 1");
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    UA_QualifiedName browseName;
-    UA_StatusCode retVal;
-    ck_assert_int_eq(UA_Server_removePubSubConnection(server, connection1), UA_STATUSCODE_GOOD);
-    retVal = UA_Server_readBrowseName(server, connection1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    retVal = UA_Server_readBrowseName(server, connection1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &connectionName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddSinglePublishedDataSetAndCheckInformationModelRepresentation){
-    UA_String pdsName = UA_STRING("PDS 1");
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    UA_QualifiedName browseName;
-    ck_assert_int_eq(UA_Server_readBrowseName(server, publishedDataSet1, &browseName), UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &pdsName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddRemoveAddSinglePublishedDataSetAndCheckInformationModelRepresentation){
-    UA_String pdsName = UA_STRING("PDS 1");
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    UA_QualifiedName browseName;
-    UA_StatusCode retVal;
-    ck_assert_int_eq(UA_Server_removePublishedDataSet(server, publishedDataSet1), UA_STATUSCODE_GOOD);
-    retVal = UA_Server_readBrowseName(server, publishedDataSet1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    retVal = UA_Server_readBrowseName(server, publishedDataSet1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &pdsName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddSingleWriterGroupAndCheckInformationModelRepresentation){
-    UA_String connectionName = UA_STRING("Connection 1");
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    UA_String pdsName = UA_STRING("PDS 1");
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    UA_String wgName = UA_STRING("WriterGroup 1");
-    addWriterGroup(connection1, wgName, 10, &writerGroup1);
-    UA_QualifiedName browseName;
-    ck_assert_int_eq(UA_Server_readBrowseName(server, writerGroup1, &browseName), UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &wgName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddRemoveAddSingleWriterGroupAndCheckInformationModelRepresentation){
-    UA_String connectionName = UA_STRING("Connection 1");
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    UA_String pdsName = UA_STRING("PDS 1");
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    UA_String wgName = UA_STRING("WriterGroup 1");
-    addWriterGroup(connection1, wgName, 10, &writerGroup1);
-    UA_QualifiedName browseName;
-    UA_StatusCode retVal;
-    ck_assert_int_eq(UA_Server_removeWriterGroup(server, writerGroup1), UA_STATUSCODE_GOOD);
-    retVal = UA_Server_readBrowseName(server, writerGroup1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    addWriterGroup(connection1, wgName, 10, &writerGroup1);
-    retVal = UA_Server_readBrowseName(server, writerGroup1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &wgName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddSingleDataSetWriterAndCheckInformationModelRepresentation){
-    UA_String connectionName = UA_STRING("Connection 1");
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    UA_String pdsName = UA_STRING("PDS 1");
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    UA_String wgName = UA_STRING("WriterGroup 1");
-    addWriterGroup(connection1, wgName, 10, &writerGroup1);
-    UA_String dswName = UA_STRING("DataSetWriter 1");
-    addDataSetWriter(writerGroup1, publishedDataSet1, dswName, &dataSetWriter1);
-    UA_QualifiedName browseName;
-    ck_assert_int_eq(UA_Server_readBrowseName(server, dataSetWriter1, &browseName), UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &dswName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(AddRemoveAddSingleDataSetWriterAndCheckInformationModelRepresentation){
-    UA_String connectionName = UA_STRING("Connection 1");
-    addPubSubConnection(connectionName, UA_STRING("opc.udp://224.0.0.22:4840/"), &connection1);
-    UA_String pdsName = UA_STRING("PDS 1");
-    addPublishedDataSet(pdsName, &publishedDataSet1);
-    UA_String wgName = UA_STRING("WriterGroup 1");
-    addWriterGroup(connection1, wgName, 10, &writerGroup1);
-    UA_String dswName = UA_STRING("DataSetWriter 1");
-    addDataSetWriter(writerGroup1, publishedDataSet1, dswName, &dataSetWriter1);
-    UA_QualifiedName browseName;
-    UA_StatusCode retVal;
-    ck_assert_int_eq(UA_Server_removeDataSetWriter(server, dataSetWriter1), UA_STATUSCODE_GOOD);
-    retVal = UA_Server_readBrowseName(server, dataSetWriter1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_BADNODEIDUNKNOWN);
-    addDataSetWriter(writerGroup1, publishedDataSet1, dswName, &dataSetWriter1);
-    retVal = UA_Server_readBrowseName(server, dataSetWriter1, &browseName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(UA_String_equal(&browseName.name, &dswName), UA_TRUE);
-    UA_QualifiedName_deleteMembers(&browseName);
-    } END_TEST
-
-START_TEST(ReadPublishIntervalAndCompareWithInternalValue){
-    setupBasicPubSubConfiguration();
-    UA_NodeId publishIntervalId = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"),
-                                                      UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), writerGroup1);
-    UA_Variant value;
-    UA_Variant_init(&value);
-    ck_assert_int_eq(UA_Server_readValue(server, publishIntervalId, &value), UA_STATUSCODE_GOOD);
-    ck_assert(UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DURATION]));
-    ck_assert(doubleEqual((UA_Double) *((UA_Duration *) value.data), 10, 0.05));
-    UA_Variant_deleteMembers(&value);
-    } END_TEST
-
-START_TEST(WritePublishIntervalAndCompareWithInternalValue){
-        setupBasicPubSubConfiguration();
-        UA_NodeId publishIntervalId = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"),
-                                                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), writerGroup1);
-        UA_Variant value;
-        UA_Variant_init(&value);
-        UA_Duration interval = 100;
-        UA_Variant_setScalar(&value, &interval, &UA_TYPES[UA_TYPES_DURATION]);
-        ck_assert_int_eq(UA_Server_writeValue(server, publishIntervalId, value), UA_STATUSCODE_GOOD);
-
-        ck_assert_int_eq(UA_Server_readValue(server, publishIntervalId, &value), UA_STATUSCODE_GOOD);
-        ck_assert(UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DURATION]));
-        ck_assert(doubleEqual((UA_Double) *((UA_Duration *) value.data), 100, 0.05));
-        UA_Variant_deleteMembers(&value);
-    } END_TEST
-
-START_TEST(ReadAddressAndCompareWithInternalValue){
-        setupBasicPubSubConfiguration();
-        UA_NodeId address = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Address"),
-                                                          UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), connection1);
-        UA_NodeId url = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Url"),
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), address);
-        UA_NodeId networkInterface = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkInterface"),
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), address);
-        UA_PubSubConnectionConfig connectionConfig;
-        memset(&connectionConfig, 0, sizeof(connectionConfig));
-        UA_Server_getPubSubConnectionConfig(server, connection1, &connectionConfig);
-        UA_Variant value;
-        UA_Variant_init(&value);
-        ck_assert_int_eq(UA_Server_readValue(server, url, &value), UA_STATUSCODE_GOOD);
-        UA_NetworkAddressUrlDataType *networkAddressUrlDataType = (UA_NetworkAddressUrlDataType *)connectionConfig.address.data;
-        ck_assert(UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_STRING]));
-        ck_assert(UA_String_equal(((UA_String *) value.data), &networkAddressUrlDataType->url));
-        UA_Variant_deleteMembers(&value);
-        ck_assert_int_eq(UA_Server_readValue(server, networkInterface, &value), UA_STATUSCODE_GOOD);
-        ck_assert(UA_String_equal(((UA_String *) value.data), &networkAddressUrlDataType->networkInterface));
-        UA_PubSubConnectionConfig_deleteMembers(&connectionConfig);
-        UA_Variant_deleteMembers(&value);
-    } END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_informationmodel = tcase_create("PubSub add single elements and check information model representation");
-    tcase_add_checked_fixture(tc_add_pubsub_informationmodel, setup, teardown);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddSignlePubSubConnectionAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddRemoveAddSignlePubSubConnectionAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddSinglePublishedDataSetAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddRemoveAddSinglePublishedDataSetAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddSingleWriterGroupAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddRemoveAddSingleWriterGroupAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddSingleDataSetWriterAndCheckInformationModelRepresentation);
-    tcase_add_test(tc_add_pubsub_informationmodel, AddRemoveAddSingleDataSetWriterAndCheckInformationModelRepresentation);
-
-    TCase *tc_add_pubsub_writergroupelements = tcase_create("PubSub WriterGroup check properties");
-    tcase_add_checked_fixture(tc_add_pubsub_writergroupelements, setup, teardown);
-    tcase_add_test(tc_add_pubsub_writergroupelements, ReadPublishIntervalAndCompareWithInternalValue);
-    tcase_add_test(tc_add_pubsub_writergroupelements, WritePublishIntervalAndCompareWithInternalValue);
-
-    TCase *tc_add_pubsub_pubsubconnectionelements = tcase_create("PubSub Connection check properties");
-    tcase_add_checked_fixture(tc_add_pubsub_pubsubconnectionelements, setup, teardown);
-    tcase_add_test(tc_add_pubsub_pubsubconnectionelements, ReadAddressAndCompareWithInternalValue);
-
-    Suite *s = suite_create("PubSub WriterGroups/Writer/Fields handling and publishing");
-    suite_add_tcase(s, tc_add_pubsub_informationmodel);
-    suite_add_tcase(s, tc_add_pubsub_writergroupelements);
-    suite_add_tcase(s, tc_add_pubsub_pubsubconnectionelements);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_informationmodel_methods.c b/ext/open62541/tests/pubsub/check_pubsub_informationmodel_methods.c
deleted file mode 100644
index 9c27eee..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_informationmodel_methods.c
+++ /dev/null
@@ -1,382 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <string.h>
-#include <math.h>
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-#include <open62541/types_generated_encoding_binary.h>
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include "check.h"
-#include "thread_wrapper.h"
-
-UA_Server *server = NULL;
-UA_Boolean running;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-        while (running)
-        UA_Server_run_iterate(server, true);
-        return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static UA_NodeId
-findSingleChildNode(UA_QualifiedName targetName,
-                    UA_NodeId referenceTypeId, UA_NodeId startingNode){
-    UA_NodeId resultNodeId;
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = referenceTypeId;
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = targetName;
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = startingNode;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-    UA_BrowsePathResult bpr =
-            UA_Server_translateBrowsePathToNodeIds(server, &bp);
-    if(bpr.statusCode != UA_STATUSCODE_GOOD ||
-       bpr.targetsSize < 1)
-        return UA_NODEID_NULL;
-    if(UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, &resultNodeId) != UA_STATUSCODE_GOOD){
-        UA_BrowsePathResult_deleteMembers(&bpr);
-        return UA_NODEID_NULL;
-    }
-    UA_BrowsePathResult_deleteMembers(&bpr);
-    return resultNodeId;
-}
-
-static UA_NodeId addPubSubConnection(void){
-    UA_Variant publisherId;
-    UA_Variant_init(&publisherId);
-    UA_UInt32 publisherIdValue = 13245;
-    UA_Variant_setScalar(&publisherId, &publisherIdValue , &UA_TYPES[UA_TYPES_UINT32]);
-
-    UA_PubSubConnectionDataType pubSubConnection;
-    UA_PubSubConnectionDataType_init(&pubSubConnection);
-    pubSubConnection.name = UA_STRING("Model Connection 1");
-    pubSubConnection.enabled = UA_TRUE;
-    pubSubConnection.publisherId = publisherId;
-    pubSubConnection.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-
-
-    UA_ExtensionObject eo;
-    UA_NetworkAddressUrlDataType networkAddressDataType = {UA_STRING("eth0"), UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_NetworkAddressUrlDataType* identityToken = UA_NetworkAddressUrlDataType_new();
-    UA_NetworkAddressUrlDataType_init(identityToken);
-    UA_NetworkAddressUrlDataType_copy(&networkAddressDataType, identityToken);
-    eo.encoding = UA_EXTENSIONOBJECT_DECODED;
-    eo.content.decoded.type = &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE];
-    eo.content.decoded.data = identityToken;
-    pubSubConnection.address = eo;
-    pubSubConnection.connectionPropertiesSize = 2;
-    UA_KeyValuePair connectionOptions[2];
-    memset(connectionOptions, 0, sizeof(UA_KeyValuePair)* 2);
-    connectionOptions[0].key = UA_QUALIFIEDNAME(0, "ttl");
-    UA_UInt32 ttl = 10;
-    UA_Variant_setScalar(&connectionOptions[0].value, &ttl, &UA_TYPES[UA_TYPES_UINT32]);
-    connectionOptions[1].key = UA_QUALIFIEDNAME(0, "loopback");
-    UA_Boolean loopback = UA_FALSE;
-    UA_Variant_setScalar(&connectionOptions[1].value, &loopback, &UA_TYPES[UA_TYPES_UINT32]);
-    pubSubConnection.connectionProperties = connectionOptions;
-
-    UA_Variant inputArguments;
-    UA_Variant_init(&inputArguments);
-    UA_Variant_setScalar(&inputArguments, &pubSubConnection, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]);
-
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.inputArgumentsSize = 1;
-    callMethodRequest.inputArguments = &inputArguments;
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE);
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION);
-
-    UA_NodeId connectionId = UA_NODEID_NULL;
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(1, result.outputArgumentsSize);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_GOOD);
-    if(result.outputArguments->type == &UA_TYPES[UA_TYPES_NODEID])
-        connectionId =  *((UA_NodeId *) result.outputArguments->data);
-    UA_ExtensionObject_deleteMembers(&eo);
-    callMethodRequest.inputArguments = NULL;
-    callMethodRequest.inputArgumentsSize = 0;
-    UA_CallMethodRequest_deleteMembers(&callMethodRequest);
-    UA_CallMethodResult_deleteMembers(&result);
-    return connectionId;
-}
-
-START_TEST(AddNewPubSubConnectionUsingTheInformationModelMethod){
-    UA_StatusCode retVal;
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    retVal = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if(retVal != UA_STATUSCODE_GOOD) {
-        UA_Client_delete(client);
-    }
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-    UA_NodeId createdConnection = addPubSubConnection();
-    UA_LocalizedText connectionDisplayName;
-    UA_LocalizedText_init(&connectionDisplayName);
-    retVal = UA_Server_readDisplayName(server, createdConnection, &connectionDisplayName);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    UA_String compareText = UA_STRING("Model Connection 1");
-    ck_assert(UA_String_equal(&connectionDisplayName.text, &compareText) == UA_TRUE);
-    //todo browse and check childs
-
-    UA_Variant serverPubSubConnectionValues;
-    UA_Variant_init(&serverPubSubConnectionValues);
-    UA_NodeId connectionPublisherId = findSingleChildNode(UA_QUALIFIEDNAME(0, "PublisherId"),
-                                                      UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                                      createdConnection);
-    ck_assert_int_eq(UA_Server_readValue(server, connectionPublisherId, &serverPubSubConnectionValues),
-                     UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(*((UA_UInt32 *) serverPubSubConnectionValues.data), 13245);
-    UA_Variant_deleteMembers(&serverPubSubConnectionValues);
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    UA_LocalizedText_deleteMembers(&connectionDisplayName);
-    } END_TEST
-
-START_TEST(AddAndRemovePublishedDataSetFolders){
-        UA_StatusCode retVal;
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        retVal = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        if(retVal != UA_STATUSCODE_GOOD) {
-            UA_Client_delete(client);
-        }
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        UA_String folderName = UA_STRING("TestFolder");
-        UA_Variant inputArguments;
-        UA_Variant_init(&inputArguments);
-        UA_Variant_setScalar(&inputArguments, &folderName, &UA_TYPES[UA_TYPES_STRING]);
-
-        UA_CallMethodRequest callMethodRequest;
-        UA_CallMethodRequest_init(&callMethodRequest);
-        callMethodRequest.inputArgumentsSize = 1;
-        callMethodRequest.inputArguments = &inputArguments;
-        callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS);
-        callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER);
-
-        UA_CallMethodResult result;
-        UA_CallMethodResult_init(&result);
-        result = UA_Server_call(server, &callMethodRequest);
-        ck_assert_int_eq(1, result.outputArgumentsSize);
-        ck_assert_int_eq(result.statusCode, UA_STATUSCODE_GOOD);
-
-        UA_NodeId createdFolder = UA_NODEID_NULL;
-        if(result.outputArguments->type == &UA_TYPES[UA_TYPES_NODEID])
-            createdFolder = *((UA_NodeId *) result.outputArguments->data);
-        UA_LocalizedText connectionDisplayName;
-        UA_LocalizedText_init(&connectionDisplayName);
-        retVal = UA_Server_readDisplayName(server, createdFolder, &connectionDisplayName);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_String compareText = UA_STRING("TestFolder");
-        ck_assert(UA_String_equal(&connectionDisplayName.text, &compareText) == UA_TRUE);
-        retVal = UA_Server_readNodeId(server, createdFolder, &createdFolder);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_CallMethodResult_deleteMembers(&result);
-        UA_LocalizedText_deleteMembers(&connectionDisplayName);
-
-        //create folder inside the new folder
-        folderName = UA_STRING("TestFolder2");
-        UA_Variant_init(&inputArguments);
-        UA_Variant_setScalar(&inputArguments, &folderName, &UA_TYPES[UA_TYPES_STRING]);
-        UA_CallMethodRequest_init(&callMethodRequest);
-        callMethodRequest.inputArgumentsSize = 1;
-        callMethodRequest.inputArguments = &inputArguments;
-        callMethodRequest.objectId = createdFolder;
-        callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER);
-        UA_CallMethodResult_init(&result);
-        result = UA_Server_call(server, &callMethodRequest);
-        ck_assert_int_eq(1, result.outputArgumentsSize);
-        ck_assert_int_eq(result.statusCode, UA_STATUSCODE_GOOD);
-        UA_NodeId createdFolder2 = UA_NODEID_NULL;
-        if(result.outputArguments->type == &UA_TYPES[UA_TYPES_NODEID])
-            createdFolder2 = *((UA_NodeId *) result.outputArguments->data);
-        UA_LocalizedText_init(&connectionDisplayName);
-        retVal = UA_Server_readDisplayName(server, createdFolder2, &connectionDisplayName);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        compareText = UA_STRING("TestFolder2");
-        ck_assert(UA_String_equal(&connectionDisplayName.text, &compareText) == UA_TRUE);
-        retVal = UA_Server_readNodeId(server, createdFolder2, &createdFolder2);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_CallMethodResult_deleteMembers(&result);
-
-        //delete the folder
-        UA_Variant_init(&inputArguments);
-        UA_Variant_setScalar(&inputArguments, &createdFolder, &UA_TYPES[UA_TYPES_NODEID]);
-        UA_CallMethodRequest_init(&callMethodRequest);
-        callMethodRequest.inputArgumentsSize = 1;
-        callMethodRequest.inputArguments = &inputArguments;
-        callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS);
-        callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER);
-
-        result = UA_Server_call(server, &callMethodRequest);
-        ck_assert_int_eq(0, result.outputArgumentsSize);
-        ck_assert_int_eq(result.statusCode, UA_STATUSCODE_GOOD);
-        //check if the node is deleted
-        retVal = UA_Server_readNodeId(server, createdFolder, NULL);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_BADNODEIDUNKNOWN);
-
-        UA_CallMethodResult_deleteMembers(&result);
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-        UA_LocalizedText_deleteMembers(&connectionDisplayName);
-    } END_TEST
-
-START_TEST(AddAndRemovePublishedDataSetItems){
-        UA_StatusCode retVal;
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        retVal = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        if(retVal != UA_STATUSCODE_GOOD) {
-            UA_Client_delete(client);
-        }
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        UA_Variant *inputArguments = (UA_Variant *) UA_calloc(4, (sizeof(UA_Variant)));
-
-        UA_String pdsName = UA_STRING("Test PDS");
-        UA_Variant_setScalar(&inputArguments[0], &pdsName, &UA_TYPES[UA_TYPES_STRING]);
-
-        UA_String *fieldNameAliases = (UA_String *) UA_calloc(2, sizeof(UA_String));
-        fieldNameAliases[0] = UA_STRING("field1");
-        fieldNameAliases[1] = UA_STRING("field2");
-        UA_Variant_setArray(&inputArguments[1], fieldNameAliases, 2, &UA_TYPES[UA_TYPES_STRING]);
-
-        UA_DataSetFieldFlags *dataSetFieldFlags = (UA_DataSetFieldFlags *) UA_calloc(2, sizeof(UA_DataSetFieldFlags));
-        dataSetFieldFlags[0] = UA_DATASETFIELDFLAGS_PROMOTEDFIELD;
-        dataSetFieldFlags[1] = UA_DATASETFIELDFLAGS_PROMOTEDFIELD;
-        UA_Variant_setArray(&inputArguments[2], dataSetFieldFlags, 2, &UA_TYPES[UA_TYPES_DATASETFIELDFLAGS]);
-
-        UA_PublishedVariableDataType *variablesToAdd = (UA_PublishedVariableDataType *) UA_calloc(2, sizeof(UA_PublishedVariableDataType));
-        variablesToAdd[0].publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
-        variablesToAdd[0].attributeId = UA_ATTRIBUTEID_VALUE;
-        variablesToAdd[1].publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_CURRENTSERVERID);
-        variablesToAdd[1].attributeId = UA_ATTRIBUTEID_VALUE;
-        UA_Variant_setArray(&inputArguments[3], variablesToAdd, 2, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]);
-
-        UA_CallMethodRequest callMethodRequest;
-        UA_CallMethodRequest_init(&callMethodRequest);
-        callMethodRequest.inputArgumentsSize = 4;
-        callMethodRequest.inputArguments = inputArguments;
-        callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS);
-        callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS);
-
-        UA_CallMethodResult result;
-        UA_CallMethodResult_init(&result);
-        result = UA_Server_call(server, &callMethodRequest);
-        ck_assert_int_eq(3, result.outputArgumentsSize);
-        ck_assert_int_eq(result.statusCode, UA_STATUSCODE_GOOD);
-
-        //TODO checked correctness of created items
-        UA_CallMethodResult_deleteMembers(&result);
-        UA_free(inputArguments);
-        UA_free(fieldNameAliases);
-        UA_free(dataSetFieldFlags);
-        UA_free(variablesToAdd);
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-} END_TEST
-
-START_TEST(AddAndRemoveWriterGroups){
-        UA_StatusCode retVal;
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        retVal = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        if(retVal != UA_STATUSCODE_GOOD) {
-            UA_Client_delete(client);
-        }
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_NodeId createdConnection = addPubSubConnection();
-
-        UA_Variant *inputArgument = (UA_Variant *) UA_calloc(1, (sizeof(UA_Variant)));
-        UA_WriterGroupDataType writerGroupDataType;
-        UA_WriterGroupDataType_init(&writerGroupDataType);
-        writerGroupDataType.name = UA_STRING("TestWriterGroup");
-        writerGroupDataType.enabled = UA_TRUE;
-        writerGroupDataType.publishingInterval = 500;
-        writerGroupDataType.writerGroupId = 1234;
-        UA_Variant_setScalar(inputArgument, &writerGroupDataType, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]);
-
-        UA_CallMethodRequest callMethodRequest;
-        UA_CallMethodRequest_init(&callMethodRequest);
-        callMethodRequest.inputArgumentsSize = 1;
-        callMethodRequest.inputArguments = inputArgument;
-        callMethodRequest.objectId = createdConnection;
-        callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP);
-
-        UA_CallMethodResult result;
-        UA_CallMethodResult_init(&result);
-        result = UA_Server_call(server, &callMethodRequest);
-        ck_assert_int_eq(result.statusCode, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(1, result.outputArgumentsSize);
-
-        UA_NodeId createdWriterGroup = UA_NODEID_NULL;
-        if(result.outputArguments->type == &UA_TYPES[UA_TYPES_NODEID])
-            createdWriterGroup = *((UA_NodeId *) result.outputArguments->data);
-        UA_LocalizedText writerGroupDisplayName;
-        UA_LocalizedText_init(&writerGroupDisplayName);
-        retVal = UA_Server_readDisplayName(server, createdWriterGroup, &writerGroupDisplayName);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_String compareText = UA_STRING("TestWriterGroup");
-        ck_assert(UA_String_equal(&writerGroupDisplayName.text, &compareText) == UA_TRUE);
-        UA_free(inputArgument);
-        UA_CallMethodResult_deleteMembers(&result);
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-        UA_LocalizedText_deleteMembers(&writerGroupDisplayName);
-} END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_informationmodel_methods_connection = tcase_create("PubSub connection delete and creation using the information model methods");
-    tcase_add_checked_fixture(tc_add_pubsub_informationmodel_methods_connection, setup, teardown);
-    tcase_add_test(tc_add_pubsub_informationmodel_methods_connection, AddNewPubSubConnectionUsingTheInformationModelMethod);
-    tcase_add_test(tc_add_pubsub_informationmodel_methods_connection, AddAndRemovePublishedDataSetFolders);
-    tcase_add_test(tc_add_pubsub_informationmodel_methods_connection, AddAndRemovePublishedDataSetItems);
-    tcase_add_test(tc_add_pubsub_informationmodel_methods_connection, AddAndRemoveWriterGroups);
-    //TODO TestCase add publishedDataItems and removePublishedDataItems, writergroup remove
-
-    Suite *s = suite_create("PubSub CRUD configuration by the information model functions");
-    suite_add_tcase(s, tc_add_pubsub_informationmodel_methods_connection);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_multiple_layer.c b/ext/open62541/tests/pubsub/check_pubsub_multiple_layer.c
deleted file mode 100644
index 7cf1c9e..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_multiple_layer.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-
-#include "open62541/types_generated_encoding_binary.h"
-
-#include "ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-UA_NodeId connection1, connection2;
-
-static void setup(void) {
-}
-
-static void teardown(void) {
-}
-
-START_TEST(AddMultipleTransportLayers){
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    UA_PubSubTransportLayer pubsubTransportLayer;
-
-    ck_assert_int_eq(config->pubsubTransportLayersSize, 0);
-
-    pubsubTransportLayer = UA_PubSubTransportLayerUDPMP();
-    UA_ServerConfig_addPubSubTransportLayer(config, &pubsubTransportLayer);
-    ck_assert_int_eq(config->pubsubTransportLayersSize, 1);
-
-    pubsubTransportLayer = UA_PubSubTransportLayerUDPMP();
-    UA_ServerConfig_addPubSubTransportLayer(config, &pubsubTransportLayer);
-    ck_assert_int_eq(config->pubsubTransportLayersSize, 2);
-
-    pubsubTransportLayer = UA_PubSubTransportLayerUDPMP();
-    UA_ServerConfig_addPubSubTransportLayer(config, &pubsubTransportLayer);
-    ck_assert_int_eq(config->pubsubTransportLayersSize, 3);
-
-    UA_Server_delete(server);
-} END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_writergroup = tcase_create("PubSub Layer allocation");
-    tcase_add_checked_fixture(tc_add_pubsub_writergroup, setup, teardown);
-    tcase_add_test(tc_add_pubsub_writergroup, AddMultipleTransportLayers);
-
-    Suite *s = suite_create("PubSub Multiple layer handling");
-    suite_add_tcase(s, tc_add_pubsub_writergroup);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_pds.c b/ext/open62541/tests/pubsub/check_pubsub_pds.c
deleted file mode 100644
index 3fd1e8f..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_pds.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-
-#include "open62541/types_generated_encoding_binary.h"
-
-#include "ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer*)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(AddPDSWithMinimalValidConfiguration){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    pdsConfig.name = UA_STRING("TEST PDS 1");
-    retVal |= UA_Server_addPublishedDataSet(server, &pdsConfig, NULL).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 1);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    UA_NodeId newPDSNodeID;
-    retVal |= UA_Server_addPublishedDataSet(server, &pdsConfig, &newPDSNodeID).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 2);
-    ck_assert_int_eq(newPDSNodeID.identifierType, UA_NODEIDTYPE_NUMERIC);
-    ck_assert_int_ne(newPDSNodeID.identifier.numeric, 0);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(AddRemoveAddPDSWithMinimalValidConfiguration){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    pdsConfig.name = UA_STRING("TEST PDS 1");
-    UA_NodeId newPDSNodeID;
-    retVal |= UA_Server_addPublishedDataSet(server, &pdsConfig, &newPDSNodeID).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 1);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    retVal |= UA_Server_removePublishedDataSet(server, newPDSNodeID);
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 0);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    retVal |= UA_Server_addPublishedDataSet(server, &pdsConfig, &newPDSNodeID).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 1);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(AddPDSWithNullConfig){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    retVal |= UA_Server_addPublishedDataSet(server, NULL, NULL).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 0);
-    ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(AddPDSWithUnsupportedType){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.name = UA_STRING("TEST PDS 1");
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE;
-    retVal |= UA_Server_addPublishedDataSet(server, &pdsConfig, NULL).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 0);
-    ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDEVENTS;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 0);
-    ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDEVENTS_TEMPLATE;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 0);
-    ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(GetPDSConfigurationAndCompareValues){
-    UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    pdsConfig.name = UA_STRING("TEST PDS 1");
-    UA_NodeId pdsIdentifier;
-    retVal |= UA_Server_addPublishedDataSet(server, &pdsConfig, &pdsIdentifier).addResult;
-    ck_assert_int_eq(server->pubSubManager.publishedDataSetsSize, 1);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    UA_PublishedDataSetConfig pdsConfigCopy;
-    memset(&pdsConfigCopy, 0, sizeof(UA_PublishedDataSetConfig));
-        UA_Server_getPublishedDataSetConfig(server, pdsIdentifier, &pdsConfigCopy);
-    ck_assert_int_eq(UA_String_equal(&pdsConfig.name, &pdsConfigCopy.name), UA_TRUE);
-    UA_PublishedDataSetConfig_deleteMembers(&pdsConfigCopy);
-} END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_pds_minimal_config = tcase_create("Create PubSub PublishedDataItem with minimal valid config");
-    tcase_add_checked_fixture(tc_add_pubsub_pds_minimal_config, setup, teardown);
-    tcase_add_test(tc_add_pubsub_pds_minimal_config, AddPDSWithMinimalValidConfiguration);
-    tcase_add_test(tc_add_pubsub_pds_minimal_config, AddRemoveAddPDSWithMinimalValidConfiguration);
-
-    TCase *tc_add_pubsub_pds_invalid_config = tcase_create("Create PubSub PublishedDataItem with minimal invalid config");
-    tcase_add_checked_fixture(tc_add_pubsub_pds_invalid_config, setup, teardown);
-    tcase_add_test(tc_add_pubsub_pds_invalid_config, AddPDSWithNullConfig);
-    tcase_add_test(tc_add_pubsub_pds_invalid_config, AddPDSWithUnsupportedType);
-
-    TCase *tc_add_pubsub_pds_handling_utils = tcase_create("PubSub PublishedDataSet handling");
-    tcase_add_checked_fixture(tc_add_pubsub_pds_handling_utils, setup, teardown);
-    tcase_add_test(tc_add_pubsub_pds_handling_utils, GetPDSConfigurationAndCompareValues);
-    //tcase_add_test(tc_add_pubsub_connections_maximal_config, GetMaximalConnectionConfigurationAndCompareValues);
-
-    Suite *s = suite_create("PubSub PublishedDataSets handling");
-    suite_add_tcase(s, tc_add_pubsub_pds_minimal_config);
-    suite_add_tcase(s, tc_add_pubsub_pds_invalid_config);
-    suite_add_tcase(s, tc_add_pubsub_pds_handling_utils);
-
-
-    //suite_add_tcase(s, tc_add_pubsub_connections_maximal_config);
-    //suite_add_tcase(s, tc_decode);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_publish.c b/ext/open62541/tests/pubsub/check_pubsub_publish.c
deleted file mode 100644
index 551a213..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_publish.c
+++ /dev/null
@@ -1,458 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-
-#include "open62541/types_generated_encoding_binary.h"
-
-#include "ua_pubsub.h"
-#include "ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-UA_NodeId connection1, connection2, writerGroup1, writerGroup2, writerGroup3,
-        publishedDataSet1, publishedDataSet2, dataSetWriter1, dataSetWriter2, dataSetWriter3;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer*)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    UA_Server_run_startup(server);
-    //add 2 connections
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connection1);
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connection2);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(AddWriterGroupWithValidConfiguration){
-        UA_StatusCode retVal;
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name = UA_STRING("WriterGroup 1");
-        writerGroupConfig.publishingInterval = 10;
-        UA_NodeId localWriterGroup;
-        retVal = UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &localWriterGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        size_t writerGroupCount = 0;
-        UA_WriterGroup *writerGroup;
-        LIST_FOREACH(writerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection1)->writerGroups, listEntry){
-            writerGroupCount++;
-        }
-        ck_assert_int_eq(writerGroupCount, 1);
-    } END_TEST
-
-START_TEST(AddRemoveAddWriterGroupWithMinimalValidConfiguration){
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name = UA_STRING("WriterGroup 1");
-        writerGroupConfig.publishingInterval = 10;
-        UA_NodeId localWriterGroup;
-        retVal |= UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &localWriterGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_removeWriterGroup(server, localWriterGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        size_t writerGroupCount = 0;
-        UA_WriterGroup *writerGroup;
-        LIST_FOREACH(writerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection1)->writerGroups, listEntry){
-            writerGroupCount++;
-        }
-        ck_assert_int_eq(writerGroupCount, 0);
-        retVal |= UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &localWriterGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        writerGroupCount = 0;
-        LIST_FOREACH(writerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection1)->writerGroups, listEntry){
-            writerGroupCount++;
-        }
-        ck_assert_int_eq(writerGroupCount, 1);
-        retVal |= UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &localWriterGroup);
-        writerGroupCount = 0;
-        LIST_FOREACH(writerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection1)->writerGroups, listEntry){
-            writerGroupCount++;
-        }
-        ck_assert_int_eq(writerGroupCount, 2);
-    } END_TEST
-
-START_TEST(AddWriterGroupWithNullConfig){
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        retVal |= UA_Server_addWriterGroup(server, connection1, NULL, NULL);
-        size_t writerGroupCount = 0;
-        UA_WriterGroup *writerGroup;
-        LIST_FOREACH(writerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection1)->writerGroups, listEntry){
-            writerGroupCount++;
-        }
-        ck_assert_int_eq(writerGroupCount, 0);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddWriterGroupWithInvalidConnectionId){
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name = UA_STRING("WriterGroup 1");
-        writerGroupConfig.publishingInterval = 10;
-        retVal |= UA_Server_addWriterGroup(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &writerGroupConfig, NULL);
-        size_t writerGroupCount = 0;
-        UA_WriterGroup *writerGroup;
-        LIST_FOREACH(writerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection1)->writerGroups, listEntry){
-            writerGroupCount++;
-        }
-        ck_assert_int_eq(writerGroupCount, 0);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(GetWriterGroupConfigurationAndCompareValues){
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name = UA_STRING("WriterGroup 1");
-        writerGroupConfig.publishingInterval = 10;
-        UA_NodeId localWriterGroup;
-        retVal |= UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &localWriterGroup);
-        UA_WriterGroupConfig writerGroupConfigCopy;
-        retVal |= UA_Server_getWriterGroupConfig(server, localWriterGroup, &writerGroupConfigCopy);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(UA_String_equal(&writerGroupConfig.name, &writerGroupConfigCopy.name), UA_TRUE);
-        //todo remove == for floating point compare
-        ck_assert(writerGroupConfig.publishingInterval == writerGroupConfig.publishingInterval);
-        UA_WriterGroupConfig_deleteMembers(&writerGroupConfigCopy);
-    } END_TEST
-
-static void setupDataSetWriterTestEnvironment(void){
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-    writerGroupConfig.name = UA_STRING("WriterGroup 1");
-    writerGroupConfig.publishingInterval = 10;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &writerGroup1);
-    writerGroupConfig.name = UA_STRING("WriterGroup 2");
-    writerGroupConfig.publishingInterval = 50;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    UA_Server_addWriterGroup(server, connection2, &writerGroupConfig, &writerGroup2);
-    writerGroupConfig.name = UA_STRING("WriterGroup 3");
-    writerGroupConfig.publishingInterval = 100;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    UA_Server_addWriterGroup(server, connection2, &writerGroupConfig, &writerGroup3);
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    pdsConfig.name = UA_STRING("PublishedDataSet 1");
-    UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSet1);
-    UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSet2);
-}
-
-START_TEST(AddDataSetWriterWithValidConfiguration){
-        setupDataSetWriterTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter 1 ");
-        UA_NodeId localDataSetWriter;
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &localDataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_DataSetWriter *dsw1 = UA_DataSetWriter_findDSWbyId(server, localDataSetWriter);
-        ck_assert_ptr_ne(dsw1, NULL);
-        UA_WriterGroup *wg1 = UA_WriterGroup_findWGbyId(server, writerGroup1);
-        ck_assert_ptr_ne(wg1, NULL);
-        ck_assert_int_eq(wg1->writersCount, 1);
-    } END_TEST
-
-START_TEST(AddRemoveAddDataSetWriterWithValidConfiguration){
-        setupDataSetWriterTestEnvironment();
-        UA_StatusCode retVal;
-        UA_WriterGroup *wg1 = UA_WriterGroup_findWGbyId(server, writerGroup1);
-        ck_assert_ptr_ne(wg1, NULL);
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter 1 ");
-        UA_NodeId dataSetWriter;
-        ck_assert_int_eq(wg1->writersCount, 0);
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(wg1->writersCount, 1);
-        retVal = UA_Server_removeDataSetWriter(server, dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(wg1->writersCount, 0);
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(wg1->writersCount, 1);
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(wg1->writersCount, 2);
-
-        UA_WriterGroup *wg2 = UA_WriterGroup_findWGbyId(server, writerGroup2);
-        ck_assert_ptr_ne(wg2, NULL);
-        retVal = UA_Server_addDataSetWriter(server, writerGroup2, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(wg2->writersCount, 1);
-    } END_TEST
-
-START_TEST(AddDataSetWriterWithNullConfig){
-        setupDataSetWriterTestEnvironment();
-        UA_StatusCode retVal;
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, NULL, NULL);
-        UA_WriterGroup *wg1 = UA_WriterGroup_findWGbyId(server, writerGroup1);
-        ck_assert_ptr_ne(wg1, NULL);
-        ck_assert_int_eq(wg1->writersCount, 0);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddDataSetWriterWithInvalidPDSId){
-        setupDataSetWriterTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter 1 ");
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &dataSetWriterConfig, NULL);
-        UA_WriterGroup *wg1 = UA_WriterGroup_findWGbyId(server, writerGroup1);
-        ck_assert_ptr_ne(wg1, NULL);
-        ck_assert_int_eq(wg1->writersCount, 0);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(GetDataSetWriterConfigurationAndCompareValues){
-        setupDataSetWriterTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter 1 ");
-        UA_NodeId localDataSetWriter;
-        retVal = UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &localDataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_DataSetWriterConfig dataSetWiterConfigCopy;
-        retVal |= UA_Server_getDataSetWriterConfig(server, localDataSetWriter, &dataSetWiterConfigCopy);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(UA_String_equal(&dataSetWiterConfigCopy.name, &dataSetWiterConfigCopy.name), UA_TRUE);
-        UA_DataSetWriterConfig_deleteMembers(&dataSetWiterConfigCopy);
-    } END_TEST
-
-static void setupDataSetFieldTestEnvironment(void){
-    setupDataSetWriterTestEnvironment();
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-    dataSetWriterConfig.name = UA_STRING("DataSetWriter 1");
-    UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter1);
-    dataSetWriterConfig.name = UA_STRING("DataSetWriter 2");
-    UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter2);
-    dataSetWriterConfig.name = UA_STRING("DataSetWriter 3");
-    UA_Server_addDataSetWriter(server, writerGroup2, publishedDataSet2, &dataSetWriterConfig, &dataSetWriter3);
-}
-
-START_TEST(AddDataSetFieldWithValidConfiguration){
-        setupDataSetFieldTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetFieldConfig fieldConfig;
-        memset(&fieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        fieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        fieldConfig.field.variable.fieldNameAlias = UA_STRING("field 1");
-        UA_NodeId localDataSetField;
-        UA_PublishedDataSet *pds = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet1);
-        ck_assert_ptr_ne(pds, NULL);
-        ck_assert_int_eq(pds->fieldSize, 0);
-        retVal = UA_Server_addDataSetField(server, publishedDataSet1, &fieldConfig, &localDataSetField).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(pds->fieldSize, 1);
-    } END_TEST
-
-START_TEST(AddRemoveAddDataSetFieldWithValidConfiguration){
-        setupDataSetFieldTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetFieldConfig fieldConfig;
-        memset(&fieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        fieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        fieldConfig.field.variable.fieldNameAlias = UA_STRING("field 1");
-        UA_NodeId localDataSetField;
-        UA_PublishedDataSet *pds1 = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet1);
-        ck_assert_ptr_ne(pds1, NULL);
-        ck_assert_int_eq(pds1->fieldSize, 0);
-        retVal = UA_Server_addDataSetField(server, publishedDataSet1, &fieldConfig, &localDataSetField).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(pds1->fieldSize, 1);
-        retVal = UA_Server_removeDataSetField(server, localDataSetField).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(pds1->fieldSize, 0);
-        retVal = UA_Server_addDataSetField(server, publishedDataSet1, &fieldConfig, &localDataSetField).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(pds1->fieldSize, 1);
-        retVal = UA_Server_addDataSetField(server, publishedDataSet1, &fieldConfig, &localDataSetField).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(pds1->fieldSize, 2);
-        UA_PublishedDataSet *pds2 = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet2);
-        ck_assert_ptr_ne(pds2, NULL);
-        retVal = UA_Server_addDataSetField(server, publishedDataSet2, &fieldConfig, &localDataSetField).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(pds2->fieldSize, 1);
-    } END_TEST
-
-START_TEST(AddDataSetFieldWithNullConfig){
-        setupDataSetFieldTestEnvironment();
-        UA_StatusCode retVal;
-        retVal = UA_Server_addDataSetField(server, publishedDataSet1, NULL, NULL).result;
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        UA_PublishedDataSet *pds1 = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet1);
-        ck_assert_ptr_ne(pds1, NULL);
-        ck_assert_int_eq(pds1->fieldSize, 0);
-    } END_TEST
-
-START_TEST(AddDataSetFieldWithInvalidPDSId){
-        setupDataSetFieldTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetFieldConfig fieldConfig;
-        memset(&fieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        fieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        fieldConfig.field.variable.fieldNameAlias = UA_STRING("field 1");
-        retVal = UA_Server_addDataSetField(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &fieldConfig, NULL).result;
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        UA_PublishedDataSet *pds1 = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet1);
-        ck_assert_ptr_ne(pds1, NULL);
-        ck_assert_int_eq(pds1->fieldSize, 0);
-    } END_TEST
-
-START_TEST(GetDataSetFieldConfigurationAndCompareValues){
-        setupDataSetFieldTestEnvironment();
-        UA_StatusCode retVal;
-        UA_DataSetFieldConfig fieldConfig;
-        memset(&fieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        fieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        fieldConfig.field.variable.fieldNameAlias = UA_STRING("field 1");
-        UA_NodeId dataSetFieldId;
-        retVal = UA_Server_addDataSetField(server, publishedDataSet1, &fieldConfig, &dataSetFieldId).result;
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_DataSetFieldConfig fieldConfigCopy;
-        retVal |= UA_Server_getDataSetFieldConfig(server, dataSetFieldId, &fieldConfigCopy);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(fieldConfig.dataSetFieldType, fieldConfigCopy.dataSetFieldType);
-        ck_assert_int_eq(UA_String_equal(&fieldConfig.field.variable.fieldNameAlias, &fieldConfigCopy.field.variable.fieldNameAlias), UA_TRUE);
-        UA_DataSetFieldConfig_deleteMembers(&fieldConfigCopy);
-    } END_TEST
-
-
-START_TEST(SinglePublishDataSetField){
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name = UA_STRING("WriterGroup 1");
-        writerGroupConfig.publishingInterval = 10;
-        writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-        UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &writerGroup1);
-        writerGroupConfig.name = UA_STRING("WriterGroup 2");
-        writerGroupConfig.publishingInterval = 50;
-        writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-        UA_Server_addWriterGroup(server, connection2, &writerGroupConfig, &writerGroup2);
-        writerGroupConfig.name = UA_STRING("WriterGroup 3");
-        writerGroupConfig.publishingInterval = 100;
-        writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-        UA_Server_addWriterGroup(server, connection2, &writerGroupConfig, &writerGroup3);
-        UA_PublishedDataSetConfig pdsConfig;
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet 1");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSet1);
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSet2);
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter 1");
-        UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter1);
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-        dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
-        dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField(server, publishedDataSet1, &dataSetFieldConfig, NULL);
-
-        UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup1);
-        UA_WriterGroup_publishCallback(server, wg);
-    } END_TEST
-
-START_TEST(PublishDataSetFieldAsDeltaFrame){
-            setupDataSetFieldTestEnvironment();
-            UA_DataSetFieldConfig dataSetFieldConfig;
-            memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-            dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-            dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-            dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-            dataSetFieldConfig.field.variable.publishParameters.publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
-            dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-            UA_Server_addDataSetField(server, publishedDataSet1, &dataSetFieldConfig, NULL);
-            UA_Server_addDataSetField(server, publishedDataSet1, &dataSetFieldConfig, NULL);
-
-            UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup1);
-            wg->config.maxEncapsulatedDataSetMessageCount = 3;
-            UA_DataSetWriter *dsw = UA_DataSetWriter_findDSWbyId(server, dataSetWriter1);
-            dsw->config.keyFrameCount = 3;
-
-            UA_WriterGroup_publishCallback(server, wg);
-            UA_WriterGroup_publishCallback(server, wg);
-            UA_WriterGroup_publishCallback(server, wg);
-            UA_WriterGroup_publishCallback(server, wg);
-            UA_WriterGroup_publishCallback(server, wg);
-        } END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_writergroup = tcase_create("PubSub WriterGroup items handling");
-    tcase_add_checked_fixture(tc_add_pubsub_writergroup, setup, teardown);
-    tcase_add_test(tc_add_pubsub_writergroup, AddWriterGroupWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_writergroup, AddRemoveAddWriterGroupWithMinimalValidConfiguration);
-    tcase_add_test(tc_add_pubsub_writergroup, AddWriterGroupWithNullConfig);
-    tcase_add_test(tc_add_pubsub_writergroup, AddWriterGroupWithInvalidConnectionId);
-    tcase_add_test(tc_add_pubsub_writergroup, GetWriterGroupConfigurationAndCompareValues);
-
-    TCase *tc_add_pubsub_datasetwriter = tcase_create("PubSub DataSetWriter items handling");
-    tcase_add_checked_fixture(tc_add_pubsub_datasetwriter, setup, teardown);
-    tcase_add_test(tc_add_pubsub_datasetwriter, AddDataSetWriterWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_datasetwriter, AddRemoveAddDataSetWriterWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_datasetwriter, AddDataSetWriterWithNullConfig);
-    tcase_add_test(tc_add_pubsub_datasetwriter, AddDataSetWriterWithInvalidPDSId);
-    tcase_add_test(tc_add_pubsub_datasetwriter, GetDataSetWriterConfigurationAndCompareValues);
-
-    TCase *tc_add_pubsub_datasetfields = tcase_create("PubSub DataSetField items handling");
-    tcase_add_checked_fixture(tc_add_pubsub_datasetfields, setup, teardown);
-    tcase_add_test(tc_add_pubsub_datasetfields, AddDataSetFieldWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_datasetfields, AddRemoveAddDataSetFieldWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_datasetfields, AddDataSetFieldWithNullConfig);
-    tcase_add_test(tc_add_pubsub_datasetfields, AddDataSetFieldWithInvalidPDSId);
-    tcase_add_test(tc_add_pubsub_datasetfields, GetDataSetFieldConfigurationAndCompareValues);
-
-    TCase *tc_pubsub_publish = tcase_create("PubSub publish DataSetFields");
-    tcase_add_checked_fixture(tc_pubsub_publish, setup, teardown);
-    tcase_add_test(tc_pubsub_publish, SinglePublishDataSetField);
-    tcase_add_test(tc_pubsub_publish, PublishDataSetFieldAsDeltaFrame);
-
-    Suite *s = suite_create("PubSub WriterGroups/Writer/Fields handling and publishing");
-    suite_add_tcase(s, tc_add_pubsub_writergroup);
-    suite_add_tcase(s, tc_add_pubsub_datasetwriter);
-    suite_add_tcase(s, tc_add_pubsub_datasetfields);
-    suite_add_tcase(s, tc_pubsub_publish);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_publish_json.c b/ext/open62541/tests/pubsub/check_pubsub_publish_json.c
deleted file mode 100644
index ad8b9c9..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_publish_json.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-#include <open62541/types.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_pubsub.h"
-#include "ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-UA_NodeId connection1, writerGroup1, publishedDataSet1, dataSetWriter1;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *) UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    UA_Server_run_startup(server);
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connection1);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(SinglePublishDataSetField){
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-
-        writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
-        writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE];
-        UA_JsonDataSetWriterMessageDataType d;
-        d.dataSetMessageContentMask = UA_JSONDATASETMESSAGECONTENTMASK_SEQUENCENUMBER;
-        writerGroupConfig.messageSettings.content.decoded.data = &d;
-
-        writerGroupConfig.name = UA_STRING("WriterGroup 1");
-        writerGroupConfig.publishingInterval = 10;
-        writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_JSON;
-        UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &writerGroup1);
-
-        UA_PublishedDataSetConfig pdsConfig;
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet 1");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSet1);
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter 1");
-        UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter1);
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-        dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
-        dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField(server, publishedDataSet1, &dataSetFieldConfig, NULL);
-
-        UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup1);
-        UA_WriterGroup_publishCallback(server, wg);
-    } END_TEST
-
-int main(void) {
-    TCase *tc_pubsub_publish = tcase_create("PubSub publish");
-    tcase_add_checked_fixture(tc_pubsub_publish, setup, teardown);
-    tcase_add_test(tc_pubsub_publish, SinglePublishDataSetField);
-
-    Suite *s = suite_create("PubSub publishing json via udp");
-    suite_add_tcase(s, tc_pubsub_publish);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_publish_uadp.c b/ext/open62541/tests/pubsub/check_pubsub_publish_uadp.c
deleted file mode 100644
index f4ffe1d..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_publish_uadp.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2019 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-
-#include "ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-UA_NodeId connection1, publishedDataSetIdent, dataSetFieldIdent, writerGroupIdent, dataSetWriterIdent;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer*)
-            UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    UA_Server_run_startup(server);
-    //add connection
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    connectionConfig.publisherId.numeric = 62541;
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connection1);
-
-    UA_PublishedDataSetConfig publishedDataSetConfig;
-    memset(&publishedDataSetConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    publishedDataSetConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    publishedDataSetConfig.name = UA_STRING("Test PDS");
-    UA_Server_addPublishedDataSet(server, &publishedDataSetConfig, &publishedDataSetIdent);
-
-    UA_DataSetFieldConfig dataSetFieldConfig;
-    memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-    dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-    dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-    dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-    dataSetFieldConfig.field.variable.publishParameters.publishedVariable =
-            UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_Server_addDataSetField(server, publishedDataSetIdent,
-                              &dataSetFieldConfig, &dataSetFieldIdent);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void receiveSingleMessage(UA_ByteString buffer, UA_PubSubConnection *connection, UA_NetworkMessage *networkMessage) {
-    if (UA_ByteString_allocBuffer(&buffer, 512) != UA_STATUSCODE_GOOD) {
-        ck_abort_msg("Message buffer allocation failed!");
-    }
-    UA_StatusCode retval =
-            connection->channel->receive(connection->channel, &buffer, NULL, 10000);
-    if(retval != UA_STATUSCODE_GOOD || buffer.length == 0) {
-        buffer.length = 512;
-        UA_ByteString_clear(&buffer);
-        ck_abort_msg("Expected message not received!");
-    }
-    memset(networkMessage, 0, sizeof(UA_NetworkMessage));
-    size_t currentPosition = 0;
-    UA_NetworkMessage_decodeBinary(&buffer, &currentPosition, networkMessage);
-    UA_ByteString_clear(&buffer);
-}
-
-START_TEST(CheckNMandDSMcalculation){
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig));
-    writerGroupConfig.name = UA_STRING("Demo WriterGroup");
-    writerGroupConfig.publishingInterval = 10;
-    writerGroupConfig.enabled = UA_FALSE;
-    writerGroupConfig.writerGroupId = 100;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-
-    UA_UadpWriterGroupMessageDataType *wgm = UA_UadpWriterGroupMessageDataType_new();
-    wgm->networkMessageContentMask = UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER;
-    writerGroupConfig.messageSettings.content.decoded.data = wgm;
-    writerGroupConfig.messageSettings.content.decoded.type =
-            &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-    writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
-
-    //maximum DSM in one NM = 10
-    writerGroupConfig.maxEncapsulatedDataSetMessageCount = 10;
-    UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &writerGroupIdent);
-    UA_UadpWriterGroupMessageDataType_delete(wgm);
-
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(UA_DataSetWriterConfig));
-    dataSetWriterConfig.name = UA_STRING("Test DataSetWriter");
-    dataSetWriterConfig.dataSetWriterId = 10;
-    dataSetWriterConfig.keyFrameCount = 1;
-    //add 10 dataSetWriter
-    for(UA_UInt16 i = 0; i < 10; i++){
-        dataSetWriterConfig.dataSetWriterId = (UA_UInt16) (dataSetWriterConfig.dataSetWriterId + 1);
-        UA_Server_addDataSetWriter(server, writerGroupIdent, publishedDataSetIdent,
-                                   &dataSetWriterConfig, &dataSetWriterIdent);
-    }
-
-    UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, connection1);
-    if(connection != NULL) {
-        UA_StatusCode rv = connection->channel->regist(connection->channel, NULL, NULL);
-        ck_assert(rv == UA_STATUSCODE_GOOD);
-    }
-
-    //change publish interval triggers implicit one publish callback run | alternatively run UA_Server_iterate
-    writerGroupConfig.publishingInterval = 100000;
-    UA_Server_updateWriterGroupConfig(server, writerGroupIdent, &writerGroupConfig);
-
-    UA_ByteString buffer = UA_BYTESTRING_ALLOC("");
-    UA_NetworkMessage networkMessage;
-    receiveSingleMessage(buffer, connection, &networkMessage);
-    //ck_assert_int_eq(networkMessage.publisherId.publisherIdUInt32 , 62541);
-    ck_assert_int_eq(networkMessage.payloadHeader.dataSetPayloadHeader.count, 10);
-    for(size_t i = 10; i > 0; i--){
-        ck_assert_int_eq(*(networkMessage.payloadHeader.dataSetPayloadHeader.dataSetWriterIds+(i-1)), 21-i);
-    }
-    UA_NetworkMessage_deleteMembers(&networkMessage);
-
-    //change publish interval triggers implicit one publish callback run | alternatively run UA_Server_iterate
-    writerGroupConfig.publishingInterval = 200000;
-    //maximum DSM in one NM = 5
-    writerGroupConfig.maxEncapsulatedDataSetMessageCount = 5;
-    UA_Server_updateWriterGroupConfig(server, writerGroupIdent, &writerGroupConfig);
-    UA_NetworkMessage networkMessage1, networkMessage2;
-    receiveSingleMessage(buffer, connection, &networkMessage1);
-    receiveSingleMessage(buffer, connection, &networkMessage2);
-    ck_assert_int_eq(networkMessage1.payloadHeader.dataSetPayloadHeader.count, 5);
-    ck_assert_int_eq(networkMessage1.payloadHeader.dataSetPayloadHeader.count, 5);
-    UA_NetworkMessage_deleteMembers(&networkMessage1);
-    UA_NetworkMessage_deleteMembers(&networkMessage2);
-
-    //change publish interval triggers implicit one publish callback run | alternatively run UA_Server_iterate
-    writerGroupConfig.publishingInterval = 300000;
-    //maximum DSM in one NM = 20
-    writerGroupConfig.maxEncapsulatedDataSetMessageCount = 20;
-    UA_Server_updateWriterGroupConfig(server, writerGroupIdent, &writerGroupConfig);
-    UA_NetworkMessage networkMessage3;
-    receiveSingleMessage(buffer, connection, &networkMessage3);
-    ck_assert_int_eq(networkMessage3.payloadHeader.dataSetPayloadHeader.count, 10);
-    UA_NetworkMessage_deleteMembers(&networkMessage3);
-
-    //change publish interval triggers implicit one publish callback run | alternatively run UA_Server_iterate
-    writerGroupConfig.publishingInterval = 400000;
-    //maximum DSM in one NM = 1
-    writerGroupConfig.maxEncapsulatedDataSetMessageCount = 1;
-    UA_Server_updateWriterGroupConfig(server, writerGroupIdent, &writerGroupConfig);
-    UA_NetworkMessage messageArray[10];
-    for (int j = 0; j < 10; ++j) {
-        receiveSingleMessage(buffer, connection, &(messageArray[j]));
-        ck_assert_int_eq(messageArray[j].payloadHeader.dataSetPayloadHeader.count, 1);
-        UA_NetworkMessage_deleteMembers(&messageArray[j]);
-    }
-
-    //change publish interval triggers implicit one publish callback run | alternatively run UA_Server_iterate
-    writerGroupConfig.publishingInterval = 500000;
-    //maximum DSM in one NM = 0 -> should be equal to 1
-    writerGroupConfig.maxEncapsulatedDataSetMessageCount = 0;
-    UA_Server_updateWriterGroupConfig(server, writerGroupIdent, &writerGroupConfig);
-    UA_Server_updateWriterGroupConfig(server, writerGroupIdent, &writerGroupConfig);
-    for (int j = 0; j < 10; ++j) {
-        receiveSingleMessage(buffer, connection, &(messageArray[j]));
-        ck_assert_int_eq(messageArray[j].payloadHeader.dataSetPayloadHeader.count, 1);
-        UA_NetworkMessage_deleteMembers(&messageArray[j]);
-    }
-
-    } END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_DSMandNMcalculation = tcase_create("PubSub NM and DSM");
-    tcase_add_checked_fixture(tc_add_pubsub_DSMandNMcalculation, setup, teardown);
-    tcase_add_test(tc_add_pubsub_DSMandNMcalculation, CheckNMandDSMcalculation);
-
-    Suite *s = suite_create("PubSub NM and DSM calculation");
-    suite_add_tcase(s, tc_add_pubsub_DSMandNMcalculation);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_publishspeed.c b/ext/open62541/tests/pubsub/check_pubsub_publishspeed.c
deleted file mode 100644
index 11e866c..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_publishspeed.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Andreas Ebner)
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-#include <open62541/types_generated_encoding_binary.h>
-
-#include "ua_server_internal.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <time.h>
-
-UA_Server *server = NULL;
-UA_NodeId connection1, connection2, writerGroup1, writerGroup2, writerGroup3,
-        publishedDataSet1, publishedDataSet2, dataSetWriter1, dataSetWriter2, dataSetWriter3;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer*)
-        UA_malloc(sizeof(UA_PubSubTransportLayer));
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4840/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connection1);
-
-    UA_WriterGroupConfig writerGroupConfig;
-    memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-    writerGroupConfig.name = UA_STRING("WriterGroup 1");
-    writerGroupConfig.publishingInterval = 10;
-    writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-    UA_Server_addWriterGroup(server, connection1, &writerGroupConfig, &writerGroup1);
-
-    UA_PublishedDataSetConfig pdsConfig;
-    memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-    pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-    pdsConfig.name = UA_STRING("PublishedDataSet 1");
-    UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSet1);
-
-    UA_DataSetWriterConfig dataSetWriterConfig;
-    memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-    dataSetWriterConfig.name = UA_STRING("DataSetWriter 1");
-    UA_Server_addDataSetWriter(server, writerGroup1, publishedDataSet1, &dataSetWriterConfig, &dataSetWriter1);
-
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(PublishSpeedTest) {
-    UA_DataSetFieldConfig dataSetFieldConfig;
-    memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-    dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-    dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-    dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-    dataSetFieldConfig.field.variable.publishParameters.publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
-    dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_Server_addDataSetField(server, publishedDataSet1, &dataSetFieldConfig, NULL);
-
-    UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup1);
-
-    printf("start sending 8000 publish messages via UDP\n");
-
-    clock_t begin, finish;
-    begin = clock();
-
-    for(int i = 0; i < 8000; i++) {
-        UA_WriterGroup_publishCallback(server, wg);
-    }
-
-    finish = clock();
-    double time_spent = (double)(finish - begin) / CLOCKS_PER_SEC;
-    printf("duration was %f s\n", time_spent);
-
-} END_TEST
-
-int main(void) {
-    TCase *tc_publishspeed = tcase_create("Speed of the publisher");
-    tcase_add_checked_fixture(tc_publishspeed, setup, teardown);
-    tcase_add_test(tc_publishspeed, PublishSpeedTest);
-
-    Suite *s = suite_create("PubSub Speed Test");
-    suite_add_tcase(s, tc_publishspeed);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/pubsub/check_pubsub_subscribe.c b/ext/open62541/tests/pubsub/check_pubsub_subscribe.c
deleted file mode 100644
index c5090d5..0000000
--- a/ext/open62541/tests/pubsub/check_pubsub_subscribe.c
+++ /dev/null
@@ -1,1356 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright (c) 2019 Kalycito Infotech Private Limited
- */
-
-#include <open62541/plugin/pubsub_udp.h>
-#include <open62541/server_config_default.h>
-#include <open62541/server_pubsub.h>
-#include <check.h>
-#include <time.h>
-
-#include "open62541/types_generated_encoding_binary.h"
-#include "ua_pubsub.h"
-#include "ua_server_internal.h"
-
-#define UA_SUBSCRIBER_PORT       4801    /* Port for Subscriber*/
-#define PUBLISH_INTERVAL         5       /* Publish interval*/
-#define PUBLISHER_ID             2234    /* Publisher Id*/
-#define DATASET_WRITER_ID        62541   /* DataSet Writer Id*/
-#define WRITER_GROUP_ID          100     /* Writer group Id  */
-#define PUBLISHER_DATA           42      /* Published data */
-#define PUBLISHVARIABLE_NODEID   1000    /* Published data nodeId */
-#define SUBSCRIBEOBJECT_NODEID   1001    /* Object nodeId */
-#define SUBSCRIBEVARIABLE_NODEID 1002    /* Subscribed data nodeId */
-#define READERGROUP_COUNT        2       /* Value to add readergroup to connection */
-#define CHECK_READERGROUP_COUNT  3       /* Value to check readergroup count */
-
-/* Global declaration for test cases  */
-UA_Server *server = NULL;
-UA_ServerConfig *config = NULL;
-UA_NodeId connection_test;
-UA_NodeId readerGroupTest;
-
-UA_NodeId publishedDataSetTest;
-
-/* setup() is to create an environment for test cases */
-static void setup(void) {
-    /*Add setup by creating new server with valid configuration */
-    server = UA_Server_new();
-    config = UA_Server_getConfig(server);
-    UA_ServerConfig_setMinimal(config, UA_SUBSCRIBER_PORT, NULL);
-    UA_Server_run_startup(server);
-    config->pubsubTransportLayers = (UA_PubSubTransportLayer *) UA_malloc(sizeof(UA_PubSubTransportLayer));
-    if(!config->pubsubTransportLayers) {
-        UA_ServerConfig_clean(config);
-    }
-
-    config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
-    config->pubsubTransportLayersSize++;
-
-    /* Add connection to the server */
-    UA_PubSubConnectionConfig connectionConfig;
-    memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
-    connectionConfig.name = UA_STRING("UADP Test Connection");
-    UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4801/")};
-    UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
-                         &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
-    connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
-    connectionConfig.publisherId.numeric = PUBLISHER_ID;
-    UA_Server_addPubSubConnection(server, &connectionConfig, &connection_test);
-    UA_PubSubConnection_regist(server, &connection_test);
-}
-
-/* teardown() is to delete the environment set for test cases */
-static void teardown(void) {
-    /*Call server delete functions */
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(AddReaderGroupWithValidConfiguration) {
-        /* To test if ReaderGroup has been added to the connection with valid configuration */
-        UA_StatusCode retVal;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        UA_NodeId localreaderGroup;
-        retVal =  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        size_t readerGroupCount = 0;
-        UA_ReaderGroup *readerGroup;
-        LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
-            readerGroupCount++;
-        }
-        /* Check readerGroup count */
-        ck_assert_int_eq(readerGroupCount, 1);
-        /* To Do: RemoveReaderGroup operation should be carried out when UA_Server_delete has been called */
-        UA_Server_removeReaderGroup(server, localreaderGroup);
-    } END_TEST
-
-START_TEST(AddReaderGroupWithNullConfig) {
-        /* Check the status of adding ReaderGroup when NULL configuration is given */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, NULL, NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        size_t readerGroupCount = 0;
-        UA_ReaderGroup *readerGroup;
-        LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
-            readerGroupCount++;
-        }
-        /* Check readerGroup count */
-        ck_assert_int_eq(readerGroupCount, 0);
-    } END_TEST
-
-START_TEST(AddReaderGroupWithInvalidConnectionId) {
-        /* Check status of adding ReaderGroup with invalid connection identifier */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &readerGroupConfig, NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        size_t readerGroupCount = 0;
-        UA_ReaderGroup *readerGroup;
-        LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
-            readerGroupCount++;
-        }
-        /* Check readerGroup count */
-        ck_assert_int_eq(readerGroupCount, 0);
-    } END_TEST
-
-START_TEST(RemoveReaderGroupWithInvalidIdentifier) {
-        /* Check status of removing ReaderGroup when giving invalid ReaderGroup identifier */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        UA_NodeId localreaderGroup;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Delete the added readerGroup */
-        retVal |= UA_Server_removeReaderGroup(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX));
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        size_t readerGroupCount = 0;
-        UA_ReaderGroup *readerGroup;
-        LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
-            readerGroupCount++;
-        }
-        /* Check readerGroup count */
-        ck_assert_int_eq(readerGroupCount, 1);
-        UA_Server_removeReaderGroup(server, localreaderGroup);
-    } END_TEST
-
-START_TEST(AddRemoveMultipleAddReaderGroupWithValidConfiguration) {
-        UA_StatusCode retVal   = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup 1");
-        UA_NodeId localReaderGroup;
-        /* Add ReaderGroup */
-        retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Remove added ReaderGroup */
-        retVal |= UA_Server_removeReaderGroup(server, localReaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        size_t readerGroupCount = 0;
-        UA_ReaderGroup *readerGroup;
-        LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry) {
-            readerGroupCount++;
-        }
-
-        /* Check ReaderGroup Count */
-        ck_assert_int_eq(readerGroupCount, 0);
-        /* Add Multiple ReaderGroups */
-        for (int iterator = 0; iterator <= READERGROUP_COUNT; iterator++) {
-            retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup);
-            ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        }
-
-        readerGroupCount = 0;
-        /* Find ReaderGroup count */
-        LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry) {
-            readerGroupCount++;
-        }
-        /* Check ReaderGroup Count */
-        ck_assert_int_eq(readerGroupCount, CHECK_READERGROUP_COUNT);
-    } END_TEST
-
-START_TEST(UpdateReaderGroupWithInvalidIdentifier) {
-        /* Check status of updating ReaderGroup with invalid identifier */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        UA_NodeId localreaderGroup;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |=  UA_Server_ReaderGroup_updateConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        UA_Server_removeReaderGroup(server, localreaderGroup);
-    } END_TEST
-
-START_TEST(GetReaderGroupConfigWithInvalidConfig) {
-        /* Check status of getting ReaderGroup configuration with invalid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        UA_NodeId localreaderGroup;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_ReaderGroup_getConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        UA_Server_removeReaderGroup(server, localreaderGroup);
-    } END_TEST
-
-START_TEST(GetReaderGroupConfigWithInvalidIdentifier) {
-        /* Check status of getting ReaderGroup configuration with invlaid identifier */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        UA_NodeId localreaderGroup;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_ReaderGroup_getConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &readerGroupConfig);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        UA_Server_removeReaderGroup(server, localreaderGroup);
-    } END_TEST
-
-START_TEST(GetReaderGroupConfigWithValidConfig) {
-        /* Check status of getting ReaderGroup configuration with valid parameters */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_NodeId localreaderGroup;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_ReaderGroup_getConfig(server, localreaderGroup, &readerGroupConfig);
-        /* To Do: DeleteMembers of readergroup config has to be a separate function */
-        UA_String_deleteMembers (&readerGroupConfig.name);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddDataSetReaderWithValidConfiguration) {
-        /* Check status of adding DataSetReader to ReaderGroup with valid parameters*/
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_ReaderGroupConfig readerGroupConfig;
-        UA_NodeId localDataSetreader;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        dataSetreaderConfig.name = UA_STRING("DataSetreader Test");
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddDataSetReaderWithNullConfig) {
-        /* Check status of adding DataSetReader to ReaderGroup with invalid parameters */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        dataSetreaderConfig.name = UA_STRING("DataSetreader Test ");
-        /* Remove the added DataSetReader */
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, NULL, NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(RemoveDataSetReaderWithValidConfiguration) {
-        /* Check status of adding DataSetReader to ReaderGroup with valid parameters */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_ReaderGroupConfig readerGroupConfig;
-        UA_NodeId localDataSetreader;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        dataSetreaderConfig.name = UA_STRING("DataSetReader Test ");
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_removeDataSetReader(server, localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(RemoveDataSetReaderWithInvalidIdentifier) {
-        /* Check status of removing DataSetReader from ReaderGroup with invalid parameters */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        dataSetreaderConfig.name = UA_STRING("DataSetReader Test ");
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, NULL, NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-        /* Remove the added DataSetReader */
-        retVal |= UA_Server_removeDataSetReader(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX));
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddMultipleDataSetReaderWithValidConfiguration) {
-        UA_StatusCode retVal    = UA_STATUSCODE_GOOD;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name  = UA_STRING("ReaderGroup 1");
-        UA_NodeId localReaderGroup;
-        UA_NodeId localReaderGroup2;
-        /* DataSetReader configuration */
-        UA_DataSetReaderConfig readerConfig;
-        memset (&readerConfig, 0, sizeof(readerConfig));
-        readerConfig.name       = UA_STRING("DataSet Reader 1");
-        UA_NodeId dataSetReader;
-        /* Add ReaderGroup */
-        retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup2);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_ReaderGroup *readerGroupIdent1 = UA_ReaderGroup_findRGbyId(server, localReaderGroup);
-        UA_ReaderGroup *readerGroupIdent2 = UA_ReaderGroup_findRGbyId(server, localReaderGroup2);
-        /* Add DataSetReaders to first ReaderGroup */
-        retVal = UA_Server_addDataSetReader(server, localReaderGroup, &readerConfig, &dataSetReader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(readerGroupIdent1->readersCount, 1);
-        retVal = UA_Server_addDataSetReader(server, localReaderGroup, &readerConfig, &dataSetReader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(readerGroupIdent1->readersCount, 2);
-        /* Add DataSetReaders to second ReaderGroup */
-        retVal = UA_Server_addDataSetReader(server, localReaderGroup2, &readerConfig, &dataSetReader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(readerGroupIdent2->readersCount, 1);
-        retVal = UA_Server_addDataSetReader(server, localReaderGroup2, &readerConfig, &dataSetReader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        ck_assert_int_eq(readerGroupIdent2->readersCount, 2);
-    } END_TEST
-
-START_TEST(UpdateDataSetReaderConfigWithInvalidId) {
-        /* Check status of updatting DataSetReader with invalid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_NodeId localDataSetreader;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup,
-                                                        &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |=  UA_Server_DataSetReader_updateConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX),
-                                                      localreaderGroup, &dataSetreaderConfig );
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(GetDataSetReaderConfigWithValidConfiguration) {
-        /* Check status of getting DataSetReader with Valid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_NodeId localDataSetreader;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_DataSetReader_getConfig(server, localDataSetreader, &dataSetreaderConfig);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(GetDataSetReaderConfigWithInvalidConfiguration) {
-        /* Check status of getting DataSetReader with Invalid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_NodeId localDataSetreader;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_DataSetReader_getConfig(server, localDataSetreader, NULL);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(GetDataSetReaderConfigWithInvalidIdentifier) {
-        /* Check status of getting DataSetReader with Invalid Identifier */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_NodeId localDataSetreader;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_DataSetReader_getConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &dataSetreaderConfig);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(CreateTargetVariableWithInvalidConfiguration) {
-        /* Check status to create target variable with invalid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_NodeId localDataSetreader;
-        UA_TargetVariablesDataType localTargetVariable;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |= UA_Server_DataSetReader_createTargetVariables(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &localTargetVariable);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddTargetVariableWithInvalidConfiguration) {
-        /* Check status to create target variable with invalid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetreaderConfig;
-        UA_NodeId localreaderGroup;
-        UA_NodeId localDataSetreader;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        retVal |=  UA_Server_DataSetReader_addTargetVariables(NULL, &localreaderGroup, localDataSetreader, UA_PUBSUB_SDS_TARGET);
-        ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
-    } END_TEST
-
-START_TEST(AddTargetVariableWithValidConfiguration) {
-        /* Check status after creating target variables with Valid configuration */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_DataSetReaderConfig dataSetReaderConfig;
-        UA_NodeId folderId;
-        UA_QualifiedName folderBrowseName;
-        UA_NodeId localreaderGroupIdentifier;
-        UA_NodeId localDataSetreaderIdentifier;
-        UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
-        readerGroupConfig.name = UA_STRING("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroupIdentifier);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        memset(&dataSetReaderConfig, 0, sizeof(UA_DataSetReaderConfig));
-        UA_DataSetMetaDataType *pMetaData = &dataSetReaderConfig.dataSetMetaData;
-        UA_DataSetMetaDataType_init (pMetaData);
-        pMetaData->name = UA_STRING ("DataSet Test");
-        /* Static definition of number of fields size to 2 to create targetVariables
-         * with DateTime and ByteString datatype */
-        pMetaData->fieldsSize = 2;
-        pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                             &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-
-        /* DateTime DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[0]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_DATETIME].typeId,
-                        &pMetaData->fields[0].dataType);
-        pMetaData->fields[0].builtInType = UA_NS0ID_DATETIME;
-        pMetaData->fields[0].valueRank = -1; /* scalar */
-
-        /* ByteString DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[1]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_BYTESTRING].typeId,
-                        &pMetaData->fields[1].dataType);
-        pMetaData->fields[1].builtInType = UA_NS0ID_BYTESTRING;
-        pMetaData->fields[1].valueRank = -1; /* scalar */
-
-        retVal |= UA_Server_addDataSetReader(server, localreaderGroupIdentifier, &dataSetReaderConfig, &localDataSetreaderIdentifier);
-
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-        UA_Server_addObjectNode (server, UA_NODEID_NULL,
-                                 UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER),
-                                 UA_NODEID_NUMERIC (0, UA_NS0ID_ORGANIZES),
-                                 folderBrowseName, UA_NODEID_NUMERIC (0,
-                                 UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-        retVal |=  UA_Server_DataSetReader_addTargetVariables(server, &folderId, localDataSetreaderIdentifier, UA_PUBSUB_SDS_TARGET);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_free(pMetaData->fields);
-    } END_TEST
-
-START_TEST(SinglePublishSubscribeDateTime) {
-        /* To check status after running both publisher and subscriber */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_PublishedDataSetConfig pdsConfig;
-        UA_NodeId dataSetWriter;
-        UA_NodeId readerIdentifier;
-        UA_NodeId writerGroup;
-        UA_DataSetReaderConfig readerConfig;
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet Test");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Data Set Field */
-        UA_NodeId dataSetFieldId;
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
-        dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
-        dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField(server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldId);
-        /* Writer group */
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name = UA_STRING("WriterGroup Test");
-        writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
-        writerGroupConfig.enabled = UA_FALSE;
-        writerGroupConfig.writerGroupId = WRITER_GROUP_ID;
-        writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
-        retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* DataSetWriter */
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name = UA_STRING("DataSetWriter Test");
-        dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
-        dataSetWriterConfig.keyFrameCount = 10;
-        retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Reader Group */
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
-        readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup (server, connection_test, &readerGroupConfig,
-                                                      &readerGroupTest);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Data Set Reader */
-        memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
-        readerConfig.name = UA_STRING ("DataSetReader Test");
-        readerConfig.dataSetWriterId = DATASET_WRITER_ID;
-        /* Setting up Meta data configuration in DataSetReader for DateTime DataType */
-        UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
-        /* FilltestMetadata function in subscriber implementation */
-        UA_DataSetMetaDataType_init (pMetaData);
-        pMetaData->name = UA_STRING ("DataSet Test");
-        /* Static definition of number of fields size to 1 to create one
-        targetVariable */
-        pMetaData->fieldsSize = 1;
-        pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                             &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-        /* DateTime DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[0]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_DATETIME].typeId,
-                        &pMetaData->fields[0].dataType);
-        pMetaData->fields[0].builtInType = UA_NS0ID_DATETIME;
-        pMetaData->fields[0].valueRank = -1; /* scalar */
-        retVal |= UA_Server_addDataSetReader (server, readerGroupTest, &readerConfig,
-                                                          &readerIdentifier);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Add Subscribed Variables */
-        UA_NodeId folderId;
-        UA_String folderName = readerConfig.dataSetMetaData.name;
-        UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-        UA_QualifiedName folderBrowseName;
-        if (folderName.length > 0) {
-            oAttr.displayName.locale = UA_STRING ("en-US");
-            oAttr.displayName.text = folderName;
-            folderBrowseName.namespaceIndex = 1;
-            folderBrowseName.name = folderName;
-          }
-        else {
-            oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
-            folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-        }
-
-        UA_Server_addObjectNode (server, UA_NODEID_NULL,
-                                 UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER),
-                                 UA_NODEID_NUMERIC (0, UA_NS0ID_ORGANIZES),
-                                 folderBrowseName, UA_NODEID_NUMERIC (0,
-                                 UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-        retVal |=  UA_Server_DataSetReader_addTargetVariables (server, &folderId,
-                                                             readerIdentifier, UA_PUBSUB_SDS_TARGET);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* run server - publisher and subscriber */
-        UA_Server_run_iterate(server,true);
-        UA_Server_run_iterate(server,true);
-        UA_free(pMetaData->fields);
-
-   }END_TEST
-
-START_TEST(SinglePublishSubscribeInt32) {
-        /* To check status after running both publisher and subscriber */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_PublishedDataSetConfig pdsConfig;
-        UA_NodeId dataSetWriter;
-        UA_NodeId readerIdentifier;
-        UA_NodeId writerGroup;
-        UA_DataSetReaderConfig readerConfig;
-
-        /* Published DataSet */
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet Test");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Create variable to publish integer data */
-        UA_NodeId publisherNode;
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description           = UA_LOCALIZEDTEXT("en-US","Published Int32");
-        attr.displayName           = UA_LOCALIZEDTEXT("en-US","Published Int32");
-        attr.dataType              = UA_TYPES[UA_TYPES_INT32].typeId;
-        UA_Int32 publisherData     = 42;
-        UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_INT32]);
-        retVal                     = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                                               UA_QUALIFIEDNAME(1, "Published Int32"),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                               attr, NULL, &publisherNode);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Data Set Field */
-        UA_NodeId dataSetFieldIdent;
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType              = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Int32");
-        dataSetFieldConfig.field.variable.promotedField  = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
-        dataSetFieldConfig.field.variable.publishParameters.attributeId       = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
-
-        /* Writer group */
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name               = UA_STRING("WriterGroup Test");
-        writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
-        writerGroupConfig.enabled            = UA_FALSE;
-        writerGroupConfig.writerGroupId      = WRITER_GROUP_ID;
-        writerGroupConfig.encodingMimeType   = UA_PUBSUB_ENCODING_UADP;
-        /* Message settings in WriterGroup to include necessary headers */
-        writerGroupConfig.messageSettings.encoding             = UA_EXTENSIONOBJECT_DECODED;
-        writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-        UA_UadpWriterGroupMessageDataType *writerGroupMessage  = UA_UadpWriterGroupMessageDataType_new();
-        writerGroupMessage->networkMessageContentMask          = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
-        writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
-        retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
-        UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* DataSetWriter */
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name            = UA_STRING("DataSetWriter Test");
-        dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
-        dataSetWriterConfig.keyFrameCount   = 10;
-        retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Reader Group */
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
-        readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
-
-        /* Data Set Reader */
-        /* Parameters to filter received NetworkMessage */
-        memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
-        readerConfig.name             = UA_STRING ("DataSetReader Test");
-        UA_UInt16 publisherIdentifier = PUBLISHER_ID;
-        readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
-        readerConfig.publisherId.data = &publisherIdentifier;
-        readerConfig.writerGroupId    = WRITER_GROUP_ID;
-        readerConfig.dataSetWriterId  = DATASET_WRITER_ID;
-        /* Setting up Meta data configuration in DataSetReader */
-        UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
-        /* FilltestMetadata function in subscriber implementation */
-        UA_DataSetMetaDataType_init (pMetaData);
-        pMetaData->name       = UA_STRING ("DataSet Test");
-        /* Static definition of number of fields size to 1 to create one
-           targetVariable */
-        pMetaData->fieldsSize = 1;
-        pMetaData->fields     = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                                                                 &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-        /* Unsigned Integer DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[0]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_INT32].typeId,
-                        &pMetaData->fields[0].dataType);
-        pMetaData->fields[0].builtInType = UA_NS0ID_INT32;
-        pMetaData->fields[0].valueRank   = -1; /* scalar */
-        retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
-                                             &readerIdentifier);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Add Subscribed Variables */
-        UA_NodeId folderId;
-        UA_NodeId newnodeId;
-        UA_String folderName      = readerConfig.dataSetMetaData.name;
-        UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-        UA_QualifiedName folderBrowseName;
-        if (folderName.length > 0) {
-            oAttr.displayName.locale        = UA_STRING ("en-US");
-            oAttr.displayName.text          = folderName;
-            folderBrowseName.namespaceIndex = 1;
-            folderBrowseName.name           = folderName;
-        }
-        else {
-            oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
-            folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-        }
-
-        retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         folderBrowseName, UA_NODEID_NUMERIC(0,
-                                         UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Variable to subscribe data */
-        UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-        vAttr.description = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int32");
-        vAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int32");
-        vAttr.dataType    = UA_TYPES[UA_TYPES_INT32].typeId;
-        retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
-                                           UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),  UA_QUALIFIEDNAME(1, "Subscribed Int32"),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType targetVars;
-        targetVars.targetVariablesSize = 1;
-        targetVars.targetVariables     = (UA_FieldTargetDataType *)
-                                          UA_calloc(targetVars.targetVariablesSize,
-                                          sizeof(UA_FieldTargetDataType));
-        /* For creating Targetvariable */
-        UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
-        targetVars.targetVariables[0].attributeId  = UA_ATTRIBUTEID_VALUE;
-        targetVars.targetVariables[0].targetNodeId = newnodeId;
-        retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
-                                                                &targetVars);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType_deleteMembers(&targetVars);
-        UA_free(pMetaData->fields);
-        /* run server - publisher and subscriber */
-        UA_Server_run_iterate(server,true);
-
-        /* Read data sent by the Publisher */
-        UA_Variant *publishedNodeData = UA_Variant_new();
-        retVal                        = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Read data received by the Subscriber */
-        UA_Variant *subscribedNodeData = UA_Variant_new();
-        retVal                         = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Check if data sent from Publisher is being received by Subscriber */
-        ck_assert_int_eq(*(UA_Int32 *)publishedNodeData->data, *(UA_Int32 *)subscribedNodeData->data);
-        UA_Variant_delete(subscribedNodeData);
-        UA_Variant_delete(publishedNodeData);
-    } END_TEST
-
-START_TEST(SinglePublishSubscribeInt64) {
-        /* To check status after running both publisher and subscriber */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_PublishedDataSetConfig pdsConfig;
-        UA_NodeId dataSetWriter;
-        UA_NodeId readerIdentifier;
-        UA_NodeId writerGroup;
-        UA_DataSetReaderConfig readerConfig;
-
-        /* Published DataSet */
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet Test");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Create variable to publish integer data */
-        UA_NodeId publisherNode;
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description           = UA_LOCALIZEDTEXT("en-US","Published Int64");
-        attr.displayName           = UA_LOCALIZEDTEXT("en-US","Published Int64");
-        attr.dataType              = UA_TYPES[UA_TYPES_INT64].typeId;
-        UA_Int64 publisherData     = 64;
-        UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_INT64]);
-        retVal                     = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                                               UA_QUALIFIEDNAME(1, "Published Int64"),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                               attr, NULL, &publisherNode);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Data Set Field */
-        UA_NodeId dataSetFieldIdent;
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType              = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Int64");
-        dataSetFieldConfig.field.variable.promotedField  = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
-        dataSetFieldConfig.field.variable.publishParameters.attributeId       = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
-
-        /* Writer group */
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name               = UA_STRING("WriterGroup Test");
-        writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
-        writerGroupConfig.enabled            = UA_FALSE;
-        writerGroupConfig.writerGroupId      = WRITER_GROUP_ID;
-        writerGroupConfig.encodingMimeType   = UA_PUBSUB_ENCODING_UADP;
-        /* Message settings in WriterGroup to include necessary headers */
-        writerGroupConfig.messageSettings.encoding             = UA_EXTENSIONOBJECT_DECODED;
-        writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-        UA_UadpWriterGroupMessageDataType *writerGroupMessage  = UA_UadpWriterGroupMessageDataType_new();
-        writerGroupMessage->networkMessageContentMask          = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
-        writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
-        retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
-        UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* DataSetWriter */
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name            = UA_STRING("DataSetWriter Test");
-        dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
-        dataSetWriterConfig.keyFrameCount   = 10;
-        retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Reader Group */
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
-        readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
-
-        /* Data Set Reader */
-        /* Parameters to filter received NetworkMessage */
-        memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
-        readerConfig.name             = UA_STRING ("DataSetReader Test");
-        UA_UInt16 publisherIdentifier = PUBLISHER_ID;
-        readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
-        readerConfig.publisherId.data = &publisherIdentifier;
-        readerConfig.writerGroupId    = WRITER_GROUP_ID;
-        readerConfig.dataSetWriterId  = DATASET_WRITER_ID;
-        /* Setting up Meta data configuration in DataSetReader */
-        UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
-        /* FilltestMetadata function in subscriber implementation */
-        UA_DataSetMetaDataType_init (pMetaData);
-        pMetaData->name       = UA_STRING ("DataSet Test");
-        /* Static definition of number of fields size to 1 to create one
-           targetVariable */
-        pMetaData->fieldsSize = 1;
-        pMetaData->fields     = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                                                                 &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-                /* Unsigned Integer DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[0]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_INT64].typeId,
-                        &pMetaData->fields[0].dataType);
-        pMetaData->fields[0].builtInType = UA_NS0ID_INT64;
-        pMetaData->fields[0].valueRank   = -1; /* scalar */
-        retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
-                                             &readerIdentifier);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Add Subscribed Variables */
-        UA_NodeId folderId;
-        UA_NodeId newnodeId;
-        UA_String folderName      = readerConfig.dataSetMetaData.name;
-        UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-        UA_QualifiedName folderBrowseName;
-        if (folderName.length > 0) {
-            oAttr.displayName.locale        = UA_STRING ("en-US");
-            oAttr.displayName.text          = folderName;
-            folderBrowseName.namespaceIndex = 1;
-            folderBrowseName.name           = folderName;
-        }
-        else {
-            oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
-            folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-        }
-
-        retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         folderBrowseName, UA_NODEID_NUMERIC(0,
-                                         UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Variable to subscribe data */
-        UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-        vAttr.description = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int64");
-        vAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int64");
-        vAttr.dataType    = UA_TYPES[UA_TYPES_INT64].typeId;
-        retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
-                                           UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),  UA_QUALIFIEDNAME(1, "Subscribed Int64"),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType targetVars;
-        targetVars.targetVariablesSize = 1;
-        targetVars.targetVariables     = (UA_FieldTargetDataType *)
-                                          UA_calloc(targetVars.targetVariablesSize,
-                                          sizeof(UA_FieldTargetDataType));
-        /* For creating Targetvariable */
-        UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
-        targetVars.targetVariables[0].attributeId  = UA_ATTRIBUTEID_VALUE;
-        targetVars.targetVariables[0].targetNodeId = newnodeId;
-        retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
-                                                                &targetVars);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType_deleteMembers(&targetVars);
-        UA_free(pMetaData->fields);
-        /* run server - publisher and subscriber */
-        UA_Server_run_iterate(server,true);
-
-        /* Read data sent by the Publisher */
-        UA_Variant *publishedNodeData = UA_Variant_new();
-        retVal                        = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Read data received by the Subscriber */
-        UA_Variant *subscribedNodeData = UA_Variant_new();
-        retVal                         = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Check if data sent from Publisher is being received by Subscriber */
-        ck_assert_int_eq(*(UA_Int64 *)publishedNodeData->data, *(UA_Int64 *)subscribedNodeData->data);
-        UA_Variant_delete(subscribedNodeData);
-        UA_Variant_delete(publishedNodeData);
-    } END_TEST
-
-START_TEST(SinglePublishSubscribeBool) {
-        /* To check status after running both publisher and subscriber */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_PublishedDataSetConfig pdsConfig;
-        UA_NodeId dataSetWriter;
-        UA_NodeId readerIdentifier;
-        UA_NodeId writerGroup;
-        UA_DataSetReaderConfig readerConfig;
-
-        /* Published DataSet */
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet Test");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Create variable to publish boolean data */
-        UA_NodeId publisherNode;
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description           = UA_LOCALIZEDTEXT("en-US","Published Bool");
-        attr.displayName           = UA_LOCALIZEDTEXT("en-US","Published Bool");
-        attr.dataType              = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
-        UA_Boolean publisherData   = UA_FALSE;
-        UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_BOOLEAN]);
-        retVal                     = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                                               UA_QUALIFIEDNAME(1, "Published Bool"),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                               attr, NULL, &publisherNode);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Data Set Field */
-        UA_NodeId dataSetFieldIdent;
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType              = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Bool");
-        dataSetFieldConfig.field.variable.promotedField  = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
-        dataSetFieldConfig.field.variable.publishParameters.attributeId       = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
-
-        /* Writer group */
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name               = UA_STRING("WriterGroup Test");
-        writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
-        writerGroupConfig.enabled            = UA_FALSE;
-        writerGroupConfig.writerGroupId      = WRITER_GROUP_ID;
-        writerGroupConfig.encodingMimeType   = UA_PUBSUB_ENCODING_UADP;
-        /* Message settings in WriterGroup to include necessary headers */
-        writerGroupConfig.messageSettings.encoding             = UA_EXTENSIONOBJECT_DECODED;
-        writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-        UA_UadpWriterGroupMessageDataType *writerGroupMessage  = UA_UadpWriterGroupMessageDataType_new();
-        writerGroupMessage->networkMessageContentMask          = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
-        writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
-        retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
-        UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* DataSetWriter */
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name            = UA_STRING("DataSetWriter Test");
-        dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
-        dataSetWriterConfig.keyFrameCount   = 10;
-        retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Reader Group */
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
-        readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
-
-        /* Data Set Reader */
-        /* Parameters to filter received NetworkMessage */
-        memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
-        readerConfig.name             = UA_STRING ("DataSetReader Test");
-        UA_UInt16 publisherIdentifier = PUBLISHER_ID;
-        readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
-        readerConfig.publisherId.data = &publisherIdentifier;
-        readerConfig.writerGroupId    = WRITER_GROUP_ID;
-        readerConfig.dataSetWriterId  = DATASET_WRITER_ID;
-        /* Setting up Meta data configuration in DataSetReader */
-        UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
-        /* FilltestMetadata function in subscriber implementation */
-        UA_DataSetMetaDataType_init (pMetaData);
-        pMetaData->name       = UA_STRING ("DataSet Test");
-        /* Static definition of number of fields size to 1 to create one
-           targetVariable */
-        pMetaData->fieldsSize = 1;
-        pMetaData->fields     = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                                                                 &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-        /* Boolean DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[0]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_BOOLEAN].typeId,
-                        &pMetaData->fields[0].dataType);
-        pMetaData->fields[0].builtInType = UA_NS0ID_BOOLEAN;
-        pMetaData->fields[0].valueRank   = -1; /* scalar */
-        retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
-                                             &readerIdentifier);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Add Subscribed Variables */
-        UA_NodeId folderId;
-        UA_NodeId newnodeId;
-        UA_String folderName      = readerConfig.dataSetMetaData.name;
-        UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-        UA_QualifiedName folderBrowseName;
-        if (folderName.length > 0) {
-            oAttr.displayName.locale        = UA_STRING ("en-US");
-            oAttr.displayName.text          = folderName;
-            folderBrowseName.namespaceIndex = 1;
-            folderBrowseName.name           = folderName;
-        }
-        else {
-            oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
-            folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-        }
-
-        retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         folderBrowseName, UA_NODEID_NUMERIC(0,
-                                         UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Variable to subscribe data */
-        UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-        vAttr.description = UA_LOCALIZEDTEXT ("en-US", "Subscribed Bool");
-        vAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Bool");
-        vAttr.dataType    = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
-        retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
-                                           UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),  UA_QUALIFIEDNAME(1, "Subscribed Bool"),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType targetVars;
-        targetVars.targetVariablesSize = 1;
-        targetVars.targetVariables     = (UA_FieldTargetDataType *)
-                                          UA_calloc(targetVars.targetVariablesSize,
-                                          sizeof(UA_FieldTargetDataType));
-        /* For creating Targetvariable */
-        UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
-        targetVars.targetVariables[0].attributeId  = UA_ATTRIBUTEID_VALUE;
-        targetVars.targetVariables[0].targetNodeId = newnodeId;
-        retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
-                                                                &targetVars);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType_deleteMembers(&targetVars);
-        UA_free(pMetaData->fields);
-        /* run server - publisher and subscriber */
-        UA_Server_run_iterate(server,true);
-
-        /* Read data sent by the Publisher */
-        UA_Variant *publishedNodeData = UA_Variant_new();
-        retVal                        = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Read data received by the Subscriber */
-        UA_Variant *subscribedNodeData = UA_Variant_new();
-        retVal                         = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Check if data sent from Publisher is being received by Subscriber */
-        ck_assert_int_eq(*(UA_Boolean *)publishedNodeData->data, *(UA_Boolean *)subscribedNodeData->data);
-        UA_Variant_delete(subscribedNodeData);
-        UA_Variant_delete(publishedNodeData);
-    } END_TEST
-
-START_TEST(SinglePublishSubscribewithValidIdentifiers) {
-        /* To check status after running both publisher and subscriber */
-        UA_StatusCode retVal = UA_STATUSCODE_GOOD;
-        UA_PublishedDataSetConfig pdsConfig;
-        UA_NodeId dataSetWriter;
-        UA_NodeId readerIdentifier;
-        UA_NodeId writerGroup;
-        UA_DataSetReaderConfig readerConfig;
-
-        /* Published DataSet */
-        memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
-        pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
-        pdsConfig.name = UA_STRING("PublishedDataSet Test");
-        UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Create variable to publish integer data */
-        UA_NodeId publisherNode;
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.description           = UA_LOCALIZEDTEXT("en-US","Published Integer");
-        attr.displayName           = UA_LOCALIZEDTEXT("en-US","Published Integer");
-        attr.dataType              = UA_TYPES[UA_TYPES_UINT32].typeId;
-        attr.accessLevel           = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-        UA_UInt32 publisherData    = PUBLISHER_DATA;
-        UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_UINT32]);
-        retVal                     = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                                               UA_QUALIFIEDNAME(1, "Published Integer"),
-                                                               UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                               attr, NULL, &publisherNode);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Data Set Field */
-        UA_NodeId dataSetFieldIdent;
-        UA_DataSetFieldConfig dataSetFieldConfig;
-        memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
-        dataSetFieldConfig.dataSetFieldType              = UA_PUBSUB_DATASETFIELD_VARIABLE;
-        dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Integer");
-        dataSetFieldConfig.field.variable.promotedField  = UA_FALSE;
-        dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
-        dataSetFieldConfig.field.variable.publishParameters.attributeId       = UA_ATTRIBUTEID_VALUE;
-        UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
-
-        /* Writer group */
-        UA_WriterGroupConfig writerGroupConfig;
-        memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
-        writerGroupConfig.name               = UA_STRING("WriterGroup Test");
-        writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
-        writerGroupConfig.enabled            = UA_FALSE;
-        writerGroupConfig.writerGroupId      = WRITER_GROUP_ID;
-        writerGroupConfig.encodingMimeType   = UA_PUBSUB_ENCODING_UADP;
-        /* Message settings in WriterGroup to include necessary headers */
-        writerGroupConfig.messageSettings.encoding             = UA_EXTENSIONOBJECT_DECODED;
-        writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
-        UA_UadpWriterGroupMessageDataType *writerGroupMessage  = UA_UadpWriterGroupMessageDataType_new();
-        writerGroupMessage->networkMessageContentMask          = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
-                                                                  (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
-        writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
-        retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
-        UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* DataSetWriter */
-        UA_DataSetWriterConfig dataSetWriterConfig;
-        memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
-        dataSetWriterConfig.name            = UA_STRING("DataSetWriter Test");
-        dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
-        dataSetWriterConfig.keyFrameCount   = 10;
-        retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Reader Group */
-        UA_ReaderGroupConfig readerGroupConfig;
-        memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
-        readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
-        retVal |=  UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
-
-        /* Data Set Reader */
-        /* Parameters to filter received NetworkMessage */
-        memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
-        readerConfig.name             = UA_STRING ("DataSetReader Test");
-        UA_UInt16 publisherIdentifier = PUBLISHER_ID;
-        readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
-        readerConfig.publisherId.data = &publisherIdentifier;
-        readerConfig.writerGroupId    = WRITER_GROUP_ID;
-        readerConfig.dataSetWriterId  = DATASET_WRITER_ID;
-        /* Setting up Meta data configuration in DataSetReader */
-        UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
-        /* FilltestMetadata function in subscriber implementation */
-        UA_DataSetMetaDataType_init (pMetaData);
-        pMetaData->name       = UA_STRING ("DataSet Test");
-        /* Static definition of number of fields size to 1 to create one
-        targetVariable */
-        pMetaData->fieldsSize = 1;
-        pMetaData->fields     = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
-                                                                 &UA_TYPES[UA_TYPES_FIELDMETADATA]);
-        /* Unsigned Integer DataType */
-        UA_FieldMetaData_init (&pMetaData->fields[0]);
-        UA_NodeId_copy (&UA_TYPES[UA_TYPES_UINT32].typeId,
-                        &pMetaData->fields[0].dataType);
-        pMetaData->fields[0].builtInType = UA_NS0ID_UINT32;
-        pMetaData->fields[0].valueRank   = -1; /* scalar */
-        retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
-                                             &readerIdentifier);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        /* Add Subscribed Variables */
-        UA_NodeId folderId;
-        UA_NodeId newnodeId;
-        UA_String folderName      = readerConfig.dataSetMetaData.name;
-        UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-        UA_QualifiedName folderBrowseName;
-        if (folderName.length > 0) {
-            oAttr.displayName.locale        = UA_STRING ("en-US");
-            oAttr.displayName.text          = folderName;
-            folderBrowseName.namespaceIndex = 1;
-            folderBrowseName.name           = folderName;
-        }
-        else {
-            oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
-            folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
-        }
-
-        retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                         folderBrowseName, UA_NODEID_NUMERIC(0,
-                                         UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Variable to subscribe data */
-        UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-        vAttr.displayName.locale    = UA_STRING ("en-US");
-        vAttr.displayName.text      = UA_STRING ("Subscribed Integer");
-        vAttr.valueRank             = -1;
-        retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
-                                           UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),  UA_QUALIFIEDNAME(1, "Subscribed Integer"),
-                                           UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType targetVars;
-        targetVars.targetVariablesSize = 1;
-        targetVars.targetVariables     = (UA_FieldTargetDataType *)
-                                          UA_calloc(targetVars.targetVariablesSize,
-                                          sizeof(UA_FieldTargetDataType));
-        /* For creating Targetvariable */
-        UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
-        targetVars.targetVariables[0].attributeId  = UA_ATTRIBUTEID_VALUE;
-        targetVars.targetVariables[0].targetNodeId = newnodeId;
-        retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
-                                                                &targetVars);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-        UA_TargetVariablesDataType_deleteMembers(&targetVars);
-        UA_free(pMetaData->fields);
-        /* run server - publisher and subscriber */
-        UA_Server_run_iterate(server,true);
-
-        /* Read data sent by the Publisher */
-        UA_Variant *publishedNodeData = UA_Variant_new();
-        retVal                        = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Read data received by the Subscriber */
-        UA_Variant *subscribedNodeData = UA_Variant_new();
-        retVal                         = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
-        ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-        /* Check if data sent from Publisher is being received by Subscriber */
-        ck_assert_int_eq(*(UA_UInt32 *)publishedNodeData->data, *(UA_UInt32 *)subscribedNodeData->data);
-        UA_Variant_delete(subscribedNodeData);
-        UA_Variant_delete(publishedNodeData);
-    } END_TEST
-
-int main(void) {
-    TCase *tc_add_pubsub_readergroup = tcase_create("PubSub readerGroup items handling");
-    tcase_add_checked_fixture(tc_add_pubsub_readergroup, setup, teardown);
-
-    /* Test cases for ReaderGroup functionality */
-    tcase_add_test(tc_add_pubsub_readergroup, AddReaderGroupWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, AddReaderGroupWithNullConfig);
-    tcase_add_test(tc_add_pubsub_readergroup, AddReaderGroupWithInvalidConnectionId);
-    tcase_add_test(tc_add_pubsub_readergroup, RemoveReaderGroupWithInvalidIdentifier);
-    tcase_add_test(tc_add_pubsub_readergroup, AddRemoveMultipleAddReaderGroupWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, UpdateReaderGroupWithInvalidIdentifier);
-    tcase_add_test(tc_add_pubsub_readergroup, GetReaderGroupConfigWithInvalidConfig);
-    tcase_add_test(tc_add_pubsub_readergroup, GetReaderGroupConfigWithInvalidIdentifier);
-    tcase_add_test(tc_add_pubsub_readergroup, GetReaderGroupConfigWithValidConfig);
-
-    /* Test cases for DataSetReader functionality */
-    tcase_add_test(tc_add_pubsub_readergroup, AddDataSetReaderWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, AddDataSetReaderWithNullConfig);
-    tcase_add_test(tc_add_pubsub_readergroup, RemoveDataSetReaderWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, RemoveDataSetReaderWithInvalidIdentifier);
-    tcase_add_test(tc_add_pubsub_readergroup, AddMultipleDataSetReaderWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, UpdateDataSetReaderConfigWithInvalidId);
-    tcase_add_test(tc_add_pubsub_readergroup, GetDataSetReaderConfigWithValidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, GetDataSetReaderConfigWithInvalidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, GetDataSetReaderConfigWithInvalidIdentifier);
-    tcase_add_test(tc_add_pubsub_readergroup, CreateTargetVariableWithInvalidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, AddTargetVariableWithInvalidConfiguration);
-    tcase_add_test(tc_add_pubsub_readergroup, AddTargetVariableWithValidConfiguration);
-
-    /*Test case to run both publisher and subscriber */
-    TCase *tc_pubsub_publish_subscribe = tcase_create("Publisher publishing and Subscriber subscribing");
-    tcase_add_checked_fixture(tc_pubsub_publish_subscribe, setup, teardown);
-    tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeDateTime);
-    tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeInt32);
-    tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeInt64);
-    tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeBool);
-    tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribewithValidIdentifiers);
-
-    Suite *suite = suite_create("PubSub readerGroups/reader/Fields handling and publishing");
-    suite_add_tcase(suite, tc_add_pubsub_readergroup);
-    suite_add_tcase(suite, tc_pubsub_publish_subscribe);
-
-    SRunner *suiteRunner = srunner_create(suite);
-    srunner_set_fork_status(suiteRunner, CK_NOFORK);
-    srunner_run_all(suiteRunner,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(suiteRunner);
-    srunner_free(suiteRunner);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_accesscontrol.c b/ext/open62541/tests/server/check_accesscontrol.c
deleted file mode 100644
index b96843c..0000000
--- a/ext/open62541/tests/server/check_accesscontrol.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include <check.h>
-
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-THREAD_HANDLE server_thread;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(Client_anonymous) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-} END_TEST
-
-START_TEST(Client_user_pass_ok) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval =
-        UA_Client_connect_username(client, "opc.tcp://localhost:4840", "user1", "password");
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-} END_TEST
-
-START_TEST(Client_user_fail) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval =
-        UA_Client_connect_username(client, "opc.tcp://localhost:4840", "user0", "password");
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADUSERACCESSDENIED);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-} END_TEST
-
-START_TEST(Client_pass_fail) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval =
-        UA_Client_connect_username(client, "opc.tcp://localhost:4840", "user1", "secret");
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADUSERACCESSDENIED);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-} END_TEST
-
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Client");
-    TCase *tc_client_user = tcase_create("Client User/Password");
-    tcase_add_checked_fixture(tc_client_user, setup, teardown);
-    tcase_add_test(tc_client_user, Client_anonymous);
-    tcase_add_test(tc_client_user, Client_user_pass_ok);
-    tcase_add_test(tc_client_user, Client_user_fail);
-    tcase_add_test(tc_client_user, Client_pass_fail);
-    suite_add_tcase(s,tc_client_user);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_discovery.c b/ext/open62541/tests/server/check_discovery.c
deleted file mode 100644
index 9713d41..0000000
--- a/ext/open62541/tests/server/check_discovery.c
+++ /dev/null
@@ -1,653 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
-*  License, v. 2.0. If a copy of the MPL was not distributed with this
-*  file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-
-#include <fcntl.h>
-
-#include "testing_clock.h"
-#include "thread_wrapper.h"
-#ifndef WIN32
-#include <sys/stat.h>
-#endif
-#include <check.h>
-
-#ifndef _WIN32
-#include <sys/stat.h>
-#endif
-
-// set register timeout to 1 second so we are able to test it.
-#define registerTimeout 1
-// cleanup is only triggered every 10 seconds, thus wait a bit longer to check
-#define checkWait registerTimeout + 11
-
-UA_Server *server_lds;
-UA_Boolean *running_lds;
-THREAD_HANDLE server_thread_lds;
-UA_Client *clientRegisterRepeated;
-
-THREAD_CALLBACK(serverloop_lds) {
-    while(*running_lds)
-        UA_Server_run_iterate(server_lds, true);
-    return 0;
-}
-
-static void configure_lds_server(UA_Server *pServer)
-{
-    UA_ServerConfig *config_lds = UA_Server_getConfig(pServer);
-    UA_ServerConfig_setDefault(config_lds);
-
-    config_lds->applicationDescription.applicationType = UA_APPLICATIONTYPE_DISCOVERYSERVER;
-    UA_String_deleteMembers(&config_lds->applicationDescription.applicationUri);
-    config_lds->applicationDescription.applicationUri =
-        UA_STRING_ALLOC("urn:open62541.test.local_discovery_server");
-    UA_LocalizedText_deleteMembers(&config_lds->applicationDescription.applicationName);
-    config_lds->applicationDescription.applicationName
-        = UA_LOCALIZEDTEXT_ALLOC("en", "LDS Server");
-    config_lds->discovery.mdnsEnable = true;
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    config_lds->discovery.mdns.mdnsServerName = UA_String_fromChars("LDS_test");
-    config_lds->discovery.mdns.serverCapabilitiesSize = 1;
-    UA_String *caps = UA_String_new();
-    *caps = UA_String_fromChars("LDS");
-    config_lds->discovery.mdns.serverCapabilities = caps;
-#endif
-    config_lds->discovery.cleanupTimeout = registerTimeout;
-}
-
-static void setup_lds(void) {
-    // start LDS server
-    running_lds = UA_Boolean_new();
-    *running_lds = true;
-
-    server_lds = UA_Server_new();
-    configure_lds_server(server_lds);
-
-    UA_Server_run_startup(server_lds);
-    THREAD_CREATE(server_thread_lds, serverloop_lds);
-
-    // wait until LDS started
-    UA_fakeSleep(1000);
-    UA_realSleep(1000);
-}
-
-static void teardown_lds(void) {
-    *running_lds = false;
-    THREAD_JOIN(server_thread_lds);
-    UA_Server_run_shutdown(server_lds);
-    UA_Boolean_delete(running_lds);
-    UA_Server_delete(server_lds);
-}
-
-UA_Server *server_register;
-UA_Boolean *running_register;
-THREAD_HANDLE server_thread_register;
-
-UA_UInt64 periodicRegisterCallbackId;
-
-THREAD_CALLBACK(serverloop_register) {
-    while(*running_register)
-        UA_Server_run_iterate(server_register, true);
-    return 0;
-}
-
-static void setup_register(void) {
-    // start register server
-    running_register = UA_Boolean_new();
-    *running_register = true;
-
-    server_register = UA_Server_new();
-    UA_ServerConfig *config_register = UA_Server_getConfig(server_register);
-    UA_ServerConfig_setMinimal(config_register, 16664, NULL);
-
-    UA_String_deleteMembers(&config_register->applicationDescription.applicationUri);
-    config_register->applicationDescription.applicationUri =
-        UA_String_fromChars("urn:open62541.test.server_register");
-    UA_LocalizedText_deleteMembers(&config_register->applicationDescription.applicationName);
-    config_register->applicationDescription.applicationName =
-        UA_LOCALIZEDTEXT_ALLOC("de", "Anmeldungsserver");
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    config_register->discovery.mdns.mdnsServerName = UA_String_fromChars("Register_test");
-#endif
-
-    UA_Server_run_startup(server_register);
-    THREAD_CREATE(server_thread_register, serverloop_register);
-}
-
-static void teardown_register(void) {
-    *running_register = false;
-    THREAD_JOIN(server_thread_register);
-    UA_Server_run_shutdown(server_register);
-    UA_Boolean_delete(running_register);
-    UA_Server_delete(server_register);
-}
-
-START_TEST(Server_new_delete) {
-    UA_Server *pServer = UA_Server_new();
-    configure_lds_server(pServer);
-    UA_Server_delete(pServer);
-}
-END_TEST
-
-START_TEST(Server_new_shutdown_delete) {
-        UA_Server *pServer = UA_Server_new();
-        configure_lds_server(pServer);
-        UA_StatusCode retval = UA_Server_run_shutdown(pServer);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        UA_Server_delete(pServer);
-}
-END_TEST
-
-START_TEST(Server_register) {
-    UA_Client *clientRegister = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(clientRegister));
-
-    UA_StatusCode retval = UA_Client_connect_noSession(clientRegister, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = UA_Server_register_discovery(server_register, clientRegister , NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Client_disconnect(clientRegister);
-    UA_Client_delete(clientRegister);
-}
-END_TEST
-
-START_TEST(Server_unregister) {
-    UA_Client *clientRegister = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(clientRegister));
-
-    UA_StatusCode retval = UA_Client_connect_noSession(clientRegister, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = UA_Server_unregister_discovery(server_register, clientRegister);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Client_disconnect(clientRegister);
-    UA_Client_delete(clientRegister);
-}
-END_TEST
-
-#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE
-
-#ifndef WIN32
-#define SEMAPHORE_PATH "/tmp/open62541-unit-test-semaphore"
-#else
-#define SEMAPHORE_PATH ".\\open62541-unit-test-semaphore"
-#endif
-
-START_TEST(Server_register_semaphore) {
-    // create the semaphore
-#ifndef WIN32
-    int fd = open(SEMAPHORE_PATH, O_RDWR|O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
-    ck_assert_int_ne(fd, -1);
-    close(fd);
-#else
-    FILE *fp;
-    fopen_s(&fp, SEMAPHORE_PATH, "ab+");
-    ck_assert_ptr_ne(fp, NULL);
-    fclose(fp);
-#endif
-
-    UA_Client *clientRegister = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(clientRegister));
-
-    UA_StatusCode retval = UA_Client_connect_noSession(clientRegister, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = UA_Server_register_discovery(server_register, clientRegister, SEMAPHORE_PATH);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Client_disconnect(clientRegister);
-    UA_Client_delete(clientRegister);
-}
-END_TEST
-
-START_TEST(Server_unregister_semaphore) {
-    // delete the semaphore, this should remove the registration automatically on next check
-    ck_assert_int_eq(remove(SEMAPHORE_PATH), 0);
-}
-END_TEST
-
-#endif /* UA_ENABLE_DISCOVERY_SEMAPHORE */
-
-START_TEST(Server_register_periodic) {
-    ck_assert(clientRegisterRepeated == NULL);
-
-    clientRegisterRepeated = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(clientRegisterRepeated));
-
-    ck_assert(clientRegisterRepeated != NULL);
-    // periodic register every minute, first register immediately
-    UA_StatusCode retval = UA_Server_addPeriodicServerRegisterCallback(server_register, clientRegisterRepeated, "opc.tcp://localhost:4840",
-                                                    60*1000, 100, &periodicRegisterCallbackId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(Server_unregister_periodic) {
-    // wait for first register delay
-    UA_fakeSleep(1000);
-    UA_realSleep(1000);
-    UA_Server_removeRepeatedCallback(server_register, periodicRegisterCallbackId);
-    UA_StatusCode retval = UA_Server_unregister_discovery(server_register, clientRegisterRepeated);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Client_disconnect(clientRegisterRepeated);
-    UA_Client_delete(clientRegisterRepeated);
-    clientRegisterRepeated=NULL;
-}
-END_TEST
-
-static void
-FindAndCheck(const UA_String expectedUris[], size_t expectedUrisSize,
-             const UA_String expectedLocales[],
-             const UA_String expectedNames[],
-             const char *filterUri,
-             const char *filterLocale) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_ApplicationDescription* applicationDescriptionArray = NULL;
-    size_t applicationDescriptionArraySize = 0;
-
-    size_t serverUrisSize = 0;
-    UA_String *serverUris = NULL;
-
-    if(filterUri) {
-        serverUrisSize = 1;
-        serverUris = UA_String_new();
-        serverUris[0] = UA_String_fromChars(filterUri);
-    }
-
-    size_t localeIdsSize = 0;
-    UA_String *localeIds = NULL;
-
-    if(filterLocale) {
-        localeIdsSize = 1;
-        localeIds = UA_String_new();
-        localeIds[0] = UA_String_fromChars(filterLocale);
-    }
-
-    UA_StatusCode retval =
-        UA_Client_findServers(client, "opc.tcp://localhost:4840",
-                              serverUrisSize, serverUris, localeIdsSize, localeIds,
-                              &applicationDescriptionArraySize, &applicationDescriptionArray);
-
-    if(filterUri)
-        UA_Array_delete(serverUris, serverUrisSize, &UA_TYPES[UA_TYPES_STRING]);
-
-    if(filterLocale)
-        UA_Array_delete(localeIds, localeIdsSize, &UA_TYPES[UA_TYPES_STRING]);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // only the discovery server is expected
-    ck_assert_uint_eq(applicationDescriptionArraySize, expectedUrisSize);
-    ck_assert(applicationDescriptionArray != NULL);
-
-    for(size_t i = 0; i < expectedUrisSize; ++i) {
-        ck_assert(UA_String_equal(&applicationDescriptionArray[i].applicationUri,
-                                  &expectedUris[i]));
-
-        if(expectedNames)
-            ck_assert(UA_String_equal(&applicationDescriptionArray[i].applicationName.text,
-                                      &expectedNames[i]));
-
-        if (expectedLocales)
-            ck_assert(UA_String_equal(&applicationDescriptionArray[i].applicationName.locale,
-                                      &expectedLocales[i]));
-    }
-
-    UA_Array_delete(applicationDescriptionArray, applicationDescriptionArraySize,
-                    &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-
-static void
-FindOnNetworkAndCheck(UA_String expectedServerNames[], size_t expectedServerNamesSize,
-                      const char *filterUri, const char *filterLocale,
-                      const char** filterCapabilities, size_t filterCapabilitiesSize) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_ServerOnNetwork* serverOnNetwork = NULL;
-    size_t serverOnNetworkSize = 0;
-
-    size_t  serverCapabilityFilterSize = 0;
-    UA_String *serverCapabilityFilter = NULL;
-
-    if(filterCapabilitiesSize) {
-        serverCapabilityFilterSize = filterCapabilitiesSize;
-        serverCapabilityFilter = (UA_String*)UA_malloc(sizeof(UA_String) * filterCapabilitiesSize);
-        for(size_t i = 0; i < filterCapabilitiesSize; i++)
-            serverCapabilityFilter[i] = UA_String_fromChars(filterCapabilities[i]);
-    }
-
-
-    UA_StatusCode retval =
-        UA_Client_findServersOnNetwork(client, "opc.tcp://localhost:4840", 0, 0,
-                                       serverCapabilityFilterSize, serverCapabilityFilter,
-                                       &serverOnNetworkSize, &serverOnNetwork);
-
-    if(serverCapabilityFilterSize)
-        UA_Array_delete(serverCapabilityFilter, serverCapabilityFilterSize,
-                        &UA_TYPES[UA_TYPES_STRING]);
-
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // only the discovery server is expected
-    ck_assert_uint_eq(serverOnNetworkSize , expectedServerNamesSize);
-
-    if(expectedServerNamesSize > 0)
-        ck_assert_ptr_ne(serverOnNetwork, NULL);
-
-    if(serverOnNetwork != NULL) {
-        for(size_t i = 0; i < expectedServerNamesSize; i++) {
-            UA_Boolean expectedServerNameInServerOnNetwork = false;
-            for(size_t j = 0; j < expectedServerNamesSize && !expectedServerNameInServerOnNetwork; j++) {
-                expectedServerNameInServerOnNetwork = UA_String_equal(&serverOnNetwork[j].serverName,
-                                        &expectedServerNames[i]);
-            }
-            ck_assert_msg(expectedServerNameInServerOnNetwork, "Expected %.*s in serverOnNetwork list, but not found",
-                expectedServerNames[i].length, expectedServerNames[i].data);
-        }
-    }
-
-    UA_Array_delete(serverOnNetwork, serverOnNetworkSize, &UA_TYPES[UA_TYPES_SERVERONNETWORK]);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-}
-
-static UA_StatusCode
-GetEndpoints(UA_Client *client, const UA_String* endpointUrl,
-             size_t* endpointDescriptionsSize,
-             UA_EndpointDescription** endpointDescriptions,
-             const char* filterTransportProfileUri) {
-    UA_GetEndpointsRequest request;
-    UA_GetEndpointsRequest_init(&request);
-    //request.requestHeader.authenticationToken = client->authenticationToken;
-    request.requestHeader.timestamp = UA_DateTime_now();
-    request.requestHeader.timeoutHint = 10000;
-    request.endpointUrl = *endpointUrl; // assume the endpointurl outlives the service call
-    if (filterTransportProfileUri) {
-        request.profileUrisSize = 1;
-        request.profileUris = (UA_String*)UA_malloc(sizeof(UA_String));
-        request.profileUris[0] = UA_String_fromChars(filterTransportProfileUri);
-    }
-
-    UA_GetEndpointsResponse response;
-    UA_GetEndpointsResponse_init(&response);
-    __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST],
-                        &response, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]);
-
-    if (filterTransportProfileUri) {
-        UA_Array_delete(request.profileUris, request.profileUrisSize, &UA_TYPES[UA_TYPES_STRING]);
-    }
-
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    *endpointDescriptionsSize = response.endpointsSize;
-    *endpointDescriptions =
-        (UA_EndpointDescription*)UA_Array_new(response.endpointsSize,
-                                              &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-    for(size_t i=0;i<response.endpointsSize;i++) {
-        UA_EndpointDescription_init(&(*endpointDescriptions)[i]);
-        UA_EndpointDescription_copy(&response.endpoints[i], &(*endpointDescriptions)[i]);
-    }
-    UA_GetEndpointsResponse_deleteMembers(&response);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-GetEndpointsAndCheck(const char* discoveryUrl, const char* filterTransportProfileUri,
-                     const UA_String expectedEndpointUrls[], size_t expectedEndpointUrlsSize) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    ck_assert_uint_eq(UA_Client_connect(client, discoveryUrl), UA_STATUSCODE_GOOD);
-
-    UA_EndpointDescription* endpointArray = NULL;
-    size_t endpointArraySize = 0;
-    UA_String discoveryUrlUA = UA_String_fromChars(discoveryUrl);
-    UA_StatusCode retval = GetEndpoints(client, &discoveryUrlUA, &endpointArraySize,
-                                        &endpointArray, filterTransportProfileUri);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_String_deleteMembers(&discoveryUrlUA);
-
-    ck_assert_uint_eq(endpointArraySize , expectedEndpointUrlsSize);
-
-    for(size_t j = 0; j < endpointArraySize && j < expectedEndpointUrlsSize; j++) {
-        UA_EndpointDescription* endpoint = &endpointArray[j];
-        ck_assert(UA_String_equal(&endpoint->endpointUrl, &expectedEndpointUrls[j]));
-    }
-
-    UA_Array_delete(endpointArray, endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
-    UA_Client_delete(client);
-}
-
-// Test if discovery server lists himself as registered server if it is filtered by his uri
-START_TEST(Client_filter_discovery) {
-    UA_String expectedUris[1];
-    expectedUris[0] = UA_STRING("urn:open62541.test.local_discovery_server");
-    FindAndCheck(expectedUris, 1, NULL, NULL, "urn:open62541.test.local_discovery_server", NULL);
-}
-END_TEST
-
-// Test if server filters locale
-START_TEST(Client_filter_locale) {
-    UA_String expectedUris[2];
-    expectedUris[0] = UA_STRING("urn:open62541.test.local_discovery_server"),
-    expectedUris[1] = UA_STRING("urn:open62541.test.server_register");
-    UA_String expectedNames[2];
-    expectedNames[0]= UA_STRING("LDS Server");
-    expectedNames[1]= UA_STRING("Anmeldungsserver");
-    UA_String expectedLocales[2];
-    expectedLocales[0] = UA_STRING("en");
-    expectedLocales[1] = UA_STRING("de");
-    // even if we request en-US, the server will return de-DE because it only has that name.
-    FindAndCheck(expectedUris, 2, expectedLocales, expectedNames, NULL, "en");
-
-}
-END_TEST
-
-// Test if registered server is returned from LDS using FindServersOnNetwork
-START_TEST(Client_find_on_network_registered) {
-    char urls[2][64];
-    UA_String expectedUris[2];
-    char hostname[256];
-
-    ck_assert_uint_eq(gethostname(hostname, 255), 0);
-
-    //DNS limits name to max 63 chars (+ \0)
-    //We need this ugly casting, otherwise gcc >7.2 will complain about format-truncation, but we want it here
-    void *hostnameVoid = (void*)hostname;
-    snprintf(urls[0], 64, "LDS_test-%s", (char*)hostnameVoid);
-    snprintf(urls[1], 64, "Register_test-%s", (char*)hostnameVoid);
-    expectedUris[0] = UA_STRING(urls[0]);
-    expectedUris[1] = UA_STRING(urls[1]);
-    FindOnNetworkAndCheck(expectedUris, 2, NULL, NULL, NULL, 0);
-
-    // filter by Capabilities
-    const char* capsLDS[] = {"LDS"};
-    const char* capsNA[] = {"NA"};
-    const char* capsMultiple[] = {"LDS", "NA"};
-
-    // only LDS expected
-    FindOnNetworkAndCheck(expectedUris, 1, NULL, NULL, capsLDS, 1);
-    // only register server expected
-    FindOnNetworkAndCheck(&expectedUris[1], 1, NULL, NULL, capsNA, 1);
-    // no server expected
-    FindOnNetworkAndCheck(NULL, 0, NULL, NULL, capsMultiple, 2);
-}
-END_TEST
-
-// Test if filtering with uris works
-START_TEST(Client_find_filter) {
-    UA_String expectedUris[1];
-    expectedUris[0] = UA_STRING("urn:open62541.test.server_register");
-    FindAndCheck(expectedUris, 1, NULL, NULL, "urn:open62541.test.server_register", NULL);
-}
-END_TEST
-
-START_TEST(Client_get_endpoints) {
-    UA_String  expectedEndpoints[1];
-    expectedEndpoints[0] = UA_STRING("opc.tcp://localhost:4840");
-
-    // general check if expected endpoints are returned
-    GetEndpointsAndCheck("opc.tcp://localhost:4840", NULL,expectedEndpoints, 1);
-
-    // check if filtering transport profile still returns the endpoint
-    GetEndpointsAndCheck("opc.tcp://localhost:4840",
-                         "http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary",
-                         expectedEndpoints, 1);
-
-    // filter transport profily by HTTPS, which should return no endpoint
-    GetEndpointsAndCheck("opc.tcp://localhost:4840",
-                         "http://opcfoundation.org/UA-Profile/Transport/https-uabinary", NULL, 0);
-}
-END_TEST
-
-#endif
-
-// Test if discovery server lists himself as registered server, before any other registration.
-START_TEST(Client_find_discovery) {
-    UA_String expectedUris[1];
-    expectedUris[0] = UA_STRING("urn:open62541.test.local_discovery_server");
-    FindAndCheck(expectedUris, 1, NULL, NULL, NULL, NULL);
-}
-END_TEST
-
-// Test if registered server is returned from LDS
-START_TEST(Client_find_registered) {
-    UA_String expectedUris[2];
-    expectedUris[0] = UA_STRING("urn:open62541.test.local_discovery_server");
-    expectedUris[1] = UA_STRING("urn:open62541.test.server_register");
-    FindAndCheck(expectedUris, 2, NULL, NULL, NULL, NULL);
-}
-END_TEST
-
-START_TEST(Util_start_lds) {
-    setup_lds();
-}
-END_TEST
-
-START_TEST(Util_stop_lds) {
-    teardown_lds();
-}
-END_TEST
-
-START_TEST(Util_wait_timeout) {
-    // wait until server is removed by timeout. Additionally wait a few seconds more to be sure.
-    UA_fakeSleep(100000 * checkWait);
-    UA_realSleep(1000);
-}
-END_TEST
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-START_TEST(Util_wait_mdns) {
-    UA_fakeSleep(5000);
-    UA_realSleep(5000);
-}
-END_TEST
-#endif
-
-START_TEST(Util_wait_startup) {
-    UA_fakeSleep(1000);
-    UA_realSleep(1000);
-}
-END_TEST
-
-START_TEST(Util_wait_retry) {
-    // first retry is after 2 seconds, then 4, so it should be enough to wait 3 seconds
-    UA_fakeSleep(3000);
-    UA_realSleep(3000);
-}
-END_TEST
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Register Server and Client");
-
-    TCase *tc_new_del = tcase_create("New Delete");
-    tcase_add_test(tc_new_del, Server_new_delete);
-    tcase_add_test(tc_new_del, Server_new_shutdown_delete);
-    suite_add_tcase(s,tc_new_del);
-
-    TCase *tc_register = tcase_create("RegisterServer");
-    tcase_add_unchecked_fixture(tc_register, setup_lds, teardown_lds);
-    tcase_add_unchecked_fixture(tc_register, setup_register, teardown_register);
-    tcase_add_test(tc_register, Server_register);
-    // register two times, just for fun
-    tcase_add_test(tc_register, Server_register);
-    tcase_add_test(tc_register, Server_unregister);
-    tcase_add_test(tc_register, Server_register_periodic);
-    tcase_add_test(tc_register, Server_unregister_periodic);
-    suite_add_tcase(s,tc_register);
-
-    TCase *tc_register_retry = tcase_create("RegisterServer Retry");
-    //tcase_add_unchecked_fixture(tc_register, setup_lds, teardown_lds);
-    tcase_add_unchecked_fixture(tc_register_retry, setup_register, teardown_register);
-    tcase_add_test(tc_register_retry, Server_register_periodic);
-    tcase_add_test(tc_register_retry, Util_wait_startup); // wait a bit to let first try run through
-    // now start LDS
-    tcase_add_test(tc_register_retry, Util_start_lds);
-    tcase_add_test(tc_register_retry, Util_wait_retry);
-    // check if there
-    tcase_add_test(tc_register_retry, Client_find_registered);
-    tcase_add_test(tc_register_retry, Server_unregister_periodic);
-    tcase_add_test(tc_register_retry, Client_find_discovery);
-    tcase_add_test(tc_register_retry, Util_stop_lds);
-
-    suite_add_tcase(s,tc_register_retry);
-
-#ifdef UA_ENABLE_DISCOVERY_MULTICAST
-    TCase *tc_register_find = tcase_create("RegisterServer and FindServers");
-    tcase_add_unchecked_fixture(tc_register_find, setup_lds, teardown_lds);
-    tcase_add_unchecked_fixture(tc_register_find, setup_register, teardown_register);
-    tcase_add_test(tc_register_find, Client_find_discovery);
-    tcase_add_test(tc_register_find, Server_register);
-    tcase_add_test(tc_register_find, Client_find_registered);
-    tcase_add_test(tc_register_find, Util_wait_mdns);
-    tcase_add_test(tc_register_find, Client_find_on_network_registered);
-    tcase_add_test(tc_register_find, Client_find_filter);
-    tcase_add_test(tc_register_find, Client_get_endpoints);
-    tcase_add_test(tc_register_find, Client_filter_locale);
-    tcase_add_test(tc_register_find, Server_unregister);
-    tcase_add_test(tc_register_find, Client_find_discovery);
-    tcase_add_test(tc_register_find, Client_filter_discovery);
-    suite_add_tcase(s,tc_register_find);
-#endif
-
-    // register server again, then wait for timeout and auto unregister
-    TCase *tc_register_timeout = tcase_create("RegisterServer timeout");
-    tcase_add_unchecked_fixture(tc_register_timeout, setup_lds, teardown_lds);
-    tcase_add_unchecked_fixture(tc_register_timeout, setup_register, teardown_register);
-    tcase_set_timeout(tc_register_timeout, checkWait+2);
-    tcase_add_test(tc_register_timeout, Server_register);
-    tcase_add_test(tc_register_timeout, Client_find_registered);
-    tcase_add_test(tc_register_timeout, Util_wait_timeout);
-    tcase_add_test(tc_register_timeout, Client_find_discovery);
-#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE
-    // now check if semaphore file works
-    tcase_add_test(tc_register_timeout, Server_register_semaphore);
-    tcase_add_test(tc_register_timeout, Client_find_registered);
-    tcase_add_test(tc_register_timeout, Server_unregister_semaphore);
-    tcase_add_test(tc_register_timeout, Util_wait_timeout);
-    tcase_add_test(tc_register_timeout, Client_find_discovery);
-#endif
-    suite_add_tcase(s,tc_register_timeout);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_local_monitored_item.c b/ext/open62541/tests/server/check_local_monitored_item.c
deleted file mode 100644
index cb606fa..0000000
--- a/ext/open62541/tests/server/check_local_monitored_item.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/client_subscriptions.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include <stddef.h>
-
-#include "check.h"
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-
-#ifdef UA_ENABLE_STATUSCODE_DESCRIPTIONS
-    #define ASSERT_STATUSCODE(a,b) ck_assert_str_eq(UA_StatusCode_name(a),UA_StatusCode_name(b));
-#else
-    #define ASSERT_STATUSCODE(a,b) ck_assert_uint_eq((a),(b));
-#endif
-
-UA_Server *server;
-size_t callbackCount = 0;
-
-UA_NodeId parentNodeId;
-UA_NodeId parentReferenceNodeId;
-UA_NodeId outNodeId;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_StatusCode retval = UA_Server_run_startup(server);
-    ASSERT_STATUSCODE(retval, UA_STATUSCODE_GOOD);
-    /* Define the attribute of the uint32 variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_UInt32 myUint32 = 40;
-    UA_Variant_setScalar(&attr.value, &myUint32, &UA_TYPES[UA_TYPES_UINT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    /* Add the variable node to the information model */
-    UA_NodeId uint32NodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName uint32Name = UA_QUALIFIEDNAME(1, "the answer");
-    parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId_init(&outNodeId);
-    ASSERT_STATUSCODE(UA_Server_addVariableNode(server,
-                                                uint32NodeId,
-                                                parentNodeId,
-                                                parentReferenceNodeId,
-                                                uint32Name,
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                attr,
-                                                NULL,
-                                                &outNodeId), UA_STATUSCODE_GOOD);
-}
-
-static void teardown(void) {
-    /* cleanup */
-    UA_NodeId_deleteMembers(&parentNodeId);
-    UA_NodeId_deleteMembers(&parentReferenceNodeId);
-    UA_NodeId_deleteMembers(&outNodeId);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void
-dataChangeNotificationCallback(UA_Server *thisServer,
-                               UA_UInt32 monitoredItemId,
-                               void *monitoredItemContext,
-                               const UA_NodeId *nodeId,
-                               void *nodeContext,
-                               UA_UInt32 attributeId,
-                               const UA_DataValue *value)
-{
-    static UA_UInt32 lastValue = 100;
-    UA_UInt32 currentValue = *((UA_UInt32*)value->value.data);
-    ck_assert_uint_ne(lastValue, currentValue);
-    lastValue = currentValue;
-    callbackCount++;
-}
-
-START_TEST(Server_LocalMonitoredItem) {
-    ck_assert_uint_eq(callbackCount, 0);
-
-    UA_MonitoredItemCreateRequest monitorRequest =
-            UA_MonitoredItemCreateRequest_default(outNodeId);
-    monitorRequest.requestedParameters.samplingInterval = (double)100;
-    monitorRequest.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_MonitoredItemCreateResult result =
-            UA_Server_createDataChangeMonitoredItem(server,
-                                                    UA_TIMESTAMPSTORETURN_BOTH,
-                                                    monitorRequest,
-                                                    NULL,
-                                                    &dataChangeNotificationCallback);
-
-    ASSERT_STATUSCODE(result.statusCode, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(callbackCount, 1);
-
-    UA_UInt32 count = 0;
-    UA_Variant val;
-    UA_Variant_setScalar(&val, &count, &UA_TYPES[UA_TYPES_UINT32]);
-
-    for(size_t i = 0; i < 10; i++) {
-        count++;
-        UA_Server_writeValue(server, outNodeId, val);
-        UA_fakeSleep(100);
-        UA_Server_run_iterate(server, 1);
-    }
-    ck_assert_uint_eq(callbackCount, 11);
-}
-END_TEST
-
-static Suite* testSuite_Client(void)
-{
-    Suite *s = suite_create("Local Monitored Item");
-    TCase *tc_server = tcase_create("Local Monitored Item Basic");
-    tcase_add_checked_fixture(tc_server, setup, teardown);
-    tcase_add_test(tc_server, Server_LocalMonitoredItem);
-    suite_add_tcase(s, tc_server);
-
-    return s;
-}
-
-int main(void)
-{
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_monitoreditem_filter.c b/ext/open62541/tests/server/check_monitoreditem_filter.c
deleted file mode 100644
index f530b05..0000000
--- a/ext/open62541/tests/server/check_monitoreditem_filter.c
+++ /dev/null
@@ -1,897 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-
-#include <check.h>
-
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-
-UA_Server *server;
-UA_Boolean running;
-THREAD_HANDLE server_thread;
-
-UA_Client *client;
-UA_UInt32 subId;
-UA_NodeId parentNodeId;
-UA_NodeId parentReferenceNodeId;
-UA_NodeId outNodeId;
-
-UA_Boolean notificationReceived = false;
-UA_UInt32 countNotificationReceived = 0;
-UA_Double publishingInterval = 500.0;
-UA_DataValue lastValue;
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-
-static void setup(void) {
-    UA_DataValue_init(&lastValue);
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-    THREAD_CREATE(server_thread, serverloop);
-
-    /* Define the attribute of the double variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Double myDouble = 40.0;
-    UA_Variant_setScalar(&attr.value, &myDouble, &UA_TYPES[UA_TYPES_DOUBLE]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_NodeId doubleNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName doubleName = UA_QUALIFIEDNAME(1, "the answer");
-    parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId_init(&outNodeId);
-    ck_assert_uint_eq(UA_Server_addVariableNode(server,
-                                                doubleNodeId, parentNodeId,
-                                                parentReferenceNodeId,
-                                                doubleName,
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                attr,
-                                                NULL,
-                                                &outNodeId)
-                      , UA_STATUSCODE_GOOD);
-
-    /* Add a boolean node */
-    UA_Boolean myBool = false;
-    UA_Variant_setScalar(&attr.value, &myBool, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer bool");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer bool");
-    attr.dataType = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
-    ck_assert_uint_eq(UA_Server_addVariableNode(server,
-                                                UA_NODEID_STRING(1, "the.bool"),
-                                                parentNodeId, parentReferenceNodeId,
-                                                UA_QUALIFIEDNAME(1, "the bool"),
-                                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                attr, NULL, NULL)
-                      , UA_STATUSCODE_GOOD);
-
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    request.requestedMaxKeepAliveCount = 100;
-    UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
-                                                                            NULL, NULL, NULL);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    subId = response.subscriptionId;
-    notificationReceived = false;
-    countNotificationReceived = 0;
-}
-
-static void teardown(void) {
-    ck_assert_uint_eq(UA_Client_Subscriptions_deleteSingle(client, subId)
-                      , UA_STATUSCODE_GOOD);
-
-    /* cleanup */
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    UA_NodeId_deleteMembers(&parentNodeId);
-    UA_NodeId_deleteMembers(&parentReferenceNodeId);
-    UA_NodeId_deleteMembers(&outNodeId);
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-    UA_DataValue_deleteMembers(&lastValue);
-}
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-static void
-dataChangeHandler(UA_Client *thisClient, UA_UInt32 thisSubId, void *subContext,
-                  UA_UInt32 monId, void *monContext, UA_DataValue *value) {
-    notificationReceived = true;
-    ++countNotificationReceived;
-    UA_DataValue_deleteMembers(&lastValue);
-    UA_DataValue_copy(value, &lastValue);
-}
-
-static UA_StatusCode
-setDouble(UA_Client *thisClient, UA_NodeId node, UA_Double value) {
-    UA_Variant variant;
-    UA_Variant_setScalar(&variant, &value, &UA_TYPES[UA_TYPES_DOUBLE]);
-    return UA_Client_writeValueAttribute(thisClient, node, &variant);
-}
-
-static UA_StatusCode waitForNotification(UA_UInt32 notifications, UA_UInt32 maxTries) {
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    for (UA_UInt32 i = 0; i < maxTries; ++i) {
-        UA_fakeSleep((UA_UInt32)publishingInterval + 100);
-        retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 100));
-        if (retval != UA_STATUSCODE_GOOD)
-            return retval;
-        if (countNotificationReceived == notifications)
-            return retval;
-    }
-    return retval;
-}
-static UA_Boolean fuzzyLastValueIsEqualTo(UA_Double value) {
-    double offset = 0.001;
-    if(lastValue.hasValue
-            && lastValue.value.type == &UA_TYPES[UA_TYPES_DOUBLE]) {
-        double lastDouble = *((UA_Double*)(lastValue.value.data));
-        if (lastDouble > value - offset && lastDouble < value + offset) {
-            return true;
-        }
-    }
-    return false;
-}
-
-START_TEST(Server_MonitoredItemsAbsoluteFilterSetLater) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with no filter */
-    UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
-    UA_UInt32 newMonitoredItemIds[1];
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    // Do we get initial value ?
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should trigger because no filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(42.0));
-
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(44.0));
-
-    // set back to 40.0
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 40.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    /* modify the monitored item with an absolute filter with deadbandvalue = 2.0 */
-    UA_MonitoredItemModifyRequest itemModify;
-    UA_MonitoredItemModifyRequest_init(&itemModify);
-
-    itemModify.monitoredItemId = newMonitoredItemIds[0];
-    itemModify.requestedParameters.samplingInterval = 250;
-    itemModify.requestedParameters.discardOldest = true;
-    itemModify.requestedParameters.queueSize = 1;
-    itemModify.requestedParameters.clientHandle = newMonitoredItemIds[0];
-    UA_DataChangeFilter filter;
-    UA_DataChangeFilter_init(&filter);
-    filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
-    filter.deadbandValue = 2.0;
-    itemModify.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    itemModify.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    itemModify.requestedParameters.filter.content.decoded.data = &filter;
-
-    UA_ModifyMonitoredItemsRequest modifyRequest;
-    UA_ModifyMonitoredItemsRequest_init(&modifyRequest);
-    modifyRequest.subscriptionId = subId;
-    modifyRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    modifyRequest.itemsToModify = &itemModify;
-    modifyRequest.itemsToModifySize = 1;
-
-    UA_ModifyMonitoredItemsResponse modifyResponse =
-       UA_Client_MonitoredItems_modify(client, modifyRequest);
-
-    ck_assert_uint_eq(modifyResponse.resultsSize, 1);
-    ck_assert_uint_eq(modifyResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyResponse);
-
-    // This should trigger only once for the new filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 39.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(39.0));
-
-    // This should trigger once at 43.0.
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(43.0));
-
-    // remove monitored item
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-
-}
-END_TEST
-
-START_TEST(Server_MonitoredItemsAbsoluteFilterSetOnCreateRemoveLater) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with absolute filter */
-    UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
-    UA_DataChangeFilter filter;
-    UA_DataChangeFilter_init(&filter);
-    filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
-    filter.deadbandValue = 2.0;
-    item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    item.requestedParameters.filter.content.decoded.data = &filter;
-    UA_UInt32 newMonitoredItemIds[1];
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    // Do we get initial value ?
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should not trigger because of filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, false);
-    ck_assert_uint_eq(countNotificationReceived, 0);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should trigger once at 43.0.
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(43.0));
-
-    // set back to 40.0
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 40.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    /* modify the monitored item with no filter */
-    UA_MonitoredItemModifyRequest itemModify;
-    UA_MonitoredItemModifyRequest_init(&itemModify);
-
-    itemModify.monitoredItemId = newMonitoredItemIds[0];
-    itemModify.requestedParameters.samplingInterval = 250;
-    itemModify.requestedParameters.discardOldest = true;
-    itemModify.requestedParameters.queueSize = 1;
-    itemModify.requestedParameters.clientHandle = newMonitoredItemIds[0];
-    UA_DataChangeFilter unsetfilter;
-    UA_DataChangeFilter_init(&unsetfilter);
-    unsetfilter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    unsetfilter.deadbandType = UA_DEADBANDTYPE_NONE;
-    unsetfilter.deadbandValue = 0.0;
-    itemModify.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    itemModify.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    itemModify.requestedParameters.filter.content.decoded.data = &unsetfilter;
-
-    UA_ModifyMonitoredItemsRequest modifyRequest;
-    UA_ModifyMonitoredItemsRequest_init(&modifyRequest);
-    modifyRequest.subscriptionId = subId;
-    modifyRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    modifyRequest.itemsToModify = &itemModify;
-    modifyRequest.itemsToModifySize = 1;
-
-    UA_ModifyMonitoredItemsResponse modifyResponse =
-       UA_Client_MonitoredItems_modify(client, modifyRequest);
-
-    ck_assert_uint_eq(modifyResponse.resultsSize, 1);
-    ck_assert_uint_eq(modifyResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyResponse);
-
-    // This should trigger because now we do not filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(42.0));
-
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(44.0));
-
-    // remove monitored item
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-
-}
-END_TEST
-
-START_TEST(Server_MonitoredItemsPercentFilterSetLater) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with no filter */
-    UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
-    UA_UInt32 newMonitoredItemIds[1];
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    // Do we get initial value ?
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should trigger because no filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(42.0));
-
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(44.0));
-
-    // set back to 40.0
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 40.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    /* modify the monitored item with an percent filter with deadbandvalue = 2.0 */
-    UA_MonitoredItemModifyRequest itemModify;
-    UA_MonitoredItemModifyRequest_init(&itemModify);
-
-    itemModify.monitoredItemId = newMonitoredItemIds[0];
-    itemModify.requestedParameters.samplingInterval = 250;
-    itemModify.requestedParameters.discardOldest = true;
-    itemModify.requestedParameters.queueSize = 1;
-    itemModify.requestedParameters.clientHandle = newMonitoredItemIds[0];
-    UA_DataChangeFilter filter;
-    UA_DataChangeFilter_init(&filter);
-    filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    filter.deadbandType = UA_DEADBANDTYPE_PERCENT;
-    filter.deadbandValue = 2.0;
-    itemModify.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    itemModify.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    itemModify.requestedParameters.filter.content.decoded.data = &filter;
-
-    UA_ModifyMonitoredItemsRequest modifyRequest;
-    UA_ModifyMonitoredItemsRequest_init(&modifyRequest);
-    modifyRequest.subscriptionId = subId;
-    modifyRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    modifyRequest.itemsToModify = &itemModify;
-    modifyRequest.itemsToModifySize = 1;
-
-    UA_ModifyMonitoredItemsResponse modifyResponse =
-       UA_Client_MonitoredItems_modify(client, modifyRequest);
-
-    ck_assert_uint_eq(modifyResponse.resultsSize, 1);
-    ck_assert_uint_eq(modifyResponse.results[0].statusCode, UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED);
-
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyResponse);
-
-    // This should trigger because setting filter failed
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(42.0));
-
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(44.0));
-
-    // remove monitored item
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-
-}
-END_TEST
-
-START_TEST(Server_MonitoredItemsNoFilter) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with an absolute filter with deadbandvalue = 2.0 */
-    UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
-    UA_UInt32 newMonitoredItemIds[1];
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    // Do we get initial value ?
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should trigger because no filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived,  2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(42.0));
-
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 2);
-
-    ck_assert(fuzzyLastValueIsEqualTo(44.0));
-
-    // remove monitored item
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-}
-END_TEST
-
-/* Test if an absolute filter can be added for boolean variables */
-START_TEST(Server_MonitoredItemsAbsoluteFilterOnBool) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with an absolute filter with deadbandvalue = 2.0 */
-    UA_MonitoredItemCreateRequest item =
-        UA_MonitoredItemCreateRequest_default(UA_NODEID_STRING(1, "the.bool"));;
-    UA_DataChangeFilter filter;
-    UA_DataChangeFilter_init(&filter);
-    filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
-    filter.deadbandValue = 0.5;
-    item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    item.requestedParameters.filter.content.decoded.data = &filter;
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                  callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-}
-END_TEST
-
-START_TEST(Server_MonitoredItemsAbsoluteFilterSetOnCreate) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with an absolute filter with deadbandvalue = 2.0 */
-    UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
-    UA_DataChangeFilter filter;
-    UA_DataChangeFilter_init(&filter);
-    filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
-    filter.deadbandValue = 2.0;
-    item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    item.requestedParameters.filter.content.decoded.data = &filter;
-    UA_UInt32 newMonitoredItemIds[1];
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    // Do we get initial value ?
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should not trigger because of filter
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, false);
-    ck_assert_uint_eq(countNotificationReceived, 0);
-
-    ck_assert(fuzzyLastValueIsEqualTo(40.0));
-
-    // This should trigger once at 43.0.
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(countNotificationReceived, 1);
-
-    ck_assert(fuzzyLastValueIsEqualTo(43.0));
-
-    // remove monitored item
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-
-}
-END_TEST
-
-START_TEST(Server_MonitoredItemsPercentFilterSetOnCreate) {
-    UA_DataValue_init(&lastValue);
-    /* define a monitored item with an percent filter with deadbandvalue = 2.0 */
-    UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
-    UA_DataChangeFilter filter;
-    UA_DataChangeFilter_init(&filter);
-    filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
-    filter.deadbandType = UA_DEADBANDTYPE_PERCENT;
-    filter.deadbandValue = 2.0;
-    item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
-    item.requestedParameters.filter.content.decoded.data = &filter;
-    UA_UInt32 newMonitoredItemIds[1];
-    UA_Client_DataChangeNotificationCallback callbacks[1];
-    callbacks[0] = dataChangeHandler;
-    UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
-    void *contexts[1];
-    contexts[0] = NULL;
-
-    UA_CreateMonitoredItemsRequest createRequest;
-    UA_CreateMonitoredItemsRequest_init(&createRequest);
-    createRequest.subscriptionId = subId;
-    createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-    createRequest.itemsToCreate = &item;
-    createRequest.itemsToCreateSize = 1;
-    UA_CreateMonitoredItemsResponse createResponse =
-       UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
-                                                   callbacks, deleteCallbacks);
-
-    ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createResponse.resultsSize, 1);
-    ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED);
-    newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
-
-    // Do we get initial value ? (must fail)
-    notificationReceived = false;
-    countNotificationReceived = 0;
-    ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, false);
-    ck_assert_uint_eq(countNotificationReceived, 0);
-
-    // remove monitored item (must fail)
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subId;
-    deleteRequest.monitoredItemIds = newMonitoredItemIds;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_BADMONITOREDITEMIDINVALID);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-}
-END_TEST
-
-#endif /*UA_ENABLE_SUBSCRIPTIONS*/
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Server monitored item filter");
-    TCase *tc_server = tcase_create("Server monitored item filter Basic");
-    tcase_add_checked_fixture(tc_server, setup, teardown);
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    tcase_add_test(tc_server, Server_MonitoredItemsNoFilter);
-    tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterSetOnCreate);
-    tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterOnBool);
-    tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterSetLater);
-    tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterSetOnCreateRemoveLater);
-    tcase_add_test(tc_server, Server_MonitoredItemsPercentFilterSetOnCreate);
-    tcase_add_test(tc_server, Server_MonitoredItemsPercentFilterSetLater);
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-    suite_add_tcase(s, tc_server);
-
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_node_inheritance.c b/ext/open62541/tests/server/check_node_inheritance.c
deleted file mode 100644
index 186230f..0000000
--- a/ext/open62541/tests/server/check_node_inheritance.c
+++ /dev/null
@@ -1,418 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-
-#include <check.h>
-
-UA_Server *server = NULL;
-UA_UInt32 valueToBeInherited = 42;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-/* finds the NodeId of a StateNumber child of a given node id */
-static void
-findChildId(UA_NodeId parentNode, UA_NodeId referenceType,
-            const UA_QualifiedName targetName, UA_NodeId *result) {
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = referenceType;
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    rpe.targetName = targetName;
-
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = parentNode;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;    //clion complains but is ok
-
-    UA_BrowsePathResult bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp);
-    ck_assert_uint_eq(bpr.statusCode, UA_STATUSCODE_GOOD);
-
-    ck_assert(bpr.targetsSize > 0);
-
-    UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, result);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-}
-#endif
-
-
-
-START_TEST(Nodes_createCustomBrowseNameObjectType)
-{
-    /* Create a custom object type "CustomBrowseNameType" which has a
-     * "DefaultInstanceBrowseName" property. */
-
-    /* create new object type node which has a subcomponent of the type StateType */
-    UA_ObjectTypeAttributes otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.displayName = UA_LOCALIZEDTEXT("", "CustomBrowseNameType");
-    otAttr.description = UA_LOCALIZEDTEXT("", "");
-    UA_StatusCode retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 7010),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "CustomBrowseNameType"),
-                                         otAttr, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // Now add a property "DefaultInstanceBrowseName"
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.minimumSamplingInterval = 0.000000;
-    attr.userAccessLevel = 1;
-    attr.accessLevel = 1;
-    attr.valueRank = UA_VALUERANK_ANY;
-    attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_QUALIFIEDNAME);
-    UA_QualifiedName defaultInstanceBrowseName = UA_QUALIFIEDNAME(1, "MyCustomBrowseName");
-    UA_Variant_setScalar(&attr.value, &defaultInstanceBrowseName, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-    attr.displayName = UA_LOCALIZEDTEXT("", "DefaultInstanceBrowseName");
-    attr.description = UA_LOCALIZEDTEXT("", "");
-    attr.writeMask = 0;
-    attr.userWriteMask = 0;
-    retval = UA_Server_addVariableNode(server,
-                                       UA_NODEID_NUMERIC(1, 7011),
-                                       UA_NODEID_NUMERIC(1, 7010),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                       UA_QUALIFIEDNAME(0, "DefaultInstanceBrowseName"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE),
-                                       attr,
-                                       NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-} END_TEST
-
-
-
-START_TEST(Nodes_checkDefaultInstanceBrowseName) {
-    /* create an object/instance of the CustomDemoType.
-     * This should fail if we do not specifiy a browse name.
-     * CustomDemoType does not have a DefaultInstanceBrowseName
-     * */
-    UA_ObjectAttributes oAttr2 = UA_ObjectAttributes_default;
-    oAttr2.displayName = UA_LOCALIZEDTEXT("", "DemoCustomBrowseNameFail");
-    oAttr2.description = UA_LOCALIZEDTEXT("", "");
-    UA_QualifiedName nullName;
-    UA_QualifiedName_init(&nullName);
-    UA_StatusCode retval =
-            UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 7020),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                    nullName, UA_NODEID_NUMERIC(1, 6010),
-                                    oAttr2, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADBROWSENAMEINVALID);
-
-    /* create an object/instance of the CustomBrowseNameType and set the default browse name */
-    oAttr2 = UA_ObjectAttributes_default;
-    oAttr2.displayName = UA_LOCALIZEDTEXT("", "DemoCustomBrowseName");
-    oAttr2.description = UA_LOCALIZEDTEXT("", "");
-    UA_QualifiedName_init(&nullName);
-    retval =
-            UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 7021),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                    nullName, UA_NODEID_NUMERIC(1, 7010),
-                                    oAttr2, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_QualifiedName receivedBrowseName;
-    UA_QualifiedName_init(&receivedBrowseName);
-
-    UA_QualifiedName defaultInstanceBrowseName = UA_QUALIFIEDNAME(1, "MyCustomBrowseName");
-
-    retval = UA_Server_readBrowseName(server, UA_NODEID_NUMERIC(1, 7021), &receivedBrowseName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(UA_QualifiedName_equal(&receivedBrowseName, &defaultInstanceBrowseName) == true);
-    UA_QualifiedName_clear(&receivedBrowseName);
-
-    /* create an object/instance of the CustomBrowseNameType and set a custom browse name */
-    oAttr2 = UA_ObjectAttributes_default;
-    oAttr2.displayName = UA_LOCALIZEDTEXT("", "DemoCustomBrowseName");
-    oAttr2.description = UA_LOCALIZEDTEXT("", "");
-    UA_QualifiedName overriddenBrowseName = UA_QUALIFIEDNAME(1, "MyOverriddenBrowseName");
-    retval =
-            UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 7022),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                    overriddenBrowseName, UA_NODEID_NUMERIC(1, 7010),
-                                    oAttr2, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_QualifiedName_init(&receivedBrowseName);
-
-    retval = UA_Server_readBrowseName(server, UA_NODEID_NUMERIC(1, 7022), &receivedBrowseName);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(UA_QualifiedName_equal(&receivedBrowseName, &overriddenBrowseName) == true);
-    UA_QualifiedName_clear(&receivedBrowseName);
-}
-END_TEST
-
-START_TEST(Nodes_createCustomStateType) {
-    // Create a type "CustomStateType" with a variable "CustomStateNumber" as property
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    UA_ObjectTypeAttributes attrObject = UA_ObjectTypeAttributes_default;
-    attrObject.displayName = UA_LOCALIZEDTEXT("", "CustomStateType");
-    attrObject.description = UA_LOCALIZEDTEXT("", "");
-    attrObject.writeMask = 0;
-    attrObject.userWriteMask = 0;
-    retval = UA_Server_addObjectTypeNode(server,
-                                         UA_NODEID_NUMERIC(1, 6000),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "CustomStateType"),
-                                         attrObject,
-                                         NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // Now add a property "StateNumber"
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.minimumSamplingInterval = 0.000000;
-    attr.userAccessLevel = 1;
-    attr.accessLevel = 1;
-    attr.valueRank = UA_VALUERANK_ANY;
-    attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_UINT32);
-    UA_UInt32 val = 0;
-    UA_Variant_setScalar(&attr.value, &val, &UA_TYPES[UA_TYPES_UINT32]);
-    attr.displayName = UA_LOCALIZEDTEXT("", "CustomStateNumber");
-    attr.description = UA_LOCALIZEDTEXT("", "");
-    attr.writeMask = 0;
-    attr.userWriteMask = 0;
-    retval = UA_Server_addVariableNode(server,
-                                       UA_NODEID_NUMERIC(1, 6001),
-                                       UA_NODEID_NUMERIC(1, 6000),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                                       UA_QUALIFIEDNAME(1, "CustomStateNumber"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE),
-                                       attr,
-                                       NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-/* Minimal nodeset does not contain the modelling rule mandatory */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    retval = UA_Server_addReference(server, UA_NODEID_NUMERIC(1, 6001),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                                    UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY),
-                                    true);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-#endif
-}
-END_TEST
-
-
-START_TEST(Nodes_createCustomObjectType) {
-    /* Create a custom object type "CustomDemoType" which has a
-     * "CustomStateType" component */
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    /* create new object type node which has a subcomponent of the type StateType */
-    UA_ObjectTypeAttributes otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.displayName = UA_LOCALIZEDTEXT("", "CustomDemoType");
-    otAttr.description = UA_LOCALIZEDTEXT("", "");
-    retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 6010),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "CustomDemoType"),
-                                         otAttr, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("", "State");
-    oAttr.description = UA_LOCALIZEDTEXT("", "");
-    retval = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 6011), UA_NODEID_NUMERIC(1, 6010),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_QUALIFIEDNAME(1, "State"),
-                                     UA_NODEID_NUMERIC(1, 6000),
-                                     oAttr, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-/* Minimal nodeset does not contain the modelling rule mandatory */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    /* modelling rule is mandatory so it will be inherited for the object
-     * created from CustomDemoType */
-    retval = UA_Server_addReference(server, UA_NODEID_NUMERIC(1, 6011),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                                    UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY),
-                                    true);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-
-    /* assign a default value to the attribute "StateNumber" inside the state
-     * attribute (part of the MyDemoType) */
-    UA_Variant stateNum;
-    UA_Variant_init(&stateNum);
-    UA_Variant_setScalar(&stateNum, &valueToBeInherited, &UA_TYPES[UA_TYPES_UINT32]);
-    UA_NodeId childID;
-    findChildId(UA_NODEID_NUMERIC(1, 6011), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                UA_QUALIFIEDNAME(1, "CustomStateNumber"), &childID);
-    ck_assert(!UA_NodeId_isNull(&childID));
-
-    retval = UA_Server_writeValue(server, childID, stateNum);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-#endif
-
-}
-END_TEST
-
-START_TEST(Nodes_createInheritedObject) {
-    /* create an object/instance of the demo type */
-    UA_ObjectAttributes oAttr2 = UA_ObjectAttributes_default;
-    oAttr2.displayName = UA_LOCALIZEDTEXT("", "Demo");
-    oAttr2.description = UA_LOCALIZEDTEXT("", "");
-    UA_StatusCode retval =
-        UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 6020),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                UA_QUALIFIEDNAME(1, "Demo"), UA_NODEID_NUMERIC(1, 6010),
-                                oAttr2, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(Nodes_checkInheritedValue) {
-/* Minimal nodeset does not contain the modelling rule mandatory, therefore there is no CustomStateNumber */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_NodeId childState;
-    findChildId(UA_NODEID_NUMERIC(1, 6020),
-                UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                UA_QUALIFIEDNAME(1, "State"), &childState);
-    ck_assert(!UA_NodeId_isNull(&childState));
-    UA_NodeId childNumber;
-    findChildId(childState, UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
-                UA_QUALIFIEDNAME(1, "CustomStateNumber"), &childNumber);
-    ck_assert(!UA_NodeId_isNull(&childNumber));
-
-    UA_Variant inheritedValue;
-    UA_Variant_init(&inheritedValue);
-    UA_Server_readValue(server, childNumber, &inheritedValue);
-    ck_assert(inheritedValue.type == &UA_TYPES[UA_TYPES_UINT32]);
-
-    UA_UInt32 *value = (UA_UInt32 *) inheritedValue.data;
-
-    ck_assert_int_eq(*value, valueToBeInherited);
-    UA_Variant_deleteMembers(&inheritedValue);
-#endif
-}
-END_TEST
-
-
-
-START_TEST(Nodes_createCustomInterfaceType) {
-/* Minimal nodeset does not have the Interface definitions */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    /* Create a custom interface type */
-
-    UA_ObjectTypeAttributes otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.displayName = UA_LOCALIZEDTEXT("", "ILocationType");
-    otAttr.description = UA_LOCALIZEDTEXT("", "");
-    UA_StatusCode retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 8000),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEINTERFACETYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "ILocationType"),
-                                         otAttr, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("", "InterfaceChild");
-    oAttr.description = UA_LOCALIZEDTEXT("", "");
-    retval = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 8001), UA_NODEID_NUMERIC(1, 8000),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_QUALIFIEDNAME(1, "InterfaceChild"),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                     oAttr, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Server_addReference(server, UA_NODEID_NUMERIC(1, 8001),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                                    UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY),
-                                    true);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-
-    /* create an object type which has the interface */
-    otAttr = UA_ObjectTypeAttributes_default;
-    otAttr.displayName = UA_LOCALIZEDTEXT("", "ObjectWithLocation");
-    otAttr.description = UA_LOCALIZEDTEXT("", "");
-    retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(1, 8002),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "ObjectWithLocation"),
-                                         otAttr, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    retval = UA_Server_addReference(server, UA_NODEID_NUMERIC(1, 8002), UA_NODEID_NUMERIC(0, UA_NS0ID_HASINTERFACE), UA_EXPANDEDNODEID_NUMERIC(1, 8000), true);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-#endif
-}
-END_TEST
-
-
-
-START_TEST(Nodes_createObjectWithInterface) {
-
-/* Minimal nodeset does not have the Interface definitions */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    /* create an object/instance of the demo type */
-    UA_ObjectAttributes oAttr2 = UA_ObjectAttributes_default;
-    oAttr2.displayName = UA_LOCALIZEDTEXT("", "ObjectInstanceOfInterface");
-    oAttr2.description = UA_LOCALIZEDTEXT("", "");
-    UA_StatusCode retval =
-            UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 8020),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                    UA_QUALIFIEDNAME(1, "ObjectInstanceOfInterface"), UA_NODEID_NUMERIC(1, 8002),
-                                    oAttr2, NULL, NULL);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-
-    /* Check that object has inherited the interface children */
-
-    UA_NodeId childId;
-    findChildId(UA_NODEID_NUMERIC(1, 8020),
-                UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                UA_QUALIFIEDNAME(1, "InterfaceChild"), &childId);
-    ck_assert(!UA_NodeId_isNull(&childId));
-#endif
-}
-END_TEST
-
-static Suite *testSuite_Client(void) {
-    Suite *s = suite_create("Node inheritance");
-    TCase *tc_inherit_subtype = tcase_create("Inherit subtype value");
-    tcase_add_unchecked_fixture(tc_inherit_subtype, setup, teardown);
-    tcase_add_test(tc_inherit_subtype, Nodes_createCustomStateType);
-    tcase_add_test(tc_inherit_subtype, Nodes_createCustomObjectType);
-    tcase_add_test(tc_inherit_subtype, Nodes_createInheritedObject);
-    tcase_add_test(tc_inherit_subtype, Nodes_checkInheritedValue);
-    tcase_add_test(tc_inherit_subtype, Nodes_createCustomBrowseNameObjectType);
-    tcase_add_test(tc_inherit_subtype, Nodes_checkDefaultInstanceBrowseName);
-    suite_add_tcase(s, tc_inherit_subtype);
-    TCase *tc_interface_addin = tcase_create("Interfaces and Addins");
-    tcase_add_unchecked_fixture(tc_interface_addin, setup, teardown);
-    tcase_add_test(tc_interface_addin, Nodes_createCustomInterfaceType);
-    tcase_add_test(tc_interface_addin, Nodes_createObjectWithInterface);
-    suite_add_tcase(s, tc_interface_addin);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_nodestore.c b/ext/open62541/tests/server/check_nodestore.c
deleted file mode 100644
index ac4b27a..0000000
--- a/ext/open62541/tests/server/check_nodestore.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-#include <open62541/util.h>
-#include <open62541/plugin/nodestore.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "check.h"
-#include "ziptree.h"
-
-/* container_of */
-#define container_of(ptr, type, member) \
-    (type *)((uintptr_t)ptr - offsetof(type,member))
-
-#if UA_MULTITHREADING >= 200
-#include <pthread.h>
-#endif
-
-/* Dirty redifinition from ua_nodestore_default.c to check that all nodes were
- * released */
-struct NodeEntry;
-typedef struct NodeEntry NodeEntry;
-
-struct NodeEntry {
-    ZIP_ENTRY(NodeEntry) zipfields;
-    UA_UInt32 nodeIdHash;
-    UA_UInt16 refCount; /* How many consumers have a reference to the node? */
-    UA_Boolean deleted; /* Node was marked as deleted and can be deleted when refCount == 0 */
-    NodeEntry *orig;    /* If a copy is made to replace a node, track that we
-                         * replace only the node from which the copy was made.
-                         * Important for concurrent operations. */
-    UA_NodeId nodeId; /* This is actually a UA_Node that also starts with a NodeId */
-};
-
-static void checkAllReleased(void *context, const UA_Node* node) {
-    NodeEntry *entry = container_of(node, NodeEntry, nodeId);
-    ck_assert_int_eq(entry->refCount, 0); /* The count is increased when the visited node is checked out */
-}
-
-void *nsCtx;
-
-static void setup(void) {
-    UA_Nodestore_new(&nsCtx);
-}
-
-static void teardown(void) {
-    UA_Nodestore_iterate(nsCtx, checkAllReleased, NULL);
-    UA_Nodestore_delete(nsCtx);
-}
-
-static int zeroCnt = 0;
-static int visitCnt = 0;
-static void checkZeroVisitor(void *context, const UA_Node* node) {
-    visitCnt++;
-    if (node == NULL) zeroCnt++;
-}
-
-static UA_Node* createNode(UA_Int16 nsid, UA_Int32 id) {
-    UA_Node *p = UA_Nodestore_newNode(nsCtx, UA_NODECLASS_VARIABLE);
-    p->nodeId.identifierType = UA_NODEIDTYPE_NUMERIC;
-    p->nodeId.namespaceIndex = nsid;
-    p->nodeId.identifier.numeric = id;
-    p->nodeClass = UA_NODECLASS_VARIABLE;
-    return p;
-}
-
-START_TEST(replaceExistingNode) {
-    UA_Node* n1 = createNode(0,2253);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_NodeId in1 = UA_NODEID_NUMERIC(0, 2253);
-    UA_Node* n2;
-    UA_Nodestore_getNodeCopy(nsCtx, &in1, &n2);
-    UA_StatusCode retval = UA_Nodestore_replaceNode(nsCtx, n2);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(replaceOldNode) {
-    UA_Node* n1 = createNode(0,2253);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_NodeId in1 = UA_NODEID_NUMERIC(0,2253);
-    UA_Node* n2;
-    UA_Node* n3;
-    UA_Nodestore_getNodeCopy(nsCtx, &in1, &n2);
-    UA_Nodestore_getNodeCopy(nsCtx, &in1, &n3);
-
-    /* shall succeed */
-    UA_StatusCode retval = UA_Nodestore_replaceNode(nsCtx, n2);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* shall fail */
-    retval = UA_Nodestore_replaceNode(nsCtx, n3);
-    ck_assert_int_ne(retval, UA_STATUSCODE_GOOD);
-}
-END_TEST
-
-START_TEST(findNodeInUA_NodeStoreWithSingleEntry) {
-    UA_Node* n1 = createNode(0,2253);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_NodeId in1 = UA_NODEID_NUMERIC(0,2253);
-    const UA_Node* nr = UA_Nodestore_getNode(nsCtx, &in1);
-    ck_assert_int_eq((uintptr_t)n1, (uintptr_t)nr);
-    UA_Nodestore_releaseNode(nsCtx, nr);
-}
-END_TEST
-
-START_TEST(failToFindNodeInOtherUA_NodeStore) {
-    UA_Node* n1 = createNode(0,2255);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_NodeId in1 = UA_NODEID_NUMERIC(1, 2255);
-    const UA_Node* nr = UA_Nodestore_getNode(nsCtx, &in1);
-    ck_assert_int_eq((uintptr_t)nr, 0);
-}
-END_TEST
-
-START_TEST(findNodeInUA_NodeStoreWithSeveralEntries) {
-    UA_Node* n1 = createNode(0,2253);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_Node* n2 = createNode(0,2255);
-    UA_Nodestore_insertNode(nsCtx, n2, NULL);
-    UA_Node* n3 = createNode(0,2257);
-    UA_Nodestore_insertNode(nsCtx, n3, NULL);
-    UA_Node* n4 = createNode(0,2200);
-    UA_Nodestore_insertNode(nsCtx, n4, NULL);
-    UA_Node* n5 = createNode(0,1);
-    UA_Nodestore_insertNode(nsCtx, n5, NULL);
-    UA_Node* n6 = createNode(0,12);
-    UA_Nodestore_insertNode(nsCtx, n6, NULL);
-
-    UA_NodeId in3 = UA_NODEID_NUMERIC(0, 2257);
-    const UA_Node* nr = UA_Nodestore_getNode(nsCtx, &in3);
-    ck_assert_int_eq((uintptr_t)nr, (uintptr_t)n3);
-    UA_Nodestore_releaseNode(nsCtx, nr);
-}
-END_TEST
-
-START_TEST(iterateOverUA_NodeStoreShallNotVisitEmptyNodes) {
-    UA_Node* n1 = createNode(0,2253);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_Node* n2 = createNode(0,2255);
-    UA_Nodestore_insertNode(nsCtx, n2, NULL);
-    UA_Node* n3 = createNode(0,2257);
-    UA_Nodestore_insertNode(nsCtx, n3, NULL);
-    UA_Node* n4 = createNode(0,2200);
-    UA_Nodestore_insertNode(nsCtx, n4, NULL);
-    UA_Node* n5 = createNode(0,1);
-    UA_Nodestore_insertNode(nsCtx, n5, NULL);
-    UA_Node* n6 = createNode(0,12);
-    UA_Nodestore_insertNode(nsCtx, n6, NULL);
-
-    zeroCnt = 0;
-    visitCnt = 0;
-    UA_Nodestore_iterate(nsCtx, checkZeroVisitor, NULL);
-    ck_assert_int_eq(zeroCnt, 0);
-    ck_assert_int_eq(visitCnt, 6);
-}
-END_TEST
-
-START_TEST(findNodeInExpandedNamespace) {
-    for(UA_UInt32 i = 0; i < 200; i++) {
-        UA_Node* n = createNode(0,i);
-        UA_Nodestore_insertNode(nsCtx, n, NULL);
-    }
-    // when
-    UA_Node *n2 = createNode(0,25);
-    const UA_Node* nr = UA_Nodestore_getNode(nsCtx, &n2->nodeId);
-    ck_assert_int_eq(nr->nodeId.identifier.numeric, n2->nodeId.identifier.numeric);
-    UA_Nodestore_releaseNode(nsCtx, nr);
-    UA_Nodestore_deleteNode(nsCtx, n2);
-}
-END_TEST
-
-START_TEST(iterateOverExpandedNamespaceShallNotVisitEmptyNodes) {
-    for(UA_UInt32 i = 0; i < 200; i++) {
-        UA_Node* n = createNode(0,i+1);
-        UA_Nodestore_insertNode(nsCtx, n, NULL);
-    }
-    // when
-    zeroCnt = 0;
-    visitCnt = 0;
-    UA_Nodestore_iterate(nsCtx, checkZeroVisitor, NULL);
-    // then
-    ck_assert_int_eq(zeroCnt, 0);
-    ck_assert_int_eq(visitCnt, 200);
-}
-END_TEST
-
-START_TEST(failToFindNonExistentNodeInUA_NodeStoreWithSeveralEntries) {
-    UA_Node* n1 = createNode(0,2253);
-    UA_Nodestore_insertNode(nsCtx, n1, NULL);
-    UA_Node* n2 = createNode(0,2255);
-    UA_Nodestore_insertNode(nsCtx, n2, NULL);
-    UA_Node* n3 = createNode(0,2257);
-    UA_Nodestore_insertNode(nsCtx, n3, NULL);
-    UA_Node* n4 = createNode(0,2200);
-    UA_Nodestore_insertNode(nsCtx, n4, NULL);
-    UA_Node* n5 = createNode(0,1);
-    UA_Nodestore_insertNode(nsCtx, n5, NULL);
-
-    UA_NodeId id = UA_NODEID_NUMERIC(0, 12);
-    const UA_Node* nr = UA_Nodestore_getNode(nsCtx, &id);
-    ck_assert_int_eq((uintptr_t)nr, 0);
-}
-END_TEST
-
-/************************************/
-/* Performance Profiling Test Cases */
-/************************************/
-
-#if UA_MULTITHREADING >= 200
-struct UA_NodeStoreProfileTest {
-    UA_Int32 min_val;
-    UA_Int32 max_val;
-    UA_Int32 rounds;
-};
-
-static void *profileGetThread(void *arg) {
-    struct UA_NodeStoreProfileTest *test = (struct UA_NodeStoreProfileTest*) arg;
-    UA_NodeId id;
-    UA_NodeId_init(&id);
-    UA_Int32 max_val = test->max_val;
-    for(UA_Int32 x = 0; x<test->rounds; x++) {
-        for(UA_Int32 i=test->min_val; i<max_val; i++) {
-            id.identifier.numeric = i+1;
-            const UA_Node *n = UA_Nodestore_getNode(nsCtx, &id);
-            UA_Nodestore_releaseNode(nsCtx, n);
-        }
-    }
-    return NULL;
-}
-#endif
-
-#define N 1000 /* make bigger to test */
-
-START_TEST(profileGetDelete) {
-    clock_t begin, end;
-    begin = clock();
-
-    for(UA_UInt32 i = 0; i < N; i++) {
-        UA_Node *n = createNode(0,i+1);
-        UA_Nodestore_insertNode(nsCtx, n, NULL);
-    }
-
-#if UA_MULTITHREADING >= 200
-#define THREADS 4
-    pthread_t t[THREADS];
-    struct UA_NodeStoreProfileTest p[THREADS];
-    for (int i = 0; i < THREADS; i++) {
-        p[i] = (struct UA_NodeStoreProfileTest){i*(N/THREADS), (i+1)*(N/THREADS), 50};
-        pthread_create(&t[i], NULL, profileGetThread, &p[i]);
-    }
-    for (int i = 0; i < THREADS; i++)
-        pthread_join(t[i], NULL);
-    end = clock();
-    printf("Time for %d create/get/delete on %d threads in a namespace: %fs.\n", N, THREADS, (double)(end - begin) / CLOCKS_PER_SEC);
-#else
-    UA_NodeId id = UA_NODEID_NULL;
-    for(size_t i = 0; i < N; i++) {
-        id.identifier.numeric = (UA_UInt32)i+1;
-        const UA_Node *node = UA_Nodestore_getNode(nsCtx, &id);
-        UA_Nodestore_releaseNode(nsCtx, node);
-    }
-    end = clock();
-    printf("Time for single-threaded %d create/get/delete in a namespace: %fs.\n", N,
-           (double)(end - begin) / CLOCKS_PER_SEC);
-#endif
-}
-END_TEST
-
-static Suite * namespace_suite (void) {
-    Suite *s = suite_create ("UA_NodeStore");
-
-    TCase* tc_find = tcase_create ("Find");
-    tcase_add_checked_fixture(tc_find, setup, teardown);
-    tcase_add_test (tc_find, findNodeInUA_NodeStoreWithSingleEntry);
-    tcase_add_test (tc_find, findNodeInUA_NodeStoreWithSeveralEntries);
-    tcase_add_test (tc_find, findNodeInExpandedNamespace);
-    tcase_add_test (tc_find, failToFindNonExistentNodeInUA_NodeStoreWithSeveralEntries);
-    tcase_add_test (tc_find, failToFindNodeInOtherUA_NodeStore);
-    suite_add_tcase (s, tc_find);
-
-    TCase *tc_replace = tcase_create("Replace");
-    tcase_add_checked_fixture(tc_replace, setup, teardown);
-    tcase_add_test (tc_replace, replaceExistingNode);
-    tcase_add_test (tc_replace, replaceOldNode);
-    suite_add_tcase (s, tc_replace);
-
-    TCase* tc_iterate = tcase_create ("Iterate");
-    tcase_add_checked_fixture(tc_iterate, setup, teardown);
-    tcase_add_test (tc_iterate, iterateOverUA_NodeStoreShallNotVisitEmptyNodes);
-    tcase_add_test (tc_iterate, iterateOverExpandedNamespaceShallNotVisitEmptyNodes);
-    suite_add_tcase (s, tc_iterate);
-    
-    TCase* tc_profile = tcase_create ("Profile");
-    tcase_add_checked_fixture(tc_profile, setup, teardown);
-    tcase_add_test (tc_profile, profileGetDelete);
-    suite_add_tcase (s, tc_profile);
-
-    return s;
-}
-
-
-int main (void) {
-    int number_failed = 0;
-    Suite *s = namespace_suite();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr,CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed (sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server.c b/ext/open62541/tests/server/check_server.c
deleted file mode 100644
index 5e2b018..0000000
--- a/ext/open62541/tests/server/check_server.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright 2019 (c) basysKom GmbH <opensource@basyskom.com> (Author: Frank Meerkötter)
- */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "server/ua_server_internal.h"
-#include "server/ua_services.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "check.h"
-
-static UA_Server *server = NULL;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-}
-
-static void teardown(void) {
-    UA_Server_delete(server);
-}
-
-START_TEST(checkGetConfig) {
-    ck_assert_ptr_eq(UA_Server_getConfig(NULL), NULL);
-    ck_assert_ptr_ne(UA_Server_getConfig(server), NULL);
-} END_TEST
-
-START_TEST(checkGetNamespaceByName) {
-    size_t notFoundIndex = 62541;
-    UA_StatusCode notFound = UA_Server_getNamespaceByName(server, UA_STRING("http://opcfoundation.org/UA/invalid"), &notFoundIndex);
-    ck_assert_int_eq(notFoundIndex, 62541); // not changed
-    ck_assert_int_eq(notFound, UA_STATUSCODE_BADNOTFOUND);
-
-    size_t foundIndex = 62541;
-    UA_StatusCode found = UA_Server_getNamespaceByName(server, UA_STRING("http://opcfoundation.org/UA/"), &foundIndex);
-    ck_assert_int_eq(foundIndex, 0); // this namespace always has index 0 (defined by the standard)
-    ck_assert_int_eq(found, UA_STATUSCODE_GOOD);
-} END_TEST
-
-static void timedCallbackHandler(UA_Server *s, void *data) {
-    *((UA_Boolean*)data) = false;  // stop the server via a timedCallback
-}
-
-START_TEST(checkServer_run) {
-    UA_Boolean running = true;
-    // 0 is in the past so the server will terminate on the first iteration
-    UA_StatusCode ret;
-    ret = UA_Server_addTimedCallback(server, &timedCallbackHandler, &running, 0, NULL);
-    ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-    ret = UA_Server_run(server, &running);
-    ck_assert_int_eq(ret, UA_STATUSCODE_GOOD);
-} END_TEST
-
-int main(void) {
-    Suite *s = suite_create("server");
-
-    TCase *tc_call = tcase_create("server - basics");
-    tcase_add_checked_fixture(tc_call, setup, teardown);
-    tcase_add_test(tc_call, checkGetConfig);
-    tcase_add_test(tc_call, checkGetNamespaceByName);
-    tcase_add_test(tc_call, checkServer_run);
-    suite_add_tcase(s, tc_call);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server_callbacks.c b/ext/open62541/tests/server/check_server_callbacks.c
deleted file mode 100644
index 68f985a..0000000
--- a/ext/open62541/tests/server/check_server_callbacks.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-#include <open62541/plugin/log_stdout.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <check.h>
-#include "thread_wrapper.h"
-
-/* While server initialization, value callbacks are called twice.
- * This counter is used to ensure that the deletion of the variable is triggered by the client (not while the server initialization)*/
-int counter  = 0;
-UA_Server *server;
-UA_Boolean running;
-UA_ServerNetworkLayer nl;
-UA_NodeId temperatureNodeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-UA_Int32 temperature;
-UA_Boolean deleteNodeWhileWriting;
-THREAD_HANDLE server_thread;
-
-static void
-updateCurrentTime(void) {
-    UA_DateTime now = UA_DateTime_now();
-    UA_Variant value;
-    UA_Variant_setScalar(&value, &now, &UA_TYPES[UA_TYPES_DATETIME]);
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-    UA_Server_writeValue(server, currentNodeId, value);
-}
-
-static void
-addCurrentTimeVariable(void) {
-    UA_DateTime now = 0;
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Current time - value callback");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    UA_Variant_setScalar(&attr.value, &now, &UA_TYPES[UA_TYPES_DATETIME]);
-
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-    UA_QualifiedName currentName = UA_QUALIFIEDNAME(1, "current-time-value-callback");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId variableTypeNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
-    UA_Server_addVariableNode(server, currentNodeId, parentNodeId,
-                              parentReferenceNodeId, currentName,
-                              variableTypeNodeId, attr, NULL, NULL);
-
-    updateCurrentTime();
-}
-
-static void
-beforeReadTime(UA_Server *tmpserver,
-               const UA_NodeId *sessionId, void *sessionContext,
-               const UA_NodeId *nodeid, void *nodeContext,
-               const UA_NumericRange *range, const UA_DataValue *data) {
-    updateCurrentTime();
-}
-
-static void
-afterWriteTime(UA_Server *tmpServer,
-               const UA_NodeId *sessionId, void *sessionContext,
-               const UA_NodeId *nodeId, void *nodeContext,
-               const UA_NumericRange *range, const UA_DataValue *data) {
-    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "The variable was updated");
-}
-
-static void
-addValueCallbackToCurrentTimeVariable(void) {
-    UA_NodeId currentNodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-    UA_ValueCallback callback ;
-    callback.onRead = beforeReadTime;
-    callback.onWrite = afterWriteTime;
-    UA_Server_setVariableNode_valueCallback(server, currentNodeId, callback);
-}
-
-static UA_StatusCode
-readTemperature(UA_Server *tmpServer,
-                const UA_NodeId *sessionId, void *sessionContext,
-                const UA_NodeId *nodeId, void *nodeContext,
-                UA_Boolean sourceTimeStamp, const UA_NumericRange *range,
-                UA_DataValue *dataValue) {
-    if (counter < 2)
-        counter++;
-    else
-        UA_Server_deleteNode(server, temperatureNodeId, true);
-
-    UA_Variant_setScalarCopy(&dataValue->value, &temperature, &UA_TYPES[UA_TYPES_INT32]);
-    dataValue->hasValue = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-writeTemperature(UA_Server *tmpServer,
-                 const UA_NodeId *sessionId, void *sessionContext,
-                 const UA_NodeId *nodeId, void *nodeContext,
-                 const UA_NumericRange *range, const UA_DataValue *data) {
-    temperature = *(UA_Int32 *) data->value.data;
-    if (deleteNodeWhileWriting)
-        UA_Server_deleteNode(server, temperatureNodeId, true);
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-addDataSourceVariable(void) {
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Temperature");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    UA_DataSource temperatureSource;
-    temperatureSource.read = readTemperature;
-    temperatureSource.write = writeTemperature;
-    UA_StatusCode retval = UA_Server_addDataSourceVariableNode(server, temperatureNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "Temperature"),
-                                        UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr,
-                                        temperatureSource, NULL, NULL);
-
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-}
-
-THREAD_CALLBACK(serverloop) {
-    while(running)
-        UA_Server_run_iterate(server, true);
-    return 0;
-}
-static void setup(void) {
-    running = true;
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-    addCurrentTimeVariable();
-    addValueCallbackToCurrentTimeVariable();
-    addDataSourceVariable();
-    THREAD_CREATE(server_thread, serverloop);
-}
-
-static void teardown(void) {
-    running = false;
-    counter = 0;
-    THREAD_JOIN(server_thread);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-START_TEST(client_readValueCallbackAttribute) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Variant val;
-        UA_Variant_init(&val);
-        UA_NodeId nodeId = UA_NODEID_STRING(1, "current-time-value-callback");
-        retval = UA_Client_readValueAttribute(client, nodeId, &val);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        UA_Variant_deleteMembers(&val);
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }
-END_TEST
-
-START_TEST(client_readMultipleAttributes) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_ReadRequest request;
-        UA_ReadRequest_init(&request);
-        UA_ReadValueId ids[3];
-        UA_ReadValueId_init(&ids[0]);
-        ids[0].attributeId = UA_ATTRIBUTEID_DESCRIPTION;
-        ids[0].nodeId = temperatureNodeId;
-
-        UA_ReadValueId_init(&ids[1]);
-        ids[1].attributeId = UA_ATTRIBUTEID_VALUE;
-        ids[1].nodeId = temperatureNodeId;
-
-        UA_ReadValueId_init(&ids[2]);
-        ids[2].attributeId = UA_ATTRIBUTEID_BROWSENAME;
-        ids[2].nodeId = temperatureNodeId;
-
-        request.nodesToRead = ids;
-        request.nodesToReadSize = 3;
-
-        UA_ReadResponse response = UA_Client_Service_read(client, request);
-        retval = response.responseHeader.serviceResult;
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        ck_assert_int_eq(response.resultsSize, 3);
-        ck_assert_uint_eq(response.results[0].status, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(response.results[1].status, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(response.results[2].status, UA_STATUSCODE_BADNODEIDUNKNOWN);
-
-        UA_ReadResponse_deleteMembers(&response);
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }
-END_TEST
-
-START_TEST(client_writeValueCallbackAttribute) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Variant *val = UA_Variant_new();
-        UA_Int32 value = 77;
-        UA_Variant_setScalarCopy(val, &value, &UA_TYPES[UA_TYPES_INT32]);
-        retval = UA_Client_writeValueAttribute(client, temperatureNodeId, val);
-
-#ifdef UA_ENABLE_IMMUTABLE_NODES
-        ck_assert_uint_eq(retval, UA_STATUSCODE_BADNODEIDUNKNOWN);
-#else
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-#endif
-        UA_Variant_delete(val);
-
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }
-END_TEST
-
-START_TEST(client_writeMultipleAttributes) {
-        UA_Client *client = UA_Client_new();
-        UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-        UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_Int32 value1 = 23;
-        UA_WriteRequest wReq;
-        UA_WriteRequest_init(&wReq);
-        UA_LocalizedText string = UA_LOCALIZEDTEXT("en-US", "Temperature");
-        UA_WriteValue wv[2];
-        UA_WriteValue_init(&wv[0]);
-        UA_WriteValue_init(&wv[1]);
-        wReq.nodesToWrite = wv;
-        wReq.nodesToWriteSize = 2;
-        wReq.nodesToWrite[0].nodeId = temperatureNodeId;
-        wReq.nodesToWrite[0].attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
-        wReq.nodesToWrite[0].value.hasValue = true;
-        wReq.nodesToWrite[0].value.value.type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
-        wReq.nodesToWrite[0].value.value.storageType = UA_VARIANT_DATA_NODELETE;
-        wReq.nodesToWrite[0].value.value.data = &string;
-
-        wReq.nodesToWrite[1].nodeId = temperatureNodeId;
-        wReq.nodesToWrite[1].attributeId = UA_ATTRIBUTEID_VALUE;
-        wReq.nodesToWrite[1].value.hasValue = true;
-        wReq.nodesToWrite[1].value.value.type = &UA_TYPES[UA_TYPES_INT32];
-        wReq.nodesToWrite[1].value.value.storageType = UA_VARIANT_DATA_NODELETE;
-        wReq.nodesToWrite[1].value.value.data = &value1;
-
-
-        UA_WriteResponse wResp = UA_Client_Service_write(client, wReq);
-
-        ck_assert_uint_eq(wResp.responseHeader.serviceResult,UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        UA_WriteResponse_clear(&wResp);
-        UA_Client_disconnect(client);
-        UA_Client_delete(client);
-    }
-END_TEST
-
-static Suite* testSuite_immutableNodes(void) {
-    Suite *s = suite_create("Immutable Nodes");
-    TCase *valueCallback = tcase_create("ValueCallback");
-
-    deleteNodeWhileWriting = UA_FALSE;
-    tcase_add_checked_fixture(valueCallback, setup, teardown);
-    tcase_add_test(valueCallback, client_readValueCallbackAttribute);
-    tcase_add_test(valueCallback, client_readMultipleAttributes);
-
-    deleteNodeWhileWriting = UA_TRUE;
-    tcase_add_test(valueCallback, client_writeValueCallbackAttribute);
-    tcase_add_test(valueCallback, client_writeMultipleAttributes);
-    suite_add_tcase(s,valueCallback);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_immutableNodes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server_historical_data.c b/ext/open62541/tests/server/check_server_historical_data.c
deleted file mode 100644
index 6d7af2a..0000000
--- a/ext/open62541/tests/server/check_server_historical_data.c
+++ /dev/null
@@ -1,1054 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/client_highlevel.h>
-#include <open62541/plugin/historydata/history_data_backend.h>
-#include <open62541/plugin/historydata/history_data_backend_memory.h>
-#include <open62541/plugin/historydata/history_data_gathering_default.h>
-#include <open62541/plugin/historydata/history_database_default.h>
-#include <open62541/plugin/historydatabase.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "client/ua_client_internal.h"
-#include "server/ua_server_internal.h"
-
-#include <check.h>
-
-#include "testing_clock.h"
-#include "testing_networklayers.h"
-#include "thread_wrapper.h"
-#ifdef UA_ENABLE_HISTORIZING
-#include "historical_read_test_data.h"
-#include "randomindextest_backend.h"
-#endif
-#include <stddef.h>
-
-static UA_Server *server;
-#ifdef UA_ENABLE_HISTORIZING
-static UA_HistoryDataGathering *gathering;
-#endif
-static UA_Boolean running;
-static THREAD_HANDLE server_thread;
-static MUTEX_HANDLE serverMutex;
-
-static UA_Client *client;
-static UA_NodeId parentNodeId;
-static UA_NodeId parentReferenceNodeId;
-static UA_NodeId outNodeId;
-
-static UA_DateTime *testDataSorted;
-
-static void serverMutexLock(void) {
-    if (!(MUTEX_LOCK(serverMutex))) {
-        fprintf(stderr, "Mutex cannot be locked.\n");
-        exit(1);
-    }
-}
-
-static void serverMutexUnlock(void) {
-    if (!(MUTEX_UNLOCK(serverMutex))) {
-        fprintf(stderr, "Mutex cannot be unlocked.\n");
-        exit(1);
-    }
-}
-
-THREAD_CALLBACK(serverloop) {
-    while(running) {
-        serverMutexLock();
-        UA_Server_run_iterate(server, false);
-        serverMutexUnlock();
-    }
-    return 0;
-}
-
-static void setup(void) {
-    if (!(MUTEX_INIT(serverMutex))) {
-        fprintf(stderr, "Server mutex was not created correctly.\n");
-        exit(1);
-    }
-    running = true;
-
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-#ifdef UA_ENABLE_HISTORIZING
-    gathering = (UA_HistoryDataGathering*)UA_calloc(1, sizeof(UA_HistoryDataGathering));
-    *gathering = UA_HistoryDataGathering_Default(1);
-    config->historyDatabase = UA_HistoryDatabase_default(*gathering);
-#endif
-
-    UA_StatusCode retval = UA_Server_run_startup(server);
-    if(retval != UA_STATUSCODE_GOOD) {
-        fprintf(stderr, "Error while calling Server_run_startup. %s\n", UA_StatusCode_name(retval));
-        UA_Server_delete(server);
-        exit(1);
-    }
-
-    THREAD_CREATE(server_thread, serverloop);
-    /* Define the attribute of the uint32 variable node */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_UInt32 myUint32 = 40;
-    UA_Variant_setScalar(&attr.value, &myUint32, &UA_TYPES[UA_TYPES_UINT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_HISTORYREAD | UA_ACCESSLEVELMASK_HISTORYWRITE;
-    attr.historizing = true;
-
-    /* Add the variable node to the information model */
-    UA_NodeId uint32NodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName uint32Name = UA_QUALIFIEDNAME(1, "the answer");
-    parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_NodeId_init(&outNodeId);
-    retval = UA_Server_addVariableNode(server, uint32NodeId, parentNodeId,
-                                       parentReferenceNodeId, uint32Name,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       attr, NULL, &outNodeId);
-    if (retval != UA_STATUSCODE_GOOD) {
-        fprintf(stderr, "Error adding variable node. %s\n", UA_StatusCode_name(retval));
-        UA_Server_delete(server);
-        exit(1);
-    }
-
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-    retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if (retval != UA_STATUSCODE_GOOD) {
-        fprintf(stderr, "Client can not connect to opc.tcp://localhost:4840. %s\n", UA_StatusCode_name(retval));
-        UA_Client_delete(client);
-        UA_Server_delete(server);
-        exit(1);
-    }
-
-    UA_Client_recv = client->connection.recv;
-    client->connection.recv = UA_Client_recvTesting;
-}
-
-static void teardown(void) {
-    /* cleanup */
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    running = false;
-    THREAD_JOIN(server_thread);
-    UA_NodeId_deleteMembers(&parentNodeId);
-    UA_NodeId_deleteMembers(&parentReferenceNodeId);
-    UA_NodeId_deleteMembers(&outNodeId);
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-#ifdef UA_ENABLE_HISTORIZING
-    UA_free(gathering);
-#endif
-    if (!MUTEX_DESTROY(serverMutex)) {
-        fprintf(stderr, "Server mutex was not destroyed correctly.\n");
-        exit(1);
-    }
-}
-
-#ifdef UA_ENABLE_HISTORIZING
-
-#include <stdio.h>
-#include "ua_session.h"
-
-static UA_StatusCode
-setUInt32(UA_Client *thisClient, UA_NodeId node, UA_UInt32 value)
-{
-    UA_Variant variant;
-    UA_Variant_setScalar(&variant, &value, &UA_TYPES[UA_TYPES_UINT32]);
-    return UA_Client_writeValueAttribute(thisClient, node, &variant);
-}
-
-static UA_DateTime* sortDateTimes(UA_DateTime *data) {
-    size_t count = 0;
-    while(data[count++]);
-    UA_DateTime* ret;
-    if (UA_Array_copy(data, count, (void**)&ret, &UA_TYPES[UA_TYPES_DATETIME]) != UA_STATUSCODE_GOOD)
-        return NULL;
-    --count;
-    // sort it
-    for (size_t i = 1; i < count; i++) {
-       for (size_t j = 0; j < count - i; j++) {
-           if (ret[j] > ret[j+1]) {
-               UA_DateTime tmp = ret[j];
-               ret[j] = ret[j+1];
-               ret[j+1] = tmp;
-           }
-       }
-    }
-    return ret;
-}
-
-static void
-printTimestamp(UA_DateTime timestamp)
-{
-    if (timestamp == TIMESTAMP_FIRST) {
-        fprintf(stderr, "FIRST,");
-    } else if (timestamp == TIMESTAMP_LAST) {
-        fprintf(stderr, "LAST,");
-    } else {
-        fprintf(stderr, "%3lld,", timestamp / UA_DATETIME_SEC);
-    }
-}
-
-static void
-printResult(UA_DataValue * value)
-{
-    if (value->status != UA_STATUSCODE_GOOD)
-        fprintf(stderr, "%s:", UA_StatusCode_name(value->status));
-    printTimestamp(value->sourceTimestamp);
-}
-
-static UA_Boolean
-resultIsEqual(const UA_DataValue * result, const testTuple * tuple, size_t index)
-{
-    switch (tuple->result[index]) {
-    case TIMESTAMP_FIRST:
-        if (result->status != UA_STATUSCODE_BADBOUNDNOTFOUND
-                || !UA_Variant_isEmpty(&result->value))
-            return false;
-        /* we do not test timestamp if TIMESTAMP_UNSPECIFIED is given for start.
-         * See OPC UA Part 11, Version 1.03, Page 5-6, Table 1, Mark b for details.*/
-        if (tuple->start != TIMESTAMP_UNSPECIFIED
-                && tuple->start != result->sourceTimestamp)
-            return false;
-        break;
-    case TIMESTAMP_LAST:
-        if (result->status != UA_STATUSCODE_BADBOUNDNOTFOUND
-                || !UA_Variant_isEmpty(&result->value))
-            return false;
-        /* we do not test timestamp if TIMESTAMP_UNSPECIFIED is given for end.
-         * See OPC UA Part 11, Version 1.03, Page 5-6, Table 1, Mark a for details.*/
-        if (tuple->end != TIMESTAMP_UNSPECIFIED
-                && tuple->end != result->sourceTimestamp)
-            return false;
-        break;
-    default:
-        if (result->sourceTimestamp != tuple->result[index]
-                || result->value.type != &UA_TYPES[UA_TYPES_INT64]
-                || *((UA_Int64*)result->value.data) != tuple->result[index])
-            return false;
-    }
-    return true;
-}
-
-static UA_Boolean
-fillHistoricalDataBackend(UA_HistoryDataBackend backend)
-{
-    int i = 0;
-    UA_DateTime currentDateTime = testData[i];
-    fprintf(stderr, "Adding to historical data backend: ");
-    while (currentDateTime) {
-        fprintf(stderr, "%lld, ", currentDateTime / UA_DATETIME_SEC);
-        UA_DataValue value;
-        UA_DataValue_init(&value);
-        value.hasValue = true;
-        UA_Int64 d = currentDateTime;
-        UA_Variant_setScalarCopy(&value.value, &d, &UA_TYPES[UA_TYPES_INT64]);
-        value.hasSourceTimestamp = true;
-        value.sourceTimestamp = currentDateTime;
-        value.hasServerTimestamp = true;
-        value.serverTimestamp = currentDateTime;
-        value.hasStatus = true;
-        value.status = UA_STATUSCODE_GOOD;
-        if (backend.serverSetHistoryData(server, backend.context, NULL, NULL, &outNodeId, UA_FALSE, &value) != UA_STATUSCODE_GOOD) {
-            fprintf(stderr, "\n");
-            return false;
-        }
-        UA_DataValue_deleteMembers(&value);
-        currentDateTime = testData[++i];
-    }
-    fprintf(stderr, "\n");
-    return true;
-}
-
-void
-Service_HistoryRead(UA_Server *server, UA_Session *session,
-                    const UA_HistoryReadRequest *request,
-                    UA_HistoryReadResponse *response);
-
-static void
-requestHistory(UA_DateTime start,
-               UA_DateTime end,
-               UA_HistoryReadResponse * response,
-               UA_UInt32 numValuesPerNode,
-               UA_Boolean returnBounds,
-               UA_ByteString *continuationPoint)
-{
-    UA_ReadRawModifiedDetails *details = UA_ReadRawModifiedDetails_new();
-    details->startTime = start;
-    details->endTime = end;
-    details->isReadModified = false;
-    details->numValuesPerNode = numValuesPerNode;
-    details->returnBounds = returnBounds;
-
-    UA_HistoryReadValueId *valueId = UA_HistoryReadValueId_new();
-    UA_NodeId_copy(&outNodeId, &valueId->nodeId);
-    if (continuationPoint)
-        UA_ByteString_copy(continuationPoint, &valueId->continuationPoint);
-
-    UA_HistoryReadRequest request;
-    UA_HistoryReadRequest_init(&request);
-    request.historyReadDetails.encoding = UA_EXTENSIONOBJECT_DECODED;
-    request.historyReadDetails.content.decoded.type = &UA_TYPES[UA_TYPES_READRAWMODIFIEDDETAILS];
-    request.historyReadDetails.content.decoded.data = details;
-
-    request.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
-
-    request.nodesToReadSize = 1;
-    request.nodesToRead = valueId;
-
-    UA_LOCK(server->serviceMutex);
-    Service_HistoryRead(server, &server->adminSession, &request, response);
-    UA_UNLOCK(server->serviceMutex);
-    UA_HistoryReadRequest_deleteMembers(&request);
-}
-
-static UA_UInt32
-testHistoricalDataBackend(size_t maxResponseSize)
-{
-    const UA_HistorizingNodeIdSettings* setting = gathering->getHistorizingSetting(server, gathering->context, &outNodeId);
-    UA_HistorizingNodeIdSettings newSetting = *setting;
-    newSetting.maxHistoryDataResponseSize = maxResponseSize;
-    gathering->updateNodeIdSetting(server, gathering->context, &outNodeId, newSetting);
-
-    UA_UInt32 retval = 0;
-    size_t i = 0;
-    testTuple *current = &testRequests[i];
-    fprintf(stderr, "Testing with maxResponseSize of %lu\n", maxResponseSize);
-    fprintf(stderr, "Start | End  | numValuesPerNode | returnBounds |ContPoint| {Expected}{Result} Result\n");
-    fprintf(stderr, "------+------+------------------+--------------+---------+----------------\n");
-    size_t j;
-    while (current->start || current->end) {
-        j = 0;
-        if (current->start == TIMESTAMP_UNSPECIFIED) {
-            fprintf(stderr, "UNSPEC|");
-        } else {
-            fprintf(stderr, "  %3lld |", current->start / UA_DATETIME_SEC);
-        }
-        if (current->end == TIMESTAMP_UNSPECIFIED) {
-            fprintf(stderr, "UNSPEC|");
-        } else {
-            fprintf(stderr, "  %3lld |", current->end / UA_DATETIME_SEC);
-        }
-        fprintf(stderr, "               %2u |          %s |     %s | {", current->numValuesPerNode, (current->returnBounds ? "Yes" : " No"), (current->returnContinuationPoint ? "Yes" : " No"));
-        while (current->result[j]) {
-            printTimestamp(current->result[j]);
-            ++j;
-        }
-        fprintf(stderr, "}");
-
-        UA_DataValue *result = NULL;
-        size_t resultSize = 0;
-        UA_ByteString continuous;
-        UA_ByteString_init(&continuous);
-        UA_Boolean readOk = true;
-        size_t reseivedValues = 0;
-        fprintf(stderr, "{");
-        size_t counter = 0;
-        do {
-            UA_HistoryReadResponse response;
-            UA_HistoryReadResponse_init(&response);
-            UA_UInt32 numValuesPerNode = current->numValuesPerNode;
-            if (numValuesPerNode > 0 && numValuesPerNode + (UA_UInt32)reseivedValues > current->numValuesPerNode)
-                numValuesPerNode = current->numValuesPerNode - (UA_UInt32)reseivedValues;
-
-            requestHistory(current->start,
-                           current->end,
-                           &response,
-                           numValuesPerNode,
-                           current->returnBounds,
-                           &continuous);
-            ++counter;
-
-            if(response.resultsSize != 1) {
-                fprintf(stderr, "ResultError:Size %lu %s", response.resultsSize, UA_StatusCode_name(response.responseHeader.serviceResult));
-                readOk = false;
-                UA_HistoryReadResponse_deleteMembers(&response);
-                break;
-            }
-
-            UA_StatusCode stat = response.results[0].statusCode;
-            if (stat == UA_STATUSCODE_BADBOUNDNOTSUPPORTED && current->returnBounds) {
-                fprintf(stderr, "%s", UA_StatusCode_name(stat));
-                UA_HistoryReadResponse_deleteMembers(&response);
-                break;
-            }
-
-            if(response.results[0].historyData.encoding != UA_EXTENSIONOBJECT_DECODED
-                    || response.results[0].historyData.content.decoded.type != &UA_TYPES[UA_TYPES_HISTORYDATA]) {
-                fprintf(stderr, "ResultError:HistoryData");
-                readOk = false;
-                UA_HistoryReadResponse_deleteMembers(&response);
-                break;
-            }
-
-            UA_HistoryData * data = (UA_HistoryData *)response.results[0].historyData.content.decoded.data;
-            resultSize = data->dataValuesSize;
-            result = data->dataValues;
-
-            if (resultSize == 0 && continuous.length > 0) {
-                fprintf(stderr, "continuousResultEmpty");
-                readOk = false;
-                UA_HistoryReadResponse_deleteMembers(&response);
-                break;
-            }
-
-            if (resultSize > maxResponseSize) {
-                fprintf(stderr, "resultToBig");
-                readOk = false;
-                UA_HistoryReadResponse_deleteMembers(&response);
-                break;
-            }
-
-            if (stat != UA_STATUSCODE_GOOD) {
-                fprintf(stderr, "%s", UA_StatusCode_name(stat));
-            } else {
-                for (size_t k = 0; k < resultSize; ++k)
-                    printResult(&result[k]);
-            }
-
-            if (stat == UA_STATUSCODE_GOOD && j >= resultSize + reseivedValues) {
-                for (size_t l = 0; l < resultSize; ++l) {
-                    /* See OPC UA Part 11, Version 1.03, Page 5-6, Table 1, Mark a for details.*/
-                    if (current->result[l + reseivedValues] == TIMESTAMP_LAST && current->end == TIMESTAMP_UNSPECIFIED) {
-                        // This test will work on not continous read, only
-                        if (reseivedValues == 0 && !(l > 0 && result[l].sourceTimestamp == result[l-1].sourceTimestamp + UA_DATETIME_SEC))
-                            readOk = false;
-                    }
-                    /* See OPC UA Part 11, Version 1.03, Page 5-6, Table 1, Mark b for details.*/
-                    if (current->result[l + reseivedValues] == TIMESTAMP_FIRST && current->start == TIMESTAMP_UNSPECIFIED) {
-                        // This test will work on not continous read, only
-                        if (reseivedValues == 0 && !(l > 0 && result[l].sourceTimestamp == result[l-1].sourceTimestamp - UA_DATETIME_SEC))
-                            readOk = false;
-                    }
-                    if (!resultIsEqual(&result[l], current, l + reseivedValues))
-                        readOk = false;
-                }
-                if (response.results[0].continuationPoint.length > 0)
-                    fprintf(stderr, "C,");
-                reseivedValues += resultSize;
-                if (reseivedValues == j) {
-                    if (current->returnContinuationPoint && response.results[0].continuationPoint.length == 0) {
-                        readOk = false;
-                        fprintf(stderr, "missingContinuationPoint");
-                    }
-                    if (!current->returnContinuationPoint && response.results[0].continuationPoint.length > 0) {
-                        readOk = false;
-                        fprintf(stderr, "unexpectedContinuationPoint");
-                    }
-                    UA_HistoryReadResponse_deleteMembers(&response);
-                    break;
-                }
-                UA_ByteString_deleteMembers(&continuous);
-                UA_ByteString_copy(&response.results[0].continuationPoint, &continuous);
-            } else {
-                readOk = false;
-                UA_HistoryReadResponse_deleteMembers(&response);
-                break;
-            }
-            UA_HistoryReadResponse_deleteMembers(&response);
-        } while (continuous.length > 0);
-
-        if (j != reseivedValues) {
-            readOk = false;
-        }
-        UA_ByteString_deleteMembers(&continuous);
-        if (!readOk) {
-            fprintf(stderr, "} Fail (%lu requests)\n", counter);
-            ++retval;
-        } else {
-            fprintf(stderr, "} OK (%lu requests)\n", counter);
-        }
-        current = &testRequests[++i];
-    }
-    return retval;
-}
-
-void
-Service_HistoryUpdate(UA_Server *server, UA_Session *session,
-                      const UA_HistoryUpdateRequest *request,
-                      UA_HistoryUpdateResponse *response);
-
-static UA_StatusCode
-deleteHistory(UA_DateTime start,
-              UA_DateTime end)
-{
-    UA_DeleteRawModifiedDetails *details = UA_DeleteRawModifiedDetails_new();
-    details->startTime = start;
-    details->endTime = end;
-    details->isDeleteModified = false;
-    UA_NodeId_copy(&outNodeId, &details->nodeId);
-
-    UA_HistoryUpdateRequest request;
-    UA_HistoryUpdateRequest_init(&request);
-    request.historyUpdateDetailsSize = 1;
-    request.historyUpdateDetails = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(request.historyUpdateDetails);
-
-    request.historyUpdateDetails[0].encoding = UA_EXTENSIONOBJECT_DECODED;
-    request.historyUpdateDetails[0].content.decoded.type = &UA_TYPES[UA_TYPES_DELETERAWMODIFIEDDETAILS];
-    request.historyUpdateDetails[0].content.decoded.data = details;
-
-    UA_HistoryUpdateResponse response;
-    UA_HistoryUpdateResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_HistoryUpdate(server, &server->adminSession, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    UA_HistoryUpdateRequest_deleteMembers(&request);
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-    if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        ret = response.responseHeader.serviceResult;
-    else if (response.resultsSize != 1)
-        ret = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    else if (response.results[0].statusCode != UA_STATUSCODE_GOOD)
-        ret = response.results[0].statusCode;
-    else if (response.results[0].operationResultsSize != 0)
-        ret = UA_STATUSCODE_BADUNEXPECTEDERROR;
-
-    UA_HistoryUpdateResponse_deleteMembers(&response);
-    return ret;
-}
-
-static UA_StatusCode
-updateHistory(UA_PerformUpdateType updateType, UA_DateTime *updateData, UA_StatusCode ** operationResults, size_t *operationResultsSize)
-{
-    UA_UpdateDataDetails *details = UA_UpdateDataDetails_new();
-    details->performInsertReplace = updateType;
-    UA_NodeId_copy(&outNodeId, &details->nodeId);
-    int updateDataSize = -1;
-    while(updateData[++updateDataSize]);
-    fprintf(stderr, "updateHistory for %d values.\n", updateDataSize);
-    details->updateValuesSize = (size_t)updateDataSize;
-    details->updateValues = (UA_DataValue*)UA_Array_new(details->updateValuesSize, &UA_TYPES[UA_TYPES_DATAVALUE]);
-    for (size_t i = 0; i < details->updateValuesSize; ++i) {
-        UA_DataValue_init(&details->updateValues[i]);
-        details->updateValues[i].hasValue = true;
-        UA_Int64 d = updateType;
-        UA_Variant_setScalarCopy(&details->updateValues[i].value, &d, &UA_TYPES[UA_TYPES_INT64]);
-        details->updateValues[i].hasSourceTimestamp = true;
-        details->updateValues[i].sourceTimestamp = updateData[i];
-        details->updateValues[i].hasServerTimestamp = true;
-        details->updateValues[i].serverTimestamp = updateData[i];
-        details->updateValues[i].hasStatus = true;
-        details->updateValues[i].status = UA_STATUSCODE_GOOD;
-    }
-
-    UA_HistoryUpdateRequest request;
-    UA_HistoryUpdateRequest_init(&request);
-    request.historyUpdateDetailsSize = 1;
-    request.historyUpdateDetails = UA_ExtensionObject_new();
-    UA_ExtensionObject_init(request.historyUpdateDetails);
-
-    request.historyUpdateDetails[0].encoding = UA_EXTENSIONOBJECT_DECODED;
-    request.historyUpdateDetails[0].content.decoded.type = &UA_TYPES[UA_TYPES_UPDATEDATADETAILS];
-    request.historyUpdateDetails[0].content.decoded.data = details;
-
-    UA_HistoryUpdateResponse response;
-    UA_HistoryUpdateResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_HistoryUpdate(server, &server->adminSession, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    UA_HistoryUpdateRequest_deleteMembers(&request);
-    UA_StatusCode ret = UA_STATUSCODE_GOOD;
-    if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
-        ret = response.responseHeader.serviceResult;
-    else if (response.resultsSize != 1)
-        ret = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    else if (response.results[0].statusCode != UA_STATUSCODE_GOOD)
-        ret = response.results[0].statusCode;
-    else if (response.results[0].operationResultsSize != (size_t)updateDataSize)
-        ret = UA_STATUSCODE_BADUNEXPECTEDERROR;
-    else {
-        if (operationResults) {
-            *operationResultsSize = response.results[0].operationResultsSize;
-            ret = UA_Array_copy(response.results[0].operationResults, *operationResultsSize, (void**)operationResults, &UA_TYPES[UA_TYPES_STATUSCODE]);
-        } else {
-            for (size_t i = 0; i < response.results[0].operationResultsSize; ++i) {
-                if (response.results[0].operationResults[i] != UA_STATUSCODE_GOOD) {
-                    ret = response.results[0].operationResults[i];
-                    break;
-                }
-            }
-        }
-    }
-    UA_HistoryUpdateResponse_deleteMembers(&response);
-    return ret;
-}
-
-static void
-testResult(UA_DateTime *resultData, UA_HistoryData * historyData) {
-
-    // request
-    UA_HistoryReadResponse localResponse;
-    UA_HistoryReadResponse_init(&localResponse);
-    requestHistory(TIMESTAMP_FIRST, TIMESTAMP_LAST, &localResponse, 0, false, NULL);
-
-    // test the response
-    ck_assert_str_eq(UA_StatusCode_name(localResponse.responseHeader.serviceResult), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    ck_assert_uint_eq(localResponse.resultsSize, 1);
-    ck_assert_str_eq(UA_StatusCode_name(localResponse.results[0].statusCode), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    ck_assert_uint_eq(localResponse.results[0].historyData.encoding, UA_EXTENSIONOBJECT_DECODED);
-    ck_assert(localResponse.results[0].historyData.content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYDATA]);
-    UA_HistoryData * data = (UA_HistoryData *)localResponse.results[0].historyData.content.decoded.data;
-    if (historyData)
-        UA_HistoryData_copy(data, historyData);
-    for (size_t j = 0; j < data->dataValuesSize; ++j) {
-        ck_assert(resultData[j] != 0);
-        ck_assert_uint_eq(data->dataValues[j].hasSourceTimestamp, true);
-        ck_assert_uint_eq(data->dataValues[j].sourceTimestamp, resultData[j]);
-    }
-    UA_HistoryReadResponse_deleteMembers(&localResponse);
-}
-
-START_TEST(Server_HistorizingUpdateDelete)
-{
-    UA_HistoryDataBackend backend = UA_HistoryDataBackend_Memory(1, 1);
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = backend;
-    setting.maxHistoryDataResponseSize = 1000;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    serverMutexLock();
-    UA_StatusCode ret = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill backend
-    ck_assert_uint_eq(fillHistoricalDataBackend(backend), true);
-
-    // delete some values
-    ck_assert_str_eq(UA_StatusCode_name(deleteHistory(DELETE_START_TIME, DELETE_STOP_TIME)),
-                     UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    testResult(testDataAfterDelete, NULL);
-
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingUpdateInsert)
-{
-    UA_HistoryDataBackend backend = UA_HistoryDataBackend_Memory(1, 1);
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = backend;
-    setting.maxHistoryDataResponseSize = 1000;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    serverMutexLock();
-    UA_StatusCode ret = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill backend with insert
-    ck_assert_str_eq(UA_StatusCode_name(updateHistory(UA_PERFORMUPDATETYPE_INSERT, testData, NULL, NULL))
-                                        , UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    UA_HistoryData data;
-    UA_HistoryData_init(&data);
-
-    testResult(testDataSorted, &data);
-
-    for (size_t i = 0; i < data.dataValuesSize; ++i) {
-        ck_assert_uint_eq(data.dataValues[i].hasValue, true);
-        ck_assert(data.dataValues[i].value.type == &UA_TYPES[UA_TYPES_INT64]);
-        ck_assert_uint_eq(*((UA_Int64*)data.dataValues[i].value.data), UA_PERFORMUPDATETYPE_INSERT);
-    }
-
-    UA_HistoryData_deleteMembers(&data);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingUpdateReplace)
-{
-    UA_HistoryDataBackend backend = UA_HistoryDataBackend_Memory(1, 1);
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = backend;
-    setting.maxHistoryDataResponseSize = 1000;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    serverMutexLock();
-    UA_StatusCode ret = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill backend with insert
-    ck_assert_str_eq(UA_StatusCode_name(updateHistory(UA_PERFORMUPDATETYPE_INSERT, testData, NULL, NULL))
-                                        , UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // replace all
-    ck_assert_str_eq(UA_StatusCode_name(updateHistory(UA_PERFORMUPDATETYPE_REPLACE, testData, NULL, NULL))
-                                        , UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    UA_HistoryData data;
-    UA_HistoryData_init(&data);
-
-    testResult(testDataSorted, &data);
-
-    for (size_t i = 0; i < data.dataValuesSize; ++i) {
-        ck_assert_uint_eq(data.dataValues[i].hasValue, true);
-        ck_assert(data.dataValues[i].value.type == &UA_TYPES[UA_TYPES_INT64]);
-        ck_assert_uint_eq(*((UA_Int64*)data.dataValues[i].value.data), UA_PERFORMUPDATETYPE_REPLACE);
-    }
-
-    UA_HistoryData_deleteMembers(&data);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingUpdateUpdate)
-{
-    UA_HistoryDataBackend backend = UA_HistoryDataBackend_Memory(1, 1);
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = backend;
-    setting.maxHistoryDataResponseSize = 1000;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    serverMutexLock();
-    UA_StatusCode ret = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill backend with insert
-    ck_assert_str_eq(UA_StatusCode_name(updateHistory(UA_PERFORMUPDATETYPE_INSERT, testData, NULL, NULL))
-                                        , UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    testResult(testDataSorted, NULL);
-
-    // delete some values
-    ck_assert_str_eq(UA_StatusCode_name(deleteHistory(DELETE_START_TIME, DELETE_STOP_TIME)),
-                     UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    testResult(testDataAfterDelete, NULL);
-
-    // update all and insert some
-    UA_StatusCode *result;
-    size_t resultSize = 0;
-    ck_assert_str_eq(UA_StatusCode_name(updateHistory(UA_PERFORMUPDATETYPE_UPDATE, testDataSorted, &result, &resultSize))
-                                        , UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    for (size_t i = 0; i < resultSize; ++i) {
-        ck_assert_str_eq(UA_StatusCode_name(result[i]), UA_StatusCode_name(testDataUpdateResult[i]));
-    }
-    UA_Array_delete(result, resultSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-
-    UA_HistoryData data;
-    UA_HistoryData_init(&data);
-
-    testResult(testDataSorted, &data);
-
-    for (size_t i = 0; i < data.dataValuesSize; ++i) {
-        ck_assert_uint_eq(data.dataValues[i].hasValue, true);
-        ck_assert(data.dataValues[i].value.type == &UA_TYPES[UA_TYPES_INT64]);
-        ck_assert_uint_eq(*((UA_Int64*)data.dataValues[i].value.data), UA_PERFORMUPDATETYPE_UPDATE);
-    }
-
-    UA_HistoryData_deleteMembers(&data);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingStrategyUser)
-{
-    // set a data backend
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = UA_HistoryDataBackend_Memory(3, 100);
-    setting.maxHistoryDataResponseSize = 100;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    UA_StatusCode retval = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill the data
-    UA_DateTime start = UA_DateTime_now();
-    UA_DateTime end = start + (10 * UA_DATETIME_SEC);
-    for (UA_UInt32 i = 0; i < 10; ++i) {
-        UA_DataValue value;
-        UA_DataValue_init(&value);
-        value.hasValue = true;
-        value.hasStatus = true;
-        value.status = UA_STATUSCODE_GOOD;
-        UA_Variant_setScalarCopy(&value.value, &i, &UA_TYPES[UA_TYPES_UINT32]);
-        value.hasSourceTimestamp = true;
-        value.sourceTimestamp = start + (i * UA_DATETIME_SEC);
-        value.hasServerTimestamp = true;
-        value.serverTimestamp = value.sourceTimestamp;
-        retval = setting.historizingBackend.serverSetHistoryData(server,
-                                                                 setting.historizingBackend.context,
-                                                                 NULL,
-                                                                 NULL,
-                                                                 &outNodeId,
-                                                                 UA_FALSE,
-                                                                 &value);
-        ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        UA_DataValue_deleteMembers(&value);
-    }
-
-    // request
-    UA_HistoryReadResponse response;
-    UA_HistoryReadResponse_init(&response);
-    requestHistory(start, end, &response, 0, false, NULL);
-
-    // test the response
-    ck_assert_str_eq(UA_StatusCode_name(response.responseHeader.serviceResult), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    ck_assert_uint_eq(response.resultsSize, 1);
-    for (size_t i = 0; i < response.resultsSize; ++i) {
-        ck_assert_str_eq(UA_StatusCode_name(response.results[i].statusCode), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        ck_assert_uint_eq(response.results[i].historyData.encoding, UA_EXTENSIONOBJECT_DECODED);
-        ck_assert(response.results[i].historyData.content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYDATA]);
-        UA_HistoryData * data = (UA_HistoryData *)response.results[i].historyData.content.decoded.data;
-        ck_assert_uint_eq(data->dataValuesSize, 10);
-        for (size_t j = 0; j < data->dataValuesSize; ++j) {
-            ck_assert_uint_eq(data->dataValues[j].hasSourceTimestamp, true);
-            ck_assert_uint_eq(data->dataValues[j].sourceTimestamp, start + (j * UA_DATETIME_SEC));
-            ck_assert_uint_eq(data->dataValues[j].hasStatus, true);
-            ck_assert_str_eq(UA_StatusCode_name(data->dataValues[j].status), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-            ck_assert_uint_eq(data->dataValues[j].hasValue, true);
-            ck_assert(data->dataValues[j].value.type == &UA_TYPES[UA_TYPES_UINT32]);
-            UA_UInt32 * value = (UA_UInt32 *)data->dataValues[j].value.data;
-            ck_assert_uint_eq(*value, j);
-        }
-    }
-    UA_HistoryReadResponse_deleteMembers(&response);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingStrategyPoll)
-{
-    // init to a defined value
-    UA_StatusCode retval = setUInt32(client, outNodeId, 43);
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // set a data backend
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = UA_HistoryDataBackend_Memory(3, 100);
-    setting.maxHistoryDataResponseSize = 100;
-    setting.pollingInterval = 100;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_POLL;
-    serverMutexLock();
-    retval = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill the data
-    UA_DateTime start = UA_DateTime_now();
-    serverMutexLock();
-    retval = gathering->startPoll(server, gathering->context, &outNodeId);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    for (size_t k = 0; k < 10; ++k) {
-        UA_fakeSleep(50);
-        UA_realSleep(50);
-        if (k == 5) {
-            serverMutexLock();
-            gathering->stopPoll(server, gathering->context, &outNodeId);
-            serverMutexUnlock();
-        }
-        setUInt32(client, outNodeId, (unsigned int)k);
-    }
-
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    UA_DateTime end = UA_DateTime_now();
-
-    // request
-    UA_HistoryReadResponse response;
-    UA_HistoryReadResponse_init(&response);
-    requestHistory(start, end, &response, 0, false, NULL);
-
-    // test the response
-    ck_assert_str_eq(UA_StatusCode_name(response.responseHeader.serviceResult), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    ck_assert_uint_eq(response.resultsSize, 1);
-    for (size_t i = 0; i < response.resultsSize; ++i) {
-        ck_assert_str_eq(UA_StatusCode_name(response.results[i].statusCode), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        ck_assert_uint_eq(response.results[i].historyData.encoding, UA_EXTENSIONOBJECT_DECODED);
-        ck_assert(response.results[i].historyData.content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYDATA]);
-        UA_HistoryData * data = (UA_HistoryData *)response.results[i].historyData.content.decoded.data;
-        ck_assert(data->dataValuesSize > 1);
-        for (size_t j = 0; j < data->dataValuesSize; ++j) {
-            ck_assert_uint_eq(data->dataValues[j].hasSourceTimestamp, true);
-            ck_assert(data->dataValues[j].sourceTimestamp >= start);
-            ck_assert(data->dataValues[j].sourceTimestamp < end);
-            ck_assert_uint_eq(data->dataValues[j].hasValue, true);
-            ck_assert(data->dataValues[j].value.type == &UA_TYPES[UA_TYPES_UINT32]);
-            UA_UInt32 * value = (UA_UInt32 *)data->dataValues[j].value.data;
-            // first need to be 43
-            if (j == 0) {
-                ck_assert(*value == 43);
-            } else {
-                ck_assert(*value < 5);
-            }
-        }
-    }
-    UA_HistoryReadResponse_deleteMembers(&response);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingStrategyValueSet)
-{
-    // init to a defined value
-    UA_StatusCode retval = setUInt32(client, outNodeId, 43);
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // set a data backend
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = UA_HistoryDataBackend_Memory(3, 100);
-    setting.maxHistoryDataResponseSize = 100;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_VALUESET;
-    serverMutexLock();
-    retval = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // fill the data
-    UA_fakeSleep(100);
-    UA_DateTime start = UA_DateTime_now();
-    UA_fakeSleep(100);
-    for (UA_UInt32 i = 0; i < 10; ++i) {
-        retval = setUInt32(client, outNodeId, i);
-        ck_assert_str_eq(UA_StatusCode_name(retval), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        UA_fakeSleep(100);
-    }
-    UA_DateTime end = UA_DateTime_now();
-
-    // request
-    UA_HistoryReadResponse response;
-    UA_HistoryReadResponse_init(&response);
-    requestHistory(start, end, &response, 0, false, NULL);
-
-    // test the response
-    ck_assert_str_eq(UA_StatusCode_name(response.responseHeader.serviceResult), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-    ck_assert_uint_eq(response.resultsSize, 1);
-    for (size_t i = 0; i < response.resultsSize; ++i) {
-        ck_assert_str_eq(UA_StatusCode_name(response.results[i].statusCode), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-        ck_assert_uint_eq(response.results[i].historyData.encoding, UA_EXTENSIONOBJECT_DECODED);
-        ck_assert(response.results[i].historyData.content.decoded.type == &UA_TYPES[UA_TYPES_HISTORYDATA]);
-        UA_HistoryData * data = (UA_HistoryData *)response.results[i].historyData.content.decoded.data;
-        ck_assert(data->dataValuesSize > 0);
-        for (size_t j = 0; j < data->dataValuesSize; ++j) {
-            ck_assert(data->dataValues[j].sourceTimestamp >= start && data->dataValues[j].sourceTimestamp < end);
-            ck_assert_uint_eq(data->dataValues[j].hasSourceTimestamp, true);
-            ck_assert_str_eq(UA_StatusCode_name(data->dataValues[j].status), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-            ck_assert_uint_eq(data->dataValues[j].hasValue, true);
-            ck_assert(data->dataValues[j].value.type == &UA_TYPES[UA_TYPES_UINT32]);
-            UA_UInt32 * value = (UA_UInt32 *)data->dataValues[j].value.data;
-            ck_assert_uint_eq(*value, j);
-        }
-    }
-    UA_HistoryReadResponse_deleteMembers(&response);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingBackendMemory)
-{
-    UA_HistoryDataBackend backend = UA_HistoryDataBackend_Memory(1, 1);
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = backend;
-    setting.maxHistoryDataResponseSize = 1000;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    serverMutexLock();
-    UA_StatusCode ret = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // empty backend should not crash
-    UA_UInt32 retval = testHistoricalDataBackend(100);
-    fprintf(stderr, "%d tests expected failed.\n", retval);
-
-    // fill backend
-    ck_assert_uint_eq(fillHistoricalDataBackend(backend), true);
-
-    // read all in one
-    retval = testHistoricalDataBackend(100);
-    fprintf(stderr, "%d tests failed.\n", retval);
-    ck_assert_uint_eq(retval, 0);
-
-    // read continuous one at one request
-    retval = testHistoricalDataBackend(1);
-    fprintf(stderr, "%d tests failed.\n", retval);
-    ck_assert_uint_eq(retval, 0);
-
-    // read continuous two at one request
-    retval = testHistoricalDataBackend(2);
-    fprintf(stderr, "%d tests failed.\n", retval);
-    ck_assert_uint_eq(retval, 0);
-    UA_HistoryDataBackend_Memory_deleteMembers(&setting.historizingBackend);
-}
-END_TEST
-
-START_TEST(Server_HistorizingRandomIndexBackend)
-{
-    UA_HistoryDataBackend backend = UA_HistoryDataBackend_randomindextest(testData);
-    UA_HistorizingNodeIdSettings setting;
-    setting.historizingBackend = backend;
-    setting.maxHistoryDataResponseSize = 1000;
-    setting.historizingUpdateStrategy = UA_HISTORIZINGUPDATESTRATEGY_USER;
-    serverMutexLock();
-    UA_StatusCode ret = gathering->registerNodeId(server, gathering->context, &outNodeId, setting);
-    serverMutexUnlock();
-    ck_assert_str_eq(UA_StatusCode_name(ret), UA_StatusCode_name(UA_STATUSCODE_GOOD));
-
-    // read all in one
-    UA_UInt32 retval = testHistoricalDataBackend(100);
-    fprintf(stderr, "%d tests failed.\n", retval);
-    ck_assert_uint_eq(retval, 0);
-
-    // read continuous one at one request
-    retval = testHistoricalDataBackend(1);
-    fprintf(stderr, "%d tests failed.\n", retval);
-    ck_assert_uint_eq(retval, 0);
-
-    // read continuous two at one request
-    retval = testHistoricalDataBackend(2);
-    fprintf(stderr, "%d tests failed.\n", retval);
-    ck_assert_uint_eq(retval, 0);
-    UA_HistoryDataBackend_randomindextest_deleteMembers(&backend);
-}
-END_TEST
-
-#endif /*UA_ENABLE_HISTORIZING*/
-
-static Suite* testSuite_Client(void)
-{
-    Suite *s = suite_create("Server Historical Data");
-    TCase *tc_server = tcase_create("Server Historical Data Basic");
-    tcase_add_checked_fixture(tc_server, setup, teardown);
-#ifdef UA_ENABLE_HISTORIZING
-    tcase_add_test(tc_server, Server_HistorizingStrategyPoll);
-    tcase_add_test(tc_server, Server_HistorizingStrategyUser);
-    tcase_add_test(tc_server, Server_HistorizingStrategyValueSet);
-    tcase_add_test(tc_server, Server_HistorizingBackendMemory);
-    tcase_add_test(tc_server, Server_HistorizingRandomIndexBackend);
-    tcase_add_test(tc_server, Server_HistorizingUpdateDelete);
-    tcase_add_test(tc_server, Server_HistorizingUpdateInsert);
-    tcase_add_test(tc_server, Server_HistorizingUpdateReplace);
-    tcase_add_test(tc_server, Server_HistorizingUpdateUpdate);
-#endif /* UA_ENABLE_HISTORIZING */
-    suite_add_tcase(s, tc_server);
-
-    return s;
-}
-
-int main(void)
-{
-#ifdef UA_ENABLE_HISTORIZING
-    testDataSorted = sortDateTimes(testData);
-#endif /* UA_ENABLE_HISTORIZING */
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-#ifdef UA_ENABLE_HISTORIZING
-    UA_free(testDataSorted);
-#endif /* UA_ENABLE_HISTORIZING */
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server_jobs.c b/ext/open62541/tests/server/check_server_jobs.c
deleted file mode 100644
index 9ed8a54..0000000
--- a/ext/open62541/tests/server/check_server_jobs.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-
-#include <check.h>
-
-#include "testing_clock.h"
-
-UA_Server *server = NULL;
-UA_Boolean *executed;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_Server_run_startup(server);
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-
-static void
-dummyCallback(UA_Server *serverPtr, void *data) {
-    *executed = true;
-}
-
-START_TEST(Server_addRemoveRepeatedCallback) {
-    executed = UA_Boolean_new();
-
-    /* The callback is added to the main queue only upon the next run_iterate */
-    UA_UInt64 id;
-    UA_Server_addRepeatedCallback(server, dummyCallback, NULL, 10, &id);
-
-    /* Wait until the callback has surely timed out */
-    UA_fakeSleep(15);
-    UA_Server_run_iterate(server, false);
-
-    /* Wait a bit longer until the workers have picked up the dispatched callback */
-    UA_realSleep(100);
-    ck_assert_uint_eq(*executed, true);
-
-    UA_Server_removeRepeatedCallback(server, id);
-    UA_Boolean_delete(executed);
-}
-END_TEST
-
-UA_UInt64 *cbId;
-
-static void
-removeItselfCallback(UA_Server *serverPtr, void *data) {
-    UA_Server_removeRepeatedCallback(serverPtr, *cbId);
-}
-
-START_TEST(Server_repeatedCallbackRemoveItself) {
-    cbId = UA_UInt64_new();
-    UA_Server_addRepeatedCallback(server, removeItselfCallback, NULL, 10, cbId);
-
-    UA_fakeSleep(15);
-    UA_Server_run_iterate(server, false);
-
-    UA_UInt64_delete(cbId);
-}
-END_TEST
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Server Callbacks");
-    TCase *tc_server = tcase_create("Server Repeated Callbacks");
-    tcase_add_checked_fixture(tc_server, setup, teardown);
-    tcase_add_test(tc_server, Server_addRemoveRepeatedCallback);
-    tcase_add_test(tc_server, Server_repeatedCallbackRemoveItself);
-    suite_add_tcase(s, tc_server);
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server_monitoringspeed.c b/ext/open62541/tests/server/check_server_monitoringspeed.c
deleted file mode 100644
index 42d7b5c..0000000
--- a/ext/open62541/tests/server/check_server_monitoringspeed.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/* This example is just to see how fast we can monitor value changes. The server does
-   not open a TCP port. */
-
-#include <open62541/server_config_default.h>
-
-#include "server/ua_subscription.h"
-#include "ua_server_internal.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <time.h>
-
-#include "testing_networklayers.h"
-#include "testing_policy.h"
-
-static UA_SecureChannel testChannel;
-static UA_SecurityPolicy dummyPolicy;
-static UA_Connection testingConnection;
-static funcs_called funcsCalled;
-static key_sizes keySizes;
-static UA_Server *server;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    TestingPolicy(&dummyPolicy, UA_BYTESTRING_NULL, &funcsCalled, &keySizes);
-    UA_SecureChannel_init(&testChannel);
-    UA_SecureChannel_setSecurityPolicy(&testChannel, &dummyPolicy, &UA_BYTESTRING_NULL);
-
-    testingConnection = createDummyConnection(65535, NULL);
-    UA_Connection_attachSecureChannel(&testingConnection, &testChannel);
-    testChannel.connection = &testingConnection;
-}
-
-static void teardown(void) {
-    UA_SecureChannel_close(&testChannel);
-    UA_SecureChannel_deleteMembers(&testChannel);
-    dummyPolicy.deleteMembers(&dummyPolicy);
-    testingConnection.close(&testingConnection);
-
-    UA_Server_delete(server);
-}
-
-static size_t callbackCount = 0;
-
-static void
-dataChangeNotificationCallback(UA_Server *s, UA_UInt32 monitoredItemId,
-                               void *monitoredItemContext, const UA_NodeId *nodeId,
-                               void *nodeContext, UA_UInt32 attributeId,
-                               const UA_DataValue *value) {
-    callbackCount++;
-}
-
-START_TEST(monitorIntegerNoChanges) {
-    /* add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode retval = UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                                     parentReferenceNodeId, myIntegerName,
-                                                     UA_NODEID_NULL, attr, NULL, NULL);
-    UA_assert(retval == UA_STATUSCODE_GOOD);
-
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    item.itemToMonitor.nodeId = myIntegerNodeId;
-    item.itemToMonitor.attributeId = UA_ATTRIBUTEID_VALUE;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_Server_createDataChangeMonitoredItem(server, UA_TIMESTAMPSTORETURN_NEITHER,
-                                            item, NULL, dataChangeNotificationCallback);
-
-    callbackCount = 0;
-
-    UA_MonitoredItem *mon = LIST_FIRST(&server->localMonitoredItems);
-
-    clock_t begin, finish;
-    begin = clock();
-
-    for(int i = 0; i < 1000000; i++) {
-        UA_MonitoredItem_sampleCallback(server, mon);
-    }
-
-    finish = clock();
-
-    double time_spent = (double)(finish - begin) / CLOCKS_PER_SEC;
-    printf("duration was %f s\n", time_spent);
-    printf("retval is %s\n", UA_StatusCode_name(retval));
-
-    UA_assert(callbackCount == 0);
-}
-END_TEST
-
-static Suite * monitoring_speed_suite (void) {
-    Suite *s = suite_create ("Monitoring Speed");
-
-    TCase* tc_datachange = tcase_create ("DataChange");
-    tcase_add_checked_fixture(tc_datachange, setup, teardown);
-    tcase_add_test (tc_datachange, monitorIntegerNoChanges);
-    suite_add_tcase (s, tc_datachange);
-
-    return s;
-}
-
-int main (void) {
-    int number_failed = 0;
-    Suite *s = monitoring_speed_suite();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr,CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed (sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server_readspeed.c b/ext/open62541/tests/server/check_server_readspeed.c
deleted file mode 100644
index 7585ad0..0000000
--- a/ext/open62541/tests/server/check_server_readspeed.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
-
-/* This example is just to see how fast we can process messages. The server does
-   not open a TCP port. */
-
-#include <open62541/server_config_default.h>
-
-#include "server/ua_services.h"
-#include "ua_server_internal.h"
-#include "ua_types_encoding_binary.h"
-
-#include <check.h>
-#include <time.h>
-
-#include "testing_networklayers.h"
-#include "testing_policy.h"
-
-static UA_SecureChannel testChannel;
-static UA_SecurityPolicy dummyPolicy;
-static UA_Connection testingConnection;
-static funcs_called funcsCalled;
-static key_sizes keySizes;
-
-static UA_Server *server;
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    TestingPolicy(&dummyPolicy, UA_BYTESTRING_NULL, &funcsCalled, &keySizes);
-    UA_SecureChannel_init(&testChannel);
-    UA_SecureChannel_setSecurityPolicy(&testChannel, &dummyPolicy, &UA_BYTESTRING_NULL);
-
-    testingConnection = createDummyConnection(65535, NULL);
-    UA_Connection_attachSecureChannel(&testingConnection, &testChannel);
-    testChannel.connection = &testingConnection;
-}
-
-static void teardown(void) {
-    UA_SecureChannel_close(&testChannel);
-    UA_SecureChannel_deleteMembers(&testChannel);
-    dummyPolicy.deleteMembers(&dummyPolicy);
-    testingConnection.close(&testingConnection);
-
-    UA_Server_delete(server);
-}
-
-START_TEST(readSpeed) {
-    /* add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode retval = UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                                     parentReferenceNodeId, myIntegerName,
-                                                     UA_NODEID_NULL, attr, NULL, NULL);
-    UA_assert(retval == UA_STATUSCODE_GOOD);
-
-    UA_ReadRequest request;
-    UA_ReadRequest_init(&request);
-    UA_ReadValueId rvi;
-    rvi.nodeId = myIntegerNodeId;
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-    rvi.indexRange = UA_STRING_NULL;
-    rvi.dataEncoding = UA_QUALIFIEDNAME(0, "Default Binary");
-    request.timestampsToReturn = UA_TIMESTAMPSTORETURN_NEITHER;
-    request.nodesToReadSize = 1;
-    request.nodesToRead = &rvi;
-
-    UA_ByteString request_msg;
-    retval |= UA_ByteString_allocBuffer(&request_msg, 1000);
-    UA_ByteString response_msg;
-    retval |= UA_ByteString_allocBuffer(&response_msg, 1000);
-
-    UA_Byte *pos = request_msg.data;
-    const UA_Byte *end = &request_msg.data[request_msg.length];
-    retval |= UA_encodeBinary(&request, &UA_TYPES[UA_TYPES_READREQUEST], &pos, &end, NULL, NULL);
-    ck_assert(retval == UA_STATUSCODE_GOOD);
-
-    UA_ReadRequest req;
-    UA_ReadResponse res;
-    UA_ReadResponse_init(&res);
-
-    clock_t begin, finish;
-    begin = clock();
-
-    for(size_t i = 0; i < 1000000; i++) {
-        size_t offset = 0;
-        retval |= UA_decodeBinary(&request_msg, &offset, &req, &UA_TYPES[UA_TYPES_READREQUEST], NULL);
-
-        UA_LOCK(server->serviceMutex);
-        Service_Read(server, &server->adminSession, &req, &res);
-        UA_UNLOCK(server->serviceMutex);
-
-        UA_Byte *rpos = response_msg.data;
-        const UA_Byte *rend = &response_msg.data[response_msg.length];
-        retval |= UA_encodeBinary(&res, &UA_TYPES[UA_TYPES_READRESPONSE],
-                                  &rpos, &rend, NULL, NULL);
-
-        UA_ReadRequest_deleteMembers(&req);
-        UA_ReadResponse_deleteMembers(&res);
-    }
-
-    finish = clock();
-    ck_assert(retval == UA_STATUSCODE_GOOD);
-
-    double time_spent = (double)(finish - begin) / CLOCKS_PER_SEC;
-    printf("duration was %f s\n", time_spent);
-    printf("retval is %s\n", UA_StatusCode_name(retval));
-
-    UA_ByteString_deleteMembers(&request_msg);
-    UA_ByteString_deleteMembers(&response_msg);
-}
-END_TEST
-
-static Suite * service_speed_suite (void) {
-    Suite *s = suite_create ("Service Speed");
-
-    TCase* tc_read = tcase_create ("Read");
-    tcase_add_checked_fixture(tc_read, setup, teardown);
-    tcase_add_test (tc_read, readSpeed);
-    suite_add_tcase (s, tc_read);
-
-    return s;
-}
-
-int main (void) {
-    int number_failed = 0;
-    Suite *s = service_speed_suite();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr,CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed (sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_server_userspace.c b/ext/open62541/tests/server/check_server_userspace.c
deleted file mode 100644
index 0f69f7d..0000000
--- a/ext/open62541/tests/server/check_server_userspace.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include <check.h>
-
-#ifdef __clang__
-//required for ck_assert_ptr_eq and const casting
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers"
-#endif
-
-START_TEST(Server_addNamespace_ShallWork) {
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_UInt16 a = UA_Server_addNamespace(server, "http://nameOfNamespace");
-    UA_UInt16 b = UA_Server_addNamespace(server, "http://nameOfNamespace");
-    UA_UInt16 c = UA_Server_addNamespace(server, "http://nameOfNamespace2");
-
-    ck_assert_uint_gt(a, 0);
-    ck_assert_uint_eq(a,b);
-    ck_assert_uint_ne(a,c);
-
-    UA_Server_delete(server);
-}
-END_TEST
-
-START_TEST(Server_addNamespace_writeService) {
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_Variant namespaces;
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-    UA_Server_readValue(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
-                        &namespaces);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(namespaces.type == &UA_TYPES[UA_TYPES_STRING]);
-
-    namespaces.data = UA_realloc(namespaces.data, (namespaces.arrayLength + 1) * sizeof(UA_String));
-    ++namespaces.arrayLength;
-    UA_String *ns = (UA_String*)namespaces.data;
-    ns[namespaces.arrayLength-1] = UA_STRING_ALLOC("test");
-    size_t nsSize = namespaces.arrayLength;
-
-    retval = UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
-                                  namespaces);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_Variant_deleteMembers(&namespaces);
-
-    /* Now read again */
-    UA_Server_readValue(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
-                        &namespaces);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(namespaces.arrayLength, nsSize);
-
-    UA_Variant_deleteMembers(&namespaces);
-    UA_Server_delete(server);
-}
-END_TEST
-
-struct nodeIterData {
-    UA_NodeId id;
-    UA_Boolean isInverse;
-    UA_NodeId referenceTypeID;
-    UA_Boolean hit;
-};
-#define NODE_ITER_DATA_SIZE 3
-
-static UA_StatusCode
-nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle) {
-    struct nodeIterData* objectsFolderChildren = ( struct nodeIterData*)handle;
-
-    ck_assert_int_eq(childId.namespaceIndex, 0);
-    ck_assert(childId.identifierType == UA_NODEIDTYPE_NUMERIC);
-
-    int i;
-
-    for(i=0; i<NODE_ITER_DATA_SIZE; i++) {
-        if(UA_NodeId_equal(&childId, &objectsFolderChildren[i].id)) {
-            break;
-        }
-    }
-    ck_assert_int_lt(i, NODE_ITER_DATA_SIZE);
-
-    ck_assert(objectsFolderChildren[i].isInverse == isInverse);
-
-    ck_assert(!objectsFolderChildren[i].hit);
-    objectsFolderChildren[i].hit = UA_TRUE;
-
-    ck_assert(UA_NodeId_equal(&referenceTypeId, &objectsFolderChildren[i].referenceTypeID));
-
-    return UA_STATUSCODE_GOOD;
-}
-
-START_TEST(Server_forEachChildNodeCall) {
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    /* List all the children/references of the objects folder
-     * The forEachChildNodeCall has to hit all of them */
-    struct nodeIterData objectsFolderChildren[3];
-    objectsFolderChildren[0].id = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    objectsFolderChildren[0].isInverse = UA_FALSE;
-    objectsFolderChildren[0].referenceTypeID = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    objectsFolderChildren[0].hit = UA_FALSE;
-
-    objectsFolderChildren[1].id = UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER);
-    objectsFolderChildren[1].isInverse = UA_TRUE;
-    objectsFolderChildren[1].referenceTypeID = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    objectsFolderChildren[1].hit = UA_FALSE;
-
-    objectsFolderChildren[2].id = UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE);
-    objectsFolderChildren[2].isInverse = UA_FALSE;
-    objectsFolderChildren[2].referenceTypeID = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION);
-    objectsFolderChildren[2].hit = UA_FALSE;
-
-    UA_StatusCode retval =
-        UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                       nodeIter, &objectsFolderChildren);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* Check if all nodes are hit */
-    for (int i=0; i<NODE_ITER_DATA_SIZE; i++) {
-        ck_assert(objectsFolderChildren[i].hit);
-    }
-
-    UA_Server_delete(server);
-} END_TEST
-
-
-START_TEST(Server_set_customHostname) {
-    UA_String customHost = UA_STRING("fancy-host");
-    UA_UInt16 port = 10042;
-
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setMinimal(config, port, NULL);
-    UA_ServerConfig_setCustomHostname(config, customHost);
-
-    UA_StatusCode retval = UA_Server_run_startup(server);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    // TODO when we have more network layers, extend this
-    ck_assert_uint_ge(config->networkLayersSize, 1);
-    ck_assert_uint_eq(config->applicationDescription.discoveryUrlsSize, config->networkLayersSize);
-
-
-    for (size_t i=0; i<config->networkLayersSize; i++) {
-        const UA_ServerNetworkLayer *nl = &config->networkLayers[i];
-        char discoveryUrl[256];
-        int len = snprintf(discoveryUrl, 255, "opc.tcp://%.*s:%d/", (int)customHost.length, customHost.data, port);
-        ck_assert_int_eq(nl->discoveryUrl.length, len);
-        ck_assert_int_eq(config->applicationDescription.discoveryUrls[i].length, len);
-        ck_assert(strncmp(discoveryUrl, (char*)nl->discoveryUrl.data, len)==0);
-        ck_assert(strncmp(discoveryUrl, (char*)config->applicationDescription.discoveryUrls[i].data, len)==0);
-    }
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-}
-END_TEST
-
-static Suite* testSuite_ServerUserspace(void) {
-    Suite *s = suite_create("ServerUserspace");
-    TCase *tc_core = tcase_create("Core");
-    tcase_add_test(tc_core, Server_addNamespace_ShallWork);
-    tcase_add_test(tc_core, Server_addNamespace_writeService);
-    tcase_add_test(tc_core, Server_forEachChildNodeCall);
-    tcase_add_test(tc_core, Server_set_customHostname);
-
-    suite_add_tcase(s,tc_core);
-    return s;
-}
-
-int main(void) {
-    int number_failed = 0;
-
-    Suite *s;
-    SRunner *sr;
-
-    s = testSuite_ServerUserspace();
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
diff --git a/ext/open62541/tests/server/check_services_attributes.c b/ext/open62541/tests/server/check_services_attributes.c
deleted file mode 100644
index 96c191b..0000000
--- a/ext/open62541/tests/server/check_services_attributes.c
+++ /dev/null
@@ -1,1010 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-#include "server/ua_services.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#ifdef __clang__
-//required for ck_assert_ptr_eq and const casting
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers"
-#endif
-
-static UA_Server *server = NULL;
-
-static UA_StatusCode
-readCPUTemperature(UA_Server *server_,
-                   const UA_NodeId *sessionId, void *sessionContext,
-                   const UA_NodeId *nodeId, void *nodeContext,
-                   UA_Boolean sourceTimeStamp, const UA_NumericRange *range,
-                   UA_DataValue *dataValue) {
-    UA_Float temp = 20.5f;
-    UA_Variant_setScalarCopy(&dataValue->value, &temp, &UA_TYPES[UA_TYPES_FLOAT]);
-    dataValue->hasValue = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-static void teardown(void) {
-    UA_Server_delete(server);
-}
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-    UA_StatusCode retval = UA_STATUSCODE_GOOD;
-
-    /* VariableNode */
-    UA_VariableAttributes vattr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&vattr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    vattr.description = UA_LOCALIZEDTEXT("locale","the answer");
-    vattr.displayName = UA_LOCALIZEDTEXT("locale","the answer");
-    vattr.valueRank = UA_VALUERANK_ANY;
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    retval = UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                       parentReferenceNodeId, myIntegerName,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       vattr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* Enum VariableNode */
-    UA_MessageSecurityMode m = UA_MESSAGESECURITYMODE_SIGN;
-    UA_Variant_setScalar(&vattr.value, &m, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]);
-    vattr.description = UA_LOCALIZEDTEXT("locale","the enum answer");
-    vattr.displayName = UA_LOCALIZEDTEXT("locale","the enum answer");
-    vattr.valueRank = UA_VALUERANK_ANY;
-    retval = UA_Server_addVariableNode(server, UA_NODEID_STRING(1, "the.enum.answer"),
-                                       parentNodeId, parentReferenceNodeId,
-                                       UA_QUALIFIEDNAME(1, "the enum answer"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       vattr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* DataSource VariableNode */
-    vattr = UA_VariableAttributes_default;
-    UA_DataSource temperatureDataSource;
-    temperatureDataSource.read = readCPUTemperature;
-    temperatureDataSource.write = NULL;
-    vattr.description = UA_LOCALIZEDTEXT("en-US","temperature");
-    vattr.displayName = UA_LOCALIZEDTEXT("en-US","temperature");
-    retval = UA_Server_addDataSourceVariableNode(server, UA_NODEID_STRING(1, "cpu.temperature"),
-                                                 UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                                 UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                                 UA_QUALIFIEDNAME(1, "cpu temperature"),
-                                                 UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                                 vattr, temperatureDataSource,
-                                                 NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* VariableNode with array */
-    vattr = UA_VariableAttributes_default;
-    UA_Int32 myIntegerArray[9] = {1,2,3,4,5,6,7,8,9};
-    UA_Variant_setArray(&vattr.value, &myIntegerArray, 9, &UA_TYPES[UA_TYPES_INT32]);
-    vattr.valueRank = UA_VALUERANK_ANY;
-    UA_UInt32 myIntegerDimensions[2] = {3,3};
-    vattr.value.arrayDimensions = myIntegerDimensions;
-    vattr.value.arrayDimensionsSize = 2;
-    vattr.displayName = UA_LOCALIZEDTEXT("locale","myarray");
-    myIntegerName = UA_QUALIFIEDNAME(1, "myarray");
-    myIntegerNodeId = UA_NODEID_STRING(1, "myarray");
-    parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    retval = UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                       parentReferenceNodeId, myIntegerName,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       vattr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* ObjectNode */
-    UA_ObjectAttributes obj_attr = UA_ObjectAttributes_default;
-    obj_attr.description = UA_LOCALIZEDTEXT("en-US","Demo");
-    obj_attr.displayName = UA_LOCALIZEDTEXT("en-US","Demo");
-    retval = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 50),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                     UA_QUALIFIEDNAME(1, "Demo"),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE),
-                                     obj_attr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* ViewNode */
-    UA_ViewAttributes view_attr = UA_ViewAttributes_default;
-    view_attr.description = UA_LOCALIZEDTEXT("en-US", "Viewtest");
-    view_attr.displayName = UA_LOCALIZEDTEXT("en-US", "Viewtest");
-    retval = UA_Server_addViewNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_VIEWNODE),
-                                   UA_NODEID_NUMERIC(0, UA_NS0ID_VIEWSFOLDER),
-                                   UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                   UA_QUALIFIEDNAME(0, "Viewtest"), view_attr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* DataTypeNode */
-    UA_DataTypeAttributes typeattr = UA_DataTypeAttributes_default;
-    typeattr.displayName = UA_LOCALIZEDTEXT("en-US", "TestDataType");
-    UA_Server_addDataTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_ARGUMENT),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                  UA_QUALIFIEDNAME(0, "Argument"), typeattr, NULL, NULL);
-
-#ifdef UA_ENABLE_METHODCALLS
-    /* MethodNode */
-    UA_MethodAttributes ma = UA_MethodAttributes_default;
-    ma.description = UA_LOCALIZEDTEXT("en-US", "Methodtest");
-    ma.displayName = UA_LOCALIZEDTEXT("en-US", "Methodtest");
-    retval = UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1, UA_NS0ID_METHODNODE),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                     UA_QUALIFIEDNAME(0, "Methodtest"), ma,
-                                     NULL, 0, NULL, 0, NULL, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-#endif
-}
-
-static UA_VariableNode* makeCompareSequence(void) {
-    UA_VariableNode *node = (UA_VariableNode*)
-        UA_Nodestore_newNode(server->nsCtx, UA_NODECLASS_VARIABLE);
-
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalarCopy(&node->value.data.value.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    node->value.data.value.hasValue = true;
-
-    const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_QualifiedName_copy(&myIntegerName,&node->browseName);
-
-    const UA_LocalizedText myIntegerDisplName = UA_LOCALIZEDTEXT("locale", "the answer");
-    UA_LocalizedText_copy(&myIntegerDisplName, &node->displayName);
-    UA_LocalizedText_copy(&myIntegerDisplName, &node->description);
-
-    const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_NodeId_copy(&myIntegerNodeId,&node->nodeId);
-
-    return node;
-}
-
-START_TEST(ReadSingleAttributeValueWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(resp.status, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_INT32] == resp.value.type);
-    ck_assert_int_eq(42, *(UA_Int32* )resp.value.data);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleDataSourceAttributeValueEmptyWithoutTimestamp) {
-    UA_Variant empty;
-    UA_Variant_init(&empty);
-    UA_StatusCode ret =
-        UA_Server_writeValue(server, UA_NODEID_STRING(1, "the.answer"), empty);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, ret);
-
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    // read 1
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    ck_assert_int_eq(true, resp.hasValue);
-    UA_DataValue_deleteMembers(&resp);
-
-    // read 2
-    ret = UA_Server_readValue(server, rvi.nodeId, &empty);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, ret);
-} END_TEST
-
-START_TEST(ReadSingleAttributeValueRangeWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "myarray");
-    rvi.indexRange = UA_STRING("1:2,0:1");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(4, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_INT32] == resp.value.type);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeNodeIdWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_NODEID;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_NODEID] == resp.value.type);
-    UA_NodeId* respval = (UA_NodeId*) resp.value.data;
-    ck_assert_int_eq(1, respval->namespaceIndex);
-    ck_assert(UA_String_equal(&myIntegerNodeId.identifier.string, &respval->identifier.string));
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeNodeClassWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_NODECLASS;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_NODECLASS] == resp.value.type);
-    ck_assert_int_eq(*(UA_Int32*)resp.value.data,UA_NODECLASS_VARIABLE);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeBrowseNameWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_BROWSENAME;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    
-    UA_QualifiedName* respval = (UA_QualifiedName*) resp.value.data;
-    const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_QUALIFIEDNAME] == resp.value.type);
-    ck_assert_int_eq(1, respval->namespaceIndex);
-    ck_assert(UA_String_equal(&myIntegerName.name, &respval->name));
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeDisplayNameWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    UA_LocalizedText* respval = (UA_LocalizedText*) resp.value.data;
-    const UA_LocalizedText comp = UA_LOCALIZEDTEXT("locale", "the answer");
-    UA_VariableNode* compNode = makeCompareSequence();
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT] == resp.value.type);
-    ck_assert(UA_String_equal(&comp.text, &respval->text));
-    ck_assert(UA_String_equal(&compNode->displayName.locale, &respval->locale));
-    UA_DataValue_deleteMembers(&resp);
-    UA_Nodestore_deleteNode(server->nsCtx, (UA_Node*)compNode);
-} END_TEST
-
-START_TEST(ReadSingleAttributeDescriptionWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_DESCRIPTION;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    
-    UA_LocalizedText* respval = (UA_LocalizedText*) resp.value.data;
-    UA_VariableNode* compNode = makeCompareSequence();
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT] == resp.value.type);
-    ck_assert(UA_String_equal(&compNode->description.locale, &respval->locale));
-    ck_assert(UA_String_equal(&compNode->description.text, &respval->text));
-    UA_DataValue_deleteMembers(&resp);
-    UA_Nodestore_deleteNode(server->nsCtx, (UA_Node*)compNode);
-} END_TEST
-
-START_TEST(ReadSingleAttributeWriteMaskWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_WRITEMASK;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    
-    UA_UInt32* respval = (UA_UInt32*) resp.value.data;
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_UINT32] == resp.value.type);
-    ck_assert_int_eq(0,*respval);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeUserWriteMaskWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_USERWRITEMASK;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    /* Uncommented since the userwritemask is always 0xffffffff for the local admin user */
-    /* UA_UInt32* respval = (UA_UInt32*) resp.value.data; */
-    /* ck_assert_int_eq(0, resp.value.arrayLength); */
-    /* ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_UINT32], resp.value.type); */
-    /* ck_assert_int_eq(0,*respval); */
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeIsAbstractWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    rvi.attributeId = UA_ATTRIBUTEID_ISABSTRACT;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BOOLEAN] == resp.value.type);
-    ck_assert(*(UA_Boolean* )resp.value.data==false);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeSymmetricWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    rvi.attributeId = UA_ATTRIBUTEID_SYMMETRIC;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BOOLEAN] == resp.value.type);
-    ck_assert(*(UA_Boolean* )resp.value.data==false);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeInverseNameWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    rvi.attributeId = UA_ATTRIBUTEID_INVERSENAME;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    UA_LocalizedText* respval = (UA_LocalizedText*) resp.value.data;
-    const UA_LocalizedText comp = UA_LOCALIZEDTEXT("", "OrganizedBy");
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT] == resp.value.type);
-    ck_assert(UA_String_equal(&comp.text, &respval->text));
-    ck_assert(UA_String_equal(&comp.locale, &respval->locale));
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeContainsNoLoopsWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_VIEWNODE);
-    rvi.attributeId = UA_ATTRIBUTEID_CONTAINSNOLOOPS;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BOOLEAN] == resp.value.type);
-    ck_assert(*(UA_Boolean* )resp.value.data==false);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeEventNotifierWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(1, 50);
-    rvi.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BYTE] == resp.value.type);
-    ck_assert_int_eq(*(UA_Byte*)resp.value.data, 0);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeDataTypeWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_DATATYPE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    ck_assert_int_eq(true, resp.hasValue);
-    ck_assert(&UA_TYPES[UA_TYPES_NODEID] == resp.value.type);
-    UA_NodeId* respval = (UA_NodeId*)resp.value.data;
-    ck_assert_int_eq(respval->namespaceIndex,0);
-    ck_assert_int_eq(respval->identifier.numeric, UA_NS0ID_BASEDATATYPE);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeValueRankWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUERANK;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_INT32] == resp.value.type);
-    ck_assert_int_eq(-2, *(UA_Int32* )resp.value.data);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeArrayDimensionsWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_UINT32] == resp.value.type);
-    ck_assert_ptr_eq((UA_Int32*)resp.value.data,0);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeAccessLevelWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_ACCESSLEVEL;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BYTE] == resp.value.type);
-    ck_assert_int_eq(*(UA_Byte*)resp.value.data, UA_ACCESSLEVELMASK_READ); // set by default
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeUserAccessLevelWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_USERACCESSLEVEL;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    /* Uncommented since the accesslevel is always 0xff for the local admin user */
-    /* const UA_VariableNode* compNode = */
-    /*     (const UA_VariableNode*)UA_NodeStore_getNode(server->nsCtx, &rvi.nodeId); */
-    /* ck_assert_int_eq(0, resp.value.arrayLength); */
-    /* ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BYTE], resp.value.type); */
-    /* ck_assert_int_eq(*(UA_Byte*)resp.value.data, compNode->accessLevel & 0xFF); // 0xFF is the default userAccessLevel */
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeMinimumSamplingIntervalWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    
-    UA_Double* respval = (UA_Double*) resp.value.data;
-    UA_VariableNode *compNode = makeCompareSequence();
-    UA_Double comp = (UA_Double) compNode->minimumSamplingInterval;
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_DOUBLE] == resp.value.type);
-    ck_assert(*respval == comp);
-    UA_DataValue_deleteMembers(&resp);
-    UA_Nodestore_deleteNode(server->nsCtx, (UA_Node*)compNode);
-} END_TEST
-
-START_TEST(ReadSingleAttributeHistorizingWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_HISTORIZING;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BOOLEAN] == resp.value.type);
-    ck_assert(*(UA_Boolean*)resp.value.data==false);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeExecutableWithoutTimestamp) {
-#ifdef UA_ENABLE_METHODCALLS
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(1, UA_NS0ID_METHODNODE);
-    rvi.attributeId = UA_ATTRIBUTEID_EXECUTABLE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(true, resp.hasValue);
-    ck_assert_int_eq(0, resp.value.arrayLength);
-    ck_assert(&UA_TYPES[UA_TYPES_BOOLEAN] == resp.value.type);
-    ck_assert(*(UA_Boolean*)resp.value.data==true);
-    UA_DataValue_deleteMembers(&resp);
-#endif
-} END_TEST
-
-START_TEST(ReadSingleAttributeUserExecutableWithoutTimestamp) {
-#ifdef UA_ENABLE_METHODCALLS
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(1, UA_NS0ID_METHODNODE);
-    rvi.attributeId = UA_ATTRIBUTEID_USEREXECUTABLE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    /* Uncommented since userexecutable is always true for the local admin user */
-    /* ck_assert_int_eq(0, resp.value.arrayLength); */
-    /* ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type); */
-    /* ck_assert(*(UA_Boolean*)resp.value.data==false); */
-    UA_DataValue_deleteMembers(&resp);
-#endif
-} END_TEST
-
-START_TEST(ReadSingleDataSourceAttributeValueWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "cpu.temperature");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleDataSourceAttributeDataTypeWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "cpu.temperature");
-    rvi.attributeId = UA_ATTRIBUTEID_DATATYPE;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    ck_assert_int_eq(resp.hasServerTimestamp, false);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleDataSourceAttributeArrayDimensionsWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "cpu.temperature");
-    rvi.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-    
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(ReadSingleAttributeDataTypeDefinitionWithoutTimestamp) {
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ARGUMENT);
-    rvi.attributeId = UA_ATTRIBUTEID_DATATYPEDEFINITION;
-
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-
-#ifdef UA_ENABLE_TYPEDESCRIPTION
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, resp.status);
-    ck_assert_uint_eq(resp.value.type->typeIndex, UA_TYPES_STRUCTUREDEFINITION);
-    UA_StructureDefinition *def = (UA_StructureDefinition*)resp.value.data;
-    ck_assert_uint_eq(def->fieldsSize, 5);
-#else
-    ck_assert_int_eq(UA_STATUSCODE_BADATTRIBUTEIDINVALID, resp.status);
-#endif
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-/* Tests for writeValue method */
-
-START_TEST(WriteSingleAttributeNodeId) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_NodeId id;
-    UA_NodeId_init(&id);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_NODEID;
-    wValue.value.hasValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &id, &UA_TYPES[UA_TYPES_NODEID]);
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-} END_TEST
-
-START_TEST(WriteSingleAttributeNodeclass) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_NodeClass nc;
-    UA_NodeClass_init(&nc);
-    wValue.attributeId = UA_ATTRIBUTEID_NODECLASS;
-    wValue.value.hasValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &nc, &UA_TYPES[UA_TYPES_NODECLASS]);
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-} END_TEST
-
-START_TEST(WriteSingleAttributeBrowseName) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_QualifiedName testValue = UA_QUALIFIEDNAME(1, "the.answer");
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_BROWSENAME;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeDisplayName) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en-EN", "the.answer");
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeDescription) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en-EN", "the.answer");
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_DESCRIPTION;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeWriteMask) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 testValue = 0;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_WRITEMASK;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeIsAbstract) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Boolean testValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_ISABSTRACT;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(WriteSingleAttributeSymmetric) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Boolean testValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_SYMMETRIC;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(WriteSingleAttributeInverseName) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en-US", "not.the.answer");
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_INVERSENAME;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(WriteSingleAttributeContainsNoLoops) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Boolean testValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_CONTAINSNOLOOPS;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(WriteSingleAttributeEventNotifier) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Byte testValue = 0;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BYTE]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(WriteSingleAttributeValue) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 myInteger = 20;
-    UA_Variant_setScalar(&wValue.value.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(resp.hasValue);
-    ck_assert_int_eq(20, *(UA_Int32*)resp.value.data);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(WriteSingleAttributeValueEnum) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 myInteger = 4;
-    UA_Variant_setScalar(&wValue.value.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_STRING(1, "the.enum.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_STRING(1, "the.enum.answer");
-    rvi.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_DataValue resp = UA_Server_read(server, &rvi, UA_TIMESTAMPSTORETURN_NEITHER);
-
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert(resp.hasValue);
-    ck_assert_int_eq(4, *(UA_Int32*)resp.value.data);
-    UA_DataValue_deleteMembers(&resp);
-} END_TEST
-
-START_TEST(WriteSingleAttributeValueRangeFromScalar) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 myInteger = 20;
-    UA_Variant_setScalar(&wValue.value.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_STRING(1, "myarray");
-    wValue.indexRange = UA_STRING("0,0");
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeValueRangeFromArray) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 myInteger = 20;
-    UA_Variant_setArray(&wValue.value.value, &myInteger, 1, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.value.hasValue = true;
-    wValue.nodeId = UA_NODEID_STRING(1, "myarray");
-    wValue.indexRange = UA_STRING("0,0");
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeDataType) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_NodeId typeId;
-    UA_NodeId_init(&typeId);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_DATATYPE;
-    wValue.value.hasValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &typeId, &UA_TYPES[UA_TYPES_NODEID]);
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADTYPEMISMATCH);
-} END_TEST
-
-START_TEST(WriteSingleAttributeValueRank) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 testValue = -1;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_VALUERANK;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    // Returns attributeInvalid, since variant/value may be writable
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeArrayDimensions) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_UInt32 testValue[] = {1,1,1};
-    UA_Variant_setArray(&wValue.value.value, &testValue, 3, &UA_TYPES[UA_TYPES_UINT32]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    // Returns attributeInvalid, since variant/value may be writable
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADTYPEMISMATCH);
-} END_TEST
-
-START_TEST(WriteSingleAttributeAccessLevel) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Byte testValue = 0;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BYTE]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_ACCESSLEVEL;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeMinimumSamplingInterval) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Double testValue = 0.0;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_DOUBLE]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeHistorizing) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Boolean testValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_HISTORIZING;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(WriteSingleAttributeExecutable) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Boolean testValue = true;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
-    wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
-    wValue.attributeId = UA_ATTRIBUTEID_EXECUTABLE;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(WriteSingleDataSourceAttributeValue) {
-    UA_WriteValue wValue;
-    UA_WriteValue_init(&wValue);
-    UA_Int32 testValue = 0;
-    UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
-    wValue.nodeId = UA_NODEID_STRING(1, "cpu.temperature");
-    wValue.attributeId = UA_ATTRIBUTEID_VALUE;
-    wValue.value.hasValue = true;
-    UA_StatusCode retval = UA_Server_write(server, &wValue);
-    ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
-} END_TEST
-
-static Suite * testSuite_services_attributes(void) {
-    Suite *s = suite_create("services_attributes_read");
-
-    TCase *tc_readSingleAttributes = tcase_create("readSingleAttributes");
-    tcase_add_checked_fixture(tc_readSingleAttributes, setup, teardown);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeValueWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeValueRangeWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeNodeIdWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeNodeClassWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeBrowseNameWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDisplayNameWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDescriptionWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeWriteMaskWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeUserWriteMaskWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeIsAbstractWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeSymmetricWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeInverseNameWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeContainsNoLoopsWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeEventNotifierWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDataTypeWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeValueRankWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeArrayDimensionsWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeAccessLevelWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeUserAccessLevelWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeMinimumSamplingIntervalWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeHistorizingWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeExecutableWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeUserExecutableWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleDataSourceAttributeValueWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleDataSourceAttributeValueEmptyWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleDataSourceAttributeDataTypeWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleDataSourceAttributeArrayDimensionsWithoutTimestamp);
-    tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDataTypeDefinitionWithoutTimestamp);
-
-    suite_add_tcase(s, tc_readSingleAttributes);
-
-    TCase *tc_writeSingleAttributes = tcase_create("writeSingleAttributes");
-    tcase_add_checked_fixture(tc_writeSingleAttributes, setup, teardown);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeNodeId);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeNodeclass);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeBrowseName);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeDisplayName);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeDescription);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeWriteMask);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeIsAbstract);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeSymmetric);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeInverseName);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeContainsNoLoops);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeEventNotifier);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValue);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValueEnum);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeDataType);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValueRangeFromScalar);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValueRangeFromArray);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValueRank);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeArrayDimensions);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeAccessLevel);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeMinimumSamplingInterval);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeHistorizing);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeExecutable);
-    tcase_add_test(tc_writeSingleAttributes, WriteSingleDataSourceAttributeValue);
-
-    suite_add_tcase(s, tc_writeSingleAttributes);
-
-    return s;
-}
-
-int main(void) {
-
-    int number_failed = 0;
-    Suite *s;
-    s = testSuite_services_attributes();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
diff --git a/ext/open62541/tests/server/check_services_call.c b/ext/open62541/tests/server/check_services_call.c
deleted file mode 100644
index b763892..0000000
--- a/ext/open62541/tests/server/check_services_call.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright 2019 (c) basysKom GmbH <opensource@basyskom.com> (Author: Frank Meerkötter)
- */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-#include <open62541/types.h>
-
-#include "server/ua_server_internal.h"
-#include "server/ua_services.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include "check.h"
-
-static UA_Server *server = NULL;
-
-static UA_StatusCode
-methodCallback(UA_Server *serverArg,
-         const UA_NodeId *sessionId, void *sessionHandle,
-         const UA_NodeId *methodId, void *methodContext,
-         const UA_NodeId *objectId, void *objectContext,
-         size_t inputSize, const UA_Variant *input,
-         size_t outputSize, UA_Variant *output)
-{
-    return UA_STATUSCODE_GOOD;
-}
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_MethodAttributes noFpAttr = UA_MethodAttributes_default;
-    noFpAttr.description = UA_LOCALIZEDTEXT("en-US","No function pointer attached");
-    noFpAttr.displayName = UA_LOCALIZEDTEXT("en-US","No function pointer attached");
-    noFpAttr.executable = true;
-    noFpAttr.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "nofunctionpointer"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "No function pointer"),
-                            noFpAttr, NULL, // no callback
-                            0, NULL, 0, NULL, NULL, NULL);
-
-    UA_MethodAttributes nonExecAttr = UA_MethodAttributes_default;
-    nonExecAttr.description = UA_LOCALIZEDTEXT("en-US","Not executable");
-    nonExecAttr.displayName = UA_LOCALIZEDTEXT("en-US","Not executable");
-    nonExecAttr.executable = false;
-    nonExecAttr.userExecutable = true;
-    UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "nonexec"),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT),
-                            UA_QUALIFIEDNAME(1, "Not executable"),
-                            nonExecAttr, &methodCallback,
-                            0, NULL, 0, NULL, NULL, NULL);
-}
-
-static void teardown(void) {
-    UA_Server_delete(server);
-}
-
-START_TEST(callUnknownMethod) {
-    const UA_UInt32 UA_NS0ID_UNKNOWN_METHOD = 60000;
-
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_UNKNOWN_METHOD);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNODEIDUNKNOWN);
-} END_TEST
-
-START_TEST(callKnownMethodOnUnknownObject) {
-    const UA_UInt32 UA_NS0ID_UNKNOWN_OBJECT = 60000;
-
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE);
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_UNKNOWN_OBJECT);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNODEIDUNKNOWN);
-} END_TEST
-
-START_TEST(callMethodAndObjectExistsButMethodHasWrongNodeClass) {
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS);  // not a method
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNODECLASSINVALID);
-} END_TEST
-
-START_TEST(callMethodOnUnrelatedObject) {
-    /* Minimal nodeset does not add any method nodes we may call here */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);  // not connected via hasComponent
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADMETHODINVALID);
-#endif
-} END_TEST
-
-START_TEST(callMethodAndObjectExistsButNoFunctionPointerAttached) {
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_STRING(1, "nofunctionpointer");
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADINTERNALERROR);
-} END_TEST
-
-START_TEST(callMethodNonExecutable) {
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_STRING(1, "nonexec");
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADNOTEXECUTABLE);
-} END_TEST
-
-START_TEST(callMethodWithMissingArguments) {
-/* Minimal nodeset does not add any method nodes we may call here */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADARGUMENTSMISSING);
-#endif
-} END_TEST
-
-START_TEST(callMethodWithTooManyArguments) {
-/* Minimal nodeset does not add any method nodes we may call here */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_Variant inputArguments[2];
-    UA_Variant_init(&inputArguments[0]);
-    UA_Variant_init(&inputArguments[1]);
-
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.inputArgumentsSize = 2;         // 1 would be correct
-    callMethodRequest.inputArguments = (UA_Variant*)&inputArguments;
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADTOOMANYARGUMENTS);
-#endif
-} END_TEST
-
-START_TEST(callMethodWithWronglyTypedArguments) {
-/* Minimal nodeset does not add any method nodes we may call here */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_Variant inputArgument;
-    UA_Variant_init(&inputArgument);
-    UA_Double wrongType = 1.0;
-    UA_Variant_setScalar(&inputArgument, &wrongType, &UA_TYPES[UA_TYPES_DOUBLE]);  // UA_UInt32 would be correct
-
-    UA_CallMethodRequest callMethodRequest;
-    UA_CallMethodRequest_init(&callMethodRequest);
-    callMethodRequest.inputArgumentsSize = 1;
-    callMethodRequest.inputArguments = &inputArgument;
-    callMethodRequest.methodId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS);
-    callMethodRequest.objectId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-
-    UA_CallMethodResult result;
-    UA_CallMethodResult_init(&result);
-    result = UA_Server_call(server, &callMethodRequest);
-
-    ck_assert_int_gt(result.inputArgumentResultsSize, 0);
-    ck_assert_int_eq(result.inputArgumentResults[0], UA_STATUSCODE_BADTYPEMISMATCH);
-    ck_assert_int_eq(result.statusCode, UA_STATUSCODE_BADINVALIDARGUMENT);
-
-    UA_Array_delete(result.inputArgumentResults, result.inputArgumentResultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
-#endif
-} END_TEST
-
-int main(void) {
-    Suite *s = suite_create("services_call");
-
-    TCase *tc_call = tcase_create("call - error branches");
-    tcase_add_checked_fixture(tc_call, setup, teardown);
-    tcase_add_test(tc_call, callUnknownMethod);
-    tcase_add_test(tc_call, callKnownMethodOnUnknownObject);
-    tcase_add_test(tc_call, callMethodAndObjectExistsButMethodHasWrongNodeClass);
-    tcase_add_test(tc_call, callMethodAndObjectExistsButNoFunctionPointerAttached);
-    tcase_add_test(tc_call, callMethodNonExecutable);
-    tcase_add_test(tc_call, callMethodOnUnrelatedObject);
-    tcase_add_test(tc_call, callMethodWithMissingArguments);
-    tcase_add_test(tc_call, callMethodWithTooManyArguments);
-    tcase_add_test(tc_call, callMethodWithWronglyTypedArguments);
-    suite_add_tcase(s, tc_call);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_services_nodemanagement.c b/ext/open62541/tests/server/check_services_nodemanagement.c
deleted file mode 100644
index bbae3b1..0000000
--- a/ext/open62541/tests/server/check_services_nodemanagement.c
+++ /dev/null
@@ -1,653 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-#include "server/ua_services.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-static UA_Server *server = NULL;
-static UA_Int32 handleCalled = 0;
-
-static UA_StatusCode
-globalInstantiationMethod(UA_Server *server_,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_NodeId *nodeId, void **nodeContext) {
-    handleCalled++;
-    return UA_STATUSCODE_GOOD;
-}
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    UA_GlobalNodeLifecycle lifecycle;
-    lifecycle.constructor = globalInstantiationMethod;
-    lifecycle.destructor = NULL;
-    lifecycle.createOptionalChild = NULL;
-    lifecycle.generateChildNodeId = NULL;
-    config->nodeLifecycle = lifecycle;
-}
-
-static void teardown(void) {
-    UA_Server_delete(server);
-}
-
-START_TEST(AddVariableNode) {
-    /* Add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode res =
-        UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                  parentReferenceNodeId, myIntegerName,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                  attr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-} END_TEST
-
-START_TEST(AddVariableNode_Matrix) {
-    /* Add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US", "Double Matrix");
-    attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-
-    attr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    attr.valueRank = UA_VALUERANK_TWO_DIMENSIONS;
-    UA_UInt32 arrayDims[2] = {2,2};
-    attr.arrayDimensions = arrayDims;
-    attr.arrayDimensionsSize = 2;
-    UA_Double zero[4] = {0.0, 0.0, 0.0, 0.0};
-    UA_Variant_setArray(&attr.value, zero, 4, &UA_TYPES[UA_TYPES_DOUBLE]);
-    attr.value.arrayDimensions = arrayDims;
-    attr.value.arrayDimensionsSize = 2;
-
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "double.matrix");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "double matrix");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode res =
-        UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                  parentReferenceNodeId, myIntegerName,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                  attr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-} END_TEST
-
-START_TEST(AddVariableNode_ExtensionObject) {
-        /* Add a variable node to the address space */
-        UA_VariableAttributes attr = UA_VariableAttributes_default;
-        attr.displayName = UA_LOCALIZEDTEXT("en-US","the extensionobject");
-
-        /* Set an ExtensionObject with an unknown binary encoding */
-        UA_ExtensionObject myExtensionObject;
-        UA_ExtensionObject_init(&myExtensionObject);
-        myExtensionObject.encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
-        myExtensionObject.content.encoded.typeId = UA_NODEID_NUMERIC(5, 1234);
-        UA_ByteString byteString = UA_BYTESTRING("String Payload as a ByteString extension");
-        myExtensionObject.content.encoded.body = byteString;
-        UA_Variant_setScalar(&attr.value, &myExtensionObject, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
-
-        UA_NodeId myEONodeId = UA_NODEID_STRING(1, "the.extensionobject");
-        UA_QualifiedName myEOName = UA_QUALIFIEDNAME(1, "the extensionobject");
-        UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-        UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-        UA_StatusCode res =
-            UA_Server_addVariableNode(server, myEONodeId, parentNodeId,
-                                      parentReferenceNodeId, myEOName,
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                      attr, NULL, NULL);
-        ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-    } END_TEST
-
-
-static UA_NodeId pointTypeId;
-
-static void
-addVariableTypeNode(void) {
-    UA_VariableTypeAttributes vtAttr = UA_VariableTypeAttributes_default;
-    vtAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vtAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    UA_UInt32 arrayDims[1] = {2};
-    vtAttr.arrayDimensions = arrayDims;
-    vtAttr.arrayDimensionsSize = 1;
-    vtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Type");
-
-    /* a matching default value is required */
-    UA_Double zero[2] = {0.0, 0.0};
-    UA_Variant_setArray(&vtAttr.value, zero, 2, &UA_TYPES[UA_TYPES_DOUBLE]);
-
-    UA_StatusCode res =
-        UA_Server_addVariableTypeNode(server, UA_NODEID_NULL,
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                      UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                      UA_QUALIFIEDNAME(1, "2DPoint Type"), UA_NODEID_NULL,
-                                      vtAttr, NULL, &pointTypeId);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-}
-
-START_TEST(InstantiateVariableTypeNode) {
-    addVariableTypeNode();
-    
-    /* Prepare the node attributes */
-    UA_UInt32 arrayDims[1] = {2};
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    vAttr.arrayDimensions = arrayDims;
-    vAttr.arrayDimensionsSize = 1;
-    vAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Variable");
-    vAttr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    /* vAttr.value is left empty, the server instantiates with the default value */
-
-    /* Add the node */
-    UA_NodeId pointVariableId;
-    UA_StatusCode res =
-        UA_Server_addVariableNode(server, UA_NODEID_NULL,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(1, "2DPoint Type"), pointTypeId,
-                                  vAttr, NULL, &pointVariableId);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-
-    /* Was the value instantiated? */
-    UA_Variant val;
-    UA_Server_readValue(server, pointVariableId, &val);
-    ck_assert(val.type != NULL);
-
-    UA_Variant_deleteMembers(&val);
-} END_TEST
-
-START_TEST(InstantiateVariableTypeNodeWrongDims) {
-    addVariableTypeNode();
-    
-    /* Prepare the node attributes */
-    UA_UInt32 arrayDims[1] = {3}; /* This will fail as the dimensions are too big */
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    vAttr.arrayDimensions = arrayDims;
-    vAttr.arrayDimensionsSize = 1;
-    vAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Variable");
-    vAttr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    /* vAttr.value is left empty, the server instantiates with the default value */
-
-    /* Add the node */
-    UA_StatusCode res =
-        UA_Server_addVariableNode(server, UA_NODEID_NULL,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(1, "2DPoint Type"), pointTypeId,
-                                  vAttr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_BADTYPEMISMATCH, res);
-} END_TEST
-
-START_TEST(InstantiateVariableTypeNodeLessDims) {
-    addVariableTypeNode();
-    
-    /* Prepare the node attributes */
-    UA_UInt32 arrayDims[1] = {1}; /* This will match as the dimension constraints are an upper bound */
-    UA_VariableAttributes vAttr = UA_VariableAttributes_default;
-    vAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
-    vAttr.valueRank = UA_VALUERANK_ONE_DIMENSION;
-    vAttr.arrayDimensions = arrayDims;
-    vAttr.arrayDimensionsSize = 1;
-    vAttr.displayName = UA_LOCALIZEDTEXT("en-US", "2DPoint Variable");
-    vAttr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
-    /* vAttr.value is left empty, the server instantiates with the default value */
-
-    /* Add the node */
-    UA_StatusCode res =
-        UA_Server_addVariableNode(server, UA_NODEID_NULL,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(1, "2DPoint Type"), pointTypeId,
-                                  vAttr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_BADTYPEMISMATCH, res);
-} END_TEST
-
-START_TEST(AddComplexTypeWithInheritance) {
-    /* add a variable node to the address space */
-
-    /* Node UA_NS0ID_SERVERTYPE is not available in the minimal NS0 */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    UA_ObjectAttributes attr = UA_ObjectAttributes_default;
-    attr.description = UA_LOCALIZEDTEXT("en-US","fakeServerStruct");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","fakeServerStruct");
-  
-    UA_NodeId myObjectNodeId = UA_NODEID_STRING(1, "the.fake.Server.Struct");
-    UA_QualifiedName myObjectName = UA_QUALIFIEDNAME(1, "the.fake.Server.Struct");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode res =
-        UA_Server_addObjectNode(server, myObjectNodeId, parentNodeId,
-                                parentReferenceNodeId, myObjectName,
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_SERVERTYPE), attr,
-                                &handleCalled, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-    ck_assert_int_gt(handleCalled, 0); // Should be 58, but may depend on NS0 XML detail
-#endif
-} END_TEST
-
-START_TEST(AddNodeTwiceGivesError) {
-    /* add a variable node to the address space */
-    UA_VariableAttributes attr = UA_VariableAttributes_default;
-    UA_Int32 myInteger = 42;
-    UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
-    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    UA_StatusCode res =
-        UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                  parentReferenceNodeId, myIntegerName,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                  attr, NULL, NULL);
-    ck_assert_int_eq(UA_STATUSCODE_GOOD, res);
-    res = UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
-                                    parentReferenceNodeId, myIntegerName,
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                    attr, NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_BADNODEIDEXISTS);
-} END_TEST
-
-static UA_Boolean constructorCalled = false;
-
-static UA_StatusCode
-objectConstructor(UA_Server *server_,
-                  const UA_NodeId *sessionId, void *sessionContext,
-                  const UA_NodeId *typeId, void *typeContext,
-                  const UA_NodeId *nodeId, void **nodeContext) {
-    constructorCalled = true;
-    return UA_STATUSCODE_GOOD;
-}
-
-START_TEST(AddObjectWithConstructor) {
-    /* Add an object type */
-    UA_NodeId objecttypeid = UA_NODEID_NUMERIC(0, 13371337);
-    UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","my objecttype");
-    UA_StatusCode res =
-        UA_Server_addObjectTypeNode(server, objecttypeid,
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                    UA_QUALIFIEDNAME(0, "myobjecttype"), attr,
-                                    NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Add a constructor to the object type */
-    UA_NodeTypeLifecycle lifecycle;
-    lifecycle.constructor = objectConstructor;
-    lifecycle.destructor = NULL;
-    res = UA_Server_setNodeTypeLifecycle(server, objecttypeid, lifecycle);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Add an object of the type */
-    UA_ObjectAttributes attr2 = UA_ObjectAttributes_default;
-    attr2.displayName = UA_LOCALIZEDTEXT("en-US","my object");
-    res = UA_Server_addObjectNode(server, UA_NODEID_NULL,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(0, "MyObjectNode"), objecttypeid,
-                                  attr2, NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Verify that the constructor was called */
-    ck_assert_int_eq(constructorCalled, true);
-} END_TEST
-
-static UA_Boolean destructorCalled = false;
-
-static void
-objectDestructor(UA_Server *server_,
-                 const UA_NodeId *sessionId, void *sessionContext,
-                 const UA_NodeId *typeId, void *typeContext,
-                 const UA_NodeId *nodeId, void **nodeContext) {
-    destructorCalled = true;
-}
-
-START_TEST(DeleteObjectWithDestructor) {
-    /* Add an object type */
-    UA_NodeId objecttypeid = UA_NODEID_NUMERIC(0, 13371337);
-    UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","my objecttype");
-    UA_StatusCode res =
-        UA_Server_addObjectTypeNode(server, objecttypeid,
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                    UA_QUALIFIEDNAME(0, "myobjecttype"), attr, NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Add a constructor to the object type */
-    UA_NodeTypeLifecycle lifecycle;
-    lifecycle.constructor = NULL;
-    lifecycle.destructor = objectDestructor;
-    res = UA_Server_setNodeTypeLifecycle(server, objecttypeid, lifecycle);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Add an object of the type */
-    UA_NodeId objectid = UA_NODEID_NUMERIC(0, 23372337);
-    UA_ObjectAttributes attr2 = UA_ObjectAttributes_default;
-    attr2.displayName = UA_LOCALIZEDTEXT("en-US","my object");
-    res = UA_Server_addObjectNode(server, objectid,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(0, "MyObject"), objecttypeid,
-                                  attr2, NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Delete the object */
-    UA_Server_deleteNode(server, objectid, true);
-
-    /* Verify that the destructor was called */
-    ck_assert_int_eq(destructorCalled, true);
-} END_TEST
-
-START_TEST(DeleteObjectAndReferences) {
-    /* Add an object of the type */
-    UA_ObjectAttributes attr = UA_ObjectAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","my object");
-    UA_NodeId objectid = UA_NODEID_NUMERIC(0, 23372337);
-    UA_StatusCode res;
-    res = UA_Server_addObjectNode(server, objectid,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(0, "MyObject"),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                  attr, NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Verify that we have a reference to the node from the objects folder */
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-    
-    UA_BrowseResult br = UA_Server_browse(server, 0, &bd);
-    ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
-    size_t refCount = 0;
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        if(UA_NodeId_equal(&br.references[i].nodeId.nodeId, &objectid))
-            refCount++;
-    }
-    ck_assert_int_eq(refCount, 1);
-    UA_BrowseResult_deleteMembers(&br);
-
-    /* Delete the object */
-    UA_Server_deleteNode(server, objectid, true);
-
-    /* Browse again, this time we expect that no reference is found */
-    br = UA_Server_browse(server, 0, &bd);
-    ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
-    refCount = 0;
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        if(UA_NodeId_equal(&br.references[i].nodeId.nodeId, &objectid))
-            refCount++;
-    }
-    ck_assert_int_eq(refCount, 0);
-    UA_BrowseResult_deleteMembers(&br);
-
-    /* Add an object the second time */
-    attr = UA_ObjectAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT("en-US","my object");
-    objectid = UA_NODEID_NUMERIC(0, 23372337);
-    res = UA_Server_addObjectNode(server, objectid,
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                  UA_QUALIFIEDNAME(0, "MyObject"),
-                                  UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                  attr, NULL, NULL);
-    ck_assert_int_eq(res, UA_STATUSCODE_GOOD);
-
-    /* Browse again, this time we expect that a single reference to the node is found */
-    refCount = 0;
-    br = UA_Server_browse(server, 0, &bd);
-    ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
-    for(size_t i = 0; i < br.referencesSize; ++i) {
-        if(UA_NodeId_equal(&br.references[i].nodeId.nodeId, &objectid))
-            refCount++;
-    }
-    ck_assert_int_eq(refCount, 1);
-    UA_BrowseResult_deleteMembers(&br);
-} END_TEST
-
-
-/* Example taken from tutorial_server_object.c */
-START_TEST(InstantiateObjectType) {
-    /* Define the object type */
-    UA_NodeId pumpTypeId = {1, UA_NODEIDTYPE_NUMERIC, {1001}};
-
-    UA_StatusCode retval;
-
-    /* Define the object type for "Device" */
-    UA_NodeId deviceTypeId; /* get the nodeid assigned by the server */
-    UA_ObjectTypeAttributes dtAttr = UA_ObjectTypeAttributes_default;
-    dtAttr.displayName = UA_LOCALIZEDTEXT("en-US", "DeviceType");
-    retval = UA_Server_addObjectTypeNode(server, UA_NODEID_NULL,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "DeviceType"), dtAttr,
-                                         NULL, &deviceTypeId);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_VariableAttributes mnAttr = UA_VariableAttributes_default;
-    mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName");
-    UA_NodeId manufacturerNameId;
-    retval = UA_Server_addVariableNode(server, UA_NODEID_NULL, deviceTypeId,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                       UA_QUALIFIEDNAME(1, "ManufacturerName"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       mnAttr, NULL, &manufacturerNameId);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* UA_NS0ID_MODELLINGRULE_MANDATORY is not available in Minimal Nodeset */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    /* Make the manufacturer name mandatory */
-    retval = UA_Server_addReference(server, manufacturerNameId,
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                                    UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-#endif
-
-    UA_VariableAttributes modelAttr = UA_VariableAttributes_default;
-    modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName");
-    retval = UA_Server_addVariableNode(server, UA_NODEID_NULL, deviceTypeId,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                       UA_QUALIFIEDNAME(1, "ModelName"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       modelAttr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* Define the object type for "Pump" */
-    UA_ObjectTypeAttributes ptAttr = UA_ObjectTypeAttributes_default;
-    ptAttr.displayName = UA_LOCALIZEDTEXT("en-US", "PumpType");
-    retval = UA_Server_addObjectTypeNode(server, pumpTypeId, deviceTypeId,
-                                         UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                         UA_QUALIFIEDNAME(1, "PumpType"), ptAttr,
-                                         NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    UA_VariableAttributes statusAttr = UA_VariableAttributes_default;
-    statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status");
-    statusAttr.valueRank = UA_VALUERANK_SCALAR;
-    UA_NodeId statusId;
-    retval = UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpTypeId,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                       UA_QUALIFIEDNAME(1, "Status"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       statusAttr, NULL, &statusId);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-/* UA_NS0ID_MODELLINGRULE_MANDATORY is not available in Minimal Nodeset */
-#ifdef UA_GENERATED_NAMESPACE_ZERO
-    /* Make the status variable mandatory */
-    retval = UA_Server_addReference(server, statusId,
-                                    UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
-                                    UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), true);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-#endif
-
-    UA_VariableAttributes rpmAttr = UA_VariableAttributes_default;
-    rpmAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MotorRPM");
-    rpmAttr.valueRank = UA_VALUERANK_SCALAR;
-    retval = UA_Server_addVariableNode(server, UA_NODEID_NULL, pumpTypeId,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                       UA_QUALIFIEDNAME(1, "MotorRPMs"),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
-                                       rpmAttr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-
-    /* Instantiate the variable */
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MyPump");
-    retval = UA_Server_addObjectNode(server, UA_NODEID_NULL,
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
-                                     UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-                                     UA_QUALIFIEDNAME(1, "MyPump"),
-                                     pumpTypeId, /* this refers to the object type
-                                                    identifier */
-                                     oAttr, NULL, NULL);
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-static UA_NodeId
-findReference(const UA_NodeId sourceId, const UA_NodeId refTypeId) {
-	UA_BrowseDescription * bDesc = UA_BrowseDescription_new();
-	UA_NodeId_copy(&sourceId, &bDesc->nodeId);
-	bDesc->browseDirection = UA_BROWSEDIRECTION_FORWARD;
-	bDesc->includeSubtypes = true;
-	bDesc->resultMask = UA_BROWSERESULTMASK_REFERENCETYPEID;
-	UA_BrowseResult bRes = UA_Server_browse(server, 0, bDesc);
-	ck_assert(bRes.statusCode == UA_STATUSCODE_GOOD);
-
-	UA_NodeId outNodeId = UA_NODEID_NULL;
-    for(size_t i = 0; i < bRes.referencesSize; i++) {
-        UA_ReferenceDescription rDesc = bRes.references[i];
-        if(UA_NodeId_equal(&rDesc.referenceTypeId, &refTypeId)) {
-            UA_NodeId_copy(&rDesc.nodeId.nodeId, &outNodeId);
-            break;
-        }
-    }
-
-	UA_BrowseDescription_deleteMembers(bDesc);
-	UA_BrowseDescription_delete(bDesc);
-	UA_BrowseResult_deleteMembers(&bRes);
-	return outNodeId;
-}
-
-static UA_NodeId
-registerRefType(char *forwName, char *invName) {
-	UA_NodeId outNodeId;
-	UA_ReferenceTypeAttributes refattr = UA_ReferenceTypeAttributes_default;
-	refattr.displayName = UA_LOCALIZEDTEXT(NULL, forwName);
-	refattr.inverseName = UA_LOCALIZEDTEXT(NULL, invName );
-	UA_QualifiedName browseName = UA_QUALIFIEDNAME(1, forwName);
-	UA_StatusCode st =
-        UA_Server_addReferenceTypeNode(server, UA_NODEID_NULL,
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_NONHIERARCHICALREFERENCES),
-                                       UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                       browseName, refattr, NULL, &outNodeId);
-	ck_assert(st == UA_STATUSCODE_GOOD);
-	return outNodeId;
-}
-
-static UA_NodeId
-addObjInstance(const UA_NodeId parentNodeId, char *dispName) {
-	UA_NodeId outNodeId;
-	UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-	oAttr.displayName = UA_LOCALIZEDTEXT(NULL, dispName);
-	UA_QualifiedName browseName = UA_QUALIFIEDNAME(1, dispName);
-	UA_StatusCode st =
-        UA_Server_addObjectNode(server, UA_NODEID_NULL, 
-                                parentNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                browseName, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
-                                oAttr, NULL, &outNodeId);
-	ck_assert(st == UA_STATUSCODE_GOOD);
-	return outNodeId;
-}
-
-START_TEST(AddDoubleReference) {
-	// create two different reference types
-	UA_NodeId ref1TypeId = registerRefType("HasRef1", "IsRefOf1");
-	UA_NodeId ref2TypeId = registerRefType("HasRef2", "IsRefOf2");
-
-	// create two different object instances
-    UA_NodeId objectsNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-	UA_NodeId sourceId = addObjInstance(objectsNodeId, "obj1");
-	UA_NodeId targetId = addObjInstance(objectsNodeId, "obj2");
-
-	// connect them twice, one time per reference type
-	UA_ExpandedNodeId targetExpId;
-	targetExpId.nodeId       = targetId;
-	targetExpId.namespaceUri = UA_STRING_NULL;
-	targetExpId.serverIndex  = 0;
-	UA_StatusCode st;
-	st = UA_Server_addReference(server, sourceId, ref1TypeId, targetExpId, true);
-	ck_assert(st == UA_STATUSCODE_GOOD);
-	st = UA_Server_addReference(server, sourceId, ref2TypeId, targetExpId, true);
-	ck_assert(st == UA_STATUSCODE_GOOD);
-    /* repetition fails */
-	st = UA_Server_addReference(server, sourceId, ref2TypeId, targetExpId, true);
-	ck_assert(st != UA_STATUSCODE_GOOD);
-
-	// check references where added
-	UA_NodeId targetCheckId;
-	targetCheckId = findReference(sourceId, ref1TypeId);
-	ck_assert(UA_NodeId_equal(&targetCheckId, &targetId));
-	targetCheckId = findReference(sourceId, ref2TypeId);
-	ck_assert(UA_NodeId_equal(&targetCheckId, &targetId));
-
-
-} END_TEST
-
-int main(void) {
-    Suite *s = suite_create("services_nodemanagement");
-
-    TCase *tc_addnodes = tcase_create("addnodes");
-    tcase_add_checked_fixture(tc_addnodes, setup, teardown);
-    tcase_add_test(tc_addnodes, AddVariableNode);
-    tcase_add_test(tc_addnodes, AddVariableNode_Matrix);
-    tcase_add_test(tc_addnodes, AddVariableNode_ExtensionObject);
-    tcase_add_test(tc_addnodes, InstantiateVariableTypeNode);
-    tcase_add_test(tc_addnodes, InstantiateVariableTypeNodeWrongDims);
-    tcase_add_test(tc_addnodes, InstantiateVariableTypeNodeLessDims);
-    tcase_add_test(tc_addnodes, AddComplexTypeWithInheritance);
-    tcase_add_test(tc_addnodes, AddNodeTwiceGivesError);
-    tcase_add_test(tc_addnodes, AddObjectWithConstructor);
-    tcase_add_test(tc_addnodes, InstantiateObjectType);
-    suite_add_tcase(s, tc_addnodes);
-
-    TCase *tc_deletenodes = tcase_create("deletenodes");
-    tcase_add_checked_fixture(tc_deletenodes, setup, teardown);
-    tcase_add_test(tc_deletenodes, DeleteObjectWithDestructor);
-    tcase_add_test(tc_deletenodes, DeleteObjectAndReferences);
-    suite_add_tcase(s, tc_deletenodes);
-
-    TCase *tc_addreferences = tcase_create("addreferences");
-    tcase_add_checked_fixture(tc_addreferences, setup, teardown);
-    tcase_add_test(tc_addreferences, AddDoubleReference);
-    suite_add_tcase(s, tc_addreferences);
-
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_services_subscriptions.c b/ext/open62541/tests/server/check_services_subscriptions.c
deleted file mode 100644
index 1d3290f..0000000
--- a/ext/open62541/tests/server/check_services_subscriptions.c
+++ /dev/null
@@ -1,881 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-#include "server/ua_services.h"
-#include "server/ua_subscription.h"
-
-#include <check.h>
-
-#include "testing_clock.h"
-
-static UA_Server *server = NULL;
-static UA_Session *session = NULL;
-static UA_UInt32 monitored = 0; /* Number of active MonitoredItems */
-
-static void
-monitoredRegisterCallback(UA_Server *s,
-                          const UA_NodeId *sessionId, void *sessionContext,
-                          const UA_NodeId *nodeId, void *nodeContext,
-                          const UA_UInt32 attrId, const UA_Boolean removed) {
-    if(!removed)
-        monitored++;
-    else
-        monitored--;
-}
-
-static void
-createSession(void) {
-    UA_CreateSessionRequest request;
-    UA_CreateSessionRequest_init(&request);
-    request.requestedSessionTimeout = UA_UINT32_MAX;
-    UA_StatusCode retval = UA_SessionManager_createSession(&server->sessionManager, NULL,
-                                                           &request, &session);
-    ck_assert_uint_eq(retval, 0);
-}
-
-static void setup(void) {
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-    config->monitoredItemRegisterCallback = monitoredRegisterCallback;
-    UA_Server_run_startup(server);
-    createSession();
-}
-
-static void teardown(void) {
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-    ck_assert_uint_eq(monitored, 0); /* All MonitoredItems have been de-registered */
-}
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-
-static UA_UInt32 subscriptionId;
-static UA_UInt32 monitoredItemId;
-
-static void
-createSubscription(void) {
-    UA_CreateSubscriptionRequest request;
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-
-    UA_CreateSubscriptionResponse response;
-    UA_CreateSubscriptionResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    subscriptionId = response.subscriptionId;
-
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-}
-
-static void
-createMonitoredItem(void) {
-    UA_CreateMonitoredItemsRequest request;
-    UA_CreateMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    rvi.attributeId = UA_ATTRIBUTEID_BROWSENAME;
-    rvi.indexRange = UA_STRING_NULL;
-    item.itemToMonitor = rvi;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_MonitoringParameters params;
-    UA_MonitoringParameters_init(&params);
-    item.requestedParameters = params;
-    request.itemsToCreateSize = 1;
-    request.itemsToCreate = &item;
-
-    UA_CreateMonitoredItemsResponse response;
-    UA_CreateMonitoredItemsResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_CreateMonitoredItems(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.resultsSize, 1);
-    ck_assert_uint_eq(response.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    monitoredItemId = response.results[0].monitoredItemId;
-    ck_assert_uint_gt(monitoredItemId, 0);
-
-    UA_MonitoredItemCreateRequest_deleteMembers(&item);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&response);
-}
-
-START_TEST(Server_createSubscription) {
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest request;
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-
-    UA_CreateSubscriptionResponse response;
-    UA_CreateSubscriptionResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    subscriptionId = response.subscriptionId;
-
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_modifySubscription) {
-    /* Create a subscription */
-    createSubscription();
-
-    /* Modify the subscription */
-    UA_ModifySubscriptionRequest request;
-    UA_ModifySubscriptionRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    // just some arbitrary numbers to test. They have no specific reason
-    request.requestedPublishingInterval = 100; // in ms
-    request.requestedLifetimeCount = 1000;
-    request.requestedMaxKeepAliveCount = 1000;
-    request.maxNotificationsPerPublish = 1;
-    request.priority = 10;
-
-    UA_ModifySubscriptionResponse response;
-    UA_ModifySubscriptionResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_ModifySubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-
-    UA_ModifySubscriptionResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_setPublishingMode) {
-    createSubscription();
-    
-    UA_SetPublishingModeRequest request;
-    UA_SetPublishingModeRequest_init(&request);
-    request.publishingEnabled = UA_TRUE;
-    request.subscriptionIdsSize = 1;
-    request.subscriptionIds = &subscriptionId;
-
-    UA_SetPublishingModeResponse response;
-    UA_SetPublishingModeResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_SetPublishingMode(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.resultsSize, 1);
-    ck_assert_uint_eq(response.results[0], UA_STATUSCODE_GOOD);
-
-    UA_SetPublishingModeResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_republish) {
-    createSubscription();
-    
-    UA_RepublishRequest request;
-    UA_RepublishRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.retransmitSequenceNumber = 0;
-
-    UA_RepublishResponse response;
-    UA_RepublishResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_Republish(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_BADMESSAGENOTAVAILABLE);
-
-    UA_RepublishResponse_deleteMembers(&response);
-}
-END_TEST
-
-
-START_TEST(Server_republish_invalid) {
-    UA_RepublishRequest request;
-    UA_RepublishRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.retransmitSequenceNumber = 0;
-
-    UA_RepublishResponse response;
-    UA_RepublishResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_Republish(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID);
-
-    UA_RepublishResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_deleteSubscription) {
-    createSubscription();
-    
-    /* Remove the subscription */
-    UA_DeleteSubscriptionsRequest del_request;
-    UA_DeleteSubscriptionsRequest_init(&del_request);
-    del_request.subscriptionIdsSize = 1;
-    del_request.subscriptionIds = &subscriptionId;
-
-    UA_DeleteSubscriptionsResponse del_response;
-    UA_DeleteSubscriptionsResponse_init(&del_response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_DeleteSubscriptions(server, session, &del_request, &del_response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(del_response.resultsSize, 1);
-    ck_assert_uint_eq(del_response.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteSubscriptionsResponse_deleteMembers(&del_response);
-}
-END_TEST
-
-START_TEST(Server_publishCallback) {
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest request;
-    UA_CreateSubscriptionResponse response;
-
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-    UA_CreateSubscriptionResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 subscriptionId1 = response.subscriptionId;
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-
-    /* Create a second subscription */
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-    UA_CreateSubscriptionResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 subscriptionId2 = response.subscriptionId;
-    UA_Double publishingInterval = response.revisedPublishingInterval;
-    ck_assert(publishingInterval > 0.0f);
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-
-    /* Keepalive is set to max initially */
-    UA_Subscription *sub;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry)
-        ck_assert_uint_eq(sub->currentKeepAliveCount, sub->maxKeepAliveCount);
-
-    /* Sleep until the publishing interval times out */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-    UA_realSleep(100);
-
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        if ((sub->subscriptionId == subscriptionId1) || (sub->subscriptionId == subscriptionId2))
-            ck_assert_uint_eq(sub->currentKeepAliveCount, sub->maxKeepAliveCount+1);
-    }
-
-    /* Remove the subscriptions */
-    UA_DeleteSubscriptionsRequest del_request;
-    UA_DeleteSubscriptionsRequest_init(&del_request);
-    UA_UInt32 removeIds[2] = {subscriptionId1, subscriptionId2};
-    del_request.subscriptionIdsSize = 2;
-    del_request.subscriptionIds = removeIds;
-
-    UA_DeleteSubscriptionsResponse del_response;
-    UA_DeleteSubscriptionsResponse_init(&del_response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_DeleteSubscriptions(server, session, &del_request, &del_response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(del_response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(del_response.resultsSize, 2);
-    ck_assert_uint_eq(del_response.results[0], UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(del_response.results[1], UA_STATUSCODE_GOOD);
-
-    UA_DeleteSubscriptionsResponse_deleteMembers(&del_response);
-}
-END_TEST
-
-START_TEST(Server_createMonitoredItems) {
-    createSubscription();
-    createMonitoredItem();
-}
-END_TEST
-
-START_TEST(Server_modifyMonitoredItems) {
-    createSubscription();
-    createMonitoredItem();
-
-    UA_ModifyMonitoredItemsRequest request;
-    UA_ModifyMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemModifyRequest item;
-    UA_MonitoredItemModifyRequest_init(&item);
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    rvi.attributeId = UA_ATTRIBUTEID_DESCRIPTION;
-    rvi.indexRange = UA_STRING_NULL;
-    item.monitoredItemId = monitoredItemId;
-    UA_MonitoringParameters params;
-    UA_MonitoringParameters_init(&params);
-    item.requestedParameters = params;
-    request.itemsToModifySize = 1;
-    request.itemsToModify = &item;
-
-    UA_ModifyMonitoredItemsResponse response;
-    UA_ModifyMonitoredItemsResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_ModifyMonitoredItems(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.resultsSize, 1);
-    ck_assert_uint_eq(response.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_MonitoredItemModifyRequest_deleteMembers(&item);
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_overflow) {
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest createSubscriptionRequest;
-    UA_CreateSubscriptionResponse createSubscriptionResponse;
-
-    UA_CreateSubscriptionRequest_init(&createSubscriptionRequest);
-    createSubscriptionRequest.publishingEnabled = true;
-    UA_CreateSubscriptionResponse_init(&createSubscriptionResponse);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &createSubscriptionRequest, &createSubscriptionResponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(createSubscriptionResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    UA_UInt32 localSubscriptionId = createSubscriptionResponse.subscriptionId;
-    UA_Double publishingInterval = createSubscriptionResponse.revisedPublishingInterval;
-    ck_assert(publishingInterval > 0.0f);
-    UA_CreateSubscriptionResponse_deleteMembers(&createSubscriptionResponse);
-
-    /* Create a monitoredItem */
-    UA_CreateMonitoredItemsRequest createMonitoredItemsRequest;
-    UA_CreateMonitoredItemsRequest_init(&createMonitoredItemsRequest);
-    createMonitoredItemsRequest.subscriptionId = localSubscriptionId;
-    createMonitoredItemsRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
-    rvi.attributeId = UA_ATTRIBUTEID_BROWSENAME;
-    rvi.indexRange = UA_STRING_NULL;
-    item.itemToMonitor = rvi;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_MonitoringParameters params;
-    UA_MonitoringParameters_init(&params);
-    item.requestedParameters = params;
-    item.requestedParameters.queueSize = 3;
-    item.requestedParameters.discardOldest = true;
-    createMonitoredItemsRequest.itemsToCreateSize = 1;
-    createMonitoredItemsRequest.itemsToCreate = &item;
-
-    UA_CreateMonitoredItemsResponse createMonitoredItemsResponse;
-    UA_CreateMonitoredItemsResponse_init(&createMonitoredItemsResponse);
-
-    UA_LOCK(server->serviceMutex);
-    Service_CreateMonitoredItems(server, session, &createMonitoredItemsRequest, &createMonitoredItemsResponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(createMonitoredItemsResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(createMonitoredItemsResponse.resultsSize, 1);
-    ck_assert_uint_eq(createMonitoredItemsResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_UInt32 localMonitoredItemId = createMonitoredItemsResponse.results[0].monitoredItemId;
-    ck_assert_uint_gt(localMonitoredItemId, 0);
-
-    UA_MonitoredItemCreateRequest_deleteMembers(&item);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&createMonitoredItemsResponse);
-
-    UA_MonitoredItem *mon = NULL;
-    UA_Subscription *sub;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        if(sub->subscriptionId == localSubscriptionId)
-            mon = UA_Subscription_getMonitoredItem(sub, localMonitoredItemId);
-    }
-    ck_assert_ptr_ne(mon, NULL);
-    UA_assert(mon);
-    ck_assert_uint_eq(mon->queueSize, 1); 
-    ck_assert_uint_eq(mon->maxQueueSize, 3); 
-    UA_Notification *notification;
-    notification = TAILQ_LAST(&mon->queue, NotificationQueue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, false);
-
-    UA_ByteString_deleteMembers(&mon->lastSampledValue);
-    UA_MonitoredItem_sampleCallback(server, mon);
-    ck_assert_uint_eq(mon->queueSize, 2); 
-    ck_assert_uint_eq(mon->maxQueueSize, 3); 
-    notification = TAILQ_LAST(&mon->queue, NotificationQueue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, false);
-
-    UA_ByteString_deleteMembers(&mon->lastSampledValue);
-    UA_MonitoredItem_sampleCallback(server, mon);
-    ck_assert_uint_eq(mon->queueSize, 3); 
-    ck_assert_uint_eq(mon->maxQueueSize, 3); 
-    notification = TAILQ_LAST(&mon->queue, NotificationQueue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, false);
-
-    UA_ByteString_deleteMembers(&mon->lastSampledValue);
-    UA_MonitoredItem_sampleCallback(server, mon);
-    ck_assert_uint_eq(mon->queueSize, 3); 
-    ck_assert_uint_eq(mon->maxQueueSize, 3); 
-    notification = TAILQ_FIRST(&mon->queue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, true);
-    ck_assert_uint_eq(notification->data.value.status,
-                      UA_STATUSCODE_INFOTYPE_DATAVALUE | UA_STATUSCODE_INFOBITS_OVERFLOW);
-
-    /* Remove status for next test */
-    notification->data.value.hasStatus = false;
-    notification->data.value.status = 0;
-
-    /* Modify the MonitoredItem */
-    UA_ModifyMonitoredItemsRequest modifyMonitoredItemsRequest;
-    UA_ModifyMonitoredItemsRequest_init(&modifyMonitoredItemsRequest);
-    modifyMonitoredItemsRequest.subscriptionId = localSubscriptionId;
-    modifyMonitoredItemsRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemModifyRequest itemToModify;
-    UA_MonitoredItemModifyRequest_init(&itemToModify);
-    itemToModify.monitoredItemId = localMonitoredItemId;
-    UA_MonitoringParameters_init(&params);
-    itemToModify.requestedParameters = params;
-    itemToModify.requestedParameters.queueSize = 2;
-    itemToModify.requestedParameters.discardOldest = true;
-    modifyMonitoredItemsRequest.itemsToModifySize = 1;
-    modifyMonitoredItemsRequest.itemsToModify = &itemToModify;
-
-    UA_ModifyMonitoredItemsResponse modifyMonitoredItemsResponse;
-    UA_ModifyMonitoredItemsResponse_init(&modifyMonitoredItemsResponse);
-
-    UA_LOCK(server->serviceMutex);
-    Service_ModifyMonitoredItems(server, session, &modifyMonitoredItemsRequest,
-                                 &modifyMonitoredItemsResponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.resultsSize, 1);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_MonitoredItemModifyRequest_deleteMembers(&itemToModify);
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyMonitoredItemsResponse);
-
-    ck_assert_uint_eq(mon->queueSize, 2); 
-    ck_assert_uint_eq(mon->maxQueueSize, 2); 
-    notification = TAILQ_FIRST(&mon->queue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, true);
-    ck_assert_uint_eq(notification->data.value.status,
-                      UA_STATUSCODE_INFOTYPE_DATAVALUE | UA_STATUSCODE_INFOBITS_OVERFLOW);
-
-    /* Modify the MonitoredItem */
-    UA_ModifyMonitoredItemsRequest_init(&modifyMonitoredItemsRequest);
-    modifyMonitoredItemsRequest.subscriptionId = localSubscriptionId;
-    modifyMonitoredItemsRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemModifyRequest_init(&itemToModify);
-    itemToModify.monitoredItemId = localMonitoredItemId;
-    UA_MonitoringParameters_init(&params);
-    itemToModify.requestedParameters = params;
-    itemToModify.requestedParameters.queueSize = 1;
-    modifyMonitoredItemsRequest.itemsToModifySize = 1;
-    modifyMonitoredItemsRequest.itemsToModify = &itemToModify;
-
-    UA_ModifyMonitoredItemsResponse_init(&modifyMonitoredItemsResponse);
-
-    UA_LOCK(server->serviceMutex);
-    Service_ModifyMonitoredItems(server, session, &modifyMonitoredItemsRequest,
-                                 &modifyMonitoredItemsResponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.resultsSize, 1);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_MonitoredItemModifyRequest_deleteMembers(&itemToModify);
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyMonitoredItemsResponse);
-
-    ck_assert_uint_eq(mon->queueSize, 1); 
-    ck_assert_uint_eq(mon->maxQueueSize, 1); 
-    notification = TAILQ_LAST(&mon->queue, NotificationQueue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, false);
-
-    /* Modify the MonitoredItem */
-    UA_ModifyMonitoredItemsRequest_init(&modifyMonitoredItemsRequest);
-    modifyMonitoredItemsRequest.subscriptionId = localSubscriptionId;
-    modifyMonitoredItemsRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemModifyRequest_init(&itemToModify);
-    itemToModify.monitoredItemId = localMonitoredItemId;
-    UA_MonitoringParameters_init(&params);
-    itemToModify.requestedParameters = params;
-    itemToModify.requestedParameters.discardOldest = false;
-    itemToModify.requestedParameters.queueSize = 1;
-    modifyMonitoredItemsRequest.itemsToModifySize = 1;
-    modifyMonitoredItemsRequest.itemsToModify = &itemToModify;
-
-    UA_ModifyMonitoredItemsResponse_init(&modifyMonitoredItemsResponse);
-
-    UA_LOCK(server->serviceMutex);
-    Service_ModifyMonitoredItems(server, session, &modifyMonitoredItemsRequest,
-                                 &modifyMonitoredItemsResponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.resultsSize, 1);
-    ck_assert_uint_eq(modifyMonitoredItemsResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-
-    UA_MonitoredItemModifyRequest_deleteMembers(&itemToModify);
-    UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyMonitoredItemsResponse);
-
-    UA_MonitoredItem_sampleCallback(server, mon);
-    ck_assert_uint_eq(mon->queueSize, 1); 
-    ck_assert_uint_eq(mon->maxQueueSize, 1); 
-    notification = TAILQ_FIRST(&mon->queue);
-    ck_assert_uint_eq(notification->data.value.hasStatus, false); /* the infobit is only set if the queue is larger than one */
-
-    /* Remove the subscriptions */
-    UA_DeleteSubscriptionsRequest deleteSubscriptionsRequest;
-    UA_DeleteSubscriptionsRequest_init(&deleteSubscriptionsRequest);
-    UA_UInt32 removeId = localSubscriptionId;
-    deleteSubscriptionsRequest.subscriptionIdsSize = 1;
-    deleteSubscriptionsRequest.subscriptionIds = &removeId;
-
-    UA_DeleteSubscriptionsResponse deleteSubscriptionsResponse;
-    UA_DeleteSubscriptionsResponse_init(&deleteSubscriptionsResponse);
-
-    UA_LOCK(server->serviceMutex);
-    Service_DeleteSubscriptions(server, session, &deleteSubscriptionsRequest,
-                                &deleteSubscriptionsResponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(deleteSubscriptionsResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteSubscriptionsResponse.resultsSize, 1);
-    ck_assert_uint_eq(deleteSubscriptionsResponse.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteSubscriptionsResponse_deleteMembers(&deleteSubscriptionsResponse);
-
-}
-END_TEST
-
-START_TEST(Server_setMonitoringMode) {
-    createSubscription();
-    createMonitoredItem();
-    
-    UA_SetMonitoringModeRequest request;
-    UA_SetMonitoringModeRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.monitoringMode = UA_MONITORINGMODE_DISABLED;
-    request.monitoredItemIdsSize = 1;
-    request.monitoredItemIds = &monitoredItemId;
-
-    UA_SetMonitoringModeResponse response;
-    UA_SetMonitoringModeResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_SetMonitoringMode(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.resultsSize, 1);
-    ck_assert_uint_eq(response.results[0], UA_STATUSCODE_GOOD);
-
-    UA_SetMonitoringModeResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_deleteMonitoredItems) {
-    createSubscription();
-    createMonitoredItem();
-    
-    UA_DeleteMonitoredItemsRequest request;
-    UA_DeleteMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.monitoredItemIdsSize = 1;
-    request.monitoredItemIds = &monitoredItemId;
-
-    UA_DeleteMonitoredItemsResponse response;
-    UA_DeleteMonitoredItemsResponse_init(&response);
-
-    UA_LOCK(server->serviceMutex);
-    Service_DeleteMonitoredItems(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.resultsSize, 1);
-    ck_assert_uint_eq(response.results[0], UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&response);
-}
-END_TEST
-
-START_TEST(Server_lifeTimeCount) {
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest request;
-    UA_CreateSubscriptionResponse response;
-
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-    request.requestedLifetimeCount = 3;
-    request.requestedMaxKeepAliveCount = 1;
-    UA_CreateSubscriptionResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.revisedMaxKeepAliveCount, 1);
-    ck_assert_uint_eq(response.revisedLifetimeCount, 3);
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-
-    /* Create a second subscription */
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-    request.requestedLifetimeCount = 4;
-    request.requestedMaxKeepAliveCount = 2;
-    UA_CreateSubscriptionResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.revisedMaxKeepAliveCount, 2);
-    /* revisedLifetimeCount is revised to 3*MaxKeepAliveCount == 3 */
-    ck_assert_uint_eq(response.revisedLifetimeCount, 6);
-    UA_Double publishingInterval = response.revisedPublishingInterval;
-    ck_assert(publishingInterval > 0.0f);
-    subscriptionId = response.subscriptionId;
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-
-    /* Add a MonitoredItem to the second subscription */
-    UA_CreateMonitoredItemsRequest mrequest;
-    UA_CreateMonitoredItemsRequest_init(&mrequest);
-    mrequest.subscriptionId = subscriptionId;
-    mrequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    rvi.attributeId = UA_ATTRIBUTEID_BROWSENAME;
-    rvi.indexRange = UA_STRING_NULL;
-    item.itemToMonitor = rvi;
-    item.requestedParameters.samplingInterval = publishingInterval / 5.0;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_MonitoringParameters params;
-    UA_MonitoringParameters_init(&params);
-    item.requestedParameters = params;
-    mrequest.itemsToCreateSize = 1;
-    mrequest.itemsToCreate = &item;
-
-    UA_CreateMonitoredItemsResponse mresponse;
-    UA_CreateMonitoredItemsResponse_init(&mresponse);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateMonitoredItems(server, session, &mrequest, &mresponse);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(mresponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(mresponse.resultsSize, 1);
-    ck_assert_uint_eq(mresponse.results[0].statusCode, UA_STATUSCODE_GOOD);
-    monitoredItemId = mresponse.results[0].monitoredItemId;
-    ck_assert_uint_gt(monitoredItemId, 0);
-    UA_MonitoredItemCreateRequest_deleteMembers(&item);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&mresponse);
-
-    UA_Server_run_iterate(server, false);
-    UA_UInt32 count = 0;
-    UA_Subscription *sub;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 0);
-        count++;
-    }
-    ck_assert_uint_eq(count, 2);
-
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 1);
-        count++;
-    }
-    ck_assert_uint_eq(count, 2);
-
-    /* Sleep until the publishing interval times out */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 2);
-        count++;
-    }
-    ck_assert_uint_eq(count, 2);
-
-    /* Sleep until the publishing interval times out */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 3);
-        count++;
-    }
-    ck_assert_uint_eq(count, 2);
-
-    /* Sleep until the publishing interval times out */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 4);
-        count++;
-    }
-    ck_assert_uint_eq(count, 1);
-
-    /* Sleep until the publishing interval times out */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 5);
-        count++;
-    }
-    ck_assert_uint_eq(count, 1);
-
-    /* Sleep until the publishing interval times out */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        ck_assert_uint_eq(sub->currentLifetimeCount, 6);
-        count++;
-    }
-    ck_assert_uint_eq(count, 1);
-
-    /* Sleep until the publishing interval times out. The next iteration removes
-     * the subscription. */
-    UA_fakeSleep((UA_UInt32)publishingInterval + 1);
-    UA_Server_run_iterate(server, false);
-
-    count = 0;
-    LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
-        count++;
-    }
-    ck_assert_uint_eq(count, 0);
-}
-END_TEST
-
-START_TEST(Server_invalidPublishingInterval) {
-    UA_Double savedPublishingIntervalLimitsMin = server->config.publishingIntervalLimits.min;
-    server->config.publishingIntervalLimits.min = 1;
-    /* Create a subscription */
-    UA_CreateSubscriptionRequest request;
-    UA_CreateSubscriptionResponse response;
-
-    UA_CreateSubscriptionRequest_init(&request);
-    request.publishingEnabled = true;
-    request.requestedPublishingInterval = -5.0; // Must be positive
-    UA_CreateSubscriptionResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateSubscription(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert(response.revisedPublishingInterval ==
-              server->config.publishingIntervalLimits.min);
-    UA_CreateSubscriptionResponse_deleteMembers(&response);
-
-    server->config.publishingIntervalLimits.min = savedPublishingIntervalLimitsMin;
-}
-END_TEST
-
-START_TEST(Server_invalidSamplingInterval) {
-    createSubscription();
-
-    UA_Double savedSamplingIntervalLimitsMin = server->config.samplingIntervalLimits.min;
-    server->config.samplingIntervalLimits.min = 1;
-
-    UA_CreateMonitoredItemsRequest request;
-    UA_CreateMonitoredItemsRequest_init(&request);
-    request.subscriptionId = subscriptionId;
-    request.timestampsToReturn = UA_TIMESTAMPSTORETURN_SERVER;
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    UA_ReadValueId rvi;
-    UA_ReadValueId_init(&rvi);
-    rvi.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    rvi.attributeId = UA_ATTRIBUTEID_BROWSENAME;
-    rvi.indexRange = UA_STRING_NULL;
-    item.itemToMonitor = rvi;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-    UA_MonitoringParameters params;
-    UA_MonitoringParameters_init(&params);
-    params.samplingInterval = -5.0; // Must be positive
-    item.requestedParameters = params;
-    request.itemsToCreateSize = 1;
-    request.itemsToCreate = &item;
-
-    UA_CreateMonitoredItemsResponse response;
-    UA_CreateMonitoredItemsResponse_init(&response);
-    UA_LOCK(server->serviceMutex);
-    Service_CreateMonitoredItems(server, session, &request, &response);
-    UA_UNLOCK(server->serviceMutex);
-    ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(response.resultsSize, 1);
-    ck_assert_uint_eq(response.results[0].statusCode, UA_STATUSCODE_GOOD);
-    ck_assert(response.results[0].revisedSamplingInterval ==
-              server->config.samplingIntervalLimits.min);
-
-    UA_MonitoredItemCreateRequest_deleteMembers(&item);
-    UA_CreateMonitoredItemsResponse_deleteMembers(&response);
-
-    server->config.samplingIntervalLimits.min = savedSamplingIntervalLimitsMin;
-}
-END_TEST
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-
-static Suite* testSuite_Client(void) {
-    Suite *s = suite_create("Server Subscription");
-    TCase *tc_server = tcase_create("Server Subscription Basic");
-    tcase_add_checked_fixture(tc_server, setup, teardown);
-#ifdef UA_ENABLE_SUBSCRIPTIONS
-    tcase_add_test(tc_server, Server_createSubscription);
-    tcase_add_test(tc_server, Server_modifySubscription);
-    tcase_add_test(tc_server, Server_setPublishingMode);
-    tcase_add_test(tc_server, Server_invalidSamplingInterval);
-    tcase_add_test(tc_server, Server_createMonitoredItems);
-    tcase_add_test(tc_server, Server_modifyMonitoredItems);
-    tcase_add_test(tc_server, Server_overflow);
-    tcase_add_test(tc_server, Server_setMonitoringMode);
-    tcase_add_test(tc_server, Server_deleteMonitoredItems);
-    tcase_add_test(tc_server, Server_republish);
-    tcase_add_test(tc_server, Server_republish_invalid);
-    tcase_add_test(tc_server, Server_deleteSubscription);
-    tcase_add_test(tc_server, Server_publishCallback);
-    tcase_add_test(tc_server, Server_lifeTimeCount);
-    tcase_add_test(tc_server, Server_invalidPublishingInterval);
-#endif /* UA_ENABLE_SUBSCRIPTIONS */
-    suite_add_tcase(s, tc_server);
-
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_services_view.c b/ext/open62541/tests/server/check_services_view.c
deleted file mode 100644
index 156c755..0000000
--- a/ext/open62541/tests/server/check_services_view.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client.h>
-#include <open62541/client_config_default.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-
-#include <check.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "thread_wrapper.h"
-
-UA_Server *server_translate_browse;
-UA_Boolean *running_translate_browse;
-THREAD_HANDLE server_thread_translate_browse;
-
-THREAD_CALLBACK(serverloop_register) {
-    while (*running_translate_browse)
-        UA_Server_run_iterate(server_translate_browse, true);
-    return 0;
-}
-
-static void setup_server(void) {
-    // start server
-    running_translate_browse = UA_Boolean_new();
-    *running_translate_browse = true;
-
-    server_translate_browse = UA_Server_new();
-    UA_ServerConfig *server_translate_config = UA_Server_getConfig(server_translate_browse);
-    UA_ServerConfig_setDefault(server_translate_config);
-
-    UA_String_deleteMembers(&server_translate_config->applicationDescription.applicationUri);
-    server_translate_config->applicationDescription.applicationUri =
-        UA_String_fromChars("urn:open62541.test.server_translate_browse");
-    UA_Server_run_startup(server_translate_browse);
-    THREAD_CREATE(server_thread_translate_browse, serverloop_register);
-}
-
-static void teardown_server(void) {
-    *running_translate_browse = false;
-    THREAD_JOIN(server_thread_translate_browse);
-    UA_Server_run_shutdown(server_translate_browse);
-    UA_Boolean_delete(running_translate_browse);
-    UA_Server_delete(server_translate_browse);
-}
-
-static size_t
-browseWithMaxResults(UA_Server *server, UA_NodeId nodeId, UA_UInt32 maxResults) {
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = nodeId;
-    bd.resultMask = UA_BROWSERESULTMASK_ALL;
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-    UA_BrowseResult br = UA_Server_browse(server, maxResults, &bd);
-    ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
-    ck_assert(br.referencesSize > 0);
-    ck_assert(br.referencesSize <= maxResults);
-
-    size_t total = br.referencesSize;
-    UA_ByteString cp = br.continuationPoint;
-    br.continuationPoint = UA_BYTESTRING_NULL;
-    UA_BrowseResult_deleteMembers(&br);
-
-    while(cp.length > 0) {
-        br = UA_Server_browseNext(server, false, &cp);
-        ck_assert(br.referencesSize > 0);
-        ck_assert(br.referencesSize <= maxResults);
-        UA_ByteString_deleteMembers(&cp);
-        cp = br.continuationPoint;
-        br.continuationPoint = UA_BYTESTRING_NULL;
-        total += br.referencesSize;
-        UA_BrowseResult_deleteMembers(&br);
-    }
-
-    return total;
-}
-
-START_TEST(Service_Browse_WithMaxResults) {
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.resultMask = UA_BROWSERESULTMASK_ALL;
-    bd.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-    UA_BrowseResult br = UA_Server_browse(server, 0, &bd);
-
-    ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
-    ck_assert(br.referencesSize > 0);
-
-    size_t total = br.referencesSize;
-    UA_BrowseResult_deleteMembers(&br);
-
-    for(UA_UInt32 i = 1; i <= total; i++) {
-        size_t sum_total =
-            browseWithMaxResults(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), i);
-        ck_assert_int_eq(total, sum_total);
-    }
-    
-    UA_Server_delete(server);
-}
-END_TEST
-
-START_TEST(Service_Browse_WithBrowseName) {
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.resultMask = UA_BROWSERESULTMASK_BROWSENAME;
-    bd.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
-    bd.browseDirection = UA_BROWSEDIRECTION_FORWARD;
-
-    UA_BrowseResult br = UA_Server_browse(server, 0, &bd);
-
-    ck_assert_int_eq(br.statusCode, UA_STATUSCODE_GOOD);
-    ck_assert(br.referencesSize > 0);
-    ck_assert(!UA_String_equal(&br.references[0].browseName.name, &UA_STRING_NULL));
-
-    UA_BrowseResult_deleteMembers(&br);
-    UA_Server_delete(server);
-}
-END_TEST
-
-START_TEST(Service_Browse_Recursive) {
-    UA_Server *server = UA_Server_new();
-    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
-
-    size_t resultSize = 0;
-    UA_ExpandedNodeId *result = NULL;
-
-    UA_BrowseDescription bd;
-    UA_BrowseDescription_init(&bd);
-    bd.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY);
-    bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES);
-    bd.includeSubtypes = true;
-    bd.browseDirection = UA_BROWSEDIRECTION_INVERSE;
-    UA_StatusCode retval = UA_Server_browseRecursive(server, &bd, &resultSize, &result);
-
-    ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(resultSize, 3);
-
-    UA_NodeId expected[3];
-    expected[0] = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-    expected[1] = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    expected[2] = UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER);
-
-    for(size_t i = 0; i < resultSize; i++) {
-        ck_assert(UA_NodeId_equal(&expected[i], &result[i].nodeId));
-    }
-
-    UA_Array_delete(result, resultSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
-    UA_Server_delete(server);
-}
-END_TEST
-
-START_TEST(Service_TranslateBrowsePathsToNodeIds) {
-    UA_Client *client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retVal = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-
-    // Just for testing we want to translate the following path to its corresponding node id
-    // /Objects/Server/ServerStatus/State
-    // Equals the following node IDs:
-    // /85/2253/2256/2259
-
-#define BROWSE_PATHS_SIZE 3
-    char *paths[BROWSE_PATHS_SIZE] = {"Server", "ServerStatus", "State"};
-    UA_UInt32 ids[BROWSE_PATHS_SIZE] = {UA_NS0ID_ORGANIZES, UA_NS0ID_HASCOMPONENT, UA_NS0ID_HASCOMPONENT};
-    UA_BrowsePath browsePath;
-    UA_BrowsePath_init(&browsePath);
-    browsePath.startingNode = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
-    browsePath.relativePath.elements = (UA_RelativePathElement*)UA_Array_new(BROWSE_PATHS_SIZE, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]);
-    browsePath.relativePath.elementsSize = BROWSE_PATHS_SIZE;
-
-    for(size_t i = 0; i < BROWSE_PATHS_SIZE; i++) {
-        UA_RelativePathElement *elem = &browsePath.relativePath.elements[i];
-        elem->referenceTypeId = UA_NODEID_NUMERIC(0, ids[i]);
-        elem->targetName = UA_QUALIFIEDNAME_ALLOC(0, paths[i]);
-    }
-
-    UA_TranslateBrowsePathsToNodeIdsRequest request;
-    UA_TranslateBrowsePathsToNodeIdsRequest_init(&request);
-    request.browsePaths = &browsePath;
-    request.browsePathsSize = 1;
-
-    UA_TranslateBrowsePathsToNodeIdsResponse response = UA_Client_Service_translateBrowsePathsToNodeIds(client, request);
-
-    ck_assert_int_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(response.resultsSize, 1);
-
-    ck_assert_int_eq(response.results[0].targetsSize, 1);
-    ck_assert_int_eq(response.results[0].targets[0].targetId.nodeId.identifierType, UA_NODEIDTYPE_NUMERIC);
-    ck_assert_int_eq(response.results[0].targets[0].targetId.nodeId.identifier.numeric, UA_NS0ID_SERVER_SERVERSTATUS_STATE);
-
-    UA_BrowsePath_deleteMembers(&browsePath);
-    UA_TranslateBrowsePathsToNodeIdsResponse_deleteMembers(&response);
-    retVal = UA_Client_disconnect(client);
-    ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
-    UA_Client_delete(client);
-}
-END_TEST
-
-START_TEST(BrowseSimplifiedBrowsePath) {
-    UA_QualifiedName objectsName = UA_QUALIFIEDNAME(0, "Objects");
-    UA_BrowsePathResult bpr =
-        UA_Server_browseSimplifiedBrowsePath(server_translate_browse,
-                                             UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
-                                             1, &objectsName);
-
-    ck_assert_int_eq(bpr.targetsSize, 1);
-
-    UA_BrowsePathResult_deleteMembers(&bpr);
-}
-END_TEST
-
-static Suite *testSuite_Service_TranslateBrowsePathsToNodeIds(void) {
-    Suite *s = suite_create("Service_TranslateBrowsePathsToNodeIds");
-    TCase *tc_browse = tcase_create("Browse Service");
-    tcase_add_test(tc_browse, Service_Browse_WithBrowseName);
-    tcase_add_test(tc_browse, Service_Browse_WithMaxResults);
-    tcase_add_test(tc_browse, Service_Browse_Recursive);
-    suite_add_tcase(s, tc_browse);
-
-    TCase *tc_translate = tcase_create("TranslateBrowsePathsToNodeIds");
-    tcase_add_unchecked_fixture(tc_translate, setup_server, teardown_server);
-    tcase_add_test(tc_translate, Service_TranslateBrowsePathsToNodeIds);
-    tcase_add_test(tc_translate, BrowseSimplifiedBrowsePath);
-
-    suite_add_tcase(s, tc_translate);
-    return s;
-}
-
-int main(void) {
-    int number_failed = 0;
-
-    Suite *s;
-    SRunner *sr;
-
-    s = testSuite_Service_TranslateBrowsePathsToNodeIds();
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
-
-
diff --git a/ext/open62541/tests/server/check_session.c b/ext/open62541/tests/server/check_session.c
deleted file mode 100644
index b0102df..0000000
--- a/ext/open62541/tests/server/check_session.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/types.h>
-
-#include "server/ua_services.h"
-
-#include <check.h>
-
-START_TEST(Session_init_ShallWork) {
-    UA_Session session;
-    UA_Session_init(&session);
-
-    UA_NodeId tmpNodeId;
-    UA_NodeId_init(&tmpNodeId);
-    UA_ApplicationDescription tmpAppDescription;
-    UA_ApplicationDescription_init(&tmpAppDescription);
-    UA_DateTime tmpDateTime = 0;
-    ck_assert_int_eq(session.activated, false);
-    ck_assert_int_eq(session.header.authenticationToken.identifier.numeric, tmpNodeId.identifier.numeric);
-    ck_assert_int_eq(session.availableContinuationPoints, UA_MAXCONTINUATIONPOINTS);
-    ck_assert_ptr_eq(session.header.channel, NULL);
-    ck_assert_ptr_eq(session.clientDescription.applicationName.locale.data, NULL);
-    ck_assert_ptr_eq(session.continuationPoints, NULL);
-    ck_assert_int_eq(session.maxRequestMessageSize, 0);
-    ck_assert_int_eq(session.maxResponseMessageSize, 0);
-    ck_assert_int_eq(session.sessionId.identifier.numeric, tmpNodeId.identifier.numeric);
-    ck_assert_ptr_eq(session.sessionName.data, NULL);
-    ck_assert_int_eq((int)session.timeout, 0);
-    ck_assert_int_eq(session.validTill, tmpDateTime);
-}
-END_TEST
-
-START_TEST(Session_updateLifetime_ShallWork) {
-    UA_Session session;
-    UA_Session_init(&session);
-    UA_DateTime tmpDateTime;
-    tmpDateTime = session.validTill;
-    UA_Session_updateLifetime(&session);
-
-    UA_Int32 result = (session.validTill >= tmpDateTime);
-    ck_assert_int_gt(result,0);
-}
-END_TEST
-
-static Suite* testSuite_Session(void) {
-    Suite *s = suite_create("Session");
-    TCase *tc_core = tcase_create("Core");
-    tcase_add_test(tc_core, Session_init_ShallWork);
-    tcase_add_test(tc_core, Session_updateLifetime_ShallWork);
-
-    suite_add_tcase(s,tc_core);
-    return s;
-}
-
-int main(void) {
-    int number_failed = 0;
-
-    Suite *s;
-    SRunner *sr;
-
-    s = testSuite_Session();
-    sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr,CK_NORMAL);
-    number_failed += srunner_ntests_failed(sr);
-    srunner_free(sr);
-
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/check_subscription_events.c b/ext/open62541/tests/server/check_subscription_events.c
deleted file mode 100644
index 74f8bfe..0000000
--- a/ext/open62541/tests/server/check_subscription_events.c
+++ /dev/null
@@ -1,698 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include <open62541/client_config_default.h>
-#include <open62541/client_subscriptions.h>
-#include <open62541/server.h>
-#include <open62541/server_config_default.h>
-
-#include "server/ua_server_internal.h"
-#include "server/ua_services.h"
-#include "server/ua_subscription.h"
-
-#include <check.h>
-
-#include "testing_clock.h"
-#include "thread_wrapper.h"
-
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-
-static UA_Server *server;
-static size_t serverIterations;
-static UA_Boolean running;
-static THREAD_HANDLE server_thread;
-static MUTEX_HANDLE serverMutex;
-
-UA_Client *client;
-
-static UA_UInt32 subscriptionId;
-static UA_UInt32 monitoredItemId;
-static UA_NodeId eventType;
-static size_t nSelectClauses = 4;
-static UA_Boolean notificationReceived;
-static UA_Boolean overflowNotificationReceived;
-static UA_SimpleAttributeOperand *selectClauses;
-
-UA_Double publishingInterval = 500.0;
-
-static void
-addNewEventType(void) {
-    UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
-    attr.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US", "SimpleEventType");
-    attr.description = UA_LOCALIZEDTEXT_ALLOC("en-US", "The simple event type we created");
-
-    UA_Server_addObjectTypeNode(server, UA_NODEID_NULL,
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE),
-                                UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
-                                UA_QUALIFIEDNAME(0, "SimpleEventType"),
-                                attr, NULL, &eventType);
-    UA_LocalizedText_deleteMembers(&attr.displayName);
-    UA_LocalizedText_deleteMembers(&attr.description);
-}
-
-static void
-setupSelectClauses(void) {
-    /* Check for severity (set manually), message (set manually), eventType
-     * (automatic) and sourceNode (automatic) */
-    selectClauses = (UA_SimpleAttributeOperand *)
-            UA_Array_new(nSelectClauses, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]);
-    if(!selectClauses)
-        return;
-
-    for(size_t i = 0; i < nSelectClauses; ++i) {
-        UA_SimpleAttributeOperand_init(&selectClauses[i]);
-        selectClauses[i].typeDefinitionId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-        selectClauses[i].browsePathSize = 1;
-        selectClauses[i].attributeId = UA_ATTRIBUTEID_VALUE;
-        selectClauses[i].browsePath = (UA_QualifiedName *)
-                UA_Array_new(selectClauses[i].browsePathSize, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
-        if(!selectClauses[i].browsePathSize) {
-            UA_Array_delete(selectClauses, nSelectClauses, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]);
-        }
-    }
-
-    selectClauses[0].browsePath[0] = UA_QUALIFIEDNAME_ALLOC(0, "Severity");
-    selectClauses[1].browsePath[0] = UA_QUALIFIEDNAME_ALLOC(0, "Message");
-    selectClauses[2].browsePath[0] = UA_QUALIFIEDNAME_ALLOC(0, "EventType");
-    selectClauses[3].browsePath[0] = UA_QUALIFIEDNAME_ALLOC(0, "SourceNode");
-}
-
-static void
-handler_events_simple(UA_Client *lclient, UA_UInt32 subId, void *subContext,
-                      UA_UInt32 monId, void *monContext,
-                      size_t nEventFields, UA_Variant *eventFields) {
-    UA_Boolean foundSeverity = UA_FALSE;
-    UA_Boolean foundMessage = UA_FALSE;
-    UA_Boolean foundType = UA_FALSE;
-    UA_Boolean foundSource = UA_FALSE;
-    ck_assert_uint_eq(*(UA_UInt32 *) monContext, monitoredItemId);
-    ck_assert_uint_eq(nEventFields, nSelectClauses);
-    // check all event fields
-    for(size_t i = 0; i < nEventFields; i++) {
-        // find out which attribute of the event is being looked at
-        if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_UINT16])) {
-            // Severity
-            ck_assert_uint_eq(*((UA_UInt16 *) (eventFields[i].data)), 1000);
-            foundSeverity = UA_TRUE;
-        } else if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_LOCALIZEDTEXT])) {
-            // Message
-            UA_LocalizedText comp = UA_LOCALIZEDTEXT("en-US", "Generated Event");
-            ck_assert(UA_String_equal(&((UA_LocalizedText *) eventFields[i].data)->locale, &comp.locale));
-            ck_assert(UA_String_equal(&((UA_LocalizedText *) eventFields[i].data)->text, &comp.text));
-            foundMessage = UA_TRUE;
-        } else if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_NODEID])) {
-            // either SourceNode or EventType
-            UA_NodeId serverId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);
-            if(UA_NodeId_equal((UA_NodeId *) eventFields[i].data, &eventType)) {
-                // EventType
-                foundType = UA_TRUE;
-            } else if(UA_NodeId_equal((UA_NodeId *) eventFields[i].data, &serverId)) {
-                // SourceNode
-                foundSource = UA_TRUE;
-            } else {
-                ck_assert_msg(UA_FALSE, "NodeId doesn't match");
-            }
-        } else {
-            ck_assert_msg(UA_FALSE, "Field doesn't match");
-        }
-    }
-    ck_assert_uint_eq(foundMessage, UA_TRUE);
-    ck_assert_uint_eq(foundSeverity, UA_TRUE);
-    ck_assert_uint_eq(foundType, UA_TRUE);
-    ck_assert_uint_eq(foundSource, UA_TRUE);
-    notificationReceived = true;
-}
-
-// create a subscription and add a monitored item to it
-static void
-setupSubscription(void) {
-    // Create subscription
-    UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
-    UA_CreateSubscriptionResponse response =
-        UA_Client_Subscriptions_create(client, request, NULL, NULL, NULL);
-    subscriptionId = response.subscriptionId;
-}
-
-static void
-removeSubscription(void) {
-    UA_DeleteSubscriptionsRequest deleteSubscriptionsRequest;
-    UA_DeleteSubscriptionsRequest_init(&deleteSubscriptionsRequest);
-    UA_UInt32 removeId = subscriptionId;
-    deleteSubscriptionsRequest.subscriptionIdsSize = 1;
-    deleteSubscriptionsRequest.subscriptionIds = &removeId;
-
-    UA_DeleteSubscriptionsResponse deleteSubscriptionsResponse;
-    UA_DeleteSubscriptionsResponse_init(&deleteSubscriptionsResponse);
-    UA_LOCK(server->serviceMutex);
-    Service_DeleteSubscriptions(server, &server->adminSession, &deleteSubscriptionsRequest,
-                                &deleteSubscriptionsResponse);
-    UA_UNLOCK(server->serviceMutex);
-    UA_DeleteSubscriptionsResponse_deleteMembers(&deleteSubscriptionsResponse);
-}
-
-static void serverMutexLock(void) {
-    if (!(MUTEX_LOCK(serverMutex))) {
-        fprintf(stderr, "Mutex cannot be locked.\n");
-        exit(1);
-    }
-}
-
-static void serverMutexUnlock(void) {
-    if (!(MUTEX_UNLOCK(serverMutex))) {
-        fprintf(stderr, "Mutex cannot be unlocked.\n");
-        exit(1);
-    }
-}
-
-THREAD_CALLBACK(serverloop) {
-    while (running) {
-        serverMutexLock();
-        UA_Server_run_iterate(server, false);
-        serverIterations++;
-        serverMutexUnlock();
-    }
-    return 0;
-}
-
-static void
-sleepUntilAnswer(UA_Double sleepMs) {
-    UA_fakeSleep((UA_UInt32)sleepMs);
-    serverMutexLock();
-    size_t oldIterations = serverIterations;
-    size_t newIterations;
-    serverMutexUnlock();
-    while(true) {
-        serverMutexLock();
-        newIterations = serverIterations;
-        serverMutexUnlock();
-        if(oldIterations != newIterations)
-            return;
-        UA_realSleep(1);
-    }
-}
-
-static void
-setup(void) {
-    if (!MUTEX_INIT(serverMutex)) {
-        fprintf(stderr, "Server mutex was not created correctly.");
-        exit(1);
-    }
-    running = true;
-
-    server = UA_Server_new();
-    UA_ServerConfig *config = UA_Server_getConfig(server);
-    UA_ServerConfig_setDefault(config);
-
-    config->maxPublishReqPerSession = 5;
-    UA_Server_run_startup(server);
-
-    addNewEventType();
-    setupSelectClauses();
-    THREAD_CREATE(server_thread, serverloop);
-
-    client = UA_Client_new();
-    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
-
-    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
-    if(retval != UA_STATUSCODE_GOOD) {
-        fprintf(stderr, "Client can not connect to opc.tcp://localhost:4840. %s",
-                UA_StatusCode_name(retval));
-        exit(1);
-    }
-    setupSubscription();
-
-    sleepUntilAnswer(publishingInterval + 100);
-}
-
-static void
-teardown(void) {
-    running = false;
-    THREAD_JOIN(server_thread);
-    removeSubscription();
-    UA_Server_run_shutdown(server);
-    UA_Server_delete(server);
-    UA_Array_delete(selectClauses, nSelectClauses, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]);
-
-    UA_Client_disconnect(client);
-    UA_Client_delete(client);
-    if (!MUTEX_DESTROY(serverMutex)) {
-        fprintf(stderr, "Server mutex was not destroyed correctly.");
-        exit(1);
-    }
-}
-
-static UA_StatusCode
-triggerEventLocked(const UA_NodeId eventNodeId, const UA_NodeId origin,
-                   UA_ByteString *outEventId, const UA_Boolean deleteEventNode) {
-    serverMutexLock();
-    UA_StatusCode retval = UA_Server_triggerEvent(server, eventNodeId, origin,
-                                                  outEventId, deleteEventNode);
-    serverMutexUnlock();
-    return retval;
-}
-
-static UA_StatusCode
-eventSetup(UA_NodeId *eventNodeId) {
-    UA_StatusCode retval;
-    serverMutexLock();
-    retval = UA_Server_createEvent(server, eventType, eventNodeId);
-    serverMutexUnlock();
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    // add a severity to the event
-    UA_Variant value;
-    UA_RelativePathElement rpe;
-    UA_RelativePathElement_init(&rpe);
-    rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY);
-    rpe.isInverse = false;
-    rpe.includeSubtypes = false;
-    UA_BrowsePath bp;
-    UA_BrowsePath_init(&bp);
-    bp.startingNode = *eventNodeId;
-    bp.relativePath.elementsSize = 1;
-    bp.relativePath.elements = &rpe;
-    rpe.targetName = UA_QUALIFIEDNAME(0, "Severity");
-    serverMutexLock();
-    UA_BrowsePathResult bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp);
-    serverMutexUnlock();
-    ck_assert_uint_eq(bpr.statusCode, UA_STATUSCODE_GOOD);
-    // number with no special meaning
-    UA_UInt16 eventSeverity = 1000;
-    UA_Variant_setScalar(&value, &eventSeverity, &UA_TYPES[UA_TYPES_UINT16]);
-    serverMutexLock();
-    retval = UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
-    serverMutexUnlock();
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-
-    //add a message to the event
-    rpe.targetName = UA_QUALIFIEDNAME(0, "Message");
-    serverMutexLock();
-    bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp);
-    serverMutexUnlock();
-    ck_assert_uint_eq(bpr.statusCode, UA_STATUSCODE_GOOD);
-    UA_LocalizedText message = UA_LOCALIZEDTEXT("en-US", "Generated Event");
-    UA_Variant_setScalar(&value, &message, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
-    serverMutexLock();
-    retval = UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
-    serverMutexUnlock();
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    UA_BrowsePathResult_deleteMembers(&bpr);
-
-    return retval;
-}
-
-static UA_MonitoredItemCreateResult
-addMonitoredItem(UA_Client_EventNotificationCallback handler, bool setFilter) {
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    item.itemToMonitor.nodeId = UA_NODEID_NUMERIC(0, 2253); // Root->Objects->Server
-    item.itemToMonitor.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-
-    UA_EventFilter filter;
-    UA_EventFilter_init(&filter);
-    filter.selectClauses = selectClauses;
-    filter.selectClausesSize = nSelectClauses;
-
-    if (setFilter) {
-        item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-        item.requestedParameters.filter.content.decoded.data = &filter;
-        item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_EVENTFILTER];
-    }
-
-    item.requestedParameters.queueSize = 1;
-    item.requestedParameters.discardOldest = true;
-
-    return UA_Client_MonitoredItems_createEvent(client, subscriptionId,
-                                                UA_TIMESTAMPSTORETURN_BOTH, item,
-                                                &monitoredItemId, handler, NULL);
-}
-
-
-/* Create event with empty filter */
-
-START_TEST(generateEventEmptyFilter) {
-        UA_NodeId eventNodeId;
-        UA_StatusCode retval = eventSetup(&eventNodeId);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-        // add a monitored item
-        UA_MonitoredItemCreateResult createResult = addMonitoredItem(handler_events_simple, false);
-        ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_BADEVENTFILTERINVALID);
-} END_TEST
-
-
-/* Ensure events are received with proper values */
-START_TEST(generateEvents) {
-    UA_NodeId eventNodeId;
-    UA_StatusCode retval = eventSetup(&eventNodeId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // add a monitored item
-    UA_MonitoredItemCreateResult createResult = addMonitoredItem(handler_events_simple, true);
-    ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_GOOD);
-    monitoredItemId = createResult.monitoredItemId;
-    // trigger the event
-    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // let the client fetch the event and check if the correct values were received
-    notificationReceived = false;
-    sleepUntilAnswer(publishingInterval + 100);
-    retval = UA_Client_run_iterate(client, 0);
-    sleepUntilAnswer(publishingInterval + 100);
-    retval = UA_Client_run_iterate(client, 0);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(createResult.revisedQueueSize, 1);
-
-    // delete the monitoredItem
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subscriptionId;
-    deleteRequest.monitoredItemIds = &monitoredItemId;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    sleepUntilAnswer(publishingInterval + 100);
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(*(deleteResponse.results), UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-} END_TEST
-
-static bool hasBaseModelChangeEventType(void) {
-
-    UA_QualifiedName readBrowsename;
-    UA_QualifiedName_init(&readBrowsename);
-    UA_StatusCode retval = UA_Server_readBrowseName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEMODELCHANGEEVENTTYPE), &readBrowsename);
-    UA_QualifiedName_deleteMembers(&readBrowsename);
-    return !(retval == UA_STATUSCODE_BADNODEIDUNKNOWN);
-}
-
-START_TEST(createAbstractEvent) {
-    if (!hasBaseModelChangeEventType())
-        return;
-
-    UA_NodeId eventNodeId = UA_NODEID_NULL;
-    UA_NodeId abstractEventType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEMODELCHANGEEVENTTYPE);
-    serverMutexLock();
-    UA_StatusCode retval = UA_Server_createEvent(server, abstractEventType, &eventNodeId);
-    serverMutexUnlock();
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-START_TEST(createAbstractEventWithParent) {
-    if (!hasBaseModelChangeEventType())
-        return;
-    UA_NodeId eventNodeId = UA_NODEID_NULL;
-    UA_NodeId abstractEventType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEMODELCHANGEEVENTTYPE);
-    serverMutexLock();
-    // createEvent does not use a parent, so we are instead using addObjectNode
-    UA_StatusCode retval = UA_Server_addObjectNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
-                                                   UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                                   UA_QUALIFIEDNAME(0, "Abstract Event"), abstractEventType,
-                                                   UA_ObjectAttributes_default, NULL, &eventNodeId);
-    serverMutexUnlock();
-    ck_assert_uint_eq(retval, UA_STATUSCODE_BADTYPEDEFINITIONINVALID);
-} END_TEST
-
-START_TEST(createNonAbstractEventWithParent) {
-    UA_NodeId eventNodeId = UA_NODEID_NULL;
-    serverMutexLock();
-    // Our SimpleEventType is not abstract
-    UA_StatusCode retval = UA_Server_addObjectNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
-                                                   UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                                                   UA_QUALIFIEDNAME(0, "Non-Abstract Event"), eventType,
-                                                   UA_ObjectAttributes_default, NULL, &eventNodeId);
-    serverMutexUnlock();
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-} END_TEST
-
-static void
-handler_events_propagate(UA_Client *lclient, UA_UInt32 subId, void *subContext,
-                         UA_UInt32 monId, void *monContext,
-                         size_t nEventFields, UA_Variant *eventFields) {
-    UA_Boolean foundSeverity = UA_FALSE;
-    UA_Boolean foundMessage = UA_FALSE;
-    UA_Boolean foundType = UA_FALSE;
-    UA_Boolean foundSource = UA_FALSE;
-    ck_assert_uint_eq(*(UA_UInt32 *) monContext, monitoredItemId);
-    ck_assert_uint_eq(nEventFields, nSelectClauses);
-    // check all event fields
-    for(size_t i = 0; i < nEventFields; i++) {
-        // find out which attribute of the event is being looked at
-        if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_UINT16])) {
-            // Severity
-            ck_assert_uint_eq(*((UA_UInt16 *) (eventFields[i].data)), 1000);
-            foundSeverity = UA_TRUE;
-        } else if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_LOCALIZEDTEXT])) {
-            // Message
-            UA_LocalizedText comp = UA_LOCALIZEDTEXT("en-US", "Generated Event");
-            ck_assert(UA_String_equal(&((UA_LocalizedText *) eventFields[i].data)->locale, &comp.locale));
-            ck_assert(UA_String_equal(&((UA_LocalizedText *) eventFields[i].data)->text, &comp.text));
-            foundMessage = UA_TRUE;
-        } else if(UA_Variant_hasScalarType(&eventFields[i], &UA_TYPES[UA_TYPES_NODEID])) {
-            // either SourceNode or EventType
-            UA_NodeId serverNameSpaceId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_VENDORSERVERINFO);
-            if(UA_NodeId_equal((UA_NodeId *) eventFields[i].data, &eventType)) {
-                // EventType
-                foundType = UA_TRUE;
-            } else if(UA_NodeId_equal((UA_NodeId *) eventFields[i].data, &serverNameSpaceId)) {
-                // SourceNode
-                foundSource = UA_TRUE;
-            } else {
-                ck_assert_msg(UA_FALSE, "NodeId doesn't match");
-            }
-        } else {
-            ck_assert_msg(UA_FALSE, "Field doesn't match");
-        }
-    }
-    ck_assert_uint_eq(foundMessage, UA_TRUE);
-    ck_assert_uint_eq(foundSeverity, UA_TRUE);
-    ck_assert_uint_eq(foundType, UA_TRUE);
-    ck_assert_uint_eq(foundSource, UA_TRUE);
-    notificationReceived = true;
-}
-
-START_TEST(uppropagation) {
-    // trigger first event
-    UA_NodeId eventNodeId = UA_NODEID_NULL;
-    UA_StatusCode retval = eventSetup(&eventNodeId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    //add a monitored item
-    UA_MonitoredItemCreateResult createResult = addMonitoredItem(handler_events_propagate, true);
-    ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_GOOD);
-    monitoredItemId = createResult.monitoredItemId;
-    // trigger the event on a child of server, using namespaces in this case (no reason in particular)
-    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_VENDORSERVERINFO), NULL,
-                                UA_TRUE);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // let the client fetch the event and check if the correct values were received
-    notificationReceived = false;
-    sleepUntilAnswer(publishingInterval + 100);
-    retval = UA_Client_run_iterate(client, 0);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(createResult.revisedQueueSize, 1);
-
-    // delete the monitoredItem
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subscriptionId;
-    deleteRequest.monitoredItemIds = &monitoredItemId;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(*(deleteResponse.results), UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-} END_TEST
-
-static void
-handler_events_overflow(UA_Client *lclient, UA_UInt32 subId, void *subContext,
-                        UA_UInt32 monId, void *monContext,
-                        size_t nEventFields, UA_Variant *eventFields) {
-    ck_assert_uint_eq(*(UA_UInt32 *) monContext, monitoredItemId);
-    if(nEventFields == 1) {
-        /* overflow was received */
-        ck_assert(eventFields->type == &UA_TYPES[UA_TYPES_NODEID]);
-        UA_NodeId comp = UA_NODEID_NUMERIC(0, UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE);
-        ck_assert((UA_NodeId_equal((UA_NodeId *) eventFields->data, &comp)));
-        overflowNotificationReceived = UA_TRUE;
-    } else if(nEventFields == 4) {
-        /* other event was received */
-        handler_events_simple(lclient, subId, subContext, monId,
-                              monContext, nEventFields, eventFields);
-    }
-}
-
-/* Ensures an eventQueueOverflowEvent is published when appropriate */
-START_TEST(eventOverflow) {
-    // add a monitored item
-    UA_MonitoredItemCreateResult createResult = addMonitoredItem(handler_events_overflow, true);
-    ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_GOOD);
-    monitoredItemId = createResult.monitoredItemId;
-
-    // trigger first event
-    UA_NodeId eventNodeId;
-    UA_StatusCode retval = eventSetup(&eventNodeId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_FALSE);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    retval = triggerEventLocked(eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-
-    // fetch the events, ensure both the overflow and the original event are received
-    notificationReceived = false;
-    overflowNotificationReceived = true;
-    sleepUntilAnswer(publishingInterval + 100);
-    retval = UA_Client_run_iterate(client, 0);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(notificationReceived, true);
-    ck_assert_uint_eq(overflowNotificationReceived, true);
-    ck_assert_uint_eq(createResult.revisedQueueSize, 1);
-
-    // delete the monitoredItem
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subscriptionId;
-    deleteRequest.monitoredItemIds = &monitoredItemId;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(*(deleteResponse.results), UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-} END_TEST
-
-START_TEST(multipleMonitoredItemsOneNode) {
-    UA_UInt32 monitoredItemIdAr[3];
-
-    /* set up monitored items */
-    UA_MonitoredItemCreateRequest item;
-    UA_MonitoredItemCreateRequest_init(&item);
-    item.itemToMonitor.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER); // Root->Objects->Server
-    item.itemToMonitor.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
-    item.monitoringMode = UA_MONITORINGMODE_REPORTING;
-
-    UA_EventFilter filter;
-    UA_EventFilter_init(&filter);
-    filter.selectClauses = selectClauses;
-    filter.selectClausesSize = nSelectClauses;
-
-    item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
-    item.requestedParameters.filter.content.decoded.data = &filter;
-    item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_EVENTFILTER];
-    item.requestedParameters.queueSize = 1;
-    item.requestedParameters.discardOldest = true;
-
-    for(size_t i = 0; i < 3; i++) {
-        UA_MonitoredItemCreateResult result =
-            UA_Client_MonitoredItems_createEvent(client, subscriptionId, UA_TIMESTAMPSTORETURN_BOTH,
-                                                 item, NULL, handler_events_simple, NULL);
-        ck_assert_uint_eq(result.statusCode, UA_STATUSCODE_GOOD);
-        monitoredItemIdAr[i] = result.monitoredItemId;
-    }
-
-    // delete the three monitored items after another
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subscriptionId;
-    deleteRequest.monitoredItemIdsSize = 1;
-    UA_DeleteMonitoredItemsResponse deleteResponse;
-
-    for(size_t i = 0; i < 3; i++) {
-        deleteRequest.monitoredItemIds = &monitoredItemIdAr[i];
-        deleteResponse = UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-        ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-        ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-        ck_assert_uint_eq(*(deleteResponse.results), UA_STATUSCODE_GOOD);
-        UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-    }
-} END_TEST
-
-START_TEST(eventStressing) {
-    // add a monitored item
-    UA_MonitoredItemCreateResult createResult = addMonitoredItem(handler_events_overflow, true);
-    ck_assert_uint_eq(createResult.statusCode, UA_STATUSCODE_GOOD);
-    monitoredItemId = createResult.monitoredItemId;
-
-    // trigger a large amount of events, ensure the server doesnt crash because of it
-    UA_NodeId eventNodeId;
-    UA_StatusCode retval = eventSetup(&eventNodeId);
-    ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    for(size_t i = 0; i < 20; i++) {
-        for(size_t j = 0; j < 5; j++) {
-            retval = triggerEventLocked(eventNodeId,
-                                            UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_FALSE);
-            ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-        }
-        retval = UA_Client_run_iterate(client, 0);
-        ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
-    }
-
-    // delete the monitoredItem
-    UA_DeleteMonitoredItemsRequest deleteRequest;
-    UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
-    deleteRequest.subscriptionId = subscriptionId;
-    deleteRequest.monitoredItemIds = &monitoredItemId;
-    deleteRequest.monitoredItemIdsSize = 1;
-
-    UA_DeleteMonitoredItemsResponse deleteResponse =
-        UA_Client_MonitoredItems_delete(client, deleteRequest);
-
-    ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
-    ck_assert_uint_eq(deleteResponse.resultsSize, 1);
-    ck_assert_uint_eq(*(deleteResponse.results), UA_STATUSCODE_GOOD);
-
-    UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
-} END_TEST
-
-#endif /* UA_ENABLE_SUBSCRIPTIONS_EVENTS */
-
-/* Assumes subscriptions work fine with data change because of other unit test */
-static Suite *testSuite_Client(void) {
-    Suite *s = suite_create("Server Subscription Events");
-    TCase *tc_server = tcase_create("Server Subscription Events");
-#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
-    tcase_add_unchecked_fixture(tc_server, setup, teardown);
-    tcase_add_test(tc_server, generateEventEmptyFilter);
-    tcase_add_test(tc_server, generateEvents);
-    tcase_add_test(tc_server, createAbstractEvent);
-    tcase_add_test(tc_server, createAbstractEventWithParent);
-    tcase_add_test(tc_server, createNonAbstractEventWithParent);
-    tcase_add_test(tc_server, uppropagation);
-    tcase_add_test(tc_server, eventOverflow);
-    tcase_add_test(tc_server, multipleMonitoredItemsOneNode);
-    tcase_add_test(tc_server, eventStressing);
-#endif /* UA_ENABLE_SUBSCRIPTIONS_EVENTS */
-    suite_add_tcase(s, tc_server);
-
-    return s;
-}
-
-int main(void) {
-    Suite *s = testSuite_Client();
-    SRunner *sr = srunner_create(s);
-    srunner_set_fork_status(sr, CK_NOFORK);
-    srunner_run_all(sr, CK_NORMAL);
-    int number_failed = srunner_ntests_failed(sr);
-    srunner_free(sr);
-    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-}
diff --git a/ext/open62541/tests/server/historical_read_test_data.h b/ext/open62541/tests/server/historical_read_test_data.h
deleted file mode 100644
index 3334df7..0000000
--- a/ext/open62541/tests/server/historical_read_test_data.h
+++ /dev/null
@@ -1,417 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- *    Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
-
-/* Data in this header is gathered from OPC Unified Architecture, Part 11, Release
-1.03 Page 5-6 from OPC Foundation */
-
-#ifndef UA_HISTORICAL_READ_TEST_DATA_H_
-#define UA_HISTORICAL_READ_TEST_DATA_H_
-
-#include <open62541/types.h>
-
-#include <limits.h>
-
-typedef struct {
-    UA_DateTime start;
-    UA_DateTime end;
-    UA_UInt32 numValuesPerNode;
-    UA_Boolean returnBounds;
-    UA_DateTime result[8];
-    UA_Boolean returnContinuationPoint;
-} testTuple;
-
-#define TIMESTAMP_UNSPECIFIED LLONG_MIN
-#define NODATA 0
-#define TIMESTAMP_FIRST 1
-#define TIMESTAMP_4_48 (448 * UA_DATETIME_SEC)
-#define TIMESTAMP_4_58 (458 * UA_DATETIME_SEC)
-#define TIMESTAMP_4_59 (459 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_00 (500 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_01 (501 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_02 (502 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_03 (503 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_04 (504 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_05 (505 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_06 (506 * UA_DATETIME_SEC)
-#define TIMESTAMP_5_07 (507 * UA_DATETIME_SEC)
-#define TIMESTAMP_LAST (600 * UA_DATETIME_SEC)
-
-static UA_DateTime testData[] = {
-    TIMESTAMP_5_03,
-    TIMESTAMP_5_00,
-    TIMESTAMP_5_02,
-    TIMESTAMP_5_06,
-    TIMESTAMP_5_05,
-    0 // last element
-};
-
-#define DELETE_START_TIME TIMESTAMP_5_03
-#define DELETE_STOP_TIME  TIMESTAMP_5_06
-
-static UA_DateTime testDataAfterDelete[] = {
-    TIMESTAMP_5_00,
-    TIMESTAMP_5_02,
-    TIMESTAMP_5_06,
-    0 // last element
-};
-
-static UA_StatusCode testDataUpdateResult[] = {
-    UA_STATUSCODE_GOODENTRYREPLACED,
-    UA_STATUSCODE_GOODENTRYREPLACED,
-    UA_STATUSCODE_GOODENTRYINSERTED,
-    UA_STATUSCODE_GOODENTRYINSERTED,
-    UA_STATUSCODE_GOODENTRYREPLACED
-};
-
-static testTuple testRequests[] =
-{
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_05,
-      0,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, 0 },
-      false
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_05,
-      0,
-      false,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_04,
-      0,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_04,
-      0,
-      false,
-      { TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      false
-    },
-    { TIMESTAMP_5_05,
-      TIMESTAMP_5_00,
-      0,
-      true,
-      { TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_5_05,
-      TIMESTAMP_5_00,
-      0,
-      false,
-      { TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, 0 },
-      false
-    },
-    { TIMESTAMP_5_04,
-      TIMESTAMP_5_01,
-      0,
-      true,
-      { TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_5_04,
-      TIMESTAMP_5_01,
-      0,
-      false,
-      { TIMESTAMP_5_03, TIMESTAMP_5_02, 0 },
-      false
-    },
-    { TIMESTAMP_4_59,
-      TIMESTAMP_5_05,
-      0,
-      true,
-      { TIMESTAMP_FIRST, TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, 0 },
-      false
-    },
-    { TIMESTAMP_4_59,
-      TIMESTAMP_5_05,
-      0,
-      false,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_07,
-      0,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, TIMESTAMP_5_06, TIMESTAMP_LAST, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_07,
-      0,
-      false,
-      { TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, TIMESTAMP_5_06, 0 },
-      false
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_05,
-      3,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_05,
-      3,
-      false,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_04,
-      3,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_04,
-      3,
-      false,
-      { TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      false
-    },
-    { TIMESTAMP_5_05,
-      TIMESTAMP_5_00,
-      3,
-      true,
-      { TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, 0 },
-      true
-    },
-    { TIMESTAMP_5_05,
-      TIMESTAMP_5_00,
-      3,
-      false,
-      { TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, 0 },
-      false
-    },
-    { TIMESTAMP_5_04,
-      TIMESTAMP_5_01,
-      3,
-      true,
-      { TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, 0 },
-      true
-    },
-    { TIMESTAMP_5_04,
-      TIMESTAMP_5_01,
-      3,
-      false,
-      { TIMESTAMP_5_03, TIMESTAMP_5_02, 0 },
-      false
-    },
-    { TIMESTAMP_4_59,
-      TIMESTAMP_5_05,
-      3,
-      true,
-      { TIMESTAMP_FIRST, TIMESTAMP_5_00, TIMESTAMP_5_02, 0 },
-      true
-    },
-    { TIMESTAMP_4_59,
-      TIMESTAMP_5_05,
-      3,
-      false,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_07,
-      3,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_07,
-      3,
-      false,
-      { TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, 0 },
-      true
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_UNSPECIFIED,
-      3,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_UNSPECIFIED,
-      3,
-      false,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_UNSPECIFIED,
-      6,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, TIMESTAMP_5_06, TIMESTAMP_LAST, 0 },
-      false
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_UNSPECIFIED,
-      6,
-      false,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, TIMESTAMP_5_03, TIMESTAMP_5_05, TIMESTAMP_5_06, 0 },
-      false
-    },
-    { TIMESTAMP_5_07,
-      TIMESTAMP_UNSPECIFIED,
-      6,
-      true,
-      { TIMESTAMP_5_06, TIMESTAMP_LAST, 0 },
-      false
-    },
-    { TIMESTAMP_5_07,
-      TIMESTAMP_UNSPECIFIED,
-      6,
-      false,
-      { NODATA, 0 },
-      false
-    },
-    { TIMESTAMP_UNSPECIFIED,
-      TIMESTAMP_5_06,
-      3,
-      true,
-      { TIMESTAMP_5_06,TIMESTAMP_5_05,TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_UNSPECIFIED,
-      TIMESTAMP_5_06,
-      3,
-      false,
-      { TIMESTAMP_5_06,TIMESTAMP_5_05,TIMESTAMP_5_03, 0 },
-      true
-    },
-    { TIMESTAMP_UNSPECIFIED,
-      TIMESTAMP_5_06,
-      6,
-      true,
-      { TIMESTAMP_5_06,TIMESTAMP_5_05,TIMESTAMP_5_03,TIMESTAMP_5_02,TIMESTAMP_5_00,TIMESTAMP_FIRST, 0 },
-      false
-    },
-    { TIMESTAMP_UNSPECIFIED,
-      TIMESTAMP_5_06,
-      6,
-      false,
-      { TIMESTAMP_5_06, TIMESTAMP_5_05, TIMESTAMP_5_03, TIMESTAMP_5_02, TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_UNSPECIFIED,
-      TIMESTAMP_4_48,
-      6,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_FIRST, 0 },
-      false
-    },
-    { TIMESTAMP_UNSPECIFIED,
-      TIMESTAMP_4_48,
-      6,
-      false,
-      { NODATA, 0 },
-      false
-    },
-    { TIMESTAMP_4_48,
-      TIMESTAMP_4_48,
-      0,
-      true,
-      { TIMESTAMP_FIRST, TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_4_48,
-      TIMESTAMP_4_48,
-      0,
-      false,
-      { NODATA, 0 },
-      false
-    },
-    { TIMESTAMP_4_48,
-      TIMESTAMP_4_48,
-      1,
-      true,
-      { TIMESTAMP_FIRST, 0 },
-      true
-    },
-    { TIMESTAMP_4_48,
-      TIMESTAMP_4_48,
-      1,
-      false,
-      { NODATA, 0 },
-      false
-    },
-    { TIMESTAMP_4_48,
-      TIMESTAMP_4_48,
-      2,
-      true,
-      { TIMESTAMP_FIRST,TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_00,
-      0,
-      true,
-      { TIMESTAMP_5_00,TIMESTAMP_5_02, 0 },
-      false
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_00,
-      0,
-      false,
-      { TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_00,
-      1,
-      true,
-      { TIMESTAMP_5_00, 0 },
-      true
-    },
-    { TIMESTAMP_5_00,
-      TIMESTAMP_5_00,
-      1,
-      false,
-      { TIMESTAMP_5_00, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_01,
-      0,
-      true,
-      { TIMESTAMP_5_00, TIMESTAMP_5_02, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_01,
-      0,
-      false,
-      { NODATA, 0 },
-      false
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_01,
-      1,
-      true,
-      { TIMESTAMP_5_00, 0 },
-      true
-    },
-    { TIMESTAMP_5_01,
-      TIMESTAMP_5_01,
-      1,
-      false,
-      { NODATA },
-      false
-    },
-    {0,0,0,false,{ NODATA }, false} // last element
-};
-#endif /*UA_HISTORICAL_READ_TEST_DATA_H_*/
diff --git a/ext/open62541/tests/server/randomindextest_backend.h b/ext/open62541/tests/server/randomindextest_backend.h
deleted file mode 100644
index 972e360..0000000
--- a/ext/open62541/tests/server/randomindextest_backend.h
+++ /dev/null
@@ -1,345 +0,0 @@
-#ifndef BACKEND_H
-#define BACKEND_H
-
-#include <open62541/plugin/historydata/history_data_backend.h>
-
-struct tupel {
-    size_t index;
-    UA_DataValue value;
-};
-
-// null terminated array
-struct context_randomindextest {
-    // null terminated array
-    struct tupel *tupels;
-    size_t tupelSize;
-};
-
-static size_t
-indexByIndex_randomindextest(struct context_randomindextest *context, size_t index)
-{
-    for (size_t i = 0; i < context->tupelSize; ++i) {
-        if (context->tupels[i].index == index)
-            return i;
-    }
-    return context->tupelSize;
-}
-
-// last value should be NULL, all values must be sorted
-static struct context_randomindextest*
-generateTestContext_randomindextest(const UA_DateTime *data) {
-    size_t count = 0;
-    while(data[count++]);
-    struct context_randomindextest* ret = (struct context_randomindextest*)UA_calloc(1, sizeof(struct context_randomindextest));
-    ret->tupels = (struct tupel*)UA_calloc(count, sizeof(struct tupel));
-    ret->tupelSize = count;
-    UA_DateTime *sortData;
-    UA_StatusCode retval = UA_Array_copy(data, count, (void**)&sortData, &UA_TYPES[UA_TYPES_DATETIME]);
-    if (retval != UA_STATUSCODE_GOOD)
-        return NULL;
-    for (size_t i = 0; i < count; ++i) {
-        size_t current = 0;
-        for (size_t j = 1; j < count-1; ++j){
-            UA_DateTime currentDate = sortData[current];
-            UA_DateTime jDate = sortData[j];
-            if (currentDate > jDate) {
-                current = j;
-            }
-        }
-        UA_DateTime nextValue = i == count-1 ? 0 : sortData[current];
-        sortData[current] = LLONG_MAX;
-        bool unique;
-        do {
-            unique = true;
-            ret->tupels[i].index = UA_UInt32_random();
-            for (size_t j = 0; j < i; ++j)
-                if (i != j && ret->tupels[i].index == ret->tupels[j].index)
-                        unique = false;
-        } while (!unique);
-        UA_DataValue_init(&ret->tupels[i].value);
-        ret->tupels[i].value.hasValue = true;
-        UA_Variant_setScalarCopy(&ret->tupels[i].value.value, &nextValue, &UA_TYPES[UA_TYPES_INT64]);
-        ret->tupels[i].value.hasStatus = true;
-        ret->tupels[i].value.status = UA_STATUSCODE_GOOD;
-        ret->tupels[i].value.hasServerTimestamp = true;
-        ret->tupels[i].value.serverTimestamp = nextValue;
-        ret->tupels[i].value.hasSourceTimestamp = true;
-        ret->tupels[i].value.sourceTimestamp = nextValue;
-    }
-    UA_free(sortData);
-    return ret;
-}
-
-static void
-deleteMembers_randomindextest(UA_HistoryDataBackend *backend)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)backend->context;
-    for (size_t i = 0; i < context->tupelSize; ++i) {
-        UA_DataValue_deleteMembers(&context->tupels[i].value);
-    }
-    UA_free(context->tupels);
-    UA_free(context);
-}
-
-static UA_StatusCode
-serverSetHistoryData_randomindextest(UA_Server *server,
-                                     void *hdbContext,
-                                     const UA_NodeId *sessionId,
-                                     void *sessionContext,
-                                     const UA_NodeId *nodeId,
-                                     UA_Boolean historizing,
-                                     const UA_DataValue *value)
-{
-    // we do not add data to the test data
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-getEnd_private(struct context_randomindextest* context)
-{
-    return context->tupels[context->tupelSize-1].index;
-}
-
-static size_t
-getEnd_randomindextest(UA_Server *server,
-                       void *hdbContext,
-                       const UA_NodeId *sessionId,
-                       void *sessionContext,
-                       const UA_NodeId *nodeId)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    return getEnd_private(context);
-}
-
-static size_t
-lastIndex_randomindextest(UA_Server *server,
-                          void *hdbContext,
-                          const UA_NodeId *sessionId,
-                          void *sessionContext,
-                          const UA_NodeId *nodeId)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    return context->tupels[context->tupelSize-2].index;
-}
-
-static size_t
-firstIndex_randomindextest(UA_Server *server,
-                           void *hdbContext,
-                           const UA_NodeId *sessionId,
-                           void *sessionContext,
-                           const UA_NodeId *nodeId)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    return context->tupels[0].index;
-}
-
-static UA_Boolean
-search_randomindextest(struct context_randomindextest* ctx,
-                            const UA_DateTime timestamp,
-                            size_t *index) {
-    for (size_t i = 0; i < ctx->tupelSize; ++i) {
-        if (ctx->tupels[i].value.sourceTimestamp == timestamp) {
-            *index = i;
-            return true;
-        }
-        if (ctx->tupels[i].value.sourceTimestamp > timestamp) {
-            *index = i;
-            return false;
-        }
-    }
-    *index = ctx->tupelSize-1;
-    return false;
-}
-
-static size_t
-getDateTimeMatch_randomindextest(UA_Server *server,
-                                 void *hdbContext,
-                                 const UA_NodeId *sessionId,
-                                 void *sessionContext,
-                                 const UA_NodeId *nodeId,
-                                 const UA_DateTime timestamp,
-                                 const MatchStrategy strategy)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    size_t current;
-
-    UA_Boolean retval = search_randomindextest(context, timestamp, &current);
-
-    if ((strategy == MATCH_EQUAL
-         || strategy == MATCH_EQUAL_OR_AFTER
-         || strategy == MATCH_EQUAL_OR_BEFORE)
-            && retval)
-        return context->tupels[current].index;
-    switch (strategy) {
-    case MATCH_AFTER:
-        if (retval)
-            return context->tupels[current+1].index;
-        return context->tupels[current].index;
-    case MATCH_EQUAL_OR_AFTER:
-        return context->tupels[current].index;
-    case MATCH_EQUAL_OR_BEFORE:
-        // retval == true aka "equal" is handled before
-        // Fall through if !retval
-    case MATCH_BEFORE:
-        if (current > 0)
-            return context->tupels[current-1].index;
-        else
-            return context->tupels[context->tupelSize-1].index;
-    default:
-        break;
-    }
-    return context->tupels[context->tupelSize-1].index;
-}
-
-
-#define MYABSSUB(a,b) ((a)<(b)?((b)-(a)):(a)-(b))
-static size_t
-resultSize_randomindextest(UA_Server *server,
-                           void *hdbContext,
-                           const UA_NodeId *sessionId,
-                           void *sessionContext,
-                           const UA_NodeId *nodeId,
-                           size_t startIndex,
-                           size_t endIndex)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    if (startIndex == getEnd_private(context)
-            || endIndex == getEnd_private(context))
-        return 0;
-    size_t realEndIndex = indexByIndex_randomindextest(context, endIndex);
-    size_t realStartIndex = indexByIndex_randomindextest(context, startIndex);
-    size_t result = MYABSSUB(realEndIndex,realStartIndex);
-    return result+1;
-}
-
-static UA_StatusCode
-copyDataValues_randomindextest(UA_Server *server,
-                               void *hdbContext,
-                               const UA_NodeId *sessionId,
-                               void *sessionContext,
-                               const UA_NodeId *nodeId,
-                               size_t startIndex,
-                               size_t endIndex,
-                               UA_Boolean reverse,
-                               size_t maxValues,
-                               UA_NumericRange range,
-                               UA_Boolean releaseContinuationPoints,
-                               const UA_ByteString *continuationPoint,
-                               UA_ByteString *outContinuationPoint,
-                               size_t *providedValues,
-                               UA_DataValue *values)
-{
-    size_t skip = 0;
-    if (continuationPoint->length > 0) {
-        if (continuationPoint->length == sizeof(size_t)) {
-            skip = *((size_t*)(continuationPoint->data));
-        } else {
-            return UA_STATUSCODE_BADCONTINUATIONPOINTINVALID;
-        }
-    }
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    size_t index = indexByIndex_randomindextest(context,startIndex);
-    size_t counter = 0;
-    size_t skipedValues = 0;
-    if (reverse) {
-        while (index >= indexByIndex_randomindextest(context,endIndex)
-               && index < context->tupelSize-1
-               && counter < maxValues) {
-            if (skipedValues++ >= skip) {
-                UA_DataValue_copy(&context->tupels[index].value, &values[counter]);
-                ++counter;
-            }
-            --index;
-        }
-    } else {
-        while (index <= indexByIndex_randomindextest(context,endIndex) && counter < maxValues) {
-            if (skipedValues++ >= skip) {
-                UA_DataValue_copy(&context->tupels[index].value, &values[counter]);
-                ++counter;
-            }
-            ++index;
-        }
-    }
-
-    if (providedValues)
-        *providedValues = counter;
-
-    if ((!reverse && (indexByIndex_randomindextest(context,endIndex)-indexByIndex_randomindextest(context,startIndex)-skip+1) > counter)
-            || (reverse && (indexByIndex_randomindextest(context,startIndex)-indexByIndex_randomindextest(context,endIndex)-skip+1) > counter)) {
-        outContinuationPoint->length = sizeof(size_t);
-        size_t t = sizeof(size_t);
-        outContinuationPoint->data = (UA_Byte*)UA_malloc(t);
-        *((size_t*)(outContinuationPoint->data)) = skip + counter;
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static const UA_DataValue*
-getDataValue_randomindextest(UA_Server *server,
-                             void *hdbContext,
-                             const UA_NodeId *sessionId,
-                             void *sessionContext,
-                             const UA_NodeId *nodeId,
-                             size_t index)
-{
-    struct context_randomindextest* context = (struct context_randomindextest*)hdbContext;
-    size_t realIndex = indexByIndex_randomindextest(context, index);
-    return &context->tupels[realIndex].value;
-}
-
-static UA_Boolean
-boundSupported_randomindextest(UA_Server *server,
-                               void *hdbContext,
-                               const UA_NodeId *sessionId,
-                               void *sessionContext,
-                               const UA_NodeId *nodeId)
-{
-    return true;
-}
-
-static UA_Boolean
-timestampsToReturnSupported_randomindextest(UA_Server *server,
-                                            void *hdbContext,
-                                            const UA_NodeId *sessionId,
-                                            void *sessionContext,
-                                            const UA_NodeId *nodeId,
-                                            const UA_TimestampsToReturn timestampsToReturn)
-{
-    return true;
-}
-
-UA_HistoryDataBackend
-UA_HistoryDataBackend_randomindextest(UA_DateTime *data);
-
-UA_HistoryDataBackend
-UA_HistoryDataBackend_randomindextest(UA_DateTime *data)
-{
-    UA_HistoryDataBackend result;
-    memset(&result, 0, sizeof(UA_HistoryDataBackend));
-    result.serverSetHistoryData = &serverSetHistoryData_randomindextest;
-    result.resultSize = &resultSize_randomindextest;
-    result.getEnd = &getEnd_randomindextest;
-    result.lastIndex = &lastIndex_randomindextest;
-    result.firstIndex = &firstIndex_randomindextest;
-    result.getDateTimeMatch = &getDateTimeMatch_randomindextest;
-    result.copyDataValues = &copyDataValues_randomindextest;
-    result.getDataValue = &getDataValue_randomindextest;
-    result.boundSupported = &boundSupported_randomindextest;
-    result.timestampsToReturnSupported = &timestampsToReturnSupported_randomindextest;
-    result.deleteMembers = &deleteMembers_randomindextest;
-    result.getHistoryData = NULL;
-    result.context = generateTestContext_randomindextest(data);
-    return result;
-}
-
-void
-UA_HistoryDataBackend_randomindextest_deleteMembers(UA_HistoryDataBackend *backend);
-
-void
-UA_HistoryDataBackend_randomindextest_deleteMembers(UA_HistoryDataBackend *backend)
-{
-    deleteMembers_randomindextest(backend);
-}
-
-#endif // BACKEND_H
diff --git a/ext/open62541/tests/testing-plugins/testing_clock.c b/ext/open62541/tests/testing-plugins/testing_clock.c
deleted file mode 100644
index 26397f5..0000000
--- a/ext/open62541/tests/testing-plugins/testing_clock.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "testing_clock.h"
-#include <time.h>
-
-/* To avoid zero timestamp value in header, the testingClock
- * is assigned with non-zero timestamp to pass unit tests */
-UA_DateTime testingClock = 0x5C8F735D;
-
-UA_DateTime UA_DateTime_now(void) {
-    return testingClock;
-}
-
-UA_DateTime UA_DateTime_nowMonotonic(void) {
-    return testingClock;
-}
-
-UA_DateTime UA_DateTime_localTimeUtcOffset(void) {
-    return 0;
-}
-
-void
-UA_fakeSleep(UA_UInt32 duration) {
-    testingClock += duration * UA_DATETIME_MSEC;
-}
-
-/* 1 millisecond = 1,000,000 Nanoseconds */
-#define NANO_SECOND_MULTIPLIER 1000000
-
-void
-UA_realSleep(UA_UInt32 duration) {
-#ifdef _WIN32
-    Sleep(duration);
-#else
-    UA_UInt32 sec = duration / 1000;
-    UA_UInt32 ns = (duration % 1000) * NANO_SECOND_MULTIPLIER;
-    struct timespec sleepValue;
-    sleepValue.tv_sec = sec;
-    sleepValue.tv_nsec = ns;
-    nanosleep(&sleepValue, NULL);
-#endif
-}
-
-void
-UA_comboSleep(unsigned long duration) {
-    UA_fakeSleep((UA_UInt32)duration);
-    UA_realSleep((UA_UInt32)duration);
-}
diff --git a/ext/open62541/tests/testing-plugins/testing_clock.h b/ext/open62541/tests/testing-plugins/testing_clock.h
deleted file mode 100644
index e0c5424..0000000
--- a/ext/open62541/tests/testing-plugins/testing_clock.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef TESTING_CLOCK_H_
-#define TESTING_CLOCK_H_
-
-#include <open62541/types.h>
-
-/* The testing clock is used for reproducible unit tests that require precise
- * timings. It implements the following functions from ua_types.h. They return a
- * deterministic time that can be advanced manually with UA_sleep.
- *
- * UA_DateTime UA_EXPORT UA_DateTime_now(void);
- * UA_DateTime UA_EXPORT UA_DateTime_nowMonotonic(void); */
-
-/* Forwards the testing clock by the given duration in ms */
-void UA_fakeSleep(UA_UInt32 duration);
-
-/* Sleep for the duration in milliseconds. Used to wait for workers to complete. */
-void UA_realSleep(UA_UInt32 duration);
-
-#endif /* TESTING_CLOCK_H_ */
diff --git a/ext/open62541/tests/testing-plugins/testing_networklayers.c b/ext/open62541/tests/testing-plugins/testing_networklayers.c
deleted file mode 100644
index 6b6fb68..0000000
--- a/ext/open62541/tests/testing-plugins/testing_networklayers.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "testing_networklayers.h"
-
-#include <open62541/server_config_default.h>
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include "testing_clock.h"
-
-static UA_ByteString *vBuffer;
-static UA_ByteString sendBuffer;
-
-UA_StatusCode UA_Client_recvTesting_result = UA_STATUSCODE_GOOD;
-
-static UA_StatusCode
-dummyGetSendBuffer(UA_Connection *connection, size_t length, UA_ByteString *buf) {
-    if(length > sendBuffer.length)
-        return UA_STATUSCODE_BADCOMMUNICATIONERROR;
-    *buf = sendBuffer;
-    buf->length = length;
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-dummyReleaseSendBuffer(UA_Connection *connection, UA_ByteString *buf) {
-}
-
-static UA_StatusCode
-dummySend(UA_Connection *connection, UA_ByteString *buf) {
-    assert(connection != NULL);
-    assert(buf != NULL);
-
-    if(vBuffer) {
-        UA_ByteString_deleteMembers(vBuffer);
-        UA_ByteString_copy(buf, vBuffer);
-    }
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-dummyReleaseRecvBuffer(UA_Connection *connection, UA_ByteString *buf) {
-}
-
-static void
-dummyClose(UA_Connection *connection) {
-    if(vBuffer)
-        UA_ByteString_deleteMembers(vBuffer);
-    UA_ByteString_deleteMembers(&sendBuffer);
-}
-
-UA_Connection createDummyConnection(size_t sendBufferSize,
-                                    UA_ByteString *verificationBuffer) {
-    vBuffer = verificationBuffer;
-    UA_ByteString_allocBuffer(&sendBuffer, sendBufferSize);
-
-    UA_Connection c;
-    c.state = UA_CONNECTION_ESTABLISHED;
-    c.config = UA_ConnectionConfig_default;
-    c.channel = NULL;
-    c.sockfd = 0;
-    c.handle = NULL;
-    c.incompleteChunk = UA_BYTESTRING_NULL;
-    c.getSendBuffer = dummyGetSendBuffer;
-    c.releaseSendBuffer = dummyReleaseSendBuffer;
-    c.send = dummySend;
-    c.recv = NULL;
-    c.releaseRecvBuffer = dummyReleaseRecvBuffer;
-    c.close = dummyClose;
-    return c;
-}
-
-UA_UInt32 UA_Client_recvSleepDuration;
-UA_StatusCode (*UA_Client_recv)(UA_Connection *connection, UA_ByteString *response,
-                                UA_UInt32 timeout);
-
-UA_StatusCode
-UA_Client_recvTesting(UA_Connection *connection, UA_ByteString *response,
-                    UA_UInt32 timeout) {
-
-    if(UA_Client_recvTesting_result != UA_STATUSCODE_GOOD) {
-        UA_StatusCode temp = UA_Client_recvTesting_result;
-        UA_Client_recvTesting_result = UA_STATUSCODE_GOOD;
-        UA_fakeSleep(timeout);
-        return temp;
-    }
-
-    UA_StatusCode res = UA_Client_recv(connection, response, timeout);
-    if(res == UA_STATUSCODE_GOODNONCRITICALTIMEOUT)
-        UA_fakeSleep(timeout);
-    else
-        UA_fakeSleep(UA_Client_recvSleepDuration);
-    UA_Client_recvSleepDuration = 0;
-    return res;
-}
diff --git a/ext/open62541/tests/testing-plugins/testing_networklayers.h b/ext/open62541/tests/testing-plugins/testing_networklayers.h
deleted file mode 100644
index 8746550..0000000
--- a/ext/open62541/tests/testing-plugins/testing_networklayers.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef TESTING_NETWORKLAYERS_H_
-#define TESTING_NETWORKLAYERS_H_
-
-#include <open62541/server_config.h>
-
-_UA_BEGIN_DECLS
-
-/**
- * Create the TCP networklayer and listen to the specified port
- *
- * @param sendBufferSize The send buffer is reused. This is the max chunk size
- * @param verificationBuffer the send function will copy the data that is sent
- *        to this buffer, so that it is possible to check what the send function
- *        received. */
-UA_Connection createDummyConnection(size_t sendBufferSize,
-                                    UA_ByteString *verificationBuffer);
-
-extern UA_UInt32 UA_Client_recvSleepDuration;
-extern UA_StatusCode (*UA_Client_recv)(UA_Connection *connection, UA_ByteString *response,
-                                       UA_UInt32 timeout);
-
-extern UA_StatusCode UA_Client_recvTesting_result;
-
-/* Override the client recv method to increase the simulated clock after the first recv.
- * UA_Client_recvSleepDuration is set to zero after the first recv.
- * UA_Client_recvTesting_result can be used to simulate an error */
-UA_StatusCode
-UA_Client_recvTesting(UA_Connection *connection, UA_ByteString *response,
-                    UA_UInt32 timeout);
-
-_UA_END_DECLS
-
-#endif /* TESTING_NETWORKLAYERS_H_ */
diff --git a/ext/open62541/tests/testing-plugins/testing_policy.c b/ext/open62541/tests/testing-plugins/testing_policy.c
deleted file mode 100644
index e12e8b0..0000000
--- a/ext/open62541/tests/testing-plugins/testing_policy.c
+++ /dev/null
@@ -1,445 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef __clang_analyzer__
-
-#include "testing_policy.h"
-
-#include <open62541/plugin/log_stdout.h>
-
-#include <check.h>
-
-#define SET_CALLED(func) funcsCalled->func = true
-
-static funcs_called *funcsCalled;
-static const key_sizes *keySizes;
-
-static UA_StatusCode
-verify_testing(const UA_SecurityPolicy *securityPolicy,
-               void *channelContext,
-               const UA_ByteString *message,
-               const UA_ByteString *signature) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-asym_sign_testing(const UA_SecurityPolicy *securityPolicy,
-                  void *channelContext,
-                  const UA_ByteString *message,
-                  UA_ByteString *signature) {
-    SET_CALLED(asym_sign);
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    ck_assert(message != NULL);
-    ck_assert(signature != NULL);
-
-    ck_assert_msg(signature->length == keySizes->asym_lcl_sig_size,
-                  "Expected signature length to be %i but was %i",
-                  keySizes->asym_lcl_sig_size,
-                  signature->length);
-
-    memset(signature->data, '*', signature->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-sym_sign_testing(const UA_SecurityPolicy *securityPolicy,
-                 void *channelContext,
-                 const UA_ByteString *message,
-                 UA_ByteString *signature) {
-    SET_CALLED(sym_sign);
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    ck_assert(message != NULL);
-    ck_assert(signature != NULL);
-    ck_assert(signature->length != 0);
-    ck_assert(signature->data != NULL);
-
-    memset(signature->data, 'S', signature->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-asym_getLocalSignatureSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                   const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-
-    return keySizes->asym_lcl_sig_size;
-}
-
-static size_t
-asym_getRemoteSignatureSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                    const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-
-    return keySizes->asym_rmt_sig_size;
-}
-
-static size_t
-asym_getLocalEncryptionKeyLength_testing(const UA_SecurityPolicy *securityPolicy,
-                                         const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->asym_lcl_enc_key_size;
-}
-
-static size_t
-asym_getRemoteEncryptionKeyLength_testing(const UA_SecurityPolicy *securityPolicy,
-                                          const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->asym_rmt_enc_key_size;
-}
-
-static size_t
-sym_getLocalSignatureSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                  const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_sig_size;
-}
-
-static size_t
-sym_getRemoteSignatureSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                   const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_sig_size;
-}
-
-static size_t
-sym_getLocalSigningKeyLength_testing(const UA_SecurityPolicy *securityPolicy,
-                                     const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_sig_keyLen;
-}
-
-static size_t
-sym_getRemoteSigningKeyLength_testing(const UA_SecurityPolicy *securityPolicy,
-                                      const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_sig_keyLen; // TODO: Remote sig key len
-}
-
-static size_t
-sym_getLocalEncryptionKeyLength_testing(const UA_SecurityPolicy *securityPolicy,
-                                        const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_enc_keyLen;
-}
-
-static size_t
-sym_getRemoteEncryptionKeyLength_testing(const UA_SecurityPolicy *securityPolicy,
-                                         const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_enc_keyLen;
-}
-
-static size_t
-sym_getLocalEncryptionBlockSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                        const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_enc_blockSize;
-}
-
-static size_t
-sym_getRemoteEncryptionBlockSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                         const void *channelContext) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    return keySizes->sym_enc_blockSize; // TODO: Different size for remote
-}
-
-static UA_StatusCode
-sym_encrypt_testing(const UA_SecurityPolicy *securityPolicy,
-                    void *channelContext,
-                    UA_ByteString *data) {
-    SET_CALLED(sym_enc);
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    ck_assert(data != NULL);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-asym_encrypt_testing(const UA_SecurityPolicy *securityPolicy,
-                     void *channelContext,
-                     UA_ByteString *data) {
-    SET_CALLED(asym_enc);
-    ck_assert(securityPolicy != NULL);
-    ck_assert(channelContext != NULL);
-    ck_assert(data != NULL);
-
-    size_t blockSize =
-        securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy,
-                                                                                                      channelContext);
-    ck_assert_msg(data->length % blockSize == 0,
-                  "Expected the length of the data to be encrypted to be a multiple of the plaintext block size (%i). "
-                      "Remainder was %i",
-                  blockSize,
-                  data->length % blockSize);
-
-    for(size_t i = 0; i < data->length; ++i) {
-        data->data[i] = (UA_Byte)((data->data[i] + 1) % (UA_BYTE_MAX + 1));
-    }
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-decrypt_testing(const UA_SecurityPolicy *securityPolicy,
-                void *channelContext,
-                UA_ByteString *data) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-makeThumbprint_testing(const UA_SecurityPolicy *securityPolicy,
-                       const UA_ByteString *certificate,
-                       UA_ByteString *thumbprint) {
-    SET_CALLED(makeCertificateThumbprint);
-
-    ck_assert(securityPolicy != NULL);
-    ck_assert(certificate != NULL);
-    ck_assert(thumbprint != NULL);
-
-    ck_assert_msg(thumbprint->length == 20, "Thumbprints have to be 20 bytes long (current specification)");
-    memset(thumbprint->data, 42, 20);
-
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-compareThumbprint_testing(const UA_SecurityPolicy *securityPolicy,
-                          const UA_ByteString *certificateThumbprint) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-generateKey_testing(const UA_SecurityPolicy *securityPolicy,
-                    const UA_ByteString *secret,
-                    const UA_ByteString *seed,
-                    UA_ByteString *out) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(secret != NULL);
-    ck_assert(seed != NULL);
-    ck_assert(out != NULL);
-    SET_CALLED(generateKey);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-generateNonce_testing(const UA_SecurityPolicy *securityPolicy,
-                      UA_ByteString *out) {
-    ck_assert(securityPolicy != NULL);
-    ck_assert(out != NULL);
-
-    memset(out->data, 'N', out->length);
-
-    SET_CALLED(generateNonce);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-newContext_testing(const UA_SecurityPolicy *securityPolicy,
-                   const UA_ByteString *remoteCertificate,
-                   void **channelContext) {
-    SET_CALLED(newContext);
-    ck_assert(securityPolicy != NULL);
-    ck_assert(remoteCertificate != NULL);
-    ck_assert(channelContext != NULL);
-
-    ck_assert(funcsCalled != NULL);
-    *channelContext = (void *)funcsCalled;
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-deleteContext_testing(void *channelContext) {
-    SET_CALLED(deleteContext);
-    ck_assert(channelContext != NULL);
-}
-
-static UA_StatusCode
-setLocalSymEncryptingKey_testing(void *channelContext,
-                                 const UA_ByteString *val) {
-    SET_CALLED(setLocalSymEncryptingKey);
-    ck_assert(channelContext != NULL);
-    ck_assert(val != NULL);
-    ck_assert(val->data != NULL);
-    ck_assert_msg(val->length == keySizes->sym_enc_keyLen,
-                  "Expected length to be %i but got %i",
-                  keySizes->sym_enc_keyLen,
-                  val->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setLocalSymSigningKey_testing(void *channelContext,
-                              const UA_ByteString *val) {
-    SET_CALLED(setLocalSymSigningKey);
-    ck_assert(channelContext != NULL);
-    ck_assert(val != NULL);
-    ck_assert(val->data != NULL);
-    ck_assert_msg(val->length == keySizes->sym_sig_keyLen,
-                  "Expected length to be %i but got %i",
-                  keySizes->sym_sig_keyLen,
-                  val->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setLocalSymIv_testing(void *channelContext,
-                      const UA_ByteString *val) {
-    SET_CALLED(setLocalSymIv);
-    ck_assert(channelContext != NULL);
-    ck_assert(val != NULL);
-    ck_assert(val->data != NULL);
-    ck_assert_msg(val->length == keySizes->sym_enc_blockSize,
-                  "Expected length to be %i but got %i",
-                  keySizes->sym_enc_blockSize,
-                  val->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setRemoteSymEncryptingKey_testing(void *channelContext,
-                                  const UA_ByteString *val) {
-    SET_CALLED(setRemoteSymEncryptingKey);
-    ck_assert(channelContext != NULL);
-    ck_assert(val != NULL);
-    ck_assert(val->data != NULL);
-    ck_assert_msg(val->length == keySizes->sym_enc_keyLen,
-                  "Expected length to be %i but got %i",
-                  keySizes->sym_enc_keyLen,
-                  val->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setRemoteSymSigningKey_testing(void *channelContext,
-                               const UA_ByteString *val) {
-    SET_CALLED(setRemoteSymSigningKey);
-    ck_assert(channelContext != NULL);
-    ck_assert(val != NULL);
-    ck_assert(val->data != NULL);
-    ck_assert_msg(val->length == keySizes->sym_sig_keyLen,
-                  "Expected length to be %i but got %i",
-                  keySizes->sym_sig_keyLen,
-                  val->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-setRemoteSymIv_testing(void *channelContext,
-                       const UA_ByteString *val) {
-    SET_CALLED(setRemoteSymIv);
-    ck_assert(channelContext != NULL);
-    ck_assert(val != NULL);
-    ck_assert(val->data != NULL);
-    ck_assert_msg(val->length == keySizes->sym_enc_blockSize,
-                  "Expected length to be %i but got %i",
-                  keySizes->sym_enc_blockSize,
-                  val->length);
-    return UA_STATUSCODE_GOOD;
-}
-
-static size_t
-asym_getRemotePlainTextBlockSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                         const void *channelContext) {
-    return keySizes->asym_rmt_ptext_blocksize;
-}
-
-static size_t
-asym_getRemoteBlockSize_testing(const UA_SecurityPolicy *securityPolicy,
-                                const void *channelContext) {
-    return keySizes->asym_rmt_blocksize;
-}
-
-static UA_StatusCode
-compareCertificate_testing(const void *channelContext,
-                           const UA_ByteString *certificate) {
-    return UA_STATUSCODE_GOOD;
-}
-
-static void
-policy_deletemembers_testing(UA_SecurityPolicy *policy) {
-    UA_ByteString_deleteMembers(&policy->localCertificate);
-}
-
-UA_StatusCode
-TestingPolicy(UA_SecurityPolicy *policy, UA_ByteString localCertificate,
-              funcs_called *fCalled, const key_sizes *kSizes) {
-    keySizes = kSizes;
-    funcsCalled = fCalled;
-    policy->policyContext = (void *)funcsCalled;
-    policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Testing");
-    policy->logger = UA_Log_Stdout;
-    policy->certificateVerification = NULL;
-    UA_ByteString_copy(&localCertificate, &policy->localCertificate);
-
-    policy->asymmetricModule.makeCertificateThumbprint = makeThumbprint_testing;
-    policy->asymmetricModule.compareCertificateThumbprint = compareThumbprint_testing;
-
-    UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm =
-        &policy->asymmetricModule.cryptoModule.signatureAlgorithm;
-    asym_signatureAlgorithm->uri = UA_STRING_NULL;
-    asym_signatureAlgorithm->verify = verify_testing;
-    asym_signatureAlgorithm->sign = asym_sign_testing;
-    asym_signatureAlgorithm->getLocalSignatureSize = asym_getLocalSignatureSize_testing;
-    asym_signatureAlgorithm->getRemoteSignatureSize = asym_getRemoteSignatureSize_testing;
-
-    UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm =
-        &policy->asymmetricModule.cryptoModule.encryptionAlgorithm;
-    asym_encryptionAlgorithm->encrypt = asym_encrypt_testing;
-    asym_encryptionAlgorithm->decrypt = decrypt_testing;
-    asym_encryptionAlgorithm->getLocalKeyLength = asym_getLocalEncryptionKeyLength_testing;
-    asym_encryptionAlgorithm->getRemoteKeyLength = asym_getRemoteEncryptionKeyLength_testing;
-    asym_encryptionAlgorithm->getRemotePlainTextBlockSize = asym_getRemotePlainTextBlockSize_testing;
-    asym_encryptionAlgorithm->getRemoteBlockSize = asym_getRemoteBlockSize_testing;
-
-    policy->symmetricModule.generateKey = generateKey_testing;
-    policy->symmetricModule.generateNonce = generateNonce_testing;
-
-    UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm =
-        &policy->symmetricModule.cryptoModule.signatureAlgorithm;
-    sym_signatureAlgorithm->uri = UA_STRING_NULL;
-    sym_signatureAlgorithm->verify = verify_testing;
-    sym_signatureAlgorithm->sign = sym_sign_testing;
-    sym_signatureAlgorithm->getLocalSignatureSize = sym_getLocalSignatureSize_testing;
-    sym_signatureAlgorithm->getRemoteSignatureSize = sym_getRemoteSignatureSize_testing;
-    sym_signatureAlgorithm->getLocalKeyLength = sym_getLocalSigningKeyLength_testing;
-    sym_signatureAlgorithm->getRemoteKeyLength = sym_getRemoteSigningKeyLength_testing;
-
-    UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm =
-        &policy->symmetricModule.cryptoModule.encryptionAlgorithm;
-    sym_encryptionAlgorithm->encrypt = sym_encrypt_testing;
-    sym_encryptionAlgorithm->decrypt = decrypt_testing;
-    sym_encryptionAlgorithm->getLocalKeyLength = sym_getLocalEncryptionKeyLength_testing;
-    sym_encryptionAlgorithm->getRemoteKeyLength = sym_getRemoteEncryptionKeyLength_testing;
-    sym_encryptionAlgorithm->getLocalBlockSize = sym_getLocalEncryptionBlockSize_testing;
-    sym_encryptionAlgorithm->getRemoteBlockSize = sym_getRemoteEncryptionBlockSize_testing;
-
-    policy->channelModule.newContext = newContext_testing;
-    policy->channelModule.deleteContext = deleteContext_testing;
-    policy->channelModule.setLocalSymEncryptingKey = setLocalSymEncryptingKey_testing;
-    policy->channelModule.setLocalSymSigningKey = setLocalSymSigningKey_testing;
-    policy->channelModule.setLocalSymIv = setLocalSymIv_testing;
-    policy->channelModule.setRemoteSymEncryptingKey = setRemoteSymEncryptingKey_testing;
-    policy->channelModule.setRemoteSymSigningKey = setRemoteSymSigningKey_testing;
-    policy->channelModule.setRemoteSymIv = setRemoteSymIv_testing;
-    policy->channelModule.compareCertificate = compareCertificate_testing;
-    policy->deleteMembers = policy_deletemembers_testing;
-
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
diff --git a/ext/open62541/tests/testing-plugins/testing_policy.h b/ext/open62541/tests/testing-plugins/testing_policy.h
deleted file mode 100644
index 31ff8bf..0000000
--- a/ext/open62541/tests/testing-plugins/testing_policy.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef OPEN62541_TESTING_POLICY_H
-#define OPEN62541_TESTING_POLICY_H
-
-#include <open62541/plugin/log.h>
-#include <open62541/plugin/securitypolicy.h>
-
-_UA_BEGIN_DECLS
-
-typedef struct funcs_called {
-    UA_Boolean asym_enc;
-    UA_Boolean asym_dec;
-
-    UA_Boolean sym_enc;
-    UA_Boolean sym_dec;
-
-    UA_Boolean asym_sign;
-    UA_Boolean asym_verify;
-
-    UA_Boolean sym_sign;
-    UA_Boolean sym_verify;
-
-    UA_Boolean newContext;
-    UA_Boolean deleteContext;
-
-    UA_Boolean makeCertificateThumbprint;
-    UA_Boolean generateKey;
-    UA_Boolean generateNonce;
-
-    UA_Boolean setLocalSymEncryptingKey;
-    UA_Boolean setLocalSymSigningKey;
-    UA_Boolean setLocalSymIv;
-    UA_Boolean setRemoteSymEncryptingKey;
-    UA_Boolean setRemoteSymSigningKey;
-    UA_Boolean setRemoteSymIv;
-} funcs_called;
-
-typedef struct key_sizes {
-    size_t sym_enc_blockSize;
-    size_t sym_sig_keyLen;
-    size_t sym_sig_size;
-    size_t sym_enc_keyLen;
-
-    size_t asym_rmt_sig_size;
-    size_t asym_lcl_sig_size;
-    size_t asym_rmt_ptext_blocksize;
-    size_t asym_rmt_blocksize;
-    size_t asym_rmt_enc_key_size;
-    size_t asym_lcl_enc_key_size;
-} key_sizes;
-
-UA_StatusCode UA_EXPORT
-TestingPolicy(UA_SecurityPolicy *policy, UA_ByteString localCertificate,
-              funcs_called *fCalled, const key_sizes *kSizes);
-
-_UA_END_DECLS
-
-#endif //OPEN62541_TESTING_POLICY_H
diff --git a/ext/open62541/tests/testing-plugins/thread_wrapper.h b/ext/open62541/tests/testing-plugins/thread_wrapper.h
deleted file mode 100644
index 99d8d57..0000000
--- a/ext/open62541/tests/testing-plugins/thread_wrapper.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/* Simple wrapper for unit test threads */
-
-/* Threads */
-
-#ifndef WIN32
-#include <pthread.h>
-#define THREAD_HANDLE pthread_t
-#define THREAD_CREATE(handle, callback) pthread_create(&handle, NULL, callback, NULL)
-#define THREAD_JOIN(handle) pthread_join(handle, NULL)
-#define THREAD_CALLBACK(name) static void * name(void *_)
-
-#else
-
-#include <windows.h>
-#define THREAD_HANDLE HANDLE
-#define THREAD_CREATE(handle, callback) { handle = CreateThread( NULL, 0, callback, NULL, 0, NULL); }
-#define THREAD_JOIN(handle) WaitForSingleObject(handle, INFINITE)
-
-
-#define THREAD_CALLBACK(name) static DWORD WINAPI name( LPVOID lpParam )
-
-#endif
-
-/* Mutex */
-
-/* Windows returns non-zero on success and pthread returns zero,
- * so compare to zero to achieve consistent return values */
-
-#ifndef WIN32
-#define MUTEX_HANDLE pthread_mutex_t
-
-/* Will return UA_TRUE when zero */
-#define MUTEX_INIT(name) (pthread_mutex_init(&(name), NULL) == 0)
-#define MUTEX_LOCK(name) (pthread_mutex_lock(&(name)) == 0)
-#define MUTEX_UNLOCK(name) (pthread_mutex_unlock(&(name)) == 0)
-#define MUTEX_DESTROY(name) (pthread_mutex_destroy(&(name)) == 0)
-
-#else
-
-#define MUTEX_HANDLE HANDLE
-
-/* Will return UA_FALSE when zero */
-#define MUTEX_INIT(name) (CreateMutex(NULL, FALSE, NULL) != 0)
-#define MUTEX_LOCK(name) (WaitForSingleObject((name), INFINITE) != 0)
-#define MUTEX_UNLOCK(name) (ReleaseMutex((name)) != 0)
-#define MUTEX_DESTROY(name) (CloseHandle((name)) != 0)
-#endif
diff --git a/ext/open62541/tools/amalgamate.py b/ext/open62541/tools/amalgamate.py
deleted file mode 100644
index 1c91388..0000000
--- a/ext/open62541/tools/amalgamate.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-
-# coding: UTF-8
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this 
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import print_function
-import argparse
-import os.path
-import re
-import io
-
-parser = argparse.ArgumentParser()
-parser.add_argument('version', help='file version')
-parser.add_argument('outfile', help='outfile with extension .c/.h')
-parser.add_argument('inputs', nargs='*', action='store', help='input filenames')
-args = parser.parse_args()
-
-outname = args.outfile.split("/")[-1]
-is_c = False
-if outname[-2:] == ".c":
-    is_c = True
-pos = outname.find(".")
-if pos > 0:
-    outname = outname[:pos]
-include_re = re.compile("^#[\s]*include (\".*\").*$|^#[\s]*include (<open62541/.*>).*$")
-guard_re = re.compile("^#(?:(?:ifndef|define)\s*[A-Z_]+_H_|endif /\* [A-Z_]+_H_ \*/|endif // [A-Z_]+_H_|endif\s*/\*\s*!?[A-Z_]+_H[_]+\s*\*/)")
-
-print ("Starting amalgamating file "+ args.outfile)
-
-file = io.open(args.outfile, 'wt', encoding='utf8', errors='replace')
-file.write(u"""/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES
- * visit http://open62541.org/ for information about this software
- * Git-Revision: %s
- */
-
-/*
- * Copyright (C) 2014-2018 the contributors as stated in the AUTHORS file
- *
- * This file is part of open62541. open62541 is free software: you can
- * redistribute it and/or modify it under the terms of the Mozilla Public
- * License v2.0 as stated in the LICENSE file provided with open62541.
- *
- * open62541 is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.
- */\n\n""" % args.version)
-
-if is_c:
-    file.write(u'''#ifndef UA_DYNAMIC_LINKING_EXPORT
-# define UA_DYNAMIC_LINKING_EXPORT
-# define MDNSD_DYNAMIC_LINKING
-#endif
-
-/* Disable security warnings for BSD sockets on MSVC */
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#include "%s.h"
-''' % outname)
-else:
-    file.write(u'''#ifndef %s
-#define %s
-''' % (outname.upper() + u"_H_", outname.upper() + u"_H_"))
-
-for fname in args.inputs:
-    with io.open(fname, encoding='utf8', errors='replace') as infile:
-        file.write(u"\n/*********************************** amalgamated original file \"" + fname + u"\" ***********************************/\n\n")
-        print ("Integrating file '" + fname + "'...", end=""),
-        for line in infile:
-            inc_res = include_re.match(line)
-            guard_res = guard_re.match(line)
-            if not inc_res and not guard_res:
-                file.write(line)
-        # Ensure file is written to disk.
-        file.flush()
-        os.fsync(file.fileno())
-        print ("done."),
-
-if not is_c:
-    file.write(u"#endif /* %s */\n" % (outname.upper() + u"_H_"))
-
-# Ensure file is written to disk.
-# See https://stackoverflow.com/questions/13761961/large-file-not-flushed-to-disk-immediately-after-calling-close
-file.flush()
-os.fsync(file.fileno())
-file.close()
-
-print ("The size of "+args.outfile+" is "+ str(os.path.getsize(args.outfile))+" Bytes.")
diff --git a/ext/open62541/tools/appveyor/build.ps1 b/ext/open62541/tools/appveyor/build.ps1
deleted file mode 100644
index 0ef4a2e..0000000
--- a/ext/open62541/tools/appveyor/build.ps1
+++ /dev/null
@@ -1,130 +0,0 @@
-
-try {
-    cd $env:APPVEYOR_BUILD_FOLDER
-
-    $vcpkg_toolchain = ""
-    $vcpkg_triplet = ""
-
-    if ($env:CC_SHORTNAME -eq "vs2008" -or $env:CC_SHORTNAME -eq "vs2013") {
-        # on VS2008 mbedtls can not be built since it includes stdint.h which is not available there
-        $build_encryption = "OFF"
-        Write-Host -ForegroundColor Green "`n## Building without encryption on VS2008 or VS2013 #####`n"
-    } else {
-        $build_encryption = "ON"
-    }
-
-    $vcpkg_toolchain = '-DCMAKE_TOOLCHAIN_FILE="C:/Tools/vcpkg/scripts/buildsystems/vcpkg.cmake"'
-    $vcpkg_triplet = '-DVCPKG_TARGET_TRIPLET="x86-windows-static"'
-    # since https://github.com/Microsoft/vcpkg/commit/0334365f516c5f229ff4fcf038c7d0190979a38a#diff-464a170117fa96bf98b2f8d224bf503c
-    # vcpkg need to have  "C:\Tools\vcpkg\installed\x86-windows-static"
-    New-Item -Force -ItemType directory -Path "C:\Tools\vcpkg\installed\x86-windows-static"
-
-    $cmake_cnf="$vcpkg_toolchain", "$vcpkg_triplet", "-G`"$env:GENERATOR`"", "-DUA_COMPILE_AS_CXX:BOOL=$env:FORCE_CXX"
-
-    # Collect files for .zip packing
-    New-Item -ItemType directory -Path pack
-    Copy-Item LICENSE pack
-    Copy-Item AUTHORS pack
-    Copy-Item README.md pack
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME with amalgamation #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DUA_BUILD_EXAMPLES:BOOL=OFF  `
-            -DUA_ENABLE_AMALGAMATION:BOOL=ON `
-            -DUA_ENABLE_ENCRYPTION:BOOL=$build_encryption ..
-    & cmake --build . --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-        Write-Host -ForegroundColor Red "`n`n*** Make failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    Remove-Item -Path build -Recurse -Force
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME with full NS0 #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DUA_BUILD_EXAMPLES:BOOL=ON `
-            -DUA_ENABLE_DA:BOOL=ON `
-            -DUA_ENABLE_JSON_ENCODING:BOOL=ON `
-            -DUA_ENABLE_PUBSUB:BOOL=ON `
-            -DUA_ENABLE_PUBSUB_DELTAFRAMES:BOOL=ON `
-            -DUA_ENABLE_PUBSUB_INFORMATIONMODEL:BOOL=ON `
-            -DUA_ENABLE_SUBSCRIPTIONS_EVENTS:BOOL=ON `
-            -DUA_NAMESPACE_ZERO:STRING=FULL ..
-    & cmake --build . --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-        Write-Host -ForegroundColor Red "`n`n*** Make failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    Remove-Item -Path build -Recurse -Force
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME without amalgamation #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DBUILD_SHARED_LIBS:BOOL=OFF `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DCMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER-$env:CC_SHORTNAME-static" `
-            -DUA_BUILD_EXAMPLES:BOOL=ON `
-            -DUA_ENABLE_AMALGAMATION:BOOL=OFF ..
-    & cmake --build . --target install --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Make install failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    & 7z a -tzip open62541-$env:CC_SHORTNAME-static.zip "$env:APPVEYOR_BUILD_FOLDER\pack\*" "$env:APPVEYOR_BUILD_FOLDER-$env:CC_SHORTNAME-static\*"
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Zipping failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    Remove-Item -Path build -Recurse -Force
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME (.dll) #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DBUILD_SHARED_LIBS:BOOL=ON `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DCMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER-$env:CC_SHORTNAME-dynamic" `
-            -DUA_BUILD_EXAMPLES:BOOL=ON `
-            -DUA_ENABLE_AMALGAMATION:BOOL=OFF ..
-    & cmake --build . --target install --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Make install failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    & 7z a -tzip open62541-$env:CC_SHORTNAME-dynamic.zip "$env:APPVEYOR_BUILD_FOLDER\pack\*" "$env:APPVEYOR_BUILD_FOLDER-$env:CC_SHORTNAME-static\*"
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Zipping failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    Remove-Item -Path build -Recurse -Force
-
-    # # do not cache log
-    # Remove-Item -Path c:\miktex\texmfs\data\miktex\log -Recurse -Force
-
-} catch {
-    # Print a detailed error message
-    $FullException = ($_.Exception|format-list -force) | Out-String
-    Write-Host -ForegroundColor Red "`n------------------ Exception ------------------`n$FullException`n"
-    [Console]::Out.Flush()
-    # Wait a bit to make sure appveyor shows the error message
-    Start-Sleep 10
-    throw
-}
diff --git a/ext/open62541/tools/appveyor/install.ps1 b/ext/open62541/tools/appveyor/install.ps1
deleted file mode 100644
index 4c5e1b0..0000000
--- a/ext/open62541/tools/appveyor/install.ps1
+++ /dev/null
@@ -1,23 +0,0 @@
-$ErrorActionPreference = "Stop"
-
-try {
-    & git submodule sync
-    & git submodule --quiet update --init --recursive
-
-    Write-Host -ForegroundColor Green "`n### Installing sphinx ###`n"
-    & cinst sphinx --source python
-
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-        Write-Host -ForegroundColor Red "`n`n*** Installing dependencies failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-
-} catch {
-    # Print a detailed error message
-    $FullException = ($_.Exception|format-list -force) | Out-String
-    Write-Host -ForegroundColor Red "`n------------------ Exception ------------------`n$FullException`n"
-    [Console]::Out.Flush()
-    # Wait a bit to make sure appveyor shows the error message
-    Start-Sleep 10
-    throw
-}
diff --git a/ext/open62541/tools/azure-devops/build.ps1 b/ext/open62541/tools/azure-devops/build.ps1
deleted file mode 100644
index 18892c5..0000000
--- a/ext/open62541/tools/azure-devops/build.ps1
+++ /dev/null
@@ -1,183 +0,0 @@
-
-try {
-
-
-    Write-Host -ForegroundColor Green "`n## Build Path $env:Build_Repository_LocalPath #####`n"
-
-    $vcpkg_toolchain = ""
-    $vcpkg_triplet = ""
-
-    if ($env:CC_SHORTNAME -eq "vs2008" -or $env:CC_SHORTNAME -eq "vs2013") {
-        # on VS2008 mbedtls can not be built since it includes stdint.h which is not available there
-        $build_encryption = "OFF"
-        Write-Host -ForegroundColor Green "`n## Building without encryption on VS2008 or VS2013 #####`n"
-    } else {
-        $build_encryption = "ON"
-    }
-
-    if ($env:CC_SHORTNAME -eq "mingw" -or $env:CC_SHORTNAME -eq "clang-mingw") {
-        # Workaround for CMake not wanting sh.exe on PATH for MinGW (necessary for CMake 3.12.2)
-        $env:PATH = ($env:PATH.Split(';') | Where-Object { $_ -ne 'C:\Program Files\Git\bin' }) -join ';'
-        $env:PATH = ($env:PATH.Split(';') | Where-Object { $_ -ne 'C:\Program Files\Git\usr\bin' }) -join ';'
-        # Add mingw to path so that CMake finds e.g. clang
-        $env:PATH = "$env:MSYS2_ROOT\mingw64\bin;$env:PATH"
-        [System.Environment]::SetEnvironmentVariable('Path', $path, 'Machine')
-    }
-
-    if ($env:CC_SHORTNAME -eq "mingw") {
-
-    } elseif ($env:CC_SHORTNAME -eq "clang-mingw") {
-        # Setup clang
-        $env:CC = "clang --target=x86_64-w64-mingw32"
-        $env:CXX = "clang++ --target=x86_64-w64-mingw32"
-        clang --version
-    } else {
-        $vcpkg_toolchain = '-DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake"'
-        $vcpkg_triplet = '-DVCPKG_TARGET_TRIPLET="x86-windows-static"'
-        # since https://github.com/Microsoft/vcpkg/commit/0334365f516c5f229ff4fcf038c7d0190979a38a#diff-464a170117fa96bf98b2f8d224bf503c
-        # vcpkg need to have  "C:\Tools\vcpkg\installed\x86-windows-static"
-        New-Item -Force -ItemType directory -Path "C:/vcpkg/installed/x86-windows-static"
-    }
-
-    $cmake_cnf="$vcpkg_toolchain", "$vcpkg_triplet", "-G`"$env:GENERATOR`"", "-DUA_COMPILE_AS_CXX:BOOL=$env:FORCE_CXX"
-
-    # Collect files for .zip packing
-    New-Item -ItemType directory -Path pack
-    Copy-Item LICENSE pack
-    Copy-Item AUTHORS pack
-    Copy-Item README.md pack
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME with amalgamation #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DUA_BUILD_EXAMPLES:BOOL=OFF  `
-            -DUA_ENABLE_AMALGAMATION:BOOL=ON `
-            -DUA_ENABLE_ENCRYPTION:BOOL=$build_encryption ..
-    & cmake --build . --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-        Write-Host -ForegroundColor Red "`n`n*** Make failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    Remove-Item -Path build -Recurse -Force
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME with full NS0 #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    # Use build type Debug here, to force `-Werror`
-    & cmake $cmake_cnf `
-            -DCMAKE_BUILD_TYPE=Debug `
-            -DUA_BUILD_EXAMPLES:BOOL=ON `
-            -DUA_ENABLE_DA:BOOL=ON `
-            -DUA_ENABLE_JSON_ENCODING:BOOL=ON `
-            -DUA_ENABLE_PUBSUB:BOOL=ON `
-            -DUA_ENABLE_PUBSUB_DELTAFRAMES:BOOL=ON `
-            -DUA_ENABLE_PUBSUB_INFORMATIONMODEL:BOOL=ON `
-            -DUA_ENABLE_SUBSCRIPTIONS_EVENTS:BOOL=ON `
-            -DUA_NAMESPACE_ZERO:STRING=FULL ..
-    & cmake --build . --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-        Write-Host -ForegroundColor Red "`n`n*** Make failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    Remove-Item -Path build -Recurse -Force
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME without amalgamation #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DBUILD_SHARED_LIBS:BOOL=OFF `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DCMAKE_INSTALL_PREFIX="$env:Build_Repository_LocalPath-$env:CC_SHORTNAME-static" `
-            -DUA_BUILD_EXAMPLES:BOOL=ON `
-            -DUA_ENABLE_AMALGAMATION:BOOL=OFF ..
-    & cmake --build . --target install --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Make install failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    & 7z a -tzip "$env:Build_ArtifactStagingDirectory/open62541-$env:CC_SHORTNAME-static.zip" "$env:Build_Repository_LocalPath\pack\*" "$env:Build_Repository_LocalPath-$env:CC_SHORTNAME-static\*"
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Zipping failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    Remove-Item -Path build -Recurse -Force
-
-    Write-Host -ForegroundColor Green "`n###################################################################"
-    Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME (.dll) #####`n"
-    New-Item -ItemType directory -Path "build"
-    cd build
-    & cmake $cmake_cnf `
-            -DBUILD_SHARED_LIBS:BOOL=ON `
-            -DCMAKE_BUILD_TYPE=RelWithDebInfo `
-            -DCMAKE_INSTALL_PREFIX="$env:Build_Repository_LocalPath-$env:CC_SHORTNAME-dynamic" `
-            -DUA_BUILD_EXAMPLES:BOOL=ON `
-            -DUA_ENABLE_AMALGAMATION:BOOL=OFF ..
-    & cmake --build . --target install --config RelWithDebInfo
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Make install failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    cd ..
-    & 7z a -tzip "$env:Build_ArtifactStagingDirectory/open62541-$env:CC_SHORTNAME-dynamic.zip" "$env:Build_Repository_LocalPath\pack\*" "$env:Build_Repository_LocalPath-$env:CC_SHORTNAME-static\*"
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0)
-    {
-        Write-Host -ForegroundColor Red "`n`n*** Zipping failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-    Remove-Item -Path build -Recurse -Force
-
-    # Only execute unit tests on vs2017 to save compilation time
-    if ($env:CC_SHORTNAME -eq "vs2017") {
-        Write-Host -ForegroundColor Green "`n###################################################################"
-        Write-Host -ForegroundColor Green "`n##### Testing $env:CC_NAME with unit tests #####`n"
-        New-Item -ItemType directory -Path "build"
-        cd build
-        & cmake $cmake_cnf `
-                -DBUILD_SHARED_LIBS:BOOL=OFF `
-                -DCMAKE_BUILD_TYPE=Debug `
-                -DUA_BUILD_EXAMPLES=OFF `
-                -DUA_BUILD_UNIT_TESTS=ON `
-                -DUA_ENABLE_DA=ON `
-                -DUA_ENABLE_DISCOVERY=ON `
-                -DUA_ENABLE_DISCOVERY_MULTICAST=ON `
-                -DUA_ENABLE_ENCRYPTION:BOOL=$build_encryption `
-                -DUA_ENABLE_JSON_ENCODING:BOOL=ON `
-                -DUA_ENABLE_PUBSUB:BOOL=ON `
-                -DUA_ENABLE_PUBSUB_DELTAFRAMES:BOOL=ON `
-                -DUA_ENABLE_PUBSUB_INFORMATIONMODEL:BOOL=ON `
-                -DUA_ENABLE_UNIT_TESTS_MEMCHECK=ON ..
-        & cmake --build . --config Debug
-        if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-            Write-Host -ForegroundColor Red "`n`n*** Make failed. Exiting ... ***"
-            exit $LASTEXITCODE
-        }
-        & cmake --build . --target test-verbose --config Debug
-        if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-            Write-Host -ForegroundColor Red "`n`n*** Make failed. Exiting ... ***"
-            exit $LASTEXITCODE
-        }
-    }
-
-    # # do not cache log
-    # Remove-Item -Path c:\miktex\texmfs\data\miktex\log -Recurse -Force
-
-} catch {
-    # Print a detailed error message
-    $FullException = ($_.Exception|format-list -force) | Out-String
-    Write-Host -ForegroundColor Red "`n------------------ Exception ------------------`n$FullException`n"
-    [Console]::Out.Flush()
-    # Wait a bit to make sure appveyor shows the error message
-    Start-Sleep 10
-    throw
-}
diff --git a/ext/open62541/tools/azure-devops/install.ps1 b/ext/open62541/tools/azure-devops/install.ps1
deleted file mode 100644
index 4a252cd..0000000
--- a/ext/open62541/tools/azure-devops/install.ps1
+++ /dev/null
@@ -1,45 +0,0 @@
-$ErrorActionPreference = "Stop"
-
-try {
-
-    Write-Host -ForegroundColor Green "`n### Installing sphinx ###`n"
-    & choco install -y sphinx --no-progress --source python
-
-    if ($env:CC_SHORTNAME -eq "mingw" -or $env:CC_SHORTNAME -eq "clang-mingw") {
-        Write-Host -ForegroundColor Green "`n### Installing msys64 ###`n"
-        & choco install -y msys2 --no-progress --params="/InstallDir:$env:MSYS2_ROOT /NoUpdate /NoPath"
-
-        Write-Host -ForegroundColor Green "`n### Installing mbedtls via PacMan ###`n"
-        # pacman may complain that the directory does not exist, thus create it.
-        # See https://github.com/open62541/open62541/issues/2068
-        & C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
-        & C:\msys64\usr\bin\pacman --noconfirm -S mingw-w64-x86_64-mbedtls
-
-        Write-Host -ForegroundColor Green "`n### Installing clang via PacMan ###`n"
-        & C:\msys64\usr\bin\pacman --noconfirm -S mingw-w64-x86_64-clang mingw-w64-i686-clang
-    } elseif ($env:CC_SHORTNAME -eq "vs2015" -or $env:CC_SHORTNAME -eq "vs2017") {
-        Write-Host -ForegroundColor Green "`n### Installing mbedtls via vcpkg ###`n"
-        & vcpkg install mbedtls:x86-windows-static
-
-        Write-Host -ForegroundColor Green "`n### Installing libcheck via vcpkg ###`n"
-        & vcpkg install check:x86-windows-static
-
-        Write-Host -ForegroundColor Green "`n### Installing DrMemory ###`n"
-        & choco install -y --no-progress drmemory.portable
-        $env:Path = 'C:\Program Files (x86)\Dr. Memory\bin;' + $env:Path        
-    }
-
-    if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) {
-        Write-Host -ForegroundColor Red "`n`n*** Installing dependencies failed. Exiting ... ***"
-        exit $LASTEXITCODE
-    }
-
-} catch {
-    # Print a detailed error message
-    $FullException = ($_.Exception|format-list -force) | Out-String
-    Write-Host -ForegroundColor Red "`n------------------ Exception ------------------`n$FullException`n"
-    [Console]::Out.Flush()
-    # Wait a bit to make sure appveyor shows the error message
-    Start-Sleep 10
-    throw
-}
diff --git a/ext/open62541/tools/c2rst.py b/ext/open62541/tools/c2rst.py
deleted file mode 100644
index b9971e5..0000000
--- a/ext/open62541/tools/c2rst.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env python
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this 
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-import sys
-import re
-
-# Converts a header file to restructured text documentation
-#
-# All text in /** */ comments becomes restructured text. Everything else is
-# included as a code-block with C syntax highlighting.
-#
-# The beginning and end of the header are removed.
-# - Find the first /** */ comment -> start of the documentation
-# - Find the last line beginning with "#ifdef" -> end of the documentation
-
-remove_keyword = [" UA_EXPORT", " UA_FUNC_ATTR_WARN_UNUSED_RESULT",
-                  " UA_FUNC_ATTR_MALLOC", " UA_RESTRICT "]
-
-def clean_comment(line):
-    m = re.search("^\s*(\* |/\*\* )(.*?)( \*/)?$", line)
-    if not m:
-        return "\n"
-    return m.group(2) + "\n"
-
-def clean_line(line):
-    for keyword in remove_keyword:
-        line = line.replace(keyword, "")
-    return line
-
-def comment_start(line):
-    m = re.search("^\s*/\*\*[ \n]", line)
-    if not m:
-        return False
-    return True
-
-def comment_end(line):
-    m = re.search(" \*/$", line)
-    if not m:
-        return False
-    return True
-
-def first_line(c):
-    "Searches for the first comment"
-    for i in range(len(c)):
-        if comment_start(c[i]):
-            return i
-    return -1
-
-def last_line(c):
-    "Searches for the latest ifdef (closing the include guard)"
-    reg = re.compile("^#ifdef")
-    for i in range(len(c)-1,1,-1):
-        if "_UA_END_DECLS" in c[i]:
-            reg = re.compile("^_UA_END_DECLS")
-    last = 1
-    for i in range(len(c)-1,1,-1):
-        m = reg.match(c[i])
-        if m:
-            last = i
-            break
-    # skip empty lines at the end
-    for i in range(last-1,1,-1):
-        if len(c[i].strip()) > 0:
-            return i
-    return len(c)-1
-
-if len(sys.argv) < 2:
-    print("Usage: python c2rst.py input.c/h output.rst")
-    exit(0)
-
-with open(sys.argv[1]) as f:
-    c = f.readlines()
-
-with open(sys.argv[2], 'w') as rst:
-    in_doc = False
-    last = last_line(c)
-    for i in range(first_line(c), last+1):
-        line = c[i]
-        doc_start = False
-        doc_end = False
-        if in_doc:
-            doc_end = comment_end(line)
-            line = clean_comment(line)
-        else:
-            doc_start = comment_start(line)
-            if doc_start:
-                doc_end = comment_end(line)
-                line = clean_comment(line)
-
-        if doc_start:
-            in_doc = True
-
-        if not ((doc_start or doc_end) and line == "\n"):
-            if not in_doc:
-                line = "   " + line
-            rst.write(clean_line(line))
-
-        if doc_end and i < last:
-            rst.write("\n.. code-block:: c\n\n")
-            in_doc = False
diff --git a/ext/open62541/tools/certs/create_self-signed.py b/ext/open62541/tools/certs/create_self-signed.py
deleted file mode 100644
index 3832a8b..0000000
--- a/ext/open62541/tools/certs/create_self-signed.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env python
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Copyright 2019 (c) Kalycito Infotech Private Limited
-#
-
-import netifaces
-import sys
-import os
-import socket
-
-if len(sys.argv) < 2:
-    sys.exit('Usage: %s directory to output certificates' % sys.argv[0])
-
-if not os.path.exists(sys.argv[1]):
-    sys.exit('ERROR: Directory %s was not found!' % sys.argv[1])
-
-keysize = 2048
-
-if len(sys.argv) == 3:
-    keysize = int(sys.argv[2])
-
-certsdir = os.path.dirname(os.path.abspath(__file__))
-print(certsdir)
-
-# Function return TRUE (1) when an IP address is associated with the
-# given interface
-def is_interface_up(interface):
-    addr = netifaces.ifaddresses(interface)
-    return netifaces.AF_INET in addr
-
-# Initialize looping variables
-interfaceNum = 0
-iteratorValue = 0
-
-# Read the number of interfaces available
-numberOfInterfaces = int(format(len(netifaces.interfaces())))
-
-# Traverse through the available network interfaces and store the
-# corresponding IP addresses of the network interface in a variable
-for interfaceNum in range(0, numberOfInterfaces):
-    # Function call which returns whether the given
-    # interface is up or not
-    check = is_interface_up(netifaces.interfaces()[interfaceNum])
-
-    # Check if the interface is up and not the loopback one
-    # If yes set the IP Address for the environmental variables
-    if check != 0 and netifaces.interfaces()[interfaceNum] != 'lo':
-        if iteratorValue == 0:
-            os.environ['IPADDRESS1'] = netifaces.ifaddresses(netifaces.interfaces()[interfaceNum])[netifaces.AF_INET][0]['addr']
-        if iteratorValue == 1:
-            os.environ['IPADDRESS2'] = netifaces.ifaddresses(netifaces.interfaces()[interfaceNum])[netifaces.AF_INET][0]['addr']
-        iteratorValue = iteratorValue + 1
-        if iteratorValue == 2:
-            break
-
-# If there is only one interface available then set the second
-# IP address as loopback IP
-if iteratorValue < 2:
-    os.environ['IPADDRESS2'] = "127.0.0.1"
-
-os.environ['HOSTNAME'] = socket.gethostname()
-openssl_conf = os.path.join(certsdir, "localhost.cnf")
-
-os.chdir(os.path.abspath(sys.argv[1]))
-
-os.system("""openssl req \
-     -config {} \
-     -new \
-     -nodes \
-     -x509 -sha256  \
-     -newkey rsa:{} \
-     -keyout localhost.key -days 365 \
-     -subj "/C=DE/O=open62541/CN=open62541Server@localhost"\
-     -out localhost.crt""".format(openssl_conf, keysize))
-
-os.system("openssl x509 -in localhost.crt -outform der -out server_cert.der")
-os.system("openssl rsa -inform PEM -in localhost.key -outform DER -out server_key.der")
-
-os.remove("localhost.key")
-os.remove("localhost.crt")
-
-print("Certificates generated in " + sys.argv[1])
diff --git a/ext/open62541/tools/certs/localhost.cnf b/ext/open62541/tools/certs/localhost.cnf
deleted file mode 100644
index 89e63cb..0000000
--- a/ext/open62541/tools/certs/localhost.cnf
+++ /dev/null
@@ -1,367 +0,0 @@
-#
-# OpenSSL example configuration file.
-# This is mostly being used for generation of certificate requests.
-#
-
-# This definition stops the following lines choking if HOME isn't
-# defined.
-HOME			= .
-RANDFILE		= $ENV::HOME/.rnd
-
-# Extra OBJECT IDENTIFIER info:
-#oid_file		= $ENV::HOME/.oid
-oid_section		= new_oids
-
-hostname = ${ENV::HOSTNAME}
-ipaddress1 = ${ENV::IPADDRESS1}
-ipaddress2 = ${ENV::IPADDRESS2}
-
-# To use this configuration file with the "-extfile" option of the
-# "openssl x509" utility, name here the section containing the
-# X.509v3 extensions to use:
-# extensions		= 
-# (Alternatively, use a configuration file that has only
-# X.509v3 extensions in its main [= default] section.)
-
-[ new_oids ]
-
-# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
-# Add a simple OID like this:
-# testoid1=1.2.3.4
-# Or use config file substitution like this:
-# testoid2=${testoid1}.5.6
-
-# Policies used by the TSA examples.
-tsa_policy1 = 1.2.3.4.1
-tsa_policy2 = 1.2.3.4.5.6
-tsa_policy3 = 1.2.3.4.5.7
-
-####################################################################
-[ ca ]
-default_ca	= CA_default		# The default ca section
-
-####################################################################
-[ CA_default ]
-
-dir		= ./ca/			# Where everything is kept
-certs		= $dir/certs		# Where the issued certs are kept
-crl_dir		= $dir/crl		# Where the issued crl are kept
-database	= $dir/database.txt	# database index file.
-#unique_subject	= no			# Set to 'no' to allow creation of
-					# several ctificates with same subject.
-new_certs_dir	= $dir/newcerts		# default place for new certs.
-
-certificate	= $dir/ca.crt	 	# The CA certificate
-serial		= $dir/serial 		# The current serial number
-crlnumber	= $dir/crlnumber	# the current crl number
-					# must be commented out to leave a V1 CRL
-crl		= $dir/crl.pem 		# The current CRL
-private_key	= $dir/ca.key 		# The private key
-RANDFILE	= $dir/.rand		# private random number file
-
-x509_extensions	= usr_cert		# The extensions to add to the cert
-
-# Comment out the following two lines for the "traditional"
-# (and highly broken) format.
-name_opt 	= ca_default		# Subject Name options
-cert_opt 	= ca_default		# Certificate field options
-
-# Extension copying option: use with caution.
-# copy_extensions = copy
-
-# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
-# so this is commented out by default to leave a V1 CRL.
-# crlnumber must also be commented out to leave a V1 CRL.
-crl_extensions	= crl_ext
-
-default_days	= 365			# how long to certify for
-default_crl_days= 30			# how long before next CRL
-default_md	= default		# use public key default MD
-preserve	= no			# keep passed DN ordering
-
-# A few difference way of specifying how similar the request should look
-# For type CA, the listed attributes must be the same, and the optional
-# and supplied fields are just that :-)
-policy		= policy_match
-
-# For the CA policy
-[ policy_match ]
-countryName		= match
-stateOrProvinceName	= match
-organizationName	= match
-organizationalUnitName	= optional
-commonName		= supplied
-emailAddress		= optional
-
-# For the 'anything' policy
-# At this point in time, you must list all acceptable 'object'
-# types.
-[ policy_anything ]
-countryName		= optional
-stateOrProvinceName	= optional
-localityName		= optional
-organizationName	= optional
-organizationalUnitName	= optional
-commonName		= supplied
-emailAddress		= optional
-
-####################################################################
-[ req ]
-default_bits		= 2048
-default_keyfile 	= privkey.pem
-distinguished_name	= req_distinguished_name
-attributes		= req_attributes
-x509_extensions	= v3_ca	# The extensions to add to the self signed cert
-
-# Passwords for private keys if not present they will be prompted for
-# input_password = secret
-# output_password = secret
-
-# This sets a mask for permitted string types. There are several options. 
-# default: PrintableString, T61String, BMPString.
-# pkix	 : PrintableString, BMPString (PKIX recommendation before 2004)
-# utf8only: only UTF8Strings (PKIX recommendation after 2004).
-# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
-# MASK:XXXX a literal mask value.
-# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
-string_mask = utf8only
-
-req_extensions = v3_req # The extensions to add to a certificate request
-
-[ req_distinguished_name ]
-countryName			= Country Name (2 letter code)
-countryName_default		= AU
-countryName_min			= 2
-countryName_max			= 2
-
-stateOrProvinceName		= State or Province Name (full name)
-stateOrProvinceName_default	= Some-State
-
-localityName			= Locality Name (eg, city)
-
-0.organizationName		= Organization Name (eg, company)
-0.organizationName_default	= Internet Widgits Pty Ltd
-
-# we can do this but it is not needed normally :-)
-#1.organizationName		= Second Organization Name (eg, company)
-#1.organizationName_default	= World Wide Web Pty Ltd
-
-organizationalUnitName		= Organizational Unit Name (eg, section)
-#organizationalUnitName_default	=
-
-commonName			= Common Name (e.g. server FQDN or YOUR name)
-commonName_max			= 64
-
-emailAddress			= Email Address
-emailAddress_max		= 64
-
-# SET-ex3			= SET extension number 3
-
-[ req_attributes ]
-challengePassword		= A challenge password
-challengePassword_min		= 4
-challengePassword_max		= 20
-
-unstructuredName		= An optional company name
-
-[ usr_cert ]
-
-# These extensions are added when 'ca' signs a request.
-
-# This goes against PKIX guidelines but some CAs do it and some software
-# requires this to avoid interpreting an end user certificate as a CA.
-
-basicConstraints=CA:FALSE
-
-# Here are some examples of the usage of nsCertType. If it is omitted
-# the certificate can be used for anything *except* object signing.
-
-# This is OK for an SSL server.
-# nsCertType			= server
-
-# For an object signing certificate this would be used.
-# nsCertType = objsign
-
-# For normal client use this is typical
-# nsCertType = client, email
-
-# and for everything including object signing:
-# nsCertType = client, email, objsign
-
-# This is typical in keyUsage for a client certificate.
-# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-
-# This will be displayed in Netscape's comment listbox.
-nsComment			= "OpenSSL Generated Certificate"
-
-# PKIX recommendations harmless if included in all certificates.
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid,issuer
-
-# This stuff is for subjectAltName and issuerAltname.
-# Import the email address.
-# subjectAltName=email:copy
-# An alternative to produce certificates that aren't
-# deprecated according to PKIX.
-# subjectAltName=email:move
-
-# Copy subject details
-# issuerAltName=issuer:copy
-
-#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
-#nsBaseUrl
-#nsRevocationUrl
-#nsRenewalUrl
-#nsCaPolicyUrl
-#nsSslServerName
-
-# This is required for TSA certificates.
-extendedKeyUsage = critical,timeStamping
-
-[ v3_req ]
-
-# Extensions to add to a certificate request
-
-basicConstraints = CA:FALSE
-keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-subjectAltName = @alt_names
-
-[ alt_names ]
-DNS.1 = ${hostname}
-DNS.2 = ${hostname}
-IP.1 = ${ipaddress1}
-IP.2 = ${ipaddress2}
-URI.1 = urn:open62541.server.application
-
-[ v3_ca ]
-
-
-# Extensions for a typical CA
-
-
-# PKIX recommendation.
-
-subjectKeyIdentifier=hash
-
-authorityKeyIdentifier=keyid:always,issuer
-
-# This is what PKIX recommends but some broken software chokes on critical
-# extensions.
-#basicConstraints = critical,CA:true
-# So we do this instead.
-basicConstraints = CA:false
-
-# Key usage: this is typical for a CA certificate. However since it will
-# prevent it being used as an test self-signed certificate it is best
-# left out by default.
-# keyUsage = cRLSign, keyCertSign
-
-keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign
-extendedKeyUsage = TLS Web Server Authentication, TLS Web Client Authentication
-
-# Some might want this also
-# nsCertType = sslCA, emailCA
-
-# Include email address in subject alt name: another PKIX recommendation
-# subjectAltName=email:copy
-# Copy issuer details
-# issuerAltName=issuer:copy
-
-# DER hex encoding of an extension: beware experts only!
-# obj=DER:02:03
-# Where 'obj' is a standard or added object
-# You can even override a supported extension:
-# basicConstraints= critical, DER:30:03:01:01:FF
-
-subjectAltName         = @alt_names
-
-[ crl_ext ]
-
-# CRL extensions.
-# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
-
-# issuerAltName=issuer:copy
-authorityKeyIdentifier=keyid:always
-
-[ proxy_cert_ext ]
-# These extensions should be added when creating a proxy certificate
-
-# This goes against PKIX guidelines but some CAs do it and some software
-# requires this to avoid interpreting an end user certificate as a CA.
-
-basicConstraints=CA:FALSE
-
-# Here are some examples of the usage of nsCertType. If it is omitted
-# the certificate can be used for anything *except* object signing.
-
-# This is OK for an SSL server.
-# nsCertType			= server
-
-# For an object signing certificate this would be used.
-# nsCertType = objsign
-
-# For normal client use this is typical
-# nsCertType = client, email
-
-# and for everything including object signing:
-# nsCertType = client, email, objsign
-
-# This is typical in keyUsage for a client certificate.
-# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-
-# This will be displayed in Netscape's comment listbox.
-nsComment			= "OpenSSL Generated Certificate"
-
-# PKIX recommendations harmless if included in all certificates.
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid,issuer
-
-# This stuff is for subjectAltName and issuerAltname.
-# Import the email address.
-# subjectAltName=email:copy
-# An alternative to produce certificates that aren't
-# deprecated according to PKIX.
-# subjectAltName=email:move
-
-# Copy subject details
-# issuerAltName=issuer:copy
-
-#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
-#nsBaseUrl
-#nsRevocationUrl
-#nsRenewalUrl
-#nsCaPolicyUrl
-#nsSslServerName
-
-# This really needs to be in place for it to be a proxy certificate.
-proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
-
-####################################################################
-[ tsa ]
-
-default_tsa = tsa_config1	# the default TSA section
-
-[ tsa_config1 ]
-
-# These are used by the TSA reply generation only.
-dir		= ./demoCA		# TSA root directory
-serial		= $dir/tsaserial	# The current serial number (mandatory)
-crypto_device	= builtin		# OpenSSL engine to use for signing
-signer_cert	= $dir/tsacert.pem 	# The TSA signing certificate
-					# (optional)
-certs		= $dir/cacert.pem	# Certificate chain to include in reply
-					# (optional)
-signer_key	= $dir/private/tsakey.pem # The TSA private key (optional)
-
-default_policy	= tsa_policy1		# Policy if request did not specify it
-					# (optional)
-other_policies	= tsa_policy2, tsa_policy3	# acceptable policies (optional)
-digests		= md5, sha1		# Acceptable message digests (mandatory)
-accuracy	= secs:1, millisecs:500, microsecs:100	# (optional)
-clock_precision_digits  = 0	# number of digits after dot. (optional)
-ordering		= yes	# Is ordering defined for timestamps?
-				# (optional, default: no)
-tsa_name		= yes	# Must the TSA name be included in the reply?
-				# (optional, default: no)
-ess_cert_id_chain	= no	# Must the ESS cert id chain be included?
-				# (optional, default: no)
diff --git a/ext/open62541/tools/clang-format_precommit_hook b/ext/open62541/tools/clang-format_precommit_hook
deleted file mode 100644
index c9110fd..0000000
--- a/ext/open62541/tools/clang-format_precommit_hook
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-#
-# This pre-commit hook checks if any versions of clang-format
-# are installed, and if so, uses the installed version to format
-# the staged changes.
-#
-# To install, copy this script to `.git/hooks/pre-commit`:
-# cd .git/hooks && ln -s ../../tools/clang-format_precommit_hook pre-commit
-# and make sure that `clang-format` is installed on your system
-
-maj_min=1
-maj_max=8
-
-base=clang-format
-format=""
-
-# Redirect output to stderr.
-exec 1>&2
-
- # check if clang-format is installed
-type "$base" >/dev/null 2>&1 && format="$base"
-
-# if not, check all possible versions
-# (i.e. clang-format-<$maj_min-$maj_max>-<0-9>)
-if [ -z "$format" ]
-then
-    for j in `seq $maj_max -1 $maj_min`
-    do
-        for i in `seq 0 9`
-        do
-            type "$base-$j.$i" >/dev/null 2>&1 && format="$base-$j.$i" && break
-        done
-        [ -z "$format" ] || break
-    done
-fi
-
-# no versions of clang-format are installed
-if [ -z "$format" ]
-then
-    echo "$base is not installed. Pre-commit hook will not be executed."
-    exit 0
-fi
-
-if git rev-parse --verify HEAD >/dev/null 2>&1
-then
-	against=HEAD
-else
-	# Initial commit: diff against an empty tree object
-	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
-fi
-
-# do the formatting
-for file in `git diff-index --cached --name-only $against`
-do
-    case "$file" in
-    *.h | *.hpp | *.c | *.cpp )
-            "$format" -i "$file"
-            ;;
-    *)
-            # do nothing with file
-            ;;
-    esac
-done
diff --git a/ext/open62541/tools/cmake/AssignSourceGroup.cmake b/ext/open62541/tools/cmake/AssignSourceGroup.cmake
deleted file mode 100644
index 66da315..0000000
--- a/ext/open62541/tools/cmake/AssignSourceGroup.cmake
+++ /dev/null
@@ -1,12 +0,0 @@
-function(assign_source_group)
-    foreach(_source IN ITEMS ${ARGN})
-        if (IS_ABSOLUTE "${_source}")
-            file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
-        else()
-            set(source_rel "${_source}")
-        endif()
-        get_filename_component(_source_path "${_source_rel}" PATH)
-        string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
-        source_group("${_source_path_msvc}" FILES "${_source}")
-    endforeach()
-endfunction(assign_source_group)
\ No newline at end of file
diff --git a/ext/open62541/tools/cmake/CompilerFlags.cmake b/ext/open62541/tools/cmake/CompilerFlags.cmake
deleted file mode 100644
index 4ef257b..0000000
--- a/ext/open62541/tools/cmake/CompilerFlags.cmake
+++ /dev/null
@@ -1,17 +0,0 @@
-# check if a C compiler flag is possible
-include(CheckCCompilerFlag)
-function(check_cc_flag CC_FLAG)
-    check_c_compiler_flag("${CC_FLAG}" CC_HAS_${CC_FLAG})
-    if(CC_HAS_${CC_FLAG})
-        add_definitions("${CC_FLAG}")
-    endif()
-endfunction()
-
-# check if an untested C compiler flag is possible
-function(check_cc_flag_untested CC_FLAG)
-    check_c_compiler_flag("${CC_FLAG}" CC_HAS_${CC_FLAG})
-    if(CC_HAS_${CC_FLAG})
-        add_definitions("${CC_FLAG}")
-        message(WARNING "Add untested flag: ${CC_FLAG}")
-    endif()
-endfunction()
diff --git a/ext/open62541/tools/cmake/FindCheck.cmake b/ext/open62541/tools/cmake/FindCheck.cmake
deleted file mode 100644
index 34a3be5..0000000
--- a/ext/open62541/tools/cmake/FindCheck.cmake
+++ /dev/null
@@ -1,68 +0,0 @@
-# - Try to find the CHECK libraries
-#  Once done this will define
-#
-#  CHECK_FOUND - system has check
-#  CHECK_INCLUDE_DIR - the check include directory
-#  CHECK_LIBRARIES - check library
-#
-#  This configuration file for finding libcheck is originally from
-#  the opensync project. The originally was downloaded from here:
-#  opensync.org/browser/branches/3rd-party-cmake-modules/modules/FindCheck.cmake
-#
-#  Copyright (c) 2007 Daniel Gollub <dgollub@suse.de>
-#  Copyright (c) 2007 Bjoern Ricks  <b.ricks@fh-osnabrueck.de>
-#
-#  Redistribution and use is allowed according to the terms of the New
-#  BSD license.
-#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-
-
-INCLUDE( FindPkgConfig )
-
-# Take care about check.pc settings
-PKG_SEARCH_MODULE( CHECK check )
-
-# Look for CHECK include dir and libraries
-IF( NOT CHECK_FOUND )
-	IF ( CHECK_INSTALL_DIR )
-		MESSAGE ( STATUS "Using override CHECK_INSTALL_DIR to find check" )
-		SET ( CHECK_INCLUDE_DIR  "${CHECK_INSTALL_DIR}/include" )
-		FIND_LIBRARY( CHECK_LIBRARY NAMES check PATHS "${CHECK_INSTALL_DIR}/lib" )
-        IF (WIN32)
-		    FIND_LIBRARY( COMPAT_LIBRARY NAMES compat PATHS "${CHECK_INSTALL_DIR}/lib" )
-        ENDIF (WIN32)
-	ELSE ( CHECK_INSTALL_DIR )
-		FIND_PATH( CHECK_INCLUDE_DIR check.h )
-		FIND_LIBRARY( CHECK_LIBRARY NAMES check )
-        IF (WIN32)
-		    FIND_LIBRARY( COMPAT_LIBRARY NAMES compat )
-        ENDIF (WIN32)
-	ENDIF ( CHECK_INSTALL_DIR )
-
-    IF (WIN32)
-        SET ( CHECK_LIBRARIES "${CHECK_LIBRARY}" "${COMPAT_LIBRARY}" )
-    ELSE ( WIN32)
-        SET ( CHECK_LIBRARIES "${CHECK_LIBRARY}" )
-    ENDIF (WIN32)
-
-	IF ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES )
-		SET( CHECK_FOUND 1 )
-		IF ( NOT Check_FIND_QUIETLY )
-			MESSAGE ( STATUS "Found CHECK: ${CHECK_LIBRARIES}" )
-		ENDIF ( NOT Check_FIND_QUIETLY )
-	ELSE ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES )
-		IF ( Check_FIND_REQUIRED )
-			MESSAGE( FATAL_ERROR "Could NOT find CHECK" )
-		ELSE ( Check_FIND_REQUIRED )
-			IF ( NOT Check_FIND_QUIETLY )
-				MESSAGE( STATUS "Could NOT find CHECK" )	
-			ENDIF ( NOT Check_FIND_QUIETLY )
-		ENDIF ( Check_FIND_REQUIRED )
-	ENDIF ( CHECK_INCLUDE_DIR AND CHECK_LIBRARIES )
-ENDIF( NOT CHECK_FOUND )
-
-# Hide advanced variables from CMake GUIs
-MARK_AS_ADVANCED( CHECK_INCLUDE_DIR CHECK_LIBRARIES CHECK_LIBRARY)
-IF( WIN32 )
-    MARK_AS_ADVANCED( COMPAT_LIBRARY)
-ENDIF()
diff --git a/ext/open62541/tools/cmake/FindClangTools.cmake b/ext/open62541/tools/cmake/FindClangTools.cmake
deleted file mode 100644
index a6d73d8..0000000
--- a/ext/open62541/tools/cmake/FindClangTools.cmake
+++ /dev/null
@@ -1,33 +0,0 @@
-# Find Clang Tools
-#
-# This module defines
-#  CLANG_TIDY_PROGRAM, The  path to the clang tidy binary
-#  CLANG_TIDY_FOUND, Whether clang tidy was found
-#  CLANG_FORMAT_PROGRAM, The path to the clang format binary
-#  CLANG_FORMAT_FOUND, Whether clang format was found
-
-find_program(CLANG_TIDY_PROGRAM
-  NAMES clang-tidy-3.9 clang-tidy-3.8 clang-tidy-3.7 clang-tidy-3.6 clang-tidy
-  PATHS $ENV{CLANG_TOOLS_PATH} /usr/local/bin /usr/bin
-  NO_DEFAULT_PATH)
-
-mark_as_advanced(CLANG_TIDY_PROGRAM)
-
-if("${CLANG_TIDY_PROGRAM}" STREQUAL "CLANG_TIDY_PROGRAM-NOTFOUND")
-  set(CLANG_TIDY_FOUND 0)
-else()
-  set(CLANG_TIDY_FOUND 1)
-endif()
-
-find_program(CLANG_FORMAT_PROGRAM
-  NAMES clang-format-3.9 clang-format-3.8 clang-format-3.7 clang-format-3.6 clang-format
-  PATHS $ENV{CLANG_TOOLS_PATH} /usr/local/bin /usr/bin
-  NO_DEFAULT_PATH)
-
-mark_as_advanced(CLANG_FORMAT_PROGRAM)
-
-if("${CLANG_FORMAT_PROGRAM}" STREQUAL "CLANG_FORMAT_PROGRAM-NOTFOUND")
-  set(CLANG_FORMAT_FOUND 0)
-else()
-  set(CLANG_FORMAT_FOUND 1)
-endif()
diff --git a/ext/open62541/tools/cmake/FindMbedTLS.cmake b/ext/open62541/tools/cmake/FindMbedTLS.cmake
deleted file mode 100644
index de86c79..0000000
--- a/ext/open62541/tools/cmake/FindMbedTLS.cmake
+++ /dev/null
@@ -1,28 +0,0 @@
-#check environment variable
-if("$ENV{MBEDTLS_FOLDER_INCLUDE}")
-    set(MBEDTLS_FOLDER_INCLUDE "$ENV{MBEDTLS_FOLDER_INCLUDE}")
-endif()
-if("$ENV{MBEDTLS_FOLDER_LIBRARY}")
-    set(MBEDTLS_FOLDER_LIBRARY "$ENV{MBEDTLS_FOLDER_LIBRARY}")
-endif()
-
-find_path(MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h HINTS ${MBEDTLS_FOLDER_INCLUDE})
-
-if(UA_BUILD_OSS_FUZZ)
-    # oss-fuzz requires static linking of libraries
-    set(MBEDTLS_LIBRARY /usr/lib/x86_64-linux-gnu/libmbedtls.a)
-    set(MBEDX509_LIBRARY /usr/lib/x86_64-linux-gnu/libmbedx509.a)
-    set(MBEDCRYPTO_LIBRARY /usr/lib/x86_64-linux-gnu/libmbedcrypto.a)
-else()
-    find_library(MBEDTLS_LIBRARY mbedtls HINTS ${MBEDTLS_FOLDER_LIBRARY})
-    find_library(MBEDX509_LIBRARY mbedx509 HINTS ${MBEDTLS_FOLDER_LIBRARY})
-    find_library(MBEDCRYPTO_LIBRARY mbedcrypto HINTS ${MBEDTLS_FOLDER_LIBRARY})
-endif()
-
-set(MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(MBEDTLS DEFAULT_MSG
-        MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
-
-mark_as_advanced(MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
diff --git a/ext/open62541/tools/cmake/FindSphinx.cmake b/ext/open62541/tools/cmake/FindSphinx.cmake
deleted file mode 100644
index cce3c56..0000000
--- a/ext/open62541/tools/cmake/FindSphinx.cmake
+++ /dev/null
@@ -1,11 +0,0 @@
-find_program(SPHINX_EXECUTABLE NAMES sphinx-build
-  HINTS
-  $ENV{SPHINX_DIR}
-  PATH_SUFFIXES bin
-  DOC "Sphinx documentation generator")
-
-include(FindPackageHandleStandardArgs)
-
-find_package_handle_standard_args(Sphinx DEFAULT_MSG SPHINX_EXECUTABLE)
-
-mark_as_advanced(SPHINX_EXECUTABLE)
\ No newline at end of file
diff --git a/ext/open62541/tools/cmake/FindValgrind.cmake b/ext/open62541/tools/cmake/FindValgrind.cmake
deleted file mode 100644
index 6ca72e3..0000000
--- a/ext/open62541/tools/cmake/FindValgrind.cmake
+++ /dev/null
@@ -1,18 +0,0 @@
-# Find Valgrind.
-#
-# This module defines:
-#  VALGRIND_INCLUDE_DIR, where to find valgrind/memcheck.h, etc.
-#  VALGRIND_PROGRAM, the valgrind executable.
-#  VALGRIND_FOUND, If false, do not try to use valgrind.
-#
-# If you have valgrind installed in a non-standard place, you can define
-# VALGRIND_PREFIX to tell cmake where it is.
-
-find_path(VALGRIND_INCLUDE_DIR memcheck.h
-  /usr/include /usr/include/valgrind /usr/local/include /usr/local/include/valgrind
-  ${VALGRIND_PREFIX}/include ${VALGRIND_PREFIX}/include/valgrind)
-find_program(VALGRIND_PROGRAM NAMES valgrind PATH /usr/bin /usr/local/bin ${VALGRIND_PREFIX}/bin)
-
-find_package_handle_standard_args(VALGRIND DEFAULT_MSG VALGRIND_INCLUDE_DIR VALGRIND_PROGRAM)
-
-mark_as_advanced(VALGRIND_INCLUDE_DIR VALGRIND_PROGRAM)
diff --git a/ext/open62541/tools/cmake/Findlibwebsockets.cmake b/ext/open62541/tools/cmake/Findlibwebsockets.cmake
deleted file mode 100644
index 1dfe115..0000000
--- a/ext/open62541/tools/cmake/Findlibwebsockets.cmake
+++ /dev/null
@@ -1,33 +0,0 @@
-# This module tries to find libWebsockets library and include files
-#
-# LIBWEBSOCKETS_INCLUDE_DIR, path where to find libwebsockets.h
-# LIBWEBSOCKETS_LIBRARY_DIR, path where to find libwebsockets.so
-# LIBWEBSOCKETS_LIBRARIES, the library to link against
-# LIBWEBSOCKETS_FOUND, If false, do not try to use libWebSockets
-#
-# This currently works probably only for Linux
-
-FIND_PATH ( LIBWEBSOCKETS_INCLUDE_DIR libwebsockets.h
-    /usr/local/include
-    /usr/include
-)
-
-FIND_LIBRARY ( LIBWEBSOCKETS_LIBRARIES websockets
-    /usr/local/lib
-    /usr/lib
-)
-
-GET_FILENAME_COMPONENT( LIBWEBSOCKETS_LIBRARY_DIR ${LIBWEBSOCKETS_LIBRARIES} PATH )
-
-SET ( LIBWEBSOCKETS_FOUND "NO" )
-IF ( LIBWEBSOCKETS_INCLUDE_DIR )
-    IF ( LIBWEBSOCKETS_LIBRARIES )
-        SET ( LIBWEBSOCKETS_FOUND "YES" )
-    ENDIF ( LIBWEBSOCKETS_LIBRARIES )
-ENDIF ( LIBWEBSOCKETS_INCLUDE_DIR )
-
-MARK_AS_ADVANCED(
-    LIBWEBSOCKETS_LIBRARY_DIR
-    LIBWEBSOCKETS_INCLUDE_DIR
-    LIBWEBSOCKETS_LIBRARIES
-)
\ No newline at end of file
diff --git a/ext/open62541/tools/cmake/SetGitBasedVersion.cmake b/ext/open62541/tools/cmake/SetGitBasedVersion.cmake
deleted file mode 100644
index 1816568..0000000
--- a/ext/open62541/tools/cmake/SetGitBasedVersion.cmake
+++ /dev/null
@@ -1,85 +0,0 @@
-get_filename_component(VERSION_SRC_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
-set(VERSION_SRC_DIR "${VERSION_SRC_DIR}/..")
-
-find_package(Git)
-
-function(set_open62541_version)
-
-    # Generate a git-describe version string from Git repository tags
-    if(GIT_EXECUTABLE AND NOT DEFINED OPEN62541_VERSION)
-        execute_process(
-            COMMAND ${GIT_EXECUTABLE} describe --tags --dirty --match "v*"
-            WORKING_DIRECTORY "${VERSION_SRC_DIR}"
-            OUTPUT_VARIABLE GIT_DESCRIBE_VERSION
-            RESULT_VARIABLE GIT_DESCRIBE_ERROR_CODE
-            OUTPUT_STRIP_TRAILING_WHITESPACE
-        )
-        if(NOT GIT_DESCRIBE_ERROR_CODE)
-
-            # Example values can be:
-            # v1.2
-            # v1.2.3
-            # v1.2.3-rc1
-            # v1.2.3-rc1-dirty
-            # v1.2.3-5-g4538abcd
-            # v1.2.3-5-g4538abcd-dirty
-
-            set(OPEN62541_VERSION ${GIT_DESCRIBE_VERSION})
-        endif()
-    endif()
-
-    if(OPEN62541_VERSION)
-        STRING(REGEX REPLACE "^(v[0-9\\.]+)(.*)$"
-               "\\1"
-               GIT_VERSION_NUMBERS
-               "${OPEN62541_VERSION}" )
-        STRING(REGEX REPLACE "^v([0-9\\.]+)(.*)$"
-               "\\2"
-               GIT_VERSION_LABEL
-               "${OPEN62541_VERSION}" )
-
-        if("${GIT_VERSION_NUMBERS}" MATCHES "^v([0-9]+)(.*)$")
-            STRING(REGEX REPLACE "^v([0-9]+)\\.?(.*)$"
-                   "\\1"
-                   GIT_VER_MAJOR
-                   "${GIT_VERSION_NUMBERS}" )
-            if("${GIT_VERSION_NUMBERS}" MATCHES "^v([0-9]+)\\.([0-9]+)(.*)$")
-                STRING(REGEX REPLACE "^v([0-9]+)\\.([0-9]+)(.*)$"
-                       "\\2"
-                       GIT_VER_MINOR
-                       "${GIT_VERSION_NUMBERS}" )
-                if("${GIT_VERSION_NUMBERS}" MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)$")
-                    STRING(REGEX REPLACE "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)$"
-                           "\\3"
-                           GIT_VER_PATCH
-                           "${GIT_VERSION_NUMBERS}" )
-                else()
-                    set(GIT_VER_PATCH 0)
-                endif()
-            else()
-                set(GIT_VER_MINOR 0)
-                set(GIT_VER_PATCH 0)
-            endif()
-
-        else()
-            set(GIT_VER_MAJOR 0)
-            set(GIT_VER_MINOR 0)
-            set(GIT_VER_PATCH 0)
-        endif()
-        set(OPEN62541_VER_MAJOR ${GIT_VER_MAJOR} PARENT_SCOPE)
-        set(OPEN62541_VER_MINOR ${GIT_VER_MINOR} PARENT_SCOPE)
-        set(OPEN62541_VER_PATCH ${GIT_VER_PATCH} PARENT_SCOPE)
-        set(OPEN62541_VER_LABEL "${GIT_VERSION_LABEL}" PARENT_SCOPE)
-        set(OPEN62541_VER_COMMIT ${OPEN62541_VERSION} PARENT_SCOPE)
-    else()
-        # Final fallback: Just use a bogus version string that is semantically older
-        # than anything else and spit out a warning to the developer.
-        set(OPEN62541_VERSION "v0.0.0-unknown" PARENT_SCOPE)
-        set(OPEN62541_VER_MAJOR 0 PARENT_SCOPE)
-        set(OPEN62541_VER_MINOR 0 PARENT_SCOPE)
-        set(OPEN62541_VER_PATCH 0 PARENT_SCOPE)
-        set(OPEN62541_VER_LABEL "-unknown" PARENT_SCOPE)
-        set(OPEN62541_VER_COMMIT "undefined" PARENT_SCOPE)
-        message(WARNING "Failed to determine OPEN62541_VERSION from repository tags. Using default version \"${OPEN62541_VERSION}\".")
-    endif()
-endfunction()
diff --git a/ext/open62541/tools/cmake/Toolchain-QNX-6.5.0.cmake b/ext/open62541/tools/cmake/Toolchain-QNX-6.5.0.cmake
deleted file mode 100644
index 6ec0777..0000000
--- a/ext/open62541/tools/cmake/Toolchain-QNX-6.5.0.cmake
+++ /dev/null
@@ -1,85 +0,0 @@
-#
-# (C) Copyright 2009 Johns Hopkins University (JHU), All Rights
-# Reserved.
-#
-# --- begin cisst license - do not edit ---
-# 
-# This software is provided "as is" under an open source license, with
-# no warranty.  The complete license can be found in license.txt and
-# http://www.cisst.org/cisst/license.txt.
-# 
-# --- end cisst license ---
-
-SET(CMAKE_SYSTEM_NAME QNX)
-SET(CMAKE_SYSTEM_VERSION 6.5.0)
-SET(CMAKE_SYSTEM_PROCESSOR x86)
-SET(TOOLCHAIN QNX)
-
-#SET(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
-
-SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")
-SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
-SET(CMAKE_STATIC_LIBRARY_PREFIX "lib")
-SET(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
-
-IF(CMAKE_HOST_WIN32)
-  SET(HOST_EXECUTABLE_SUFFIX ".exe")
-ENDIF(CMAKE_HOST_WIN32)
-
-FIND_PATH(QNX_HOST
-  NAME usr/bin/qcc${HOST_EXECUTABLE_SUFFIX}
-  PATHS $ENV{QNX_HOST} C:/QNX650/host/win32/
-  NO_CMAKE_PATH
-  NO_CMAKE_ENVIRONMENT_PATH
-)
-  
-FIND_PATH(QNX_TARGET
-  NAME usr/include/qnx_errno.h
-  PATHS $ENV{QNX_TARGET} C:/QNX650/target/qnx6/
-  NO_CMAKE_PATH
-  NO_CMAKE_ENVIRONMENT_PATH
-)
-
-IF(CMAKE_HOST_WIN32)
-  FIND_PATH(QNX_CONFIGURATION
-    NAME bin/qnxactivate.exe
-    PATHS $ENV{QNX_CONFIGURATION}
-    "C:/Program Files/QNX Software Systems/qconfig"
-    NO_CMAKE_PATH
-    NO_CMAKE_ENVIRONMENT_PATH
- )
-ENDIF(CMAKE_HOST_WIN32)
-
-SET(ENV{QNX_HOST} ${QNX_HOST})
-SET(ENV{QNX_TARGET} ${QNX_TARGET})
-IF(CMAKE_HOST_WIN32)
-  SET(ENV{QNX_CONFIGURATION} ${QNX_CONFIGURATION})
-  SET(ENV{PATH} "$ENV{PATH};${QNX_HOST}/usr/bin")
-ENDIF(CMAKE_HOST_WIN32)
-
-SET(CMAKE_MAKE_PROGRAM "${QNX_HOST}/usr/bin/make${HOST_EXECUTABLE_SUFFIX}"    CACHE PATH "QNX Make Program")
-SET(CMAKE_SH           "${QNX_HOST}/usr/bin/sh${HOST_EXECUTABLE_SUFFIX}"      CACHE PATH "QNX shell Program")
-SET(CMAKE_AR           "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ar${HOST_EXECUTABLE_SUFFIX}"      CACHE PATH "QNX ar Program")
-SET(CMAKE_RANLIB       "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ranlib${HOST_EXECUTABLE_SUFFIX}"      CACHE PATH "QNX ranlib Program")
-SET(CMAKE_NM           "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-nm${HOST_EXECUTABLE_SUFFIX}"      CACHE PATH "QNX nm Program")
-SET(CMAKE_OBJCOPY      "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objcopy${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objcopy Program")
-SET(CMAKE_OBJDUMP      "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objdump${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objdump Program")
-SET(CMAKE_LINKER       "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ld"     CACHE PATH "QNX Linker Program")
-SET(CMAKE_STRIP        "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-strip${HOST_EXECUTABLE_SUFFIX}"   CACHE PATH "QNX Strip Program")
-
-SET(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-gcc${HOST_EXECUTABLE_SUFFIX})
-SET(CMAKE_C_FLAGS_DEBUG "-g")
-SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
-SET(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
-SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
-
-SET(CMAKE_CXX_COMPILER ${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-c++${HOST_EXECUTABLE_SUFFIX})
-SET(CMAKE_CXX_FLAGS_DEBUG "-g")
-SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
-SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
-SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
-
-SET(CMAKE_FIND_ROOT_PATH ${QNX_TARGET}) 
-SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/ext/open62541/tools/cmake/Toolchain-gcc-m32.cmake b/ext/open62541/tools/cmake/Toolchain-gcc-m32.cmake
deleted file mode 100644
index 4062090..0000000
--- a/ext/open62541/tools/cmake/Toolchain-gcc-m32.cmake
+++ /dev/null
@@ -1,6 +0,0 @@
-# the name of the target operating system
-set(CMAKE_SYSTEM_NAME Linux)
-
-# which compilers to use for C and C++
-set(CMAKE_C_COMPILER gcc -m32)
-set(CMAKE_CXX_COMPILER g++ -m32)
diff --git a/ext/open62541/tools/cmake/Toolchain-mingw32.cmake b/ext/open62541/tools/cmake/Toolchain-mingw32.cmake
deleted file mode 100644
index ba500f1..0000000
--- a/ext/open62541/tools/cmake/Toolchain-mingw32.cmake
+++ /dev/null
@@ -1,56 +0,0 @@
-# the name of the target operating system
-set(CMAKE_SYSTEM_NAME Windows)
-
-#remove the runtime dependency for libgcc_s_sjlj-1.dll
-set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc")
-
-# Which compilers to use for C and C++, and location of target
-# environment.
-if(EXISTS /usr/i686-w64-mingw32)
-# First look in standard location as used by Debian/Ubuntu/etc.
-set(CMAKE_STRIP i686-w64-mingw32-strip)
-set(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
-set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
-set(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
-set(CMAKE_AR:FILEPATH /usr/bin/i686-w64-mingw32-ar)
-set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)
-elseif(EXISTS /usr/i586-mingw32msvc)
-# First look in standard location as used by Debian/Ubuntu/etc.
-set(CMAKE_STRIP i586-mingw32msvc-strip)
-set(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
-set(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
-set(CMAKE_RC_COMPILER i586-mingw32msvc-windres)
-set(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc)
-elseif(EXISTS /opt/mingw)
-# You can get a MinGW environment using the script at <http://mxe.cc>.
-# It downloads and builds MinGW and most of the dependencies for you.
-# You can use the toolchain file generated by MXE called `mxe-conf.cmake'
-# or you can use this file by adjusting the above and following paths.
-set(CMAKE_STRIP /opt/mingw/usr/bin/i686-pc-mingw32-strip)
-set(CMAKE_C_COMPILER /opt/mingw/usr/bin/i686-pc-mingw32-gcc)
-set(CMAKE_CXX_COMPILER /opt/mingw/usr/bin/i686-pc-mingw32-g++)
-set(CMAKE_RC_COMPILER /opt/mingw/usr/bin/i686-pc-mingw32-windres)
-set(CMAKE_FIND_ROOT_PATH /opt/mingw/usr/i686-pc-mingw32)
-else()
-# Else fill in local path which the user will likely adjust.
-# This is the location assumed by <http://www.libsdl.org/extras/win32/cross/>
-set(CMAKE_STRIP /usr/local/cross-tools/bin/i386-mingw32-strip)
-set(CMAKE_C_COMPILER /usr/local/cross-tools/bin/i386-mingw32-gcc)
-set(CMAKE_CXX_COMPILER /usr/local/cross-tools/bin/i386-mingw32-g++)
-set(CMAKE_RC_COMPILER /usr/local/cross-tools/bin/i386-mingw32-windres)
-set(CMAKE_FIND_ROOT_PATH /usr/local/cross-tools)
-endif() 
-
-# Adjust the default behaviour of the FIND_XXX() commands:
-# search headers and libraries in the target environment, search
-# programs in the host environment
-set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
-# Tell pkg-config not to look at the target environment's .pc files.
-# Setting PKG_CONFIG_LIBDIR sets the default search directory, but we have to
-# set PKG_CONFIG_PATH as well to prevent pkg-config falling back to the host's
-# path.
-set(ENV{PKG_CONFIG_LIBDIR} ${CMAKE_FIND_ROOT_PATH}/lib/pkgconfig)
-set(ENV{PKG_CONFIG_PATH} ${CMAKE_FIND_ROOT_PATH}/lib/pkgconfig)
-set(ENV{MINGDIR} ${CMAKE_FIND_ROOT_PATH}) 
diff --git a/ext/open62541/tools/cmake/Toolchain-mingw64.cmake b/ext/open62541/tools/cmake/Toolchain-mingw64.cmake
deleted file mode 100644
index 6dee6b4..0000000
--- a/ext/open62541/tools/cmake/Toolchain-mingw64.cmake
+++ /dev/null
@@ -1,38 +0,0 @@
-# the name of the target operating system
-set(CMAKE_SYSTEM_NAME Windows)
-
-#remove the runtime dependency for libgcc_s_sjlj-1.dll
-set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc")
-
-# Which compilers to use for C and C++, and location of target
-# environment.
-if(EXISTS /usr/x86_64-w64-mingw32)
-# First look in standard location as used by Debian/Ubuntu/etc.
-set(CMAKE_STRIP x86_64-w64-mingw32-strip)
-set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
-set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
-set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
-set(CMAKE_AR:FILEPATH /usr/bin/x86_64-w64-mingw32-ar)
-set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
-elseif(EXISTS /usr/i586-mingw32msvc)
-# Else fill in local path which the user will likely adjust.
-set(CMAKE_STRIP /usr/local/cross-tools/bin/i386-mingw32-strip)
-set(CMAKE_C_COMPILER /usr/local/cross-tools/bin/i386-mingw32-gcc)
-set(CMAKE_CXX_COMPILER /usr/local/cross-tools/bin/i386-mingw32-g++)
-set(CMAKE_RC_COMPILER /usr/local/cross-tools/bin/i386-mingw32-windres)
-set(CMAKE_FIND_ROOT_PATH /usr/local/cross-tools)
-endif() 
-
-# Adjust the default behaviour of the FIND_XXX() commands:
-# search headers and libraries in the target environment, search
-# programs in the host environment
-set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
-# Tell pkg-config not to look at the target environment's .pc files.
-# Setting PKG_CONFIG_LIBDIR sets the default search directory, but we have to
-# set PKG_CONFIG_PATH as well to prevent pkg-config falling back to the host's
-# path.
-set(ENV{PKG_CONFIG_LIBDIR} ${CMAKE_FIND_ROOT_PATH}/lib/pkgconfig)
-set(ENV{PKG_CONFIG_PATH} ${CMAKE_FIND_ROOT_PATH}/lib/pkgconfig)
-set(ENV{MINGDIR} ${CMAKE_FIND_ROOT_PATH}) 
diff --git a/ext/open62541/tools/cmake/Toolchain-rpi.cmake b/ext/open62541/tools/cmake/Toolchain-rpi.cmake
deleted file mode 100644
index 5fc197d..0000000
--- a/ext/open62541/tools/cmake/Toolchain-rpi.cmake
+++ /dev/null
@@ -1,12 +0,0 @@
-# -- How to cross compile for Raspberry Pi (on a 32bit host) -- 
-# 1) get the toolchain
-# cd ~
-# git clone https://github.com/raspberrypi/tools
-# 2) export path to one of the compilers
-# export PATH=$PATH:~/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/
-# 3) use this toolchain file 
-# cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-rpi.cmake -DEXAMPLESERVER=ON ..
-# make
-set(CMAKE_C_COMPILER arm-bcm2708hardfp-linux-gnueabi-gcc)
-set(CMAKE_CXX_COMPILER arm-bcm2708hardfp-linux-gnueabi-g++)
-set(CMAKE_STRIP arm-bcm2708hardfp-linux-gnueabi-strip)
diff --git a/ext/open62541/tools/cmake/Toolchain-rpi64.cmake b/ext/open62541/tools/cmake/Toolchain-rpi64.cmake
deleted file mode 100644
index ce9381d..0000000
--- a/ext/open62541/tools/cmake/Toolchain-rpi64.cmake
+++ /dev/null
@@ -1,12 +0,0 @@
-# -- How to cross compile for Raspberry Pi (on a 64bit host) -- 
-# 1) get the toolchain
-# cd ~
-# git clone https://github.com/raspberrypi/tools
-# 2) export path to one of the compilers
-# export PATH=$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/
-# 3) use this toolchain file 
-# cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-rpi64.cmake -DEXAMPLESERVER=ON ..
-# make
-set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
-set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
-set(CMAKE_STRIP arm-linux-gnueabihf-strip)
diff --git a/ext/open62541/tools/cmake/linting_build.cmake b/ext/open62541/tools/cmake/linting_build.cmake
deleted file mode 100644
index 1865544..0000000
--- a/ext/open62541/tools/cmake/linting_build.cmake
+++ /dev/null
@@ -1,33 +0,0 @@
-if(UA_ENABLE_STATIC_ANALYZER STREQUAL MINIMAL OR UA_ENABLE_STATIC_ANALYZER STREQUAL REDUCED OR UA_ENABLE_STATIC_ANALYZER STREQUAL FULL)
-    # cpplint just gives warnings about coding style
-    find_program(CPPLINT_EXE NAMES "cpplint")
-    if(CPPLINT_EXE)
-        set(CMAKE_C_CPPLINT "${CPPLINT_EXE};--quiet")
-        set(CMAKE_CXX_CPPLINT "${CPPLINT_EXE};--quiet")
-    endif()
-endif()
-if(UA_ENABLE_STATIC_ANALYZER STREQUAL REDUCED OR UA_ENABLE_STATIC_ANALYZER STREQUAL FULL)
-    # clang-tidy has certain warnings as errors
-    find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
-    if(CLANG_TIDY_EXE)
-        set(CMAKE_C_CLANG_TIDY "${CLANG_TIDY_EXE};-p=compile_commands.json")
-        set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-p=compile_commands.json")
-    endif()
-elseif(UA_ENABLE_STATIC_ANALYZER STREQUAL FULL)
-    # cppcheck provides just warnings but checks "all" (for now) - huge CPU impact
-    find_program(CPPCHECK_EXE NAMES "cppcheck")
-    if(CPPCHECK_EXE)
-        set(CMAKE_C_CPPCHECK "${CPPCHECK_EXE};--project=compile_commands.json;--enable=all;--inconclusive;--inline-suppr;\
---suppressions-list=${PROJECT_SOURCE_DIR}/cppcheck-suppressions.txt;-D__GNUC__;-i ${PROJECT_SOURCE_DIR}/build")
-        set(CMAKE_CXX_CPPCHECK "${CPPCHECK_EXE};--project=compile_commands.json;--enable=all;--inconclusive;--inline-suppr;\
---suppressions-list=${PROJECT_SOURCE_DIR}/cppcheck-suppressions.txt;-D__GNUC__;-i ${PROJECT_SOURCE_DIR}/build")
-    endif()
-
-    # "include what you use" requires additional configuration - ignore for now
-    find_program(IWYU_EXE NAMES "iwyu")
-    if(IWYU_EXE)
-        #set(CMAKE_C_INCLUDE_WHAT_YOU_USE "${IWYU_EXE}")
-        #set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "${IWYU_EXE}")
-    endif()
-endif()
-
diff --git a/ext/open62541/tools/cmake/linting_target.cmake b/ext/open62541/tools/cmake/linting_target.cmake
deleted file mode 100644
index 202ac52..0000000
--- a/ext/open62541/tools/cmake/linting_target.cmake
+++ /dev/null
@@ -1,48 +0,0 @@
-find_package(ClangTools)
-# clang-tidy uses the compile_commands.json file for include dirs and other config
-add_custom_target(clang-tidy ${CLANG_TIDY_PROGRAM}
-                  -p=compile_commands.json
-                  -format-style=file
-                  --
-                  ${lib_sources}
-                  DEPENDS ${lib_sources}
-                  COMMENT "Run clang-tidy on the library")
-add_dependencies(clang-tidy open62541)
-set_target_properties(clang-tidy PROPERTIES FOLDER "CodeAnalysis")
-
-add_custom_target(cpplint cpplint
-                  ${lib_sources}
-                  ${internal_headers}
-                  ${default_plugin_headers}
-                  ${default_plugin_sources}
-                  ${ua_architecture_headers}
-                  ${ua_architecture_sources}
-                  DEPENDS ${lib_sources}
-                          ${internal_headers}
-                          ${default_plugin_headers}
-                          ${default_plugin_sources}
-                          ${ua_architecture_headers}
-                          ${ua_architecture_sources}
-                  COMMENT "Run cpplint code style checker on the library")
-set_target_properties(cpplint PROPERTIES FOLDER "CodeAnalysis")
-
-
-# adds new target "clang-format" to enforce clang-format rules
-find_program(CLANG_FORMAT_EXE NAMES "clang-format")
-if(CLANG_FORMAT_EXE)
-    file(GLOB_RECURSE FILES_TO_FORMAT
-         ${PROJECT_SOURCE_DIR}/arch/*.c
-         ${PROJECT_SOURCE_DIR}/plugins/*.c
-         ${PROJECT_SOURCE_DIR}/src/*.c
-         ${PROJECT_SOURCE_DIR}/arch/*.h
-         ${PROJECT_SOURCE_DIR}/include/*.h
-         ${PROJECT_SOURCE_DIR}/plugins/*.h
-         ${PROJECT_SOURCE_DIR}/src/*.h
-         )
-    add_custom_target(
-        clang-format COMMAND ${CLANG_FORMAT_EXE}
-        -style=file
-        -i
-        ${FILES_TO_FORMAT}
-    )
-endif()
diff --git a/ext/open62541/tools/cmake/macros_internal.cmake b/ext/open62541/tools/cmake/macros_internal.cmake
deleted file mode 100644
index aa8d024..0000000
--- a/ext/open62541/tools/cmake/macros_internal.cmake
+++ /dev/null
@@ -1,55 +0,0 @@
-#Add a new architecture to to the lists of available architectures
-FUNCTION(ua_add_architecture)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURES ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_add_architecture)
-
-#Include folders to the compilation
-FUNCTION(ua_include_directories)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_INCLUDE_DIRECTORIES ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_include_directories)
-
-#Add a new header file to the architecture group
-FUNCTION(ua_add_architecture_header)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURE_HEADERS ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_add_architecture_header)
-
-#Add a new header file to the architecture group at the beginning of it
-FUNCTION(ua_add_architecture_header_beginning)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURE_HEADERS_BEGINNING ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_add_architecture_header_beginning)
-
-#Add a new source file to the architecture group
-FUNCTION(ua_add_architecture_file)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURE_SOURCES ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_add_architecture_file)
-
-#Add definitions to the compilations that are exclusive for the selected architecture
-FUNCTION(ua_architecture_add_definitions)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURE_ADD_DEFINITIONS ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_architecture_add_definitions)
-
-#Remove definitions from the compilations that are exclusive for the selected architecture
-FUNCTION(ua_architecture_remove_definitions)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURE_REMOVE_DEFINITIONS ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_architecture_remove_definitions)
-
-#Add libraries to be linked to the comnpilation that are exclusive for the selected architecture
-FUNCTION(ua_architecture_append_to_library)
-    FOREACH(ARG ${ARGV})
-        set_property(GLOBAL APPEND PROPERTY UA_ARCHITECTURE_APPEND_TO_LIBRARY ${ARG})
-    ENDFOREACH(ARG)
-ENDFUNCTION(ua_architecture_append_to_library)
diff --git a/ext/open62541/tools/cmake/macros_public.cmake b/ext/open62541/tools/cmake/macros_public.cmake
deleted file mode 100644
index a6a36f3..0000000
--- a/ext/open62541/tools/cmake/macros_public.cmake
+++ /dev/null
@@ -1,541 +0,0 @@
-
-# --------------- Generate NodeIDs header ---------------------
-#
-# Generates header file from .csv which contains defines for every
-# node id to be used instead of numeric node ids.
-#
-# The resulting files will be put into OUTPUT_DIR with the names:
-# - NAME.h
-#
-#
-# The following arguments are accepted:
-#   Options:
-#
-#   Arguments taking one value:
-#
-#   NAME            Full name of the generated files, e.g. di_nodeids
-#   TARGET_SUFFIX   Suffix for the resulting target. e.g. ids-di
-#   [TARGET_PREFIX] Optional prefix for the resulting target. Default `open62541-generator`
-#   ID_PREFIX       Prefix for the generated node ID defines, e.g. NS_DI
-#   [OUTPUT_DIR]    Optional target directory for the generated files. Default is '${PROJECT_BINARY_DIR}/src_generated'
-#   FILE_CSV        Path to the .csv file containing the node ids, e.g. 'OpcUaDiModel.csv'
-#
-function(ua_generate_nodeid_header)
-    set(options )
-    set(oneValueArgs NAME ID_PREFIX OUTPUT_DIR FILE_CSV TARGET_SUFFIX TARGET_PREFIX)
-    set(multiValueArgs )
-    cmake_parse_arguments(UA_GEN_ID "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
-    if(NOT UA_GEN_ID_TARGET_SUFFIX OR "${UA_GEN_ID_TARGET_SUFFIX}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_nodeid_header function requires a value for the TARGET_SUFFIX argument")
-    endif()
-
-    # Set default value for output dir
-    if(NOT UA_GEN_ID_OUTPUT_DIR OR "${UA_GEN_ID_OUTPUT_DIR}" STREQUAL "")
-        set(UA_GEN_ID_OUTPUT_DIR ${PROJECT_BINARY_DIR}/src_generated/open62541)
-    endif()
-    # Set default target prefix
-    if(NOT UA_GEN_ID_TARGET_PREFIX OR "${UA_GEN_ID_TARGET_PREFIX}" STREQUAL "")
-        set(UA_GEN_ID_TARGET_PREFIX "open62541-generator")
-    endif()
-
-    # Replace dash with underscore to make valid c literal
-    string(REPLACE "-" "_" UA_GEN_ID_NAME ${UA_GEN_ID_NAME})
-
-    add_custom_target(${UA_GEN_ID_TARGET_PREFIX}-${UA_GEN_ID_TARGET_SUFFIX} DEPENDS
-        ${UA_GEN_ID_OUTPUT_DIR}/${UA_GEN_ID_NAME}.h
-    )
-
-    # Make sure that the output directory exists
-    if(NOT EXISTS ${UA_GEN_ID_OUTPUT_DIR})
-        file(MAKE_DIRECTORY ${UA_GEN_ID_OUTPUT_DIR})
-    endif()
-
-    # Header containing defines for all NodeIds
-    add_custom_command(OUTPUT ${UA_GEN_ID_OUTPUT_DIR}/${UA_GEN_ID_NAME}.h
-        PRE_BUILD
-        COMMAND ${PYTHON_EXECUTABLE} ${open62541_TOOLS_DIR}/generate_nodeid_header.py
-        ${UA_GEN_ID_FILE_CSV}  ${UA_GEN_ID_OUTPUT_DIR}/${UA_GEN_ID_NAME} ${UA_GEN_ID_ID_PREFIX}
-        DEPENDS ${open62541_TOOLS_DIR}/generate_nodeid_header.py
-        ${UA_GEN_ID_FILE_CSV})
-endfunction()
-
-
-# --------------- Generate Datatypes ---------------------
-#
-# Generates Datatype definition based on the .csv and .bsd files of a nodeset.
-# The result of the generation will be C Code which can be compiled with the rest of the stack.
-# Some nodesets come with custom datatypes. These datatype structures first need to be
-# generated so that the nodeset can use these types.
-#
-# The resulting files will be put into OUTPUT_DIR with the names:
-# - NAME_generated.c
-# - NAME_generated.h
-# - NAME_generated_encoding_binary.h
-# - NAME_generated_handling.h
-#
-# The cmake resulting cmake target will be named like this:
-#   open62541-generator-${TARGET_SUFFIX}
-#
-# The following arguments are accepted:
-#   Options:
-#
-#   [BUILTIN]       Optional argument. If given, then builtin types will be generated.
-#   [INTERNAL]      Optional argument. If given, then the given types file is seen as internal file (e.g. does not require a .csv)
-#
-#   Arguments taking one value:
-#
-#   NAME            Full name of the generated files, e.g. ua_types_di
-#   TARGET_SUFFIX   Suffix for the resulting target. e.g. types-di
-#   [TARGET_PREFIX] Optional prefix for the resulting target. Default `open62541-generator`
-#   NAMESPACE_IDX   Namespace index of the nodeset, when it is loaded into the server. This index
-#                   is used for the node ids withing the types array and is currently not determined automatically.
-#                   Make sure that it matches the namespace index in the server.
-#   [OUTPUT_DIR]    Optional target directory for the generated files. Default is '${PROJECT_BINARY_DIR}/src_generated'
-#   FILE_CSV        Path to the .csv file containing the node ids, e.g. 'OpcUaDiModel.csv'
-#
-#   Arguments taking multiple values:
-#
-#   FILES_BSD        Path to the .bsd file containing the type definitions, e.g. 'Opc.Ua.Di.Types.bsd'. Multiple files can be
-#                   passed which will all combined to one resulting code.
-#   IMPORT_BSD      Combination of types array and path to the .bsd file containing additional type definitions referenced by
-#                   the FILES_BSD files. The value is separated with a hash sign, i.e.
-#                   'UA_TYPES#${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.Types.bsd'
-#                   Multiple files can be passed which will all be imported.
-#   [FILES_SELECTED] Optional path to a simple text file which contains a list of types which should be included in the generation.
-#                   The file should contain one type per line. Multiple files can be passed to this argument.
-#
-#
-function(ua_generate_datatypes)
-    set(options BUILTIN INTERNAL)
-    set(oneValueArgs NAME TARGET_SUFFIX TARGET_PREFIX NAMESPACE_IDX OUTPUT_DIR FILE_CSV)
-    set(multiValueArgs FILES_BSD IMPORT_BSD FILES_SELECTED)
-    cmake_parse_arguments(UA_GEN_DT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
-    if(NOT DEFINED open62541_TOOLS_DIR)
-        message(FATAL_ERROR "open62541_TOOLS_DIR must point to the open62541 tools directory")
-    endif()
-
-    # ------ Argument checking -----
-    if(NOT DEFINED UA_GEN_DT_NAMESPACE_IDX AND NOT "${UA_GEN_DT_NAMESPACE_IDX}" STREQUAL "0")
-        message(FATAL_ERROR "ua_generate_datatype function requires a value for the NAMESPACE_IDX argument")
-    endif()
-    if(NOT UA_GEN_DT_NAME OR "${UA_GEN_DT_NAME}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_datatype function requires a value for the NAME argument")
-    endif()
-    if(NOT UA_GEN_DT_TARGET_SUFFIX OR "${UA_GEN_DT_TARGET_SUFFIX}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_datatype function requires a value for the TARGET_SUFFIX argument")
-    endif()
-    if(NOT UA_GEN_DT_FILE_CSV OR "${UA_GEN_DT_FILE_CSV}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_datatype function requires a value for the FILE_CSV argument")
-    endif()
-    if(NOT UA_GEN_DT_FILES_BSD OR "${UA_GEN_DT_FILES_BSD}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_datatype function requires a value for the FILES_BSD argument")
-    endif()
-
-    # Set default value for output dir
-    if(NOT UA_GEN_DT_OUTPUT_DIR OR "${UA_GEN_DT_OUTPUT_DIR}" STREQUAL "")
-        set(UA_GEN_DT_OUTPUT_DIR ${PROJECT_BINARY_DIR}/src_generated/open62541)
-    endif()
-    # Set default target prefix
-    if(NOT UA_GEN_DT_TARGET_PREFIX OR "${UA_GEN_DT_TARGET_PREFIX}" STREQUAL "")
-        set(UA_GEN_DT_TARGET_PREFIX "open62541-generator")
-    endif()
-
-    # ------ Add custom command and target -----
-
-    set(UA_GEN_DT_NO_BUILTIN "--no-builtin")
-    if (UA_GEN_DT_BUILTIN)
-        set(UA_GEN_DT_NO_BUILTIN "")
-    endif()
-
-    set(UA_GEN_DT_INTERNAL_ARG "")
-    if (UA_GEN_DT_INTERNAL)
-        set(UA_GEN_DT_INTERNAL_ARG "--internal")
-    endif()
-
-    set(SELECTED_TYPES_TMP "")
-    foreach(f ${UA_GEN_DT_FILES_SELECTED})
-        set(SELECTED_TYPES_TMP ${SELECTED_TYPES_TMP} "--selected-types=${f}")
-    endforeach()
-
-    set(BSD_FILES_TMP "")
-    foreach(f ${UA_GEN_DT_FILES_BSD})
-        set(BSD_FILES_TMP ${BSD_FILES_TMP} "--type-bsd=${f}")
-    endforeach()
-
-    set(IMPORT_BSD_TMP "")
-    foreach(f ${UA_GEN_DT_IMPORT_BSD})
-        set(IMPORT_BSD_TMP ${IMPORT_BSD_TMP} "--import=${f}")
-    endforeach()
-
-    # Make sure that the output directory exists
-    if(NOT EXISTS ${UA_GEN_DT_OUTPUT_DIR})
-        file(MAKE_DIRECTORY ${UA_GEN_DT_OUTPUT_DIR})
-    endif()
-
-    # Replace dash with underscore to make valid c literal
-    string(REPLACE "-" "_" UA_GEN_DT_NAME ${UA_GEN_DT_NAME})
-
-    add_custom_command(OUTPUT ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.c
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.h
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_handling.h
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_encoding_binary.h
-        PRE_BUILD
-        COMMAND ${PYTHON_EXECUTABLE} ${open62541_TOOLS_DIR}/generate_datatypes.py
-        --namespace=${UA_GEN_DT_NAMESPACE_IDX}
-        ${SELECTED_TYPES_TMP}
-        ${BSD_FILES_TMP}
-        ${IMPORT_BSD_TMP}
-        --type-csv=${UA_GEN_DT_FILE_CSV}
-        ${UA_GEN_DT_NO_BUILTIN}
-        ${UA_GEN_DT_INTERNAL_ARG}
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}
-        DEPENDS ${open62541_TOOLS_DIR}/generate_datatypes.py
-        ${UA_GEN_DT_FILES_BSD}
-        ${UA_GEN_DT_FILE_CSV}
-        ${UA_GEN_DT_FILES_SELECTED})
-    add_custom_target(${UA_GEN_DT_TARGET_PREFIX}-${UA_GEN_DT_TARGET_SUFFIX} DEPENDS
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.c
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.h
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_handling.h
-        ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_encoding_binary.h
-        )
-
-    string(TOUPPER "${UA_GEN_DT_NAME}" GEN_NAME_UPPER)
-    set(UA_${GEN_NAME_UPPER}_SOURCES "${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.c" CACHE INTERNAL "${UA_GEN_DT_NAME} source files")
-    set(UA_${GEN_NAME_UPPER}_HEADERS "${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.h;${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_handling.h;${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_encoding_binary.h"
-        CACHE INTERNAL "${UA_GEN_DT_NAME} header files")
-
-    if(UA_COMPILE_AS_CXX)
-        set_source_files_properties(${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.c PROPERTIES LANGUAGE CXX)
-    endif()
-endfunction()
-
-
-# --------------- Generate Nodeset ---------------------
-#
-# Generates C code for the given NodeSet2.xml file.
-# This C code can be used to initialize the server.
-#
-# The resulting files will be put into OUTPUT_DIR with the names:
-# - ua_namespace_NAME.c
-# - ua_namespace_NAME.h
-#
-# The resulting cmake target will be named like this:
-#   open62541-generator-ns-${NAME}
-#
-# The following arguments are accepted:
-#   Options:
-#
-#   [INTERNAL]      Optional argument. If given, then the generated node set code will use internal headers.
-#
-#   Arguments taking one value:
-#
-#   NAME            Name of the nodeset, e.g. 'di'
-#   [TYPES_ARRAY]   Optional name of the types array containing the custom datatypes of this node set.
-#   [OUTPUT_DIR]    Optional target directory for the generated files. Default is '${PROJECT_BINARY_DIR}/src_generated'
-#   [IGNORE]        Optional file containing a list of node ids which should be ignored. The file should have one id per line.
-#   [TARGET_PREFIX] Optional prefix for the resulting target. Default `open62541-generator`
-#
-#   Arguments taking multiple values:
-#
-#   FILE            Path to the NodeSet2.xml file. Multiple values can be passed. These nodesets will be combined into one output.
-#   [DEPENDS_TYPES]   Optional list of types array which match with the DEPENDS_NS node sets. e.g. 'UA_TYPES;UA_TYPES_DI'
-#   [DEPENDS_NS]      Optional list of NodeSet2.xml files which are a dependency of this node set.
-#   [DEPENDS_TARGET]  Optional list of CMake targets this nodeset depends on.
-#
-#
-function(ua_generate_nodeset)
-
-    set(options INTERNAL )
-    set(oneValueArgs NAME TYPES_ARRAY OUTPUT_DIR IGNORE TARGET_PREFIX)
-    set(multiValueArgs FILE DEPENDS_TYPES DEPENDS_NS DEPENDS_TARGET)
-    cmake_parse_arguments(UA_GEN_NS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
-
-    if(NOT DEFINED open62541_TOOLS_DIR)
-        message(FATAL_ERROR "open62541_TOOLS_DIR must point to the open62541 tools directory")
-    endif()
-
-    # ------ Argument checking -----
-    if(NOT UA_GEN_NS_NAME OR "${UA_GEN_NS_NAME}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_nodeset function requires a value for the NAME argument")
-    endif()
-
-    if(NOT UA_GEN_NS_FILE OR "${UA_GEN_NS_FILE}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_nodeset function requires a value for the FILE argument")
-    endif()
-
-    # Set default value for output dir
-    if(NOT UA_GEN_NS_OUTPUT_DIR OR "${UA_GEN_NS_OUTPUT_DIR}" STREQUAL "")
-        set(UA_GEN_NS_OUTPUT_DIR ${PROJECT_BINARY_DIR}/src_generated/open62541)
-    endif()
-
-    # Set default target prefix
-    if(NOT UA_GEN_NS_TARGET_PREFIX OR "${UA_GEN_NS_TARGET_PREFIX}" STREQUAL "")
-        set(UA_GEN_NS_TARGET_PREFIX "open62541-generator")
-    endif()
-
-    # ------ Add custom command and target -----
-
-    set(GEN_INTERNAL_HEADERS "")
-    if (UA_GEN_NS_INTERNAL)
-        set(GEN_INTERNAL_HEADERS "--internal-headers")
-    endif()
-
-    set(GEN_NS0 "")
-    set(TARGET_SUFFIX "ns-${UA_GEN_NS_NAME}")
-    set(FILE_SUFFIX "_${UA_GEN_NS_NAME}_generated")
-    string(REPLACE "-" "_" FILE_SUFFIX ${FILE_SUFFIX})
-
-    if ("${UA_GEN_NS_NAME}" STREQUAL "ns0")
-        set(TARGET_SUFFIX "namespace")
-        set(FILE_SUFFIX "0_generated")
-    endif()
-
-    set(GEN_IGNORE "")
-    if (UA_GEN_NS_IGNORE)
-        set(GEN_IGNORE "--ignore=${UA_GEN_NS_IGNORE}")
-    endif()
-
-    set(TYPES_ARRAY_LIST "")
-    foreach(f ${UA_GEN_NS_DEPENDS_TYPES})
-        # Replace dash with underscore to make valid c literal
-        string(REPLACE "-" "_" TYPE_ARRAY ${f})
-
-        set(TYPES_ARRAY_LIST ${TYPES_ARRAY_LIST} "--types-array=${TYPE_ARRAY}")
-    endforeach()
-    if(UA_GEN_NS_TYPES_ARRAY)
-        # Replace dash with underscore to make valid c literal
-        string(REPLACE "-" "_" TYPE_ARRAY ${UA_GEN_NS_TYPES_ARRAY})
-        set(TYPES_ARRAY_LIST ${TYPES_ARRAY_LIST} "--types-array=${TYPE_ARRAY}")
-    endif()
-
-    set(DEPENDS_FILE_LIST "")
-    foreach(f ${UA_GEN_NS_DEPENDS_NS})
-        set(DEPENDS_FILE_LIST ${DEPENDS_FILE_LIST} "--existing=${f}")
-    endforeach()
-    set(FILE_LIST "")
-    foreach(f ${UA_GEN_NS_FILE})
-        set(FILE_LIST ${FILE_LIST} "--xml=${f}")
-    endforeach()
-
-    # Make sure that the output directory exists
-    if(NOT EXISTS ${UA_GEN_NS_OUTPUT_DIR})
-        file(MAKE_DIRECTORY ${UA_GEN_NS_OUTPUT_DIR})
-    endif()
-
-    add_custom_command(OUTPUT ${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.c
-                       ${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.h
-                       PRE_BUILD
-                       COMMAND ${PYTHON_EXECUTABLE} ${open62541_TOOLS_DIR}/nodeset_compiler/nodeset_compiler.py
-                       ${GEN_INTERNAL_HEADERS}
-                       ${GEN_NS0}
-                       ${GEN_BIN_SIZE}
-                       ${GEN_IGNORE}
-                       ${TYPES_ARRAY_LIST}
-                       ${DEPENDS_FILE_LIST}
-                       ${FILE_LIST}
-                       ${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}
-                       DEPENDS
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/nodeset_compiler.py
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/nodes.py
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/nodeset.py
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/datatypes.py
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/backend_open62541.py
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/backend_open62541_nodes.py
-                       ${open62541_TOOLS_DIR}/nodeset_compiler/backend_open62541_datatypes.py
-                       ${UA_GEN_NS_FILE}
-                       ${UA_GEN_NS_DEPENDS_NS}
-                       )
-
-    add_custom_target(${UA_GEN_NS_TARGET_PREFIX}-${TARGET_SUFFIX}
-                      DEPENDS
-                      ${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.c
-                      ${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.h)
-    if (UA_GEN_NS_DEPENDS_TARGET)
-        add_dependencies(${UA_GEN_NS_TARGET_PREFIX}-${TARGET_SUFFIX} ${UA_GEN_NS_DEPENDS_TARGET})
-    endif()
-
-    if(UA_COMPILE_AS_CXX)
-        set_source_files_properties(${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.c PROPERTIES LANGUAGE CXX)
-    endif()
-
-    string(REPLACE "-" "_" UA_GEN_NS_NAME ${UA_GEN_NS_NAME})
-    string(TOUPPER "${UA_GEN_NS_NAME}" GEN_NAME_UPPER)
-
-    set_property(GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_FILE_${UA_GEN_NS_NAME}" ${UA_GEN_NS_DEPENDS_NS} ${UA_GEN_NS_FILE})
-    set_property(GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_TYPES_${UA_GEN_NS_NAME}" ${UA_GEN_NS_DEPENDS_TYPES} ${UA_GEN_NS_TYPES_ARRAY})
-
-    set(UA_NODESET_${GEN_NAME_UPPER}_SOURCES "${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.c" CACHE INTERNAL "UA_NODESET_${GEN_NAME_UPPER} source files")
-    set(UA_NODESET_${GEN_NAME_UPPER}_HEADERS "${UA_GEN_NS_OUTPUT_DIR}/namespace${FILE_SUFFIX}.h" CACHE INTERNAL "UA_NODESET_${GEN_NAME_UPPER} header files")
-    set(UA_NODESET_${GEN_NAME_UPPER}_TARGET "${UA_GEN_NS_TARGET_PREFIX}-${TARGET_SUFFIX}" CACHE INTERNAL "UA_NODESET_${GEN_NAME_UPPER} target")
-
-endfunction()
-
-
-# --------------- Generate Nodeset and Datatypes ---------------------
-#
-# Generates C code for the given NodeSet2.xml and Datatype file.
-# This C code can be used to initialize the server.
-#
-# This is a combination of the ua_generate_datatypes, ua_generate_nodeset, and
-# ua_generate_nodeid_header macros.
-# This function can also be used to just create a nodeset without datatypes by
-# omitting the CSV, BSD, and NAMESPACE_IDX parameter.
-# If only one of the previous parameters is given, all of them are required.
-#
-# It is possible to define dependencies of nodesets by using the DEPENDS argument.
-# E.g. the PLCOpen nodeset depends on the 'di' nodeset. Thus it is enough to just
-# pass 'DEPENDS di' to the function. The 'di' nodeset then first needs to be generated
-# with this function or with the ua_generate_nodeset function.
-#
-# The resulting cmake target will be named like this:
-#   open62541-generator-ns-${NAME}
-#
-# The following arguments are accepted:
-#
-#   Options:
-#
-#   INTERNAL        Include internal headers. Required if custom datatypes are added.
-#
-#   Arguments taking one value:
-#
-#   NAME            Short name of the nodeset. E.g. 'di'
-#   FILE_NS         Path to the NodeSet2.xml file. Multiple values can be passed. These nodesets will be combined into one output.
-#
-#   [FILE_CSV]      Optional path to the .csv file containing the node ids, e.g. 'OpcUaDiModel.csv'
-#   [FILE_BSD]      Optional path to the .bsd file containing the type definitions, e.g. 'Opc.Ua.Di.Types.bsd'. Multiple files can be
-#                   passed which will all combined to one resulting code.
-#   [NAMESPACE_IDX] Optional namespace index of the nodeset, when it is loaded into the server. This parameter is mandatory if FILE_CSV
-#                   or FILE_BSD is set. See ua_generate_datatypes function.
-#   [TARGET_PREFIX] Optional prefix for the resulting targets. Default `open62541-generator`
-#
-#   Arguments taking multiple values:
-#   [DEPENDS]       Optional list of nodeset names on which this nodeset depends. These names must match any name from a previous
-#                   call to this funtion. E.g. 'di' if you are generating the 'plcopen' nodeset
-#
-#
-function(ua_generate_nodeset_and_datatypes)
-
-    set(options INTERNAL)
-    set(oneValueArgs NAME FILE_NS FILE_CSV FILE_BSD NAMESPACE_IDX OUTPUT_DIR TARGET_PREFIX)
-    set(multiValueArgs DEPENDS)
-    cmake_parse_arguments(UA_GEN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
-    if(NOT DEFINED open62541_TOOLS_DIR)
-        message(FATAL_ERROR "open62541_TOOLS_DIR must point to the open62541 tools directory")
-    endif()
-
-    if(NOT DEFINED open62541_NODESET_DIR)
-        message(FATAL_ERROR "open62541_NODESET_DIR must point to the open62541/deps/ua-nodeset directory")
-    endif()
-
-    # ------ Argument checking -----
-    if(NOT UA_GEN_NAME OR "${UA_GEN_NAME}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires a value for the NAME argument")
-    endif()
-    string(TOUPPER "${UA_GEN_NAME}" GEN_NAME_UPPER)
-
-    if(NOT UA_GEN_FILE_NS OR "${UA_GEN_FILE_NS}" STREQUAL "")
-        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires a value for the FILE_NS argument")
-    endif()
-
-    if((NOT UA_GEN_FILE_CSV OR "${UA_GEN_FILE_CSV}" STREQUAL "") AND
-    (NOT "${UA_GEN_FILE_BSD}" STREQUAL "" OR
-        NOT "${UA_GEN_NAMESPACE_IDX}" STREQUAL ""))
-        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires FILE_CSV argument if any of FILE_BSD or NAMESPACE_IDX are set")
-    endif()
-
-    if((NOT UA_GEN_FILE_BSD OR "${UA_GEN_FILE_BSD}" STREQUAL "") AND
-    (NOT "${UA_GEN_FILE_CSV}" STREQUAL "" OR
-        NOT "${UA_GEN_NAMESPACE_IDX}" STREQUAL ""))
-        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires FILE_BSD argument if any of FILE_CSV or NAMESPACE_IDX are set")
-    endif()
-
-    if(NOT UA_GEN_NAMESPACE_IDX OR "${UA_GEN_NAMESPACE_IDX}" STREQUAL "" AND
-    (NOT "${UA_GEN_FILE_CSV}" STREQUAL "" OR
-        NOT "${UA_GEN_FILE_BSD}" STREQUAL ""))
-        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires NAMESPACE_IDX argument if any of FILE_CSV or FILE_BSD are set")
-    endif()
-
-    # Set default value for output dir
-    if(NOT UA_GEN_OUTPUT_DIR OR "${UA_GEN_OUTPUT_DIR}" STREQUAL "")
-        set(UA_GEN_OUTPUT_DIR ${PROJECT_BINARY_DIR}/src_generated/open62541)
-    endif()
-    # Set default target prefix
-    if(NOT UA_GEN_TARGET_PREFIX OR "${UA_GEN_TARGET_PREFIX}" STREQUAL "")
-        set(UA_GEN_TARGET_PREFIX "open62541-generator")
-    endif()
-
-    set(NODESET_DEPENDS_TARGET "")
-    set(NODESET_TYPES_ARRAY "UA_TYPES")
-
-    if(NOT "${UA_GEN_FILE_BSD}" STREQUAL "")
-        # Generate Datatypes for nodeset
-        ua_generate_datatypes(
-            NAME "types_${UA_GEN_NAME}"
-            TARGET_PREFIX "${UA_GEN_TARGET_PREFIX}"
-            TARGET_SUFFIX "types-${UA_GEN_NAME}"
-            NAMESPACE_IDX ${UA_GEN_NAMESPACE_IDX}
-            FILE_CSV "${UA_GEN_FILE_CSV}"
-            FILES_BSD "${UA_GEN_FILE_BSD}"
-            OUTPUT_DIR "${UA_GEN_OUTPUT_DIR}"
-        )
-        set(NODESET_DEPENDS_TARGET "${UA_GEN_TARGET_PREFIX}-types-${UA_GEN_NAME}")
-        set(NODESET_TYPES_ARRAY "UA_TYPES_${GEN_NAME_UPPER}")
-
-        ua_generate_nodeid_header(
-            NAME "${UA_GEN_NAME}_nodeids"
-            ID_PREFIX "${GEN_NAME_UPPER}"
-            FILE_CSV "${UA_GEN_FILE_CSV}"
-            OUTPUT_DIR "${UA_GEN_OUTPUT_DIR}"
-            TARGET_PREFIX "${UA_GEN_TARGET_PREFIX}"
-            TARGET_SUFFIX "ids-${UA_GEN_NAME}"
-        )
-        set(NODESET_DEPENDS_TARGET ${NODESET_DEPENDS_TARGET} "${UA_GEN_TARGET_PREFIX}-ids-${UA_GEN_NAME}")
-    endif()
-
-    # Create a list of nodesets on which this nodeset depends on
-    if (NOT UA_GEN_DEPENDS OR "${UA_GEN_DEPENDS}" STREQUAL "" )
-        set(NODESET_DEPENDS "${open62541_NODESET_DIR}/Schema/Opc.Ua.NodeSet2.xml")
-        set(TYPES_DEPENDS "UA_TYPES")
-    else()
-        foreach(f ${UA_GEN_DEPENDS})
-          if(EXISTS ${f})
-            set(NODESET_DEPENDS ${NODESET_DEPENDS} "${f}")
-          else()
-            string(REPLACE "-" "_" DEPENDS_NAME "${f}")
-            get_property(DEPENDS_FILE GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_FILE_${DEPENDS_NAME}")
-            if(NOT DEPENDS_FILE OR "${DEPENDS_FILE}" STREQUAL "")
-                message(FATAL_ERROR "Nodeset dependency ${f} needs to be generated before ${UA_GEN_NAME}")
-            endif()
-
-            set(NODESET_DEPENDS ${NODESET_DEPENDS} "${DEPENDS_FILE}")
-            get_property(DEPENDS_TYPES GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_TYPES_${DEPENDS_NAME}")
-            set(TYPES_DEPENDS ${TYPES_DEPENDS} "${DEPENDS_TYPES}")
-            set(NODESET_DEPENDS_TARGET ${NODESET_DEPENDS_TARGET} "${UA_GEN_TARGET_PREFIX}-ns-${f}")
-          endif()
-        endforeach()
-    endif()
-
-
-    set(NODESET_INTERNAL "")
-    if (${UA_GEN_INTERNAL})
-        set(NODESET_INTERNAL "INTERNAL")
-    endif()
-
-    ua_generate_nodeset(
-        NAME "${UA_GEN_NAME}"
-        FILE "${UA_GEN_FILE_NS}"
-        TYPES_ARRAY "${NODESET_TYPES_ARRAY}"
-        ${NODESET_INTERNAL}
-        DEPENDS_TYPES ${TYPES_DEPENDS}
-        DEPENDS_NS ${NODESET_DEPENDS}
-        DEPENDS_TARGET ${NODESET_DEPENDS_TARGET}
-        OUTPUT_DIR "${UA_GEN_OUTPUT_DIR}"
-        TARGET_PREFIX "${UA_GEN_TARGET_PREFIX}"
-    )
-
-endfunction()
diff --git a/ext/open62541/tools/cmake/open62541Config.cmake.in b/ext/open62541/tools/cmake/open62541Config.cmake.in
deleted file mode 100644
index c7b0346..0000000
--- a/ext/open62541/tools/cmake/open62541Config.cmake.in
+++ /dev/null
@@ -1,22 +0,0 @@
-@PACKAGE_INIT@
-
-include("${CMAKE_CURRENT_LIST_DIR}/open62541Targets.cmake")
-
-set (open62541_TOOLS_DIR @PACKAGE_open62541_install_tools_dir@ CACHE PATH "Path to the directory that contains the tooling of the stack")
-set (open62541_NODESET_DIR @PACKAGE_open62541_install_nodeset_dir@ CACHE PATH "Path to the directory that contains the OPC UA schema repository")
-
-include(CMakeFindDependencyMacro)
-find_dependency(PythonInterp REQUIRED)
-
-include("${CMAKE_CURRENT_LIST_DIR}/open62541Macros.cmake")
-
-set(open62541_COMPONENTS_ALL @open62541_enabled_components@)
-
-foreach(_comp ${open62541_FIND_COMPONENTS})
-  list (FIND open62541_COMPONENTS_ALL "${_comp}" _index)
-  if (${_index} LESS 0)
-    set(open62541_FOUND False)
-    set(open62541_NOTFOUND_MESSAGE "Unsupported open62541 component: ${_comp}")
-    message(WARNING "${open62541_NOTFOUND_MESSAGE}")
-  endif()
-endforeach()
diff --git a/ext/open62541/tools/gdb-prettyprint.py b/ext/open62541/tools/gdb-prettyprint.py
deleted file mode 100644
index ebc4793..0000000
--- a/ext/open62541/tools/gdb-prettyprint.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env python
-
-# WARNING: This is till work in progress
-#
-# Load into gdb with 'source ../tools/gdb-prettyprint.py'
-# Make sure to also apply 'set print pretty on' to get nice structure printouts
-
-class String:
-    def __init__(self, val):
-        self.val = val
-
-    def to_string (self):
-        length = int(self.val['length'])
-        data = self.val['data']
-
-        if int(data) == 0:
-            return "UA_STRING_NULL"
-        inferior = gdb.selected_inferior()
-        text = inferior.read_memory(data, length).tobytes().decode(errors='replace')
-        return "\"%s\"" % text
-
-class LocalizedText:
-    def __init__(self, val):
-        self.val = val
-
-    def to_string (self):
-        return "UA_LocalizedText(%s, %s)" % (self.val['locale'], self.val['text'])
-
-class QualifiedName:
-    def __init__(self, val):
-        self.val = val
-
-    def to_string (self):
-        return "UA_QualifiedName(%s, %s)" % (int(self.val['namespaceIndex']), self.val['name'])
-
-class Guid:
-    def __init__(self, val):
-        self.val = val
-
-    def to_string (self):
-        return "UA_Guid()"
-
-class NodeId:
-    def __init__(self, val):
-        self.val = val
-
-    def to_string (self):
-        return "UA_NodeId()"
-
-class Variant:
-    def __init__(self, val):
-        self.val = val
-
-    def to_string (self):
-        return "UA_Variant()"
-
-def lookup_type (val):
-    if str(val.type) == 'UA_String':
-        return String(val)
-    if str(val.type) == 'UA_LocalizedText':
-        return LocalizedText(val)
-    if str(val.type) == 'UA_QualifiedName':
-        return QualifiedName(val)
-    if str(val.type) == 'UA_Guid':
-        return Guid(val)
-    if str(val.type) == 'UA_NodeId':
-        return NodeId(val)
-    if str(val.type) == 'UA_Variant':
-        return Variant(val)
-    return None
-
-gdb.pretty_printers.append (lookup_type)
diff --git a/ext/open62541/tools/generate_datatypes.py b/ext/open62541/tools/generate_datatypes.py
deleted file mode 100644
index d5432ec..0000000
--- a/ext/open62541/tools/generate_datatypes.py
+++ /dev/null
@@ -1,709 +0,0 @@
-#!/usr/bin/env python
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import print_function
-import sys
-import time
-import platform
-import getpass
-from collections import OrderedDict
-import re
-import xml.etree.ElementTree as etree
-import itertools
-import argparse
-import csv
-import json
-from nodeset_compiler.opaque_type_mapping import get_base_type_for_opaque as get_base_type_for_opaque_ns0
-
-types = OrderedDict() # contains types that were already parsed
-types_imported = OrderedDict() # contains types that were already parsed and marked as imported types (do not write to source code)
-typedescriptions = {} # contains type nodeids
-user_opaque_type_mapping = {} # contains user defined opaque type mapping
-
-excluded_types = ["NodeIdType", "InstanceNode", "TypeNode", "Node", "ObjectNode",
-                  "ObjectTypeNode", "VariableNode", "VariableTypeNode", "ReferenceTypeNode",
-                  "MethodNode", "ViewNode", "DataTypeNode",
-                  "NumericRange", "NumericRangeDimensions",
-                  "UA_ServerDiagnosticsSummaryDataType", "UA_SamplingIntervalDiagnosticsDataType",
-                  "UA_SessionSecurityDiagnosticsDataType", "UA_SubscriptionDiagnosticsDataType",
-                  "UA_SessionDiagnosticsDataType"]
-
-builtin_types = ["Boolean", "SByte", "Byte", "Int16", "UInt16", "Int32", "UInt32",
-                 "Int64", "UInt64", "Float", "Double", "String", "DateTime", "Guid",
-                 "ByteString", "XmlElement", "NodeId", "ExpandedNodeId", "StatusCode",
-                 "QualifiedName", "LocalizedText", "ExtensionObject", "DataValue",
-                 "Variant", "DiagnosticInfo"]
-
-# If set to False, every defined datatype must have a corresponding ID entry in the csv file
-isInternalTypes = False
-
-# Some types can be memcpy'd off the binary stream. That's especially important
-# for arrays. But we need to check if they contain padding and whether the
-# endianness is correct. This dict gives the C-statement that must be true for the
-# type to be overlayable. Parsed types are added if they apply.
-builtin_overlayable = {"Boolean": "true",
-                       "SByte": "true", "Byte": "true",
-                       "Int16": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "UInt16": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "Int32": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "UInt32": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "Int64": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "UInt64": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "Float": "UA_BINARY_OVERLAYABLE_FLOAT",
-                       "Double": "UA_BINARY_OVERLAYABLE_FLOAT",
-                       "DateTime": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "StatusCode": "UA_BINARY_OVERLAYABLE_INTEGER",
-                       "Guid": "(UA_BINARY_OVERLAYABLE_INTEGER && " +
-                       "offsetof(UA_Guid, data2) == sizeof(UA_UInt32) && " +
-                       "offsetof(UA_Guid, data3) == (sizeof(UA_UInt16) + sizeof(UA_UInt32)) && " +
-                       "offsetof(UA_Guid, data4) == (2*sizeof(UA_UInt32)))"}
-
-whitelistFuncAttrWarnUnusedResult = []  # for instances [ "String", "ByteString", "LocalizedText" ]
-
-# Type aliases
-type_aliases = { "CharArray" : "String" }
-def getTypeName(xmlTypeName):
-    typeName = xmlTypeName[xmlTypeName.find(":")+1:]
-    return type_aliases.get(typeName, typeName)
-
-# Escape C strings:
-def makeCLiteral(value):
-    return re.sub(r'(?<!\\)"', r'\\"', value.replace('\\', r'\\\\').replace('\n', r'\\n').replace('\r', r''))
-
-# Strip invalid characters to create valid C identifiers (variable names etc):
-def makeCIdentifier(value):
-    return re.sub(r'[^\w]', '', value)
-
-def get_base_type_for_opaque(name):
-    if name in user_opaque_type_mapping:
-        return user_opaque_type_mapping[name]
-    else:
-        return get_base_type_for_opaque_ns0(name)
-
-################
-# Type Classes #
-################
-
-class StructMember(object):
-    def __init__(self, name, memberType, isArray):
-        self.name = name
-        self.memberType = memberType
-        self.isArray = isArray
-
-def getNodeidTypeAndId(nodeId):
-    if '=' not in nodeId:
-        return "UA_NODEIDTYPE_NUMERIC, {{{0}}}".format(nodeId)
-    if nodeId.startswith("i="):
-        return "UA_NODEIDTYPE_NUMERIC, {{{0}}}".format(nodeId[2:])
-    if nodeId.startswith("s="):
-        strId = nodeId[2:]
-        return "UA_NODEIDTYPE_STRING, {{ .string = UA_STRING_STATIC(\"{id}\") }}".format(id=strId.replace("\"", "\\\""))
-
-
-class Type(object):
-    def __init__(self, outname, xml, namespace):
-        self.name = None
-        if xml is not None:
-            self.name = xml.get("Name")
-            self.typeIndex = "UA_" + makeCIdentifier(outname.upper() + "_" + self.name.upper())
-        else:
-            self.typeIndex = makeCIdentifier(outname.upper())
-        self.ns0 = ("true" if namespace == 0 else "false")
-        self.outname = outname
-        self.kind = None
-        self.description = ""
-        self.pointerfree = "false"
-        self.overlayable = "false"
-        self.members = []
-        if xml is not None:
-            for child in xml:
-                if child.tag == "{http://opcfoundation.org/BinarySchema/}Documentation":
-                    self.description = child.text
-                    break
-
-    def datatype_c(self):
-        # xmlEncodingId = "0"
-        binaryEncodingId = "0"
-        if self.name in typedescriptions:
-            description = typedescriptions[self.name]
-            typeid = "{%s, %s}" % (description.namespaceid, getNodeidTypeAndId(description.nodeid))
-            # xmlEncodingId = description.xmlEncodingId
-            binaryEncodingId = description.binaryEncodingId
-        else:
-            if not isInternalTypes:
-                raise RuntimeError("NodeId for " + self.name + " not found in .csv file")
-            else:
-                typeid = "{0, UA_NODEIDTYPE_NUMERIC, {0}}"
-        idName = makeCIdentifier(self.name)
-        return "{\n    UA_TYPENAME(\"%s\") /* .typeName */\n" % idName + \
-            "    " + typeid + ", /* .typeId */\n" + \
-            "    sizeof(UA_" + idName + "), /* .memSize */\n" + \
-            "    " + self.typeIndex + ", /* .typeIndex */\n" + \
-            "    " + self.kind + ", /* .typeKind */\n" + \
-            "    " + self.pointerfree + ", /* .pointerFree */\n" + \
-            "    " + self.overlayable + ", /* .overlayable */\n" + \
-            "    " + str(len(self.members)) + ", /* .membersSize */\n" + \
-            "    " + binaryEncodingId + ", /* .binaryEncodingId */\n" + \
-            "    %s_members" % idName + " /* .members */\n}"
-
-    def members_c(self):
-        idName = makeCIdentifier(self.name)
-        if len(self.members) == 0:
-            return "#define %s_members NULL" % (idName)
-        members = "static UA_DataTypeMember %s_members[%s] = {" % (idName, len(self.members))
-        before = None
-        size = len(self.members)
-        for i, member in enumerate(self.members):
-            memberName = makeCIdentifier(member.name)
-            memberNameCapital = memberName
-            if len(memberName) > 0:
-                memberNameCapital = memberName[0].upper() + memberName[1:]
-            m = "\n{\n    UA_TYPENAME(\"%s\") /* .memberName */\n" % memberNameCapital
-            m += "    UA_%s_%s, /* .memberTypeIndex */\n" % (member.memberType.outname.upper(), makeCIdentifier(member.memberType.name.upper()))
-            m += "    "
-            if not before:
-                m += "0,"
-            else:
-                if member.isArray:
-                    m += "offsetof(UA_%s, %sSize)" % (idName, memberName)
-                else:
-                    m += "offsetof(UA_%s, %s)" % (idName, memberName)
-                m += " - offsetof(UA_%s, %s)" % (idName, makeCIdentifier(before.name))
-                if before.isArray:
-                    m += " - sizeof(void*),"
-                else:
-                    m += " - sizeof(UA_%s)," % makeCIdentifier(before.memberType.name)
-            m += " /* .padding */\n"
-            m += "    %s, /* .namespaceZero */\n" % member.memberType.ns0
-            m += ("    true" if member.isArray else "    false") + " /* .isArray */\n}"
-            if i != size:
-                m += ","
-            members += m
-            before = member
-        return members + "};"
-
-    def datatype_ptr(self):
-        return "&UA_" + self.outname.upper() + "[UA_" + makeCIdentifier(self.outname.upper() + "_" + self.name.upper()) + "]"
-
-    def functions_c(self):
-        idName = makeCIdentifier(self.name)
-        funcs = "static UA_INLINE void\nUA_%s_init(UA_%s *p) {\n    memset(p, 0, sizeof(UA_%s));\n}\n\n" % (idName, idName, idName)
-        funcs += "static UA_INLINE UA_%s *\nUA_%s_new(void) {\n    return (UA_%s*)UA_new(%s);\n}\n\n" % (idName, idName, idName, self.datatype_ptr())
-        if self.pointerfree == "true":
-            funcs += "static UA_INLINE UA_StatusCode\nUA_%s_copy(const UA_%s *src, UA_%s *dst) {\n    *dst = *src;\n    return UA_STATUSCODE_GOOD;\n}\n\n" % (idName, idName, idName)
-            funcs += "static UA_INLINE void\nUA_%s_deleteMembers(UA_%s *p) {\n    memset(p, 0, sizeof(UA_%s));\n}\n\n" % (idName, idName, idName)
-            funcs += "static UA_INLINE void\nUA_%s_clear(UA_%s *p) {\n    memset(p, 0, sizeof(UA_%s));\n}\n\n" % (idName, idName, idName)
-        else:
-            for entry in whitelistFuncAttrWarnUnusedResult:
-                if idName == entry:
-                    funcs += "UA_INTERNAL_FUNC_ATTR_WARN_UNUSED_RESULT "
-                    break
-
-            funcs += "static UA_INLINE UA_StatusCode\nUA_%s_copy(const UA_%s *src, UA_%s *dst) {\n    return UA_copy(src, dst, %s);\n}\n\n" % (idName, idName, idName, self.datatype_ptr())
-            funcs += "static UA_INLINE void\nUA_%s_deleteMembers(UA_%s *p) {\n    UA_clear(p, %s);\n}\n\n" % (idName, idName, self.datatype_ptr())
-            funcs += "static UA_INLINE void\nUA_%s_clear(UA_%s *p) {\n    UA_clear(p, %s);\n}\n\n" % (idName, idName, self.datatype_ptr())
-        funcs += "static UA_INLINE void\nUA_%s_delete(UA_%s *p) {\n    UA_delete(p, %s);\n}" % (idName, idName, self.datatype_ptr())
-        return funcs
-
-    def encoding_h(self):
-        idName = makeCIdentifier(self.name)
-        enc = "static UA_INLINE size_t\nUA_%s_calcSizeBinary(const UA_%s *src) {\n    return UA_calcSizeBinary(src, %s);\n}\n"
-        enc += "static UA_INLINE UA_StatusCode\nUA_%s_encodeBinary(const UA_%s *src, UA_Byte **bufPos, const UA_Byte *bufEnd) {\n    return UA_encodeBinary(src, %s, bufPos, &bufEnd, NULL, NULL);\n}\n"
-        enc += "static UA_INLINE UA_StatusCode\nUA_%s_decodeBinary(const UA_ByteString *src, size_t *offset, UA_%s *dst) {\n    return UA_decodeBinary(src, offset, dst, %s, NULL);\n}"
-        return enc % tuple(list(itertools.chain(*itertools.repeat([idName, idName, self.datatype_ptr()], 3))))
-
-class BuiltinType(Type):
-    def __init__(self, name):
-        Type.__init__(self, name, None, 0)
-        self.name = name
-        self.ns0 = "true"
-        self.typeIndex = makeCIdentifier("UA_TYPES_" + self.name.upper())
-        self.outname = "types"
-        self.kind = "UA_DATATYPEKIND_" + self.name.upper()
-        self.description = ""
-        self.pointerfree = "false"
-        if self.name in builtin_overlayable.keys():
-            self.pointerfree = "true"
-        self.overlayable = "false"
-        if name in builtin_overlayable:
-            self.overlayable = builtin_overlayable[name]
-        self.members = []
-
-class EnumerationType(Type):
-    def __init__(self, outname, xml, namespace):
-        Type.__init__(self, outname, xml, namespace)
-        self.pointerfree = "true"
-        self.overlayable = "UA_BINARY_OVERLAYABLE_INTEGER"
-        self.members = []
-        self.kind = "UA_DATATYPEKIND_ENUM"
-        self.typeIndex = "UA_TYPES_INT32"
-        self.elements = OrderedDict()
-        for child in xml:
-            if child.tag == "{http://opcfoundation.org/BinarySchema/}EnumeratedValue":
-                self.elements[child.get("Name")] = child.get("Value")
-
-    def typedef_h(self):
-        if sys.version_info[0] < 3:
-            values = self.elements.iteritems()
-        else:
-            values = self.elements.items()
-        return "typedef enum {\n    " + ",\n    ".join(map(lambda kv : makeCIdentifier("UA_" + self.name.upper() + "_" + kv[0].upper()) + \
-                                                           " = " + kv[1], values)) + \
-               ",\n    __UA_{0}_FORCE32BIT = 0x7fffffff\n".format(makeCIdentifier(self.name.upper())) + "} " + \
-               "UA_{0};\nUA_STATIC_ASSERT(sizeof(UA_{0}) == sizeof(UA_Int32), enum_must_be_32bit);".format(makeCIdentifier(self.name))
-
-class OpaqueType(Type):
-    def __init__(self, outname, xml, namespace, baseType):
-        Type.__init__(self, outname, xml, namespace)
-        self.kind = "UA_DATATYPEKIND_" + baseType.upper()
-        self.baseType = baseType
-        self.members = []
-
-    def typedef_h(self):
-        return "typedef UA_" + self.baseType + " UA_%s;" % self.name
-
-class StructType(Type):
-    def __init__(self, outname, xml, namespace):
-        Type.__init__(self, outname, xml, namespace)
-        self.members = []
-        lengthfields = [] # lengthfields of arrays are not included as members
-        for child in xml:
-            if child.get("LengthField"):
-                lengthfields.append(child.get("LengthField"))
-        for child in xml:
-            if not child.tag == "{http://opcfoundation.org/BinarySchema/}Field":
-                continue
-            if child.get("Name") in lengthfields:
-                continue
-            memberName = child.get("Name")
-            memberName = memberName[:1].lower() + memberName[1:]
-            memberTypeName = getTypeName(child.get("TypeName"))
-            memberType = types[memberTypeName]
-            isArray = True if child.get("LengthField") else False
-            self.members.append(StructMember(memberName, memberType, isArray))
-
-        self.pointerfree = "true"
-        self.overlayable = "true"
-        self.kind = "UA_DATATYPEKIND_STRUCTURE"
-        before = None
-        for m in self.members:
-            if m.isArray or m.memberType.pointerfree != "true":
-                self.pointerfree = "false"
-                self.overlayable = "false"
-            else:
-                self.overlayable += "\n\t\t && " + m.memberType.overlayable
-                if before:
-                    self.overlayable += "\n\t\t && offsetof(UA_%s, %s) == (offsetof(UA_%s, %s) + sizeof(UA_%s))" % \
-                                        (makeCIdentifier(self.name), makeCIdentifier(m.name), makeCIdentifier(self.name), makeCIdentifier(before.name), makeCIdentifier(before.memberType.name))
-            if "false" in self.overlayable:
-                self.overlayable = "false"
-            before = m
-
-    def typedef_h(self):
-        if len(self.members) == 0:
-            return "typedef void * UA_%s;" % makeCIdentifier(self.name)
-        returnstr =  "typedef struct {\n"
-        for member in self.members:
-            if member.isArray:
-                returnstr += "    size_t %sSize;\n" % makeCIdentifier(member.name)
-                returnstr += "    UA_%s *%s;\n" % (makeCIdentifier(member.memberType.name), makeCIdentifier(member.name))
-            else:
-                returnstr += "    UA_%s %s;\n" % (makeCIdentifier(member.memberType.name), makeCIdentifier(member.name))
-        return returnstr + "} UA_%s;" % makeCIdentifier(self.name)
-
-#########################
-# Parse Typedefinitions #
-#########################
-
-def parseTypeDefinitions(outname, xmlDescription, namespace, addToTypes=None):
-    def typeReady(element):
-        "Are all member types defined?"
-        for child in element:
-            if child.tag == "{http://opcfoundation.org/BinarySchema/}Field":
-                childname = getTypeName(child.get("TypeName"))
-                if childname not in types:
-                    return False
-        return True
-
-    def unknownTypes(element):
-        "Return all unknown types"
-        unknowns = []
-        for child in element:
-            if child.tag == "{http://opcfoundation.org/BinarySchema/}Field":
-                childname = getTypeName(child.get("TypeName"))
-                if childname not in types:
-                    unknowns.append(childname)
-        return unknowns
-
-    def skipType(name):
-        if name in excluded_types:
-            return True
-        if re.search("NodeId$", name) != None:
-            return True
-        return False
-
-    snippets = {}
-    for typeXml in etree.parse(xmlDescription).getroot():
-        if not typeXml.get("Name"):
-            continue
-        name = typeXml.get("Name")
-        snippets[name] = typeXml
-
-    detectLoop = len(snippets)+1
-    while(len(snippets) > 0):
-        if detectLoop == len(snippets):
-            name, typeXml = (snippets.items())[0]
-            raise RuntimeError("Infinite loop detected trying to processing types " + name + ": unknonwn subtype " + str(unknownTypes(typeXml)))
-        detectLoop = len(snippets)
-        for name, typeXml in list(snippets.items()):
-            if name in types or skipType(name):
-                del snippets[name]
-                continue
-            if not typeReady(typeXml):
-                continue
-            if name in builtin_types:
-                newType = BuiltinType(name)
-            elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}EnumeratedType":
-                newType = EnumerationType(outname, typeXml, namespace)
-            elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}OpaqueType":
-                newType = OpaqueType(outname, typeXml, namespace, get_base_type_for_opaque(name)['name'])
-            elif typeXml.tag == "{http://opcfoundation.org/BinarySchema/}StructuredType":
-                newType = StructType(outname, typeXml, namespace)
-            else:
-                raise Exception("Type not known")
-
-            types[name] = newType
-            if addToTypes is not None:
-                addToTypes[name] = newType
-
-            del snippets[name]
-
-##########################
-# Parse TypeDescriptions #
-##########################
-
-class TypeDescription(object):
-    def __init__(self, name, nodeid, namespaceid):
-        self.name = name
-        self.nodeid = nodeid
-        self.namespaceid = namespaceid
-        self.xmlEncodingId = "0"
-        self.binaryEncodingId = "0"
-
-def parseTypeDescriptions(f, namespaceid):
-    definitions = {}
-
-    csvreader = csv.reader(f, delimiter=',')
-    delay_init = []
-
-    for row in csvreader:
-        if len(row) < 3:
-            continue
-        if row[2] == "Object":
-            # Check if node name ends with _Encoding_(DefaultXml|DefaultBinary) and store the node id in the corresponding DataType
-            m = re.match('(.*?)_Encoding_Default(Xml|Binary)$',row[0])
-            if (m):
-                baseType = m.group(1)
-                if baseType not in types:
-                    continue
-
-                delay_init.append({
-                    "baseType": baseType,
-                    "encoding": m.group(2),
-                    "id": row[1]
-                })
-            continue
-        if row[2] != "DataType":
-            continue
-        if row[0] == "BaseDataType":
-            definitions["Variant"] = TypeDescription(row[0], row[1], namespaceid)
-        elif row[0] == "Structure":
-            definitions["ExtensionObject"] = TypeDescription(row[0], row[1], namespaceid)
-        elif row[0] not in types:
-            continue
-        else:
-            definitions[row[0]] = TypeDescription(row[0], row[1], namespaceid)
-    for i in delay_init:
-        if i["baseType"] not in definitions:
-            raise Exception("Type {} not found in definitions file.".format(i["baseType"]))
-        if i["encoding"] == "Xml":
-            definitions[i["baseType"]].xmlEncodingId = i["id"]
-        else:
-            definitions[i["baseType"]].binaryEncodingId = i["id"]
-    return definitions
-
-def merge_dicts(*dict_args):
-    """
-    Given any number of dicts, shallow copy and merge into a new dict,
-    precedence goes to key value pairs in latter dicts.
-    """
-    result = {}
-    for dictionary in dict_args:
-        result.update(dictionary)
-    return result
-
-###############################
-# Parse the Command Line Input#
-###############################
-
-parser = argparse.ArgumentParser()
-parser.add_argument('-c', '--type-csv',
-                    metavar="<typeDescriptions>",
-                    type=argparse.FileType('r'),
-                    dest="type_csv",
-                    action='append',
-                    default=[],
-                    help='csv file with type descriptions')
-
-parser.add_argument('--namespace',
-                    type=int,
-                    dest="namespace",
-                    default=0,
-                    help='namespace id of the generated type nodeids (defaults to 0)')
-
-parser.add_argument('-s', '--selected-types',
-                    metavar="<selectedTypes>",
-                    type=argparse.FileType('r'),
-                    dest="selected_types",
-                    action='append',
-                    default=[],
-                    help='file with list of types (among those parsed) to be generated. If not given, all types are generated')
-
-parser.add_argument('--no-builtin',
-                    action='store_true',
-                    dest="no_builtin",
-                    help='Do not generate builtin types')
-
-parser.add_argument('--opaque-map',
-                    metavar="<opaqueTypeMap>",
-                    type=argparse.FileType('r'),
-                    dest="opaque_map",
-                    action='append',
-                    default=[],
-                    help='JSON file with opaque type mapping: { \'typename\': { \'ns\': 0,  \'id\': 7, \'name\': \'UInt32\' }, ... }')
-
-parser.add_argument('--internal',
-                    action='store_true',
-                    dest="internal",
-                    help='Given bsd are internal types which do not have any .csv file')
-
-parser.add_argument('-t', '--type-bsd',
-                    metavar="<typeBsds>",
-                    type=argparse.FileType('r'),
-                    dest="type_bsd",
-                    action='append',
-                    default=[],
-                    help='bsd file with type definitions')
-
-parser.add_argument('-i', '--import',
-                    metavar="<importBsds>",
-                    type=str,
-                    dest="import_bsd",
-                    action='append',
-                    default=[],
-                    help='combination of TYPE_ARRAY#filepath.bsd with type definitions which should be loaded but not exported/generated')
-
-parser.add_argument('outfile',
-                    metavar='<outputFile>',
-                    help='output file w/o extension')
-args = parser.parse_args()
-
-outname = args.outfile.split("/")[-1]
-inname = ', '.join(list(map(lambda x:x.name.split("/")[-1], args.type_bsd)))
-
-isInternalTypes = args.internal
-
-################
-# Create Types #
-################
-
-for builtin in builtin_types:
-    types[builtin] = BuiltinType(builtin)
-
-for f in args.opaque_map:
-    user_opaque_type_mapping.update(json.load(f))
-
-for i in args.import_bsd:
-    (outname_import, file_import) = i.split("#")
-    outname_import = outname_import.lower()
-    if outname_import.startswith("ua_"):
-        outname_import = outname_import[3:]
-    parseTypeDefinitions(outname_import, file_import, args.namespace, addToTypes=types_imported)
-
-for f in args.type_bsd:
-    parseTypeDefinitions(outname, f, args.namespace)
-
-typedescriptions = {}
-for f in args.type_csv:
-    typedescriptions = merge_dicts(typedescriptions, parseTypeDescriptions(f, args.namespace))
-
-# Read the selected data types
-selected_types = []
-for f in args.selected_types:
-    selected_types += list(filter(len, [line.strip() for line in f]))
-# Use all types if none are selected
-if len(selected_types) == 0:
-    selected_types = types.keys()
-
-#############################
-# Write out the Definitions #
-#############################
-
-fh = open(args.outfile + "_generated.h", 'w')
-ff = open(args.outfile + "_generated_handling.h", 'w')
-fe = open(args.outfile + "_generated_encoding_binary.h", 'w')
-fc = open(args.outfile + "_generated.c",'w')
-def printh(string):
-    print(string, end='\n', file=fh)
-def printf(string):
-    print(string, end='\n', file=ff)
-def printe(string):
-    print(string, end='\n', file=fe)
-def printc(string):
-    print(string, end='\n', file=fc)
-
-def iter_types(v):
-    l = None
-    if sys.version_info[0] < 3:
-        l = list(v.itervalues())
-    else:
-        l = list(v.values())
-    if len(selected_types) > 0:
-        l = list(filter(lambda t: t.name in selected_types, l))
-    if args.no_builtin:
-        l = list(filter(lambda t: type(t) != BuiltinType, l))
-    l = list(filter(lambda t: t.name not in types_imported, l))
-    return l
-
-################
-# Print Header #
-################
-
-printh('''/* Generated from ''' + inname + ''' with script ''' + sys.argv[0] + '''
- * on host ''' + platform.uname()[1] + ''' by user ''' + getpass.getuser() + \
-       ''' at ''' + time.strftime("%Y-%m-%d %I:%M:%S") + ''' */
-
-#ifndef ''' + outname.upper() + '''_GENERATED_H_
-#define ''' + outname.upper() + '''_GENERATED_H_
-
-#ifdef UA_ENABLE_AMALGAMATION
-#include "open62541.h"
-#else
-#include <open62541/types.h>
-''' + ('#include <open62541/types_generated.h>\n' if outname != "types" else '') + '''
-#endif
-
-_UA_BEGIN_DECLS
-
-''')
-
-filtered_types = iter_types(types)
-
-printh('''/**
- * Every type is assigned an index in an array containing the type descriptions.
- * These descriptions are used during type handling (copying, deletion,
- * binary encoding, ...). */''')
-printh("#define UA_" + outname.upper() + "_COUNT %s" % (str(len(filtered_types))))
-printh("extern UA_EXPORT const UA_DataType UA_" + outname.upper() + "[UA_" + outname.upper() + "_COUNT];")
-
-for i, t in enumerate(filtered_types):
-    printh("\n/**\n * " +  t.name)
-    printh(" * " + "^" * len(t.name))
-    if t.description == "":
-        printh(" */")
-    else:
-        printh(" * " + t.description + " */")
-    if type(t) != BuiltinType:
-        printh(t.typedef_h() + "\n")
-    printh("#define UA_" + makeCIdentifier(outname.upper() + "_" + t.name.upper()) + " " + str(i))
-
-printh('''
-
-_UA_END_DECLS
-
-#endif /* %s_GENERATED_H_ */''' % outname.upper())
-
-##################
-# Print Handling #
-##################
-
-printf('''/* Generated from ''' + inname + ''' with script ''' + sys.argv[0] + '''
- * on host ''' + platform.uname()[1] + ''' by user ''' + getpass.getuser() + \
-       ''' at ''' + time.strftime("%Y-%m-%d %I:%M:%S") + ''' */
-
-#ifndef ''' + outname.upper() + '''_GENERATED_HANDLING_H_
-#define ''' + outname.upper() + '''_GENERATED_HANDLING_H_
-
-#include "''' + outname + '''_generated.h"
-
-_UA_BEGIN_DECLS
-
-#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-# pragma GCC diagnostic ignored "-Wmissing-braces"
-#endif
-''')
-
-for t in filtered_types:
-    printf("\n/* " + t.name + " */")
-    printf(t.functions_c())
-
-printf('''
-#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6
-# pragma GCC diagnostic pop
-#endif
-
-_UA_END_DECLS
-
-#endif /* %s_GENERATED_HANDLING_H_ */''' % outname.upper())
-
-###########################
-# Print Description Array #
-###########################
-
-printc('''/* Generated from ''' + inname + ''' with script ''' + sys.argv[0] + '''
- * on host ''' + platform.uname()[1] + ''' by user ''' + getpass.getuser() + \
-       ''' at ''' + time.strftime("%Y-%m-%d %I:%M:%S") + ''' */
-
-#include "''' + outname + '''_generated.h"''')
-
-for t in filtered_types:
-    printc("")
-    printc("/* " + t.name + " */")
-    printc(t.members_c())
-
-printc("const UA_DataType UA_%s[UA_%s_COUNT] = {" % (outname.upper(), outname.upper()))
-for t in filtered_types:
-    printc("/* " + t.name + " */")
-    printc(t.datatype_c() + ",")
-printc("};\n")
-
-##################
-# Print Encoding #
-##################
-
-printe('''/* Generated from ''' + inname + ''' with script ''' + sys.argv[0] + '''
- * on host ''' + platform.uname()[1] + ''' by user ''' + getpass.getuser() + \
-       ''' at ''' + time.strftime("%Y-%m-%d %I:%M:%S") + ''' */
-
-#ifdef UA_ENABLE_AMALGAMATION
-# include "open62541.h"
-#else
-# include "ua_types_encoding_binary.h"
-# include "''' + outname + '''_generated.h"
-#endif
-
-''')
-
-for t in filtered_types:
-    printe("\n/* " + t.name + " */")
-    printe(t.encoding_h())
-
-fh.close()
-ff.close()
-fc.close()
-fe.close()
diff --git a/ext/open62541/tools/generate_nodeid_header.py b/ext/open62541/tools/generate_nodeid_header.py
deleted file mode 100644
index c608632..0000000
--- a/ext/open62541/tools/generate_nodeid_header.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this 
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import print_function
-import sys
-import argparse
-from io import open
-
-parser = argparse.ArgumentParser()
-parser.add_argument('statuscodes', help='path/to/Opc.Ua.NodeIds.csv')
-parser.add_argument('outfile', help='outfile w/o extension')
-parser.add_argument('namespace', help='NS0')
-args = parser.parse_args()
-
-rows = []
-with open(args.statuscodes, mode="rt") as f:
-    lines = f.readlines()
-    for l in lines:
-        rows.append(tuple(l.strip().split(',')))
-
-fh = open(args.outfile + ".h", "wt", encoding='utf8')
-def printh(string):
-    print(string, end=u'\n', file=fh)
-
-#########################
-# Print the header file #
-#########################
-
-printh(u'''/*---------------------------------------------------------
- * Autogenerated -- do not modify
- * Generated from {0} with script {1}
- *-------------------------------------------------------*/
-
-#ifndef UA_NODEIDS_{2}_H_
-#define UA_NODEIDS_{2}_H_
-
-/**
- * Namespace Zero NodeIds
- * ----------------------
- * Numeric identifiers of standard-defined nodes in namespace zero. The
- * following definitions are autogenerated from the ``{0}`` file */
-'''.format(args.statuscodes, sys.argv[0], args.namespace))
-
-for row in rows:
-    printh(u"#define UA_{namespace}ID_{name} {id} /* {description} */".format(namespace=args.namespace, name=row[0].upper(), id=row[1], description=row[2]))
-
-printh(u'''#endif /* UA_NODEIDS_{0}_H_ */ '''.format(args.namespace))
-
-fh.close()
diff --git a/ext/open62541/tools/generate_statuscode_descriptions.py b/ext/open62541/tools/generate_statuscode_descriptions.py
deleted file mode 100644
index 39ed3a0..0000000
--- a/ext/open62541/tools/generate_statuscode_descriptions.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env python
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this 
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import print_function
-import sys
-import argparse
-from io import open
-
-parser = argparse.ArgumentParser()
-parser.add_argument('statuscodes', help='path/to/Opc.Ua.StatusCodes.csv')
-parser.add_argument('outfile', help='outfile w/o extension')
-args = parser.parse_args()
-
-rows = []
-with open(args.statuscodes, mode="rt") as f:
-    lines = f.readlines()
-    for l in lines:
-        rows.append(tuple(l.strip().split(',')))
-
-fh = open(args.outfile + ".h", "wt", encoding='utf8')
-fc = open(args.outfile + ".c", "wt", encoding='utf8')
-def printh(string):
-    print(string, end=u'\n', file=fh)
-def printc(string):
-    print(string, end=u'\n', file=fc)
-
-#########################
-# Print the header file #
-#########################
-
-printh(u'''/*---------------------------------------------------------
- * Autogenerated -- do not modify
- * Generated from %s with script %s
- *-------------------------------------------------------*/
-
-/**
- * .. _statuscodes:
- *
- * StatusCodes
- * -----------
- * StatusCodes are extensively used in the OPC UA protocol and in the open62541
- * API. They are represented by the :ref:`statuscode` data type. The following
- * definitions are autogenerated from the ``Opc.Ua.StatusCodes.csv`` file provided
- * with the OPC UA standard. */
-
-/* These StatusCodes are manually generated. */
-#define UA_STATUSCODE_GOOD 0x00
-#define UA_STATUSCODE_INFOTYPE_DATAVALUE 0x00000400
-#define UA_STATUSCODE_INFOBITS_OVERFLOW 0x00000080
-''' % (args.statuscodes, sys.argv[0]))
-
-for row in rows:
-    printh(u"/* %s */\n#define UA_STATUSCODE_%s %s\n" % (row[2], row[0].upper(), row[1]))
-
-#########################
-# Print the source file #
-#########################
-
-printc(u'''/**********************************************************
- * Autogenerated -- do not modify
- * Generated from %s with script %s
- *********************************************************/
-
-#include <open62541/types.h>''' % (args.statuscodes, sys.argv[0]))
-
-count = 2 + len(rows)
-
-printc(u'''
-typedef struct {
-    UA_StatusCode code;
-    const char *name;
-} UA_StatusCodeName;
-
-#ifndef UA_ENABLE_STATUSCODE_DESCRIPTIONS
-static const char * emptyStatusCodeName = "";
-const char * UA_StatusCode_name(UA_StatusCode code) {
-    return emptyStatusCodeName;
-}
-#else
-static const size_t statusCodeDescriptionsSize = %s;
-static const UA_StatusCodeName statusCodeDescriptions[%i] = {
-    {UA_STATUSCODE_GOOD, \"Good\"},''' % (count, count))
-
-for row in rows:
-    printc(u"    {UA_STATUSCODE_%s, \"%s\"}," % (row[0].upper(), row[0]))
-printc(u'''    {0xffffffff, "Unknown StatusCode"}
-};
-
-const char * UA_StatusCode_name(UA_StatusCode code) {
-    for (size_t i = 0; i < statusCodeDescriptionsSize; ++i) {
-        if (statusCodeDescriptions[i].code == code)
-            return statusCodeDescriptions[i].name;
-    }
-    return statusCodeDescriptions[statusCodeDescriptionsSize-1].name;
-}
-
-#endif''')
-
-fc.close()
-fh.close()
diff --git a/ext/open62541/tools/nodeset_compiler/NodeID_NS0_Base.txt b/ext/open62541/tools/nodeset_compiler/NodeID_NS0_Base.txt
deleted file mode 100644
index 3a15fc4..0000000
--- a/ext/open62541/tools/nodeset_compiler/NodeID_NS0_Base.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-i=24
-i=31
-i=32
-i=33
-i=34
-i=35
-i=36
-i=37
-i=38
-i=39
-i=40
-i=41
-i=44
-i=45
-i=45
-i=46
-i=47
-i=48
-i=49
-i=58
-i=61
-i=62
-i=63
-i=68
-i=84
-i=85
-i=86
-i=87
-i=88
-i=89
-i=90
-i=91
-i=3048
diff --git a/ext/open62541/tools/nodeset_compiler/README.md b/ext/open62541/tools/nodeset_compiler/README.md
deleted file mode 100644
index 887940f..0000000
--- a/ext/open62541/tools/nodeset_compiler/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# open62541 nodeset Compiler
-
-The nodeset compiler is a collection of python scripts that can parse OPC UA XML Namespace definition files and transform them into a class representation. This facilitates both reprinting the namespace in a different non-XML format (such as C-Code or DOT) and analysis of the namespace structure.
-
-The initial implementation has been contributed by a research project of the chair for Process Control Systems Engineering of the TU Dresden. It was not strictly speaking created as a C generator, but could be easily modified to fulfill this role for open62541. Later on it was extended and improved by the core developers of open62541.
-
-## Documentation
-
-Usage documentation and How-Tos can be found on the webpage: <https://open62541.org/doc/current/nodeset_compiler.html> 
diff --git a/ext/open62541/tools/nodeset_compiler/__init__.py b/ext/open62541/tools/nodeset_compiler/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/ext/open62541/tools/nodeset_compiler/__init__.py
+++ /dev/null
diff --git a/ext/open62541/tools/nodeset_compiler/backend_graphviz.py b/ext/open62541/tools/nodeset_compiler/backend_graphviz.py
deleted file mode 100644
index 213e543..0000000
--- a/ext/open62541/tools/nodeset_compiler/backend_graphviz.py
+++ /dev/null
@@ -1,160 +0,0 @@
-from nodeset import *
-import graphviz as gv
-import codecs
-
-def nodePrintDot(node):
-    cleanname = "node_" + str(node.id).replace(";", "").replace("=", "")
-    dot = cleanname + " [label = \"{" + str(node.id) + "|" + str(node.browseName) + \
-          "}\", shape=\"record\"]"
-    for r in node.references:
-        if isinstance(r.target, Node):
-            tgtname = "node_" + str(r.target.id).replace(";", "").replace("=", "")
-            dot = dot + "\n"
-            if r.isForward == True:
-                dot = dot + cleanname + " -> " + tgtname + " [label=\"" + \
-                      str(r.referenceType.browseName) + "\"]\n"
-            else:
-                if len(r.referenceType.inverseName) == 0:
-                    logger.warn("Inverse name of reference is null " + str(r.referenceType.id))
-                dot = dot + cleanname + " -> " + tgtname + \
-                      " [label=\"" + str(r.referenceType.inverseName) + "\"]\n"
-    return dot
-
-def printDotGraphWalk(nodeset, depth=1, filename="out.dot", rootNode=None,
-                      followInverse=False, excludeNodeIds=[]):
-    """ Outputs a graphiz/dot description the nodes centered around rootNode.
-
-        References beginning from rootNode will be followed for depth steps. If
-        "followInverse = True" is passed, then inverse (not Forward) references
-        will also be followed.
-
-        Nodes can be excluded from the graph by passing a list of NodeIds as
-        string representation using excludeNodeIds (ex ["i=53", "ns=2;i=453"]).
-
-        Output is written into filename to be parsed by dot/neato/srfp...
-    """
-    iter = depth
-    processed = []
-    if rootNode is None or not isinstance(rootNode, Node) or not rootNode in nodeset.nodes:
-        root = nodeset.getRoot()
-    else:
-        root = rootNode
-
-    file = codecs.open(filename, 'w+', encoding='utf-8')
-
-    if root is None:
-        return
-
-    file.write("digraph ns {\n")
-    file.write(nodePrintDot(root))
-    refs = []
-    if followInverse == True:
-        refs = root.references  # + root.getInverseReferences()
-    else:
-        for ref in root.references:
-            if ref.isForward:
-                refs.append(ref)
-    while iter > 0:
-        tmp = []
-        for ref in refs:
-            if isinstance(ref.target, NodeId):
-                tgt = nodeset.nodes[ref.target]
-                if not str(tgt.id) in excludeNodeIds:
-                    if not tgt in processed:
-                        file.write(nodePrintDot(tgt))
-                        processed.append(tgt)
-                        if ref.isForward is False and followInverse is True:
-                            for inverseRef in tgt.inverseReferences:
-                                refs.append(inverseRef)
-                            tmp = tmp + tgt.references  # + tgt.getInverseReferences()
-                        elif ref.isForward:
-                            for targetRef in tgt.references:
-                                refs.append(targetRef)
-        refs = tmp
-        iter = iter - 1
-
-    file.write("}\n")
-    file.close()
-
-def getNodeString(node):
-    return node.browseName.name + " (" + str(node.id) + ")"
-
-def getReferenceString(nodeset, ref):
-    refNode = nodeset.nodes[ref.referenceType]
-    return refNode.browseName.name
-
-def getNodeStyle(node):
-    if isinstance(node, ReferenceTypeNode):
-        return {'shape': 'box', 'style': 'filled', 'fillcolor': '1', 'colorscheme': "pastel19"}
-    if isinstance(node, VariableTypeNode):
-        return {'shape': 'box', 'style': 'filled', 'fillcolor': '2', 'colorscheme': "pastel19"}
-    if isinstance(node, ObjectTypeNode):
-        return {'shape': 'box', 'style': 'filled', 'fillcolor': '3', 'colorscheme': "pastel19"}
-    if isinstance(node, DataTypeNode):
-        return {'shape': 'box', 'style': 'filled', 'fillcolor': '4', 'colorscheme': "pastel19"}
-    if isinstance(node, VariableNode):
-        return {'shape': 'ellipse', 'style': 'rounded,filled', 'fillcolor': '5', 'colorscheme': "pastel19"}
-    if isinstance(node, ObjectNode):
-        return {'shape': 'box', 'style': 'rounded,filled', 'fillcolor': '6', 'colorscheme': "pastel19"}
-    if isinstance(node, MethodNode):
-        return {'shape': 'box', 'style': 'rounded,filled', 'fillcolor': '7', 'colorscheme': "pastel19"}
-    if isinstance(node, ViewNode):
-        return {'shape': 'box', 'style': 'rounded,filled', 'fillcolor': '8', 'colorscheme': "pastel19"}
-
-def add_edges(graph, edges):
-    for e in edges:
-        if isinstance(e[0], tuple):
-            graph.edge(*e[0], **e[1])
-        else:
-            graph.edge(*e)
-    return graph
-
-def add_nodes(graph, nodes):
-    for n in nodes:
-        if isinstance(n, tuple):
-            graph.node(n[0], **n[1])
-        else:
-            graph.node(n)
-    return graph
-
-def addReferenceToGraph(nodeset, nodeFrom, nodeTo, reference, graph):
-    add_edges(graph, [((getNodeString(nodeFrom), getNodeString(nodeTo)), {'label': getReferenceString(nodeset, reference)})])
-
-
-def addNodeToGraph(nodeset, node, graph, alreadyAdded=set(), relevantReferences=set(), ignoreNodes=set(), isRoot=False, depth = 0):
-    if node.id in alreadyAdded or node.id in ignoreNodes:
-        return
-    alreadyAdded.add(node.id)
-    add_nodes(graph, [(getNodeString(node), getNodeStyle(node))])
-    for ref in node.references:
-        if ref.referenceType in relevantReferences and ref.isForward:
-            targetNode = nodeset.nodes[ref.target]
-            if targetNode.id in ignoreNodes:
-                continue
-            addNodeToGraph(nodeset, targetNode, graph, alreadyAdded, depth=depth+1, relevantReferences=relevantReferences,
-                           ignoreNodes = ignoreNodes)
-            addReferenceToGraph(nodeset, node, targetNode, ref, graph)
-
-
-def generateGraphvizCode(nodeset, filename="dependencies", rootNode=None, excludeNodeIds=[]):
-    if rootNode is None or not isinstance(rootNode, Node) or not rootNode in nodeset.nodes:
-        root = nodeset.getRoot()
-    else:
-        root = rootNode
-
-    if root is None:
-        return
-
-    g = gv.dot.Digraph(name="NodeSet Dependency", format='pdf', )
-
-    alreadyAdded = set()
-    ignoreNodes = set()
-    # Ignore some nodes since almost all nodes will point to that which messes up the graph
-    ignoreNodes.add(NodeId("i=68")) # PropertyType
-    ignoreNodes.add(NodeId("i=63")) # BaseDataVariableType
-    ignoreNodes.add(NodeId("i=61")) # FolderType
-    addNodeToGraph(nodeset, root, g, alreadyAdded, isRoot=True,
-                   relevantReferences=nodeset.getRelevantOrderingReferences(),
-                   ignoreNodes=ignoreNodes)
-
-    g.render(filename)
diff --git a/ext/open62541/tools/nodeset_compiler/backend_open62541.py b/ext/open62541/tools/nodeset_compiler/backend_open62541.py
deleted file mode 100644
index d9358ae..0000000
--- a/ext/open62541/tools/nodeset_compiler/backend_open62541.py
+++ /dev/null
@@ -1,319 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-
-from __future__ import print_function
-from os.path import basename
-import logging
-import codecs
-import os
-try:
-    from StringIO import StringIO
-except ImportError:
-    from io import StringIO
-
-import sys
-if sys.version_info[0] >= 3:
-    # strings are already parsed to unicode
-    def unicode(s):
-        return s
-
-logger = logging.getLogger(__name__)
-
-from datatypes import NodeId
-from nodes import *
-from nodeset import *
-from backend_open62541_nodes import generateNodeCode_begin, generateNodeCode_finish, generateReferenceCode
-
-# Kahn's algorithm: https://algocoding.wordpress.com/2015/04/05/topological-sorting-python/
-def sortNodes(nodeset):
-    # reverse hastypedefinition references to treat only forward references
-    hasTypeDef = NodeId("ns=0;i=40")
-    for u in nodeset.nodes.values():
-        for ref in u.references:
-            if ref.referenceType == hasTypeDef:
-                ref.isForward = not ref.isForward
-
-    # Only hierarchical types...
-    relevant_refs = nodeset.getRelevantOrderingReferences()
-
-    # determine in-degree of unfulfilled references
-    L = [node for node in nodeset.nodes.values() if node.hidden]  # ordered list of nodes
-    R = {node.id: node for node in nodeset.nodes.values() if not node.hidden} # remaining nodes
-    in_degree = {id: 0 for id in R.keys()}
-    for u in R.values(): # for each node
-        for ref in u.references:
-            if not ref.referenceType in relevant_refs:
-                continue
-            if nodeset.nodes[ref.target].hidden:
-                continue
-            if ref.isForward:
-                continue
-            in_degree[u.id] += 1
-
-    # Print ReferenceType and DataType nodes first. They may be required even
-    # though there is no reference to them. For example if the referencetype is
-    # used in a reference, it must exist. A Variable node may point to a
-    # DataTypeNode in the datatype attribute and not via an explicit reference.
-
-    Q = [node for node in R.values() if in_degree[node.id] == 0 and
-         (isinstance(node, ReferenceTypeNode) or isinstance(node, DataTypeNode))]
-    while Q:
-        u = Q.pop() # choose node of zero in-degree and 'remove' it from graph
-        L.append(u)
-        del R[u.id]
-
-        for ref in u.references:
-            if not ref.referenceType in relevant_refs:
-                continue
-            if nodeset.nodes[ref.target].hidden:
-                continue
-            if not ref.isForward:
-                continue
-            in_degree[ref.target] -= 1
-            if in_degree[ref.target] == 0:
-                Q.append(R[ref.target])
-
-    # Order the remaining nodes
-    Q = [node for node in R.values() if in_degree[node.id] == 0]
-    while Q:
-        u = Q.pop() # choose node of zero in-degree and 'remove' it from graph
-        L.append(u)
-        del R[u.id]
-
-        for ref in u.references:
-            if not ref.referenceType in relevant_refs:
-                continue
-            if nodeset.nodes[ref.target].hidden:
-                continue
-            if not ref.isForward:
-                continue
-            in_degree[ref.target] -= 1
-            if in_degree[ref.target] == 0:
-                Q.append(R[ref.target])
-
-    # reverse hastype references
-    for u in nodeset.nodes.values():
-        for ref in u.references:
-            if ref.referenceType == hasTypeDef:
-                ref.isForward = not ref.isForward
-
-    if len(L) != len(nodeset.nodes.values()):
-        print(len(L))
-        stillOpen = ""
-        for id in in_degree:
-            if in_degree[id] == 0:
-                continue
-            node = nodeset.nodes[id]
-            stillOpen += node.browseName.name + "/" + str(node.id) + " = " + str(in_degree[id]) + \
-                                                                         " " + str(node.references) + "\r\n"
-        raise Exception("Node graph is circular on the specified references. Still open nodes:\r\n" + stillOpen)
-    return L
-
-###################
-# Generate C Code #
-###################
-
-def generateOpen62541Code(nodeset, outfilename, internal_headers=False, typesArray=[]):
-    outfilebase = basename(outfilename)
-    # Printing functions
-    outfileh = codecs.open(outfilename + ".h", r"w+", encoding='utf-8')
-    outfilec = StringIO()
-
-    def writeh(line):
-        print(unicode(line), end='\n', file=outfileh)
-
-    def writec(line):
-        print(unicode(line), end='\n', file=outfilec)
-
-    additionalHeaders = ""
-    if len(typesArray) > 0:
-        for arr in set(typesArray):
-            if arr == "UA_TYPES":
-                continue
-            # remove ua_ prefix if exists
-            typeFile = arr.lower()
-            typeFile = typeFile[typeFile.startswith("ua_") and len("ua_"):]
-            additionalHeaders += """#include "%s_generated.h"\n""" % typeFile
-
-    # Print the preamble of the generated code
-    writeh("""/* WARNING: This is a generated file.
- * Any manual changes will be overwritten. */
-
-#ifndef %s_H_
-#define %s_H_
-""" % (outfilebase.upper(), outfilebase.upper()))
-    if internal_headers:
-        writeh("""
-#ifdef UA_ENABLE_AMALGAMATION
-# include "open62541.h"
-
-/* The following declarations are in the open62541.c file so here's needed when compiling nodesets externally */
-
-# ifndef UA_INTERNAL //this definition is needed to hide this code in the amalgamated .c file
-
-typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos,
-                                                 const UA_Byte **bufEnd);
-
-UA_StatusCode
-UA_encodeBinary(const void *src, const UA_DataType *type,
-                UA_Byte **bufPos, const UA_Byte **bufEnd,
-                UA_exchangeEncodeBuffer exchangeCallback,
-                void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-UA_StatusCode
-UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst,
-                const UA_DataType *type, size_t customTypesSize,
-                const UA_DataType *customTypes) UA_FUNC_ATTR_WARN_UNUSED_RESULT;
-
-size_t
-UA_calcSizeBinary(void *p, const UA_DataType *type);
-
-const UA_DataType *
-UA_findDataTypeByBinary(const UA_NodeId *typeId);
-
-# endif // UA_INTERNAL
-
-#else // UA_ENABLE_AMALGAMATION
-# include <open62541/server.h>
-#endif
-
-%s
-""" % (additionalHeaders))
-    else:
-        writeh("""
-#ifdef UA_ENABLE_AMALGAMATION
-# include "open62541.h"
-#else
-# include <open62541/server.h>
-#endif
-%s
-""" % (additionalHeaders))
-    writeh("""
-_UA_BEGIN_DECLS
-
-extern UA_StatusCode %s(UA_Server *server);
-
-_UA_END_DECLS
-
-#endif /* %s_H_ */""" % \
-           (outfilebase, outfilebase.upper()))
-
-    writec("""/* WARNING: This is a generated file.
- * Any manual changes will be overwritten. */
-
-#include "%s.h"
-""" % (outfilebase))
-
-    # Loop over the sorted nodes
-    logger.info("Reordering nodes for minimal dependencies during printing")
-    sorted_nodes = sortNodes(nodeset)
-    logger.info("Writing code for nodes and references")
-    functionNumber = 0
-
-    printed_ids = set()
-    for node in sorted_nodes:
-        printed_ids.add(node.id)
-
-        if not node.hidden:
-            writec("\n/* " + str(node.displayName) + " - " + str(node.id) + " */")
-            code_global = []
-            code = generateNodeCode_begin(node, nodeset, code_global)
-            if code is None:
-                writec("/* Ignored. No parent */")
-                nodeset.hide_node(node.id)
-                continue
-            else:
-                if len(code_global) > 0:
-                    writec("\n".join(code_global))
-                    writec("\n")
-                writec("\nstatic UA_StatusCode function_" + outfilebase + "_" + str(functionNumber) + "_begin(UA_Server *server, UA_UInt16* ns) {")
-                if isinstance(node, MethodNode):
-                    writec("#ifdef UA_ENABLE_METHODCALLS")
-                writec(code)
-
-        # Print inverse references leading to this node
-        for ref in node.references:
-            if ref.target not in printed_ids:
-                continue
-            if node.hidden and nodeset.nodes[ref.target].hidden:
-                continue
-            if node.parent is not None and ref.target == node.parent.id \
-                and ref.referenceType == node.parentReference.id:
-                # Skip parent reference
-                continue
-            writec(generateReferenceCode(ref))
-
-        if node.hidden:
-            continue
-
-        writec("return retVal;")
-
-        if isinstance(node, MethodNode):
-            writec("#else")
-            writec("return UA_STATUSCODE_GOOD;")
-            writec("#endif /* UA_ENABLE_METHODCALLS */")
-        writec("}");
-
-        writec("\nstatic UA_StatusCode function_" + outfilebase + "_" + str(functionNumber) + "_finish(UA_Server *server, UA_UInt16* ns) {")
-
-        if isinstance(node, MethodNode):
-            writec("#ifdef UA_ENABLE_METHODCALLS")
-        writec("return " + generateNodeCode_finish(node))
-        if isinstance(node, MethodNode):
-            writec("#else")
-            writec("return UA_STATUSCODE_GOOD;")
-            writec("#endif /* UA_ENABLE_METHODCALLS */")
-        writec("}");
-
-        functionNumber = functionNumber + 1
-
-    writec("""
-UA_StatusCode %s(UA_Server *server) {
-UA_StatusCode retVal = UA_STATUSCODE_GOOD;""" % (outfilebase))
-
-    # Generate namespaces (don't worry about duplicates)
-    writec("/* Use namespace ids generated by the server */")
-    writec("UA_UInt16 ns[" + str(len(nodeset.namespaces)) + "];")
-    for i, nsid in enumerate(nodeset.namespaces):
-        nsid = nsid.replace("\"", "\\\"")
-        writec("ns[" + str(i) + "] = UA_Server_addNamespace(server, \"" + nsid + "\");")
-
-    if functionNumber > 0:
-
-        # concatenate method calls with "&&" operator.
-        # The first method which does not return UA_STATUSCODE_GOOD (=0) will cause aborting
-        # the remaining calls and retVal will be set to that error code.
-        writec("bool dummy = (")
-        for i in range(0, functionNumber):
-            writec("!(retVal = function_{outfilebase}_{idx}_begin(server, ns)) &&".format(
-                outfilebase=outfilebase, idx=str(i)))
-
-        for i in reversed(range(0, functionNumber)):
-            writec("!(retVal = function_{outfilebase}_{idx}_finish(server, ns)) {concat}".format(
-                outfilebase=outfilebase, idx=str(i), concat= "&&" if i>0 else ""))
-
-        # use (void)(dummy) to avoid unused variable error.
-        writec("); (void)(dummy);")
-
-    writec("return retVal;\n}")
-    outfileh.flush()
-    os.fsync(outfileh)
-    outfileh.close()
-    fullCode = outfilec.getvalue()
-    outfilec.close()
-
-    outfilec = codecs.open(outfilename + ".c", r"w+", encoding='utf-8')
-    outfilec.write(fullCode)
-    outfilec.flush()
-    os.fsync(outfilec)
-    outfilec.close()
-
diff --git a/ext/open62541/tools/nodeset_compiler/backend_open62541_datatypes.py b/ext/open62541/tools/nodeset_compiler/backend_open62541_datatypes.py
deleted file mode 100644
index 89445ee..0000000
--- a/ext/open62541/tools/nodeset_compiler/backend_open62541_datatypes.py
+++ /dev/null
@@ -1,132 +0,0 @@
-from datatypes import *
-import datetime
-import re
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-def generateBooleanCode(value):
-    if value:
-        return "true"
-    return "false"
-
-# Strip invalid characters to create valid C identifiers (variable names etc):
-def makeCIdentifier(value):
-    return re.sub(r'[^\w]', '', value)
-
-# Escape C strings:
-def makeCLiteral(value):
-    return re.sub(r'(?<!\\)"', r'\\"', value.replace('\\', r'\\').replace('"', r'\"').replace('\n', r'\\n').replace('\r', r''))
-
-def splitStringLiterals(value, splitLength=500):
-    """
-    Split a string literal longer than splitLength into smaller literals.
-    E.g. "Some very long text" will be split into "Some ver" "y long te" "xt"
-    On VS2008 there is a maximum allowed length of a single string literal.
-    """
-    value = value.strip()
-    if len(value) < splitLength or splitLength == 0:
-        return "\"" + re.sub(r'(?<!\\)"', r'\\"', value) + "\""
-    ret = ""
-    tmp = value
-    while len(tmp) > splitLength:
-        ret += "\"" + tmp[:splitLength].replace('"', r'\"') + "\" "
-        tmp = tmp[splitLength:]
-    ret += "\"" + re.sub(r'(?<!\\)"', r'\\"', tmp) + "\" "
-    return ret
-
-def generateStringCode(value, alloc=False):
-    value = makeCLiteral(value)
-    return u"UA_STRING{}({})".format("_ALLOC" if alloc else "", splitStringLiterals(value))
-
-def generateXmlElementCode(value, alloc=False):
-    value = makeCLiteral(value)
-    return u"UA_XMLELEMENT{}({})".format("_ALLOC" if alloc else "", splitStringLiterals(value))
-
-def generateByteStringCode(value, valueName, global_var_code, isPointer):
-    if isinstance(value, str):
-        # PY3 returns a byte array for b64decode, while PY2 returns a string.
-        # Therefore convert it to bytes
-        asciiarray = bytearray()
-        asciiarray.extend(value)
-        asciiarray = list(asciiarray)
-    else:
-        asciiarray = list(value)
-
-    asciiarraystr = str(asciiarray).rstrip(']').lstrip('[')
-    cleanValueName = re.sub(r"->", "__", re.sub(r"\.", "_", valueName))
-    global_var_code.append("static const UA_Byte {cleanValueName}_byteArray[{len}] = {{{data}}};".format(
-        len=len(asciiarray), data=asciiarraystr, cleanValueName=cleanValueName
-    ))
-    # Cast away const with '(UA_Byte *)(void*)(uintptr_t)' since we know that UA_Server_addNode_begin will copy the content
-    return "{instance}{accessor}length = {len};\n{instance}{accessor}data = (UA_Byte *)(void*)(uintptr_t){cleanValueName}_byteArray;"\
-                                                .format(len=len(asciiarray), instance=valueName, cleanValueName=cleanValueName,
-                                                        accessor='->' if isPointer else '.')
-
-def generateLocalizedTextCode(value, alloc=False):
-    vt = makeCLiteral(value.text)
-    return u"UA_LOCALIZEDTEXT{}(\"{}\", {})".format("_ALLOC" if alloc else "", '' if value.locale is None else value.locale,
-                                                   splitStringLiterals(vt))
-
-def generateQualifiedNameCode(value, alloc=False,):
-    vn = makeCLiteral(value.name)
-    return u"UA_QUALIFIEDNAME{}(ns[{}], {})".format("_ALLOC" if alloc else "",
-                                                     str(value.ns), splitStringLiterals(vn))
-
-def generateNodeIdCode(value):
-    if not value:
-        return "UA_NODEID_NUMERIC(0, 0)"
-    if value.i != None:
-        return "UA_NODEID_NUMERIC(ns[%s], %s)" % (value.ns, value.i)
-    elif value.s != None:
-        v = makeCLiteral(value.s)
-        return u"UA_NODEID_STRING(ns[%s], \"%s\")" % (value.ns, v)
-    raise Exception(str(value) + " no NodeID generation for bytestring and guid..")
-
-def generateExpandedNodeIdCode(value):
-    if value.i != None:
-        return "UA_EXPANDEDNODEID_NUMERIC(ns[%s], %s)" % (str(value.ns), str(value.i))
-    elif value.s != None:
-        vs = makeCLiteral(value.s)
-        return u"UA_EXPANDEDNODEID_STRING(ns[%s], \"%s\")" % (str(value.ns), vs)
-    raise Exception(str(value) + " no NodeID generation for bytestring and guid..")
-
-def generateDateTimeCode(value):
-    epoch = datetime.datetime.utcfromtimestamp(0)
-    mSecsSinceEpoch = int((value - epoch).total_seconds() * 1000.0)
-    return "( (UA_DateTime)(" + str(mSecsSinceEpoch) + " * UA_DATETIME_MSEC) + UA_DATETIME_UNIX_EPOCH)"
-
-def generateNodeValueCode(prepend , node, instanceName, valueName, global_var_code, asIndirect=False):
-    if type(node) in [Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float, Double]:
-        return prepend + "(UA_" + node.__class__.__name__ + ") " + str(node.value) + ";"
-    elif type(node) == String:
-        return prepend + generateStringCode(node.value, alloc=asIndirect) + ";"
-    elif type(node) == XmlElement:
-        return prepend + generateXmlElementCode(node.value, alloc=asIndirect) + ";"
-    elif type(node) == ByteString:
-        # replace whitespaces between tags and remove newlines
-        return prepend + "UA_BYTESTRING_NULL;" if not node.value else generateByteStringCode(
-            node.value, valueName, global_var_code, isPointer=asIndirect)
-        # the replacements done here is just for the array form can be workable in C code. It doesn't couses any problem
-        # because the core data used here is already in byte form. So, there is no way we disturb it.
-    elif type(node) == LocalizedText:
-        return prepend + generateLocalizedTextCode(node, alloc=asIndirect) + ";"
-    elif type(node) == NodeId:
-        return prepend + generateNodeIdCode(node) + ";"
-    elif type(node) == ExpandedNodeId:
-        return prepend + generateExpandedNodeIdCode(node) + ";"
-    elif type(node) == DateTime:
-        return prepend + generateDateTimeCode(node.value) + ";"
-    elif type(node) == QualifiedName:
-        return prepend + generateQualifiedNameCode(node.value, alloc=asIndirect) + ";"
-    elif type(node) == StatusCode:
-        raise Exception("generateNodeValueCode for type " + node.__class__.name + " not implemented")
-    elif type(node) == DiagnosticInfo:
-        raise Exception("generateNodeValueCode for type " + node.__class__.name + " not implemented")
-    elif type(node) == Guid:
-        raise Exception("generateNodeValueCode for type " + node.__class__.name + " not implemented")
-    elif type(node) == ExtensionObject:
-        if asIndirect == False:
-            return prepend + "*" + str(instanceName) + ";"
-        return prepend + str(instanceName) + ";"
diff --git a/ext/open62541/tools/nodeset_compiler/backend_open62541_nodes.py b/ext/open62541/tools/nodeset_compiler/backend_open62541_nodes.py
deleted file mode 100644
index d433073..0000000
--- a/ext/open62541/tools/nodeset_compiler/backend_open62541_nodes.py
+++ /dev/null
@@ -1,548 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-###    Copyright 2019 (c) Andrea Minosu
-###    Copyright 2018 (c) Jannis Volker
-###    Copyright 2018 (c) Ralph Lange
-
-from nodes import *
-from backend_open62541_datatypes import *
-import re
-import logging
-
-import sys
-if sys.version_info[0] >= 3:
-    # strings are already parsed to unicode
-    def unicode(s):
-        return s
-
-logger = logging.getLogger(__name__)
-
-#################
-# Generate Code #
-#################
-
-def generateNodeIdPrintable(node):
-    if isinstance(node.id, NodeId):
-        CodePrintable = node.__class__.__name__ + "_" + str(node.id)
-    else:
-        CodePrintable = node.__class__.__name__ + "_unknown_nid"
-
-    return re.sub('[^0-9a-z_]+', '_', CodePrintable.lower())
-
-def generateNodeValueInstanceName(node, parent, arrayIndex):
-    return generateNodeIdPrintable(parent) + "_" + str(node.alias) + "_" + str(arrayIndex)
-
-def generateReferenceCode(reference):
-    if reference.isForward:
-        return "retVal |= UA_Server_addReference(server, %s, %s, %s, true);" % \
-               (generateNodeIdCode(reference.source),
-                generateNodeIdCode(reference.referenceType),
-                generateExpandedNodeIdCode(reference.target))
-    else:
-        return "retVal |= UA_Server_addReference(server, %s, %s, %s, false);" % \
-               (generateNodeIdCode(reference.source),
-                generateNodeIdCode(reference.referenceType),
-                generateExpandedNodeIdCode(reference.target))
-
-def generateReferenceTypeNodeCode(node):
-    code = []
-    code.append("UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default;")
-    if node.isAbstract:
-        code.append("attr.isAbstract = true;")
-    if node.symmetric:
-        code.append("attr.symmetric  = true;")
-    if node.inverseName != "":
-        code.append("attr.inverseName  = UA_LOCALIZEDTEXT(\"\", \"%s\");" % \
-                    node.inverseName)
-    return code
-
-def generateObjectNodeCode(node):
-    code = []
-    code.append("UA_ObjectAttributes attr = UA_ObjectAttributes_default;")
-    if node.eventNotifier:
-        code.append("attr.eventNotifier = true;")
-    return code
-
-def setNodeDatatypeRecursive(node, nodeset):
-
-    if not isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode):
-        raise RuntimeError("Node {}: DataType can only be set for VariableNode and VariableTypeNode".format(str(node.id)))
-
-    if node.dataType is not None:
-        return
-
-    # If BaseVariableType
-    if node.id == NodeId("ns=0;i=62"):
-        if node.dataType is None:
-            # Set to default BaseDataType
-            node.dataType = NodeId("ns=0;i=24")
-        return
-
-    if isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode):
-        typeDefNode = nodeset.getNodeTypeDefinition(node)
-        if typeDefNode is None:
-            # Use the parent type.
-            raise RuntimeError("Cannot get node for HasTypeDefinition of VariableNode " + node.browseName.name + " " + str(node.id))
-
-        setNodeDatatypeRecursive(typeDefNode, nodeset)
-
-        node.dataType = typeDefNode.dataType
-    else:
-        # Use the parent type.
-        if node.parent is None:
-            raise RuntimeError("Parent node not defined for " + node.browseName.name + " " + str(node.id))
-
-        setNodeDatatypeRecursive(node.parent, nodeset)
-        node.dataType = node.parent.dataType
-
-def setNodeValueRankRecursive(node, nodeset):
-
-    if not isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode):
-        raise RuntimeError("Node {}: ValueRank can only be set for VariableNode and VariableTypeNode".format(str(node.id)))
-
-    if node.valueRank is not None:
-        return
-
-    # If BaseVariableType
-    if node.id == NodeId("ns=0;i=62"):
-        if node.valueRank is None:
-            # BaseVariableType always has -2
-            node.valueRank = -2
-        return
-
-    if isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode):
-        typeDefNode = nodeset.getNodeTypeDefinition(node)
-        if typeDefNode is None:
-            # Use the parent type.
-            raise RuntimeError("Cannot get node for HasTypeDefinition of VariableNode " + node.browseName.name + " " + str(node.id))
-        if not isinstance(typeDefNode, VariableTypeNode):
-            raise RuntimeError("Node {} ({}) has an invalid type definition. {} is not a VariableType node.".format(
-                str(node.id), node.browseName.name, str(typeDefNode.id)))
-
-
-        setNodeValueRankRecursive(typeDefNode, nodeset)
-
-        if typeDefNode.valueRank is not None and typeDefNode.valueRank > -1:
-            node.valueRank = typeDefNode.valueRank
-        else:
-            # Default value
-            node.valueRank = -1
-    else:
-        # Check if parent node limits the value rank
-        setNodeValueRankRecursive(node.parent, nodeset)
-
-
-        if node.parent.valueRank is not None and node.parent.valueRank > -1:
-            node.valueRank = node.parent.valueRank
-        else:
-            # Default value
-            node.valueRank = -1
-
-
-def generateCommonVariableCode(node, nodeset):
-    code = []
-    codeCleanup = []
-    codeGlobal = []
-
-    if node.valueRank is None:
-        # Set the constrained value rank from the type/parent node
-        setNodeValueRankRecursive(node, nodeset)
-        code.append("/* Value rank inherited */")
-
-    code.append("attr.valueRank = %d;" % node.valueRank)
-    if node.valueRank > 0:
-        code.append("attr.arrayDimensionsSize = %d;" % node.valueRank)
-        code.append("UA_UInt32 arrayDimensions[{}];".format(node.valueRank))
-        if len(node.arrayDimensions) == node.valueRank:
-            for idx, v in enumerate(node.arrayDimensions):
-                code.append("arrayDimensions[{}] = {};".format(idx, int(str(v))))
-        else:
-            for dim in range(0, node.valueRank):
-                code.append("arrayDimensions[{}] = 0;".format(dim))
-        code.append("attr.arrayDimensions = &arrayDimensions[0];")
-
-    if node.dataType is None:
-        # Inherit the datatype from the HasTypeDefinition reference, as stated in the OPC UA Spec:
-        # 6.4.2
-        # "Instances inherit the initial values for the Attributes that they have in common with the
-        # TypeDefinitionNode from which they are instantiated, with the exceptions of the NodeClass and
-        # NodeId."
-        setNodeDatatypeRecursive(node, nodeset)
-        code.append("/* DataType inherited */")
-
-    dataTypeNode = nodeset.getBaseDataType(nodeset.getDataTypeNode(node.dataType))
-
-    if dataTypeNode is None:
-        raise RuntimeError("Cannot get BaseDataType for dataType : " + str(node.dataType) + " of node " + node.browseName.name + " " + str(node.id))
-
-    code.append("attr.dataType = %s;" % generateNodeIdCode(node.dataType))
-
-    if dataTypeNode.isEncodable():
-        if node.value is not None:
-            [code1, codeCleanup1, codeGlobal1] = generateValueCode(node.value, nodeset.nodes[node.id], nodeset)
-            code += code1
-            codeCleanup += codeCleanup1
-            codeGlobal += codeGlobal1
-            # #1978 Variant arrayDimensions are only required to properly decode multidimensional arrays
-            # (valueRank > 1) from data stored as one-dimensional array of arrayLength elements.
-            # One-dimensional arrays are already completely defined by arraylength attribute so setting
-            # also arrayDimensions, even if not explicitly forbidden, can confuse clients
-            if node.valueRank is not None and node.valueRank > 1 and len(node.arrayDimensions) == node.valueRank and len(node.value.value) > 0:
-                numElements = 1
-                hasZero = False
-                for v in node.arrayDimensions:
-                    dim = int(unicode(v))
-                    if dim > 0:
-                        numElements = numElements * dim
-                    else:
-                        hasZero = True
-                if hasZero == False and len(node.value.value) == numElements:
-                    code.append("attr.value.arrayDimensionsSize = attr.arrayDimensionsSize;")
-                    code.append("attr.value.arrayDimensions = attr.arrayDimensions;")
-    elif node.value is not None:
-        code.append("/* Cannot encode the value */")
-        logger.warn("Cannot encode dataTypeNode: " + dataTypeNode.browseName.name + " for value of node " + node.browseName.name + " " + str(node.id))
-
-    return [code, codeCleanup, codeGlobal]
-
-def generateVariableNodeCode(node, nodeset):
-    code = []
-    codeCleanup = []
-    codeGlobal = []
-    code.append("UA_VariableAttributes attr = UA_VariableAttributes_default;")
-    if node.historizing:
-        code.append("attr.historizing = true;")
-    code.append("attr.minimumSamplingInterval = %f;" % node.minimumSamplingInterval)
-    code.append("attr.userAccessLevel = %d;" % node.userAccessLevel)
-    code.append("attr.accessLevel = %d;" % node.accessLevel)
-    # in order to be compatible with mostly OPC UA client
-    # force valueRank = -1 for scalar VariableNode
-    if node.valueRank == -2 and node.value is not None and len(node.value.value) == 1:
-        node.valueRank = -1
-    [code1, codeCleanup1, codeGlobal1] = generateCommonVariableCode(node, nodeset)
-    code += code1
-    codeCleanup += codeCleanup1
-    codeGlobal += codeGlobal1
-
-    return [code, codeCleanup, codeGlobal]
-
-def generateVariableTypeNodeCode(node, nodeset):
-    code = []
-    codeCleanup = []
-    codeGlobal = []
-    code.append("UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default;")
-    if node.isAbstract:
-        code.append("attr.isAbstract = true;")
-    [code1, codeCleanup1, codeGlobal1] = generateCommonVariableCode(node, nodeset)
-    code += code1
-    codeCleanup += codeCleanup1
-    codeGlobal += codeGlobal1
-
-    return [code, codeCleanup, codeGlobal]
-
-def lowerFirstChar(inputString):
-    return inputString[0].lower() + inputString[1:]
-
-def generateExtensionObjectSubtypeCode(node, parent, nodeset, global_var_code, instanceName=None, isArrayElement=False):
-    code = [""]
-    codeCleanup = [""]
-
-    logger.debug("Building extensionObject for " + str(parent.id))
-    logger.debug("Value    " + str(node.value))
-    logger.debug("Encoding " + str(node.encodingRule))
-
-    typeBrowseNode = makeCIdentifier(nodeset.getDataTypeNode(parent.dataType).browseName.name)
-    #TODO: review this
-    if typeBrowseNode == "NumericRange":
-        # in the stack we define a separate structure for the numeric range, but
-        # the value itself is just a string
-        typeBrowseNode = "String"
-
-
-    typeString = "UA_" + typeBrowseNode
-    if instanceName is None:
-        instanceName = generateNodeValueInstanceName(node, parent, 0)
-        code.append("UA_STACKARRAY(" + typeString + ", " + instanceName + ", 1);")
-    typeArr = nodeset.getDataTypeNode(parent.dataType).typesArray
-    typeString = nodeset.getDataTypeNode(parent.dataType).browseName.name.upper()
-    typeArrayString = typeArr + "[" + typeArr + "_" + typeString + "]"
-    code.append("UA_init({ref}{instanceName}, &{typeArrayString});".format(ref="&" if isArrayElement else "",
-                                                                           instanceName=instanceName,
-                                                                           typeArrayString=typeArrayString))
-
-    # Assign data to the struct contents
-    # Track the encoding rule definition to detect arrays and/or ExtensionObjects
-    values = node.value
-    if values == None:
-        values = []
-    for idx,subv in enumerate(values):
-        encField = node.encodingRule[idx]
-        memberName = lowerFirstChar(encField[0])
-
-        # Check if this is an array
-        accessor = "." if isArrayElement else "->"
-
-        if isinstance(subv, list):
-            if len(subv) == 0:
-                continue
-            logger.info("ExtensionObject contains array")
-            memberName = lowerFirstChar(encField[0])
-            encTypeString = "UA_" + subv[0].__class__.__name__
-            instanceNameSafe = makeCIdentifier(instanceName)
-            code.append("UA_STACKARRAY(" + encTypeString + ", " + instanceNameSafe + "_" + memberName+", {0});".format(len(subv)))
-            encTypeArr = nodeset.getDataTypeNode(subv[0].__class__.__name__).typesArray
-            encTypeArrayString = encTypeArr + "[" + encTypeArr + "_" + subv[0].__class__.__name__.upper() + "]"
-            code.append("UA_init({instanceName}, &{typeArrayString});".format(instanceName=instanceNameSafe + "_" + memberName,
-                                                                              typeArrayString=encTypeArrayString))
-
-            for subArrayIdx,val in enumerate(subv):
-                code.append(generateNodeValueCode(instanceNameSafe + "_" + memberName + "[" + str(subArrayIdx) + "]" +" = ",
-                                                  val, instanceName,instanceName + "_gehtNed_member", global_var_code, asIndirect=False))
-            code.append(instanceName + accessor + memberName + " = " + instanceNameSafe+"_"+ memberName+";")
-            continue
-
-        logger.debug("Encoding of field " + memberName + " is " + str(subv.encodingRule) + "defined by " + str(encField))
-        if subv.valueRank is None or subv.valueRank == 0:
-            if not subv.isNone():
-                # Some values can be optional
-                valueName = instanceName + accessor + memberName
-                code.append(generateNodeValueCode(valueName + " = " ,
-                            subv, instanceName,valueName, global_var_code, asIndirect=False))
-        else:
-            memberName = lowerFirstChar(encField[0])
-            code.append(generateNodeValueCode(instanceName + accessor + memberName + "Size = ", subv,
-                                              instanceName,valueName, global_var_code, asIndirect=False))
-
-    if not isArrayElement:
-        code.append("UA_Variant_setScalar(&attr.value, " + instanceName + ", &" + typeArrayString + ");")
-
-    return [code, codeCleanup]
-
-def getTypeBrowseName(dataTypeNode):
-    typeBrowseName = makeCIdentifier(dataTypeNode.browseName.name)
-    #TODO: review this
-    if typeBrowseName == "NumericRange":
-        # in the stack we define a separate structure for the numeric range, but
-        # the value itself is just a string
-        typeBrowseName = "String"
-    return typeBrowseName
-
-def getTypesArrayForValue(nodeset, value):
-    typeNode = nodeset.getNodeByBrowseName(value.__class__.__name__)
-    if typeNode is None or value.isInternal:
-        typesArray = "UA_TYPES"
-    else:
-        typesArray = typeNode.typesArray
-    typeName = makeCIdentifier(value.__class__.__name__.upper())
-    return "&" + typesArray + "[" + typesArray + "_" + typeName + "]"
-
-
-def isArrayVariableNode(node, parentNode):
-    return parentNode.valueRank is not None and (parentNode.valueRank != -1 and (parentNode.valueRank >= 0
-                                       or (len(node.value) > 1
-                                           and (parentNode.valueRank != -2 or parentNode.valueRank != -3))))
-
-def generateValueCode(node, parentNode, nodeset, bootstrapping=True):
-    code = []
-    codeCleanup = []
-    codeGlobal = []
-    valueName = generateNodeIdPrintable(parentNode) + "_variant_DataContents"
-
-    # node.value either contains a list of multiple identical BUILTINTYPES, or it
-    # contains a single builtintype (which may be a container); choose if we need
-    # to create an array or a single variable.
-    # Note that some genious defined that there are arrays of size 1, which are
-    # distinctly different then a single value, so we need to check that as well
-    # Semantics:
-    # -3: Scalar or 1-dim
-    # -2: Scalar or x-dim | x>0
-    # -1: Scalar
-    #  0: x-dim | x>0
-    #  n: n-dim | n>0
-    if (len(node.value) == 0):
-        return ["", "", ""]
-    if not isinstance(node.value[0], Value):
-        return ["", "", ""]
-
-    dataTypeNode = nodeset.getDataTypeNode(parentNode.dataType)
-
-    if isArrayVariableNode(node, parentNode):
-        # User the following strategy for all directly mappable values a la 'UA_Type MyInt = (UA_Type) 23;'
-        if isinstance(node.value[0], Guid):
-            logger.warn("Don't know how to print array of GUID in node " + str(parentNode.id))
-        elif isinstance(node.value[0], DiagnosticInfo):
-            logger.warn("Don't know how to print array of DiagnosticInfo in node " + str(parentNode.id))
-        elif isinstance(node.value[0], StatusCode):
-            logger.warn("Don't know how to print array of StatusCode in node " + str(parentNode.id))
-        else:
-            if isinstance(node.value[0], ExtensionObject):
-                code.append("UA_" + getTypeBrowseName(dataTypeNode) + " " + valueName + "[" + str(len(node.value)) + "];")
-                for idx, v in enumerate(node.value):
-                    logger.debug("Building extObj array index " + str(idx))
-                    instanceName = valueName + "[" + str(idx) + "]"
-                    [code1, codeCleanup1] = generateExtensionObjectSubtypeCode(v, parent=parentNode, nodeset=nodeset,
-                                                                               global_var_code=codeGlobal, instanceName=instanceName,
-                                                                               isArrayElement=True)
-                    code = code + code1
-                    codeCleanup = codeCleanup + codeCleanup1
-            else:
-                code.append("UA_" + node.value[0].__class__.__name__ + " " + valueName + "[" + str(len(node.value)) + "];")
-                for idx, v in enumerate(node.value):
-                    instanceName = generateNodeValueInstanceName(v, parentNode, idx)
-                    code.append(generateNodeValueCode(
-                        valueName + "[" + str(idx) + "] = " , v, instanceName, valueName, codeGlobal))
-            code.append("UA_Variant_setArray(&attr.value, &" + valueName +
-                        ", (UA_Int32) " + str(len(node.value)) + ", " + "&" +
-                        dataTypeNode.typesArray + "["+dataTypeNode.typesArray + "_" + getTypeBrowseName(dataTypeNode).upper() +"]);")
-    #scalar value
-    else:
-        # User the following strategy for all directly mappable values a la 'UA_Type MyInt = (UA_Type) 23;'
-        if isinstance(node.value[0], Guid):
-            logger.warn("Don't know how to print scalar GUID in node " + str(parentNode.id))
-        elif isinstance(node.value[0], DiagnosticInfo):
-            logger.warn("Don't know how to print scalar DiagnosticInfo in node " + str(parentNode.id))
-        elif isinstance(node.value[0], StatusCode):
-            logger.warn("Don't know how to print scalar StatusCode in node " + str(parentNode.id))
-        else:
-            # The following strategy applies to all other types, in particular strings and numerics.
-            if isinstance(node.value[0], ExtensionObject):
-                [code1, codeCleanup1] = generateExtensionObjectSubtypeCode(node.value[0], parent=parentNode, nodeset=nodeset,
-                                                                           global_var_code=codeGlobal, isArrayElement=False)
-                code = code + code1
-                codeCleanup = codeCleanup + codeCleanup1
-            instanceName = generateNodeValueInstanceName(node.value[0], parentNode, 0)
-            if not node.value[0].isNone() and not(isinstance(node.value[0], ExtensionObject)):
-                code.append("UA_" + node.value[0].__class__.__name__ + " *" + valueName + " =  UA_" + node.value[
-                    0].__class__.__name__ + "_new();")
-                code.append("if (!" + valueName + ") return UA_STATUSCODE_BADOUTOFMEMORY;")
-                code.append("UA_" + node.value[0].__class__.__name__ + "_init(" + valueName + ");")
-                code.append(generateNodeValueCode("*" + valueName + " = " , node.value[0], instanceName, valueName, codeGlobal, asIndirect=True))
-                code.append(
-                        "UA_Variant_setScalar(&attr.value, " + valueName + ", " +
-                        getTypesArrayForValue(nodeset, node.value[0]) + ");")
-                if node.value[0].__class__.__name__ == "ByteString":
-                    # The data is on the stack, not heap, so we can not delete the ByteString
-                    codeCleanup.append("{}->data = NULL;".format(valueName))
-                    codeCleanup.append("{}->length = 0;".format(valueName))
-                codeCleanup.append("UA_{0}_delete({1});".format(
-                    node.value[0].__class__.__name__, valueName))
-    return [code, codeCleanup, codeGlobal]
-
-def generateMethodNodeCode(node):
-    code = []
-    code.append("UA_MethodAttributes attr = UA_MethodAttributes_default;")
-    if node.executable:
-        code.append("attr.executable = true;")
-    if node.userExecutable:
-        code.append("attr.userExecutable = true;")
-    return code
-
-def generateObjectTypeNodeCode(node):
-    code = []
-    code.append("UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;")
-    if node.isAbstract:
-        code.append("attr.isAbstract = true;")
-    return code
-
-def generateDataTypeNodeCode(node):
-    code = []
-    code.append("UA_DataTypeAttributes attr = UA_DataTypeAttributes_default;")
-    if node.isAbstract:
-        code.append("attr.isAbstract = true;")
-    return code
-
-def generateViewNodeCode(node):
-    code = []
-    code.append("UA_ViewAttributes attr = UA_ViewAttributes_default;")
-    if node.containsNoLoops:
-        code.append("attr.containsNoLoops = true;")
-    code.append("attr.eventNotifier = (UA_Byte)%s;" % str(node.eventNotifier))
-    return code
-
-def generateSubtypeOfDefinitionCode(node):
-    for ref in node.inverseReferences:
-        # 45 = HasSubtype
-        if ref.referenceType.i == 45:
-            return generateNodeIdCode(ref.target)
-    return "UA_NODEID_NULL"
-
-def generateNodeCode_begin(node, nodeset, code_global):
-    code = []
-    codeCleanup = []
-    code.append("UA_StatusCode retVal = UA_STATUSCODE_GOOD;")
-
-    # Attributes
-    if isinstance(node, ReferenceTypeNode):
-        code.extend(generateReferenceTypeNodeCode(node))
-    elif isinstance(node, ObjectNode):
-        code.extend(generateObjectNodeCode(node))
-    elif isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode):
-        [code1, codeCleanup1, codeGlobal1] = generateVariableNodeCode(node, nodeset)
-        code.extend(code1)
-        codeCleanup.extend(codeCleanup1)
-        code_global.extend(codeGlobal1)
-    elif isinstance(node, VariableTypeNode):
-        [code1, codeCleanup1, codeGlobal1] = generateVariableTypeNodeCode(node, nodeset)
-        code.extend(code1)
-        codeCleanup.extend(codeCleanup1)
-        code_global.extend(codeGlobal1)
-    elif isinstance(node, MethodNode):
-        code.extend(generateMethodNodeCode(node))
-    elif isinstance(node, ObjectTypeNode):
-        code.extend(generateObjectTypeNodeCode(node))
-    elif isinstance(node, DataTypeNode):
-        code.extend(generateDataTypeNodeCode(node))
-    elif isinstance(node, ViewNode):
-        code.extend(generateViewNodeCode(node))
-    if node.displayName is not None:
-        code.append("attr.displayName = " + generateLocalizedTextCode(node.displayName, alloc=False) + ";")
-    if node.description is not None:
-        code.append("#ifdef UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS")
-        code.append("attr.description = " + generateLocalizedTextCode(node.description, alloc=False) + ";")
-        code.append("#endif")
-    if node.writeMask is not None:
-        code.append("attr.writeMask = %d;" % node.writeMask)
-    if node.userWriteMask is not None:
-        code.append("attr.userWriteMask = %d;" % node.userWriteMask)
-
-    # AddNodes call
-    code.append("retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_{},".
-            format(makeCIdentifier(node.__class__.__name__.upper().replace("NODE" ,""))))
-    code.append(generateNodeIdCode(node.id) + ",")
-    code.append(generateNodeIdCode(node.parent.id if node.parent else NodeId()) + ",")
-    code.append(generateNodeIdCode(node.parentReference.id if node.parent else NodeId()) + ",")
-    code.append(generateQualifiedNameCode(node.browseName) + ",")
-    if isinstance(node, VariableNode) or isinstance(node, ObjectNode):
-        typeDefRef = node.popTypeDef()
-        code.append(generateNodeIdCode(typeDefRef.target) + ",")
-    else:
-        code.append(" UA_NODEID_NULL,")
-    code.append("(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_{}ATTRIBUTES],NULL, NULL);".
-            format(makeCIdentifier(node.__class__.__name__.upper().replace("NODE" ,""))))
-    code.extend(codeCleanup)
-
-    return "\n".join(code)
-
-def generateNodeCode_finish(node):
-    code = []
-
-    if isinstance(node, MethodNode):
-        code.append("UA_Server_addMethodNode_finish(server, ")
-    else:
-        code.append("UA_Server_addNode_finish(server, ")
-    code.append(generateNodeIdCode(node.id))
-
-    if isinstance(node, MethodNode):
-        code.append(", NULL, 0, NULL, 0, NULL);")
-    else:
-        code.append(");")
-
-    return "\n".join(code)
diff --git a/ext/open62541/tools/nodeset_compiler/datatypes.py b/ext/open62541/tools/nodeset_compiler/datatypes.py
deleted file mode 100644
index dcebe98..0000000
--- a/ext/open62541/tools/nodeset_compiler/datatypes.py
+++ /dev/null
@@ -1,738 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-
-import sys
-import logging
-import re
-from datetime import datetime
-import xml.dom.minidom as dom
-from base64 import *
-
-__all__ = ['valueIsInternalType', 'Value', 'Boolean', 'Number', 'Integer',
-           'UInteger', 'Byte', 'SByte',
-           'Int16', 'UInt16', 'Int32', 'UInt32', 'Int64', 'UInt64', 'Float', 'Double',
-           'String', 'XmlElement', 'ByteString', 'ExtensionObject', 'LocalizedText',
-           'NodeId', 'ExpandedNodeId', 'DateTime', 'QualifiedName', 'StatusCode',
-           'DiagnosticInfo', 'Guid']
-
-logger = logging.getLogger(__name__)
-
-if sys.version_info[0] >= 3:
-    # strings are already parsed to unicode
-    def unicode(s):
-        return s
-
-    string_types = str
-else:
-    string_types = basestring 
-
-def getNextElementNode(xmlvalue):
-    if xmlvalue is None:
-        return None
-    xmlvalue = xmlvalue.nextSibling
-    while not xmlvalue is None and not xmlvalue.nodeType == xmlvalue.ELEMENT_NODE:
-        xmlvalue = xmlvalue.nextSibling
-    return xmlvalue
-
-def valueIsInternalType(valueTypeString):
-    return valueTypeString.lower() in ['boolean', 'number', 'int32', 'uint32', 'int16', 'uint16',
-                   'int64', 'uint64', 'byte', 'sbyte', 'float', 'double',
-                   'string', 'bytestring', 'localizedtext', 'statuscode',
-                   'diagnosticinfo', 'nodeid', 'guid', 'datetime',
-                   'qualifiedname', 'expandednodeid', 'xmlelement', 'integer', 'uinteger']
-
-class Value(object):
-    def __init__(self):
-        self.value = None
-        self.alias = None
-        self.dataType = None
-        self.encodingRule = []
-        self.isInternal = False
-        self.valueRank = None
-
-    def getValueFieldByAlias(self, fieldname):
-        if not isinstance(self.value, list):
-            return None
-        if not isinstance(self.value[0], Value):
-            return None
-        for val in self.value:
-            if val.alias() == fieldname:
-                return val.value
-        return None
-
-    def getTypeByString(self, stringName, encodingRule):
-        stringName = str(stringName.lower())
-        if stringName == 'boolean':
-            t = Boolean()
-        elif stringName == 'number':
-            t = Number()
-        elif stringName == 'integer':
-            t = Integer()
-        elif stringName == 'uinteger':
-            t = UInteger()
-        elif stringName == 'int32':
-            t = Int32()
-        elif stringName == 'uint32':
-            t = UInt32()
-        elif stringName == 'int16':
-            t = Int16()
-        elif stringName == 'uint16':
-            t = UInt16()
-        elif stringName == 'int64':
-            t = Int64()
-        elif stringName == 'uint64':
-            t = UInt64()
-        elif stringName == 'byte':
-            t = Byte()
-        elif stringName == 'sbyte':
-            t = SByte()
-        elif stringName == 'float':
-            t = Float()
-        elif stringName == 'double':
-            t = Double()
-        elif stringName == 'string':
-            t = String()
-        elif stringName == 'bytestring':
-            t = ByteString()
-        elif stringName == 'localizedtext':
-            t = LocalizedText()
-        elif stringName == 'statuscode':
-            t = StatusCode()
-        elif stringName == 'diagnosticinfo':
-            t = DiagnosticInfo()
-        elif stringName == 'nodeid':
-            t = NodeId()
-        elif stringName == 'guid':
-            t = Guid()
-        elif stringName == 'datetime':
-            t = DateTime()
-        elif stringName == 'qualifiedname':
-            t = QualifiedName()
-        elif stringName == 'expandednodeid':
-            t = ExpandedNodeId()
-        elif stringName == 'xmlelement':
-            t = XmlElement()
-        else:
-            logger.debug("No class representing stringName " + stringName + " was found. Cannot create builtinType.")
-            return None
-        t.encodingRule = encodingRule
-        return t
-
-    def checkXML(self, xmlvalue):
-        if xmlvalue is None or xmlvalue.nodeType != xmlvalue.ELEMENT_NODE:
-            logger.error("Expected XML Element, but got junk...")
-            return
-
-    def parseXMLEncoding(self, xmlvalue, parentDataTypeNode, parent):
-        self.checkXML(xmlvalue)
-        if not "value" in xmlvalue.localName.lower():
-            logger.error("Expected <Value> , but found " + xmlvalue.localName + \
-                         " instead. Value will not be parsed.")
-            return
-
-        if len(xmlvalue.childNodes) == 0:
-            logger.error("Expected childnodes for value, but none were found...")
-            return
-
-        for n in xmlvalue.childNodes:
-            if n.nodeType == n.ELEMENT_NODE:
-                xmlvalue = n
-                break
-
-        if "ListOf" in xmlvalue.localName:
-            self.value = []
-            for el in xmlvalue.childNodes:
-                if not el.nodeType == el.ELEMENT_NODE:
-                    continue
-                val = self.__parseXMLSingleValue(el, parentDataTypeNode, parent)
-                if val is None:
-                    self.value = []
-                    return
-                self.value.append(val)
-        else:
-            self.value = [self.__parseXMLSingleValue(xmlvalue, parentDataTypeNode, parent)]
-
-    def __parseXMLSingleValue(self, xmlvalue, parentDataTypeNode, parent, alias=None, encodingPart=None, valueRank=None):
-        # Parse an encoding list such as enc = [[Int32], ['Duration', ['DateTime']]],
-        # returning a possibly aliased variable or list of variables.
-        # Keep track of aliases, as ['Duration', ['Hawaii', ['UtcTime', ['DateTime']]]]
-        # will be of type DateTime, but tagged as <Duration>2013-04-10 12:00 UTC</Duration>,
-        # and not as <Duration><Hawaii><UtcTime><String>2013-04-10 12:00 UTC</String>...
-
-        # Encoding may be partially handed down (iterative call). Only resort to
-        # type definition if we are not given a specific encoding to match
-        if encodingPart is None:
-            enc = parentDataTypeNode.getEncoding()
-        else:
-            enc = encodingPart
-
-        # Check the structure of the encoding list to determine if a type is to be
-        # returned or we need to descend further checking aliases or multipart types
-        # such as extension Objects.
-        if len(enc) == 1:
-            # 0: ['BuiltinType']          either builtin type
-            # 1: [ [ 'Alias', [...], n] ] or single alias for possible multipart
-            if isinstance(enc[0], string_types):
-                # 0: 'BuiltinType'
-                if alias is not None:
-                    if xmlvalue is not None and not xmlvalue.localName == alias and not xmlvalue.localName == enc[0]:
-                        logger.error(str(parent.id) + ": Expected XML element with tag " + alias + " but found " + xmlvalue.localName + " instead")
-                        return ExtensionObject()
-                    else:
-                        t = self.getTypeByString(enc[0], enc)
-                        t.alias = alias
-                        t.valueRank = valueRank
-
-                        if valueRank == 1:
-                            values = []
-                            for el in xmlvalue.childNodes:
-                                if not el.nodeType == el.ELEMENT_NODE:
-                                    continue
-                                val = self.getTypeByString(enc[0], enc)
-                                val.parseXML(el)
-                                values.append(val)
-                            return values
-                        else:
-                            if xmlvalue is not None:
-                                t.parseXML(xmlvalue)
-                            return t
-                else:
-                    if not valueIsInternalType(xmlvalue.localName):
-                        logger.error(str(parent.id) + ": Expected XML describing builtin type " + enc[0] + " but found " + xmlvalue.localName + " instead")
-                    else:
-                        t = self.getTypeByString(enc[0], enc)
-                        t.parseXML(xmlvalue)
-                        t.isInternal = True
-                        return t
-            else:
-                # 1: ['Alias', [...], n]
-                # Let the next elif handle this
-                return self.__parseXMLSingleValue(xmlvalue, parentDataTypeNode, parent,
-                                                  alias=alias, encodingPart=enc[0], valueRank=enc[2] if len(enc)>2 else None)
-        elif len(enc) == 3 and isinstance(enc[0], string_types):
-            # [ 'Alias', [...], 0 ]          aliased multipart
-            if alias is None:
-                alias = enc[0]
-            # if we have an alias and the next field is multipart, keep the alias
-            elif alias is not None and len(enc[1]) > 1:
-                alias = enc[0]
-            # otherwise drop the alias
-            return self.__parseXMLSingleValue(xmlvalue, parentDataTypeNode, parent,
-                                              alias=alias, encodingPart=enc[1], valueRank=enc[2] if len(enc)>2 else None)
-        else:
-            # [ [...], [...], [...]] multifield of unknowns (analyse separately)
-            # create an extension object to hold multipart type
-
-            # FIXME: This implementation expects an extensionobject to be manditory for
-            #        multipart variables. Variants/Structures are not included in the
-            #        OPCUA Namespace 0 nodeset.
-            #        Consider moving this ExtensionObject specific parsing into the
-            #        builtin type and only determining the multipart type at this stage.
-            extobj = ExtensionObject()
-            if not xmlvalue.localName == "ExtensionObject":
-                logger.error(str(parent.id) + ": Expected XML tag <ExtensionObject> for multipart type, but found " + xmlvalue.localName + " instead.")
-                return extobj
-
-            extobj.encodingRule = enc
-            etype = xmlvalue.getElementsByTagName("TypeId")
-            if len(etype) == 0:
-                logger.error(str(parent.id) + ": Did not find <TypeId> for ExtensionObject")
-                return extobj
-            etype = etype[0].getElementsByTagName("Identifier")
-            if len(etype) == 0:
-                logger.error(str(parent.id) + ": Did not find <Identifier> for ExtensionObject")
-                return extobj
-
-            etype = NodeId(etype[0].firstChild.data.strip(' \t\n\r'))
-            extobj.typeId = etype
-
-            ebody = xmlvalue.getElementsByTagName("Body")
-            if len(ebody) == 0:
-                logger.error(str(parent.id) + ": Did not find <Body> for ExtensionObject")
-                return extobj
-            ebody = ebody[0]
-
-            try:
-                # Body must contain an Object of type 'DataType' as defined in Variable
-                ebodypart = ebody.firstChild
-                if not ebodypart.nodeType == ebodypart.ELEMENT_NODE:
-                    ebodypart = getNextElementNode(ebodypart)
-                if ebodypart is None:
-                    logger.error(str(parent.id) + ": Expected ExtensionObject to hold a variable of type " + str(parentDataTypeNode.browseName) + " but found nothing.")
-                    return extobj
-
-                if not ebodypart.localName == "OptionSet" and not ebodypart.localName == parentDataTypeNode.browseName.name:
-                    logger.error(str(parent.id) + ": Expected ExtensionObject to hold a variable of type " + str(parentDataTypeNode.browseName) + " but found " +
-                                 str(ebodypart.localName) + " instead.")
-                    return extobj
-                extobj.alias = ebodypart.localName
-
-                ebodypart = ebodypart.firstChild
-                if not ebodypart.nodeType == ebodypart.ELEMENT_NODE:
-                    ebodypart = getNextElementNode(ebodypart)
-                if ebodypart is None:
-                    logger.error(str(parent.id) + ": Description of dataType " + str(parentDataTypeNode.browseName) + " in ExtensionObject is empty/invalid.")
-                    return extobj
-
-                extobj.value = []
-                for e in enc:
-                    extobj.value.append(extobj.__parseXMLSingleValue(ebodypart, parentDataTypeNode, parent,
-                                                                     alias=None, encodingPart=e))
-                    ebodypart = getNextElementNode(ebodypart)
-            except Exception:
-                logger.error(str(parent.id) + ": Could not parse <Body> for ExtensionObject")
-
-            return extobj
-
-    def __str__(self):
-        return self.__class__.__name__ + "(" + str(self.value) + ")"
-
-    def isNone(self):
-        return self.value is None
-
-    def __repr__(self):
-        return self.__str__()
-
-#################
-# Builtin Types #
-#################
-
-
-def getXmlTextTrimmed(xmlNode):
-    if xmlNode is None or xmlNode.data is None:
-        return None
-    content = xmlNode.data
-    # Check for empty string (including newlines)
-    if not re.sub(r"[\s\n\r]", "", content).strip():
-        return None
-    return unicode(content.strip())
-
-
-class Boolean(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        # Expect <Boolean>value</Boolean> or
-        #        <Aliasname>value</Aliasname>
-        self.checkXML(xmlvalue)
-        val = getXmlTextTrimmed(xmlvalue.firstChild)
-        if val is None:
-            self.value = "false"  # Catch XML <Boolean /> by setting the value to a default
-        else:
-            if "false" in unicode(xmlvalue.firstChild.data).lower():
-                self.value = "false"
-            else:
-                self.value = "true"
-
-class Number(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        # Expect <Int16>value</Int16> or any other valid number type, or
-        #        <Aliasname>value</Aliasname>
-        self.checkXML(xmlvalue)
-        val = getXmlTextTrimmed(xmlvalue.firstChild)
-        self.value = val if val is not None else 0
-
-class Integer(Number):
-    def __init__(self, xmlelement=None):
-        Number.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class UInteger(Number):
-    def __init__(self, xmlelement=None):
-        Number.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class Byte(UInteger):
-    def __init__(self, xmlelement=None):
-        UInteger.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class SByte(Integer):
-    def __init__(self, xmlelement=None):
-        Integer.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class Int16(Integer):
-    def __init__(self, xmlelement=None):
-        Integer.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class UInt16(UInteger):
-    def __init__(self, xmlelement=None):
-        UInteger.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class Int32(Integer):
-    def __init__(self, xmlelement=None):
-        Integer.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class UInt32(UInteger):
-    def __init__(self, xmlelement=None):
-        UInteger.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class Int64(Integer):
-    def __init__(self, xmlelement=None):
-        Integer.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class UInt64(UInteger):
-    def __init__(self, xmlelement=None):
-        UInteger.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class Float(Number):
-    def __init__(self, xmlelement=None):
-        Number.__init__(self)
-        if xmlelement:
-            Float.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlvalue):
-        # Expect <Float>value</Float> or
-        #        <Aliasname>value</Aliasname>
-        self.checkXML(xmlvalue)
-        val = getXmlTextTrimmed(xmlvalue.firstChild)
-        self.value = val if val is not None else 0.0
-
-class Double(Float):
-    def __init__(self, xmlelement=None):
-        Float.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-class String(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def pack(self):
-        bin = structpack("I", len(unicode(self.value)))
-        bin = bin + str(self.value)
-        return bin
-
-    def parseXML(self, xmlvalue):
-        # Expect <String>value</String> or
-        #        <Aliasname>value</Aliasname>
-        if not isinstance(xmlvalue, dom.Element):
-            self.value = xmlvalue
-            return
-        self.checkXML(xmlvalue)
-        val = getXmlTextTrimmed(xmlvalue.firstChild)
-        self.value = val if val is not None else ""
-
-
-class XmlElement(String):
-    def __init__(self, xmlelement=None):
-        String.__init__(self, xmlelement)
-
-class ByteString(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-
-    def parseXML(self, xmlvalue):
-        # Expect <ByteString>value</ByteString>
-        if not isinstance(xmlvalue, dom.Element):
-            self.value = xmlvalue
-            return
-        self.checkXML(xmlvalue)
-        if xmlvalue.firstChild is None:
-            self.value = []  # Catch XML <ByteString /> by setting the value to a default
-        else:
-            self.value = b64decode(xmlvalue.firstChild.data)
-
-class ExtensionObject(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlelement):
-        pass
-
-    def __str__(self):
-        return "'ExtensionObject'"
-
-class LocalizedText(Value):
-    def __init__(self, xmlvalue=None):
-        Value.__init__(self)
-        self.locale = None
-        self.text = None
-        if xmlvalue:
-            self.parseXML(xmlvalue)
-
-    def parseXML(self, xmlvalue):
-        # Expect <LocalizedText> or <AliasName>
-        #          <Locale>xx_XX</Locale>
-        #          <Text>TextText</Text>
-        #        <LocalizedText> or </AliasName>
-        if not isinstance(xmlvalue, dom.Element):
-            self.text = xmlvalue
-            return
-        self.checkXML(xmlvalue)
-        tmp = xmlvalue.getElementsByTagName("Locale")
-        if len(tmp) > 0 and tmp[0].firstChild != None:
-            self.locale = tmp[0].firstChild.data.strip(' \t\n\r')
-        tmp = xmlvalue.getElementsByTagName("Text")
-        if len(tmp) > 0 and tmp[0].firstChild != None:
-            self.text = tmp[0].firstChild.data.strip(' \t\n\r')
-
-    def __str__(self):
-        if self.locale is None and self.text is None:
-            return "None"
-        if self.locale is not None and len(self.locale) > 0:
-            return "(" + self.locale + ":" + self.text + ")"
-        else:
-            return self.text
-
-    def isNone(self):
-        return self.text is None
-
-class NodeId(Value):
-    def __init__(self, idstring=None):
-        Value.__init__(self)
-        self.i = None
-        self.b = None
-        self.g = None
-        self.s = None
-        self.ns = 0
-        self.setFromIdString(idstring)
-
-    def setFromIdString(self, idstring):
-
-        if not idstring:
-            self.i = 0
-            return
-
-        # The ID will encoding itself appropriatly as string. If multiple ID's
-        # (numeric, string, guid) are defined, the order of preference for the ID
-        # string is always numeric, guid, bytestring, string. Binary encoding only
-        # applies to numeric values (UInt16).
-        idparts = idstring.strip().split(";")
-        for p in idparts:
-            if p[:2] == "ns":
-                self.ns = int(p[3:])
-            elif p[:2] == "i=":
-                self.i = int(p[2:])
-            elif p[:2] == "o=":
-                self.b = p[2:]
-            elif p[:2] == "g=":
-                tmp = []
-                self.g = p[2:].split("-")
-                for i in self.g:
-                    i = "0x" + i
-                    tmp.append(int(i, 16))
-                self.g = tmp
-            elif p[:2] == "s=":
-                self.s = p[2:]
-            else:
-                raise Exception("no valid nodeid: " + idstring)
-
-    # The parsing can be called with an optional namespace mapping dict.
-    def parseXML(self, xmlvalue):
-        # Expect <NodeId> or <Alias>
-        #           <Identifier> # It is unclear whether or not this is manditory. Identifier tags are used in Namespace 0.
-        #                ns=x;i=y or similar string representation of id()
-        #           </Identifier>
-        #        </NodeId> or </Alias>
-        if not isinstance(xmlvalue, dom.Element):
-            self.text = xmlvalue # Alias
-            return
-        self.checkXML(xmlvalue)
-
-        # Catch XML <NodeId />
-        if xmlvalue.firstChild is None:
-            logger.error("No value is given, which is illegal for Node Types...")
-            self.value = None
-        else:
-            # Check if there is an <Identifier> tag
-            if len(xmlvalue.getElementsByTagName("Identifier")) != 0:
-                xmlvalue = xmlvalue.getElementsByTagName("Identifier")[0]
-            self.setFromIdString(unicode(xmlvalue.firstChild.data))
-
-    def __str__(self):
-        s = "ns=" + str(self.ns) + ";"
-        # Order of preference is numeric, guid, bytestring, string
-        if self.i != None:
-            return s + "i=" + str(self.i)
-        elif self.g != None:
-            s = s + "g="
-            tmp = []
-            for i in self.g:
-                tmp.append(hex(i).replace("0x", ""))
-            for i in tmp:
-                s = s + "-" + i
-            return s.replace("g=-", "g=")
-        elif self.b != None:
-            return s + "b=" + str(self.b)
-        elif self.s != None:
-            return s + "s=" + str(self.s)
-
-    def isNone(self):
-        return self.i is None and self.b is None and self.s is None and self.g is None
-
-    def __eq__(self, nodeId2):
-        return (str(self) == str(nodeId2))
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __repr__(self):
-        return str(self)
-
-    def __hash__(self):
-        return hash(str(self))
-
-class ExpandedNodeId(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        self.checkXML(xmlvalue)
-        logger.debug("Not implemented", LOG_LEVEL_ERR)
-
-class DateTime(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        # Expect <DateTime> or <AliasName>
-        #        2013-08-13T21:00:05.0000L
-        #        </DateTime> or </AliasName>
-        self.checkXML(xmlvalue)
-        timestr = getXmlTextTrimmed(xmlvalue.firstChild)
-
-        if timestr is None:
-            # Catch XML <DateTime /> by setting the value to a default
-            self.value = datetime(2001, 1, 1)
-        else:
-            # .NET tends to create this garbage %Y-%m-%dT%H:%M:%S.0000z
-            # strip everything after the "." away for a posix time_struct
-            if "." in timestr:
-                timestr = timestr[:timestr.index(".")]
-            # If the last character is not numeric, remove it
-            while len(timestr) > 0 and not timestr[-1] in "0123456789":
-                timestr = timestr[:-1]
-            try:
-                self.value = datetime.strptime(timestr, "%Y-%m-%dT%H:%M:%S")
-            except Exception:
-                try:
-                    self.value = datetime.strptime(timestr, "%Y-%m-%d")
-                except Exception:
-                    logger.error("Timestring format is illegible. Expected 2001-01-30T21:22:23 or 2001-01-30, but got " + \
-                                 timestr + " instead. Time will be defaultet to now()")
-                    self.value = datetime(2001, 1, 1)
-
-class QualifiedName(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        self.ns = 0
-        self.name = None
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        # Expect <QualifiedName> or <AliasName>
-        #           <NamespaceIndex>Int16<NamespaceIndex>
-        #           <Name>SomeString<Name>
-        #        </QualifiedName> or </AliasName>
-        if not isinstance(xmlvalue, dom.Element):
-            colonindex = xmlvalue.find(":")
-            if colonindex == -1:
-                self.name = xmlvalue
-            else:
-                self.name = xmlvalue[colonindex + 1:]
-                self.ns = int(xmlvalue[:colonindex])
-            return
-
-        self.checkXML(xmlvalue)
-        # Is a namespace index passed?
-        if len(xmlvalue.getElementsByTagName("NamespaceIndex")) != 0:
-            self.ns = int(xmlvalue.getElementsByTagName("NamespaceIndex")[0].firstChild.data)
-        if len(xmlvalue.getElementsByTagName("Name")) != 0:
-            self.name = xmlvalue.getElementsByTagName("Name")[0].firstChild.data
-
-
-    def __str__(self):
-        return "ns=" + str(self.ns) + ";" + str(self.name)
-
-    def isNone(self):
-        return self.name is None
-
-class StatusCode(UInt32):
-    def __init__(self, xmlelement=None):
-        UInt32.__init__(self, xmlelement)
-
-class DiagnosticInfo(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        self.checkXML(xmlvalue)
-        logger.warn("Not implemented")
-
-class Guid(Value):
-    def __init__(self, xmlelement=None):
-        Value.__init__(self)
-        if xmlelement:
-            self.parseXML(xmlelement)
-
-    def parseXML(self, xmlvalue):
-        self.checkXML(xmlvalue)
-
-        val = getXmlTextTrimmed(xmlvalue.firstChild)
-
-        if val is None:
-            self.value = [0, 0, 0, 0]  # Catch XML <Guid /> by setting the value to a default
-        else:
-            self.value = val
-            self.value = self.value.replace("{", "")
-            self.value = self.value.replace("}", "")
-            self.value = self.value.split("-")
-            tmp = []
-            for g in self.value:
-                try:
-                    tmp.append(int("0x" + g, 16))
-                except Exception:
-                    logger.error("Invalid formatting of Guid. Expected {01234567-89AB-CDEF-ABCD-0123456789AB}, got " + \
-                                 unicode(xmlvalue.firstChild.data))
-                    tmp = [0, 0, 0, 0, 0]
-            if len(tmp) != 5:
-                logger.error("Invalid formatting of Guid. Expected {01234567-89AB-CDEF-ABCD-0123456789AB}, got " + \
-                             unicode(xmlvalue.firstChild.data))
-                tmp = [0, 0, 0, 0]
-            self.value = tmp
diff --git a/ext/open62541/tools/nodeset_compiler/nodes.py b/ext/open62541/tools/nodeset_compiler/nodes.py
deleted file mode 100644
index da686ab..0000000
--- a/ext/open62541/tools/nodeset_compiler/nodes.py
+++ /dev/null
@@ -1,636 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-
-import sys
-import logging
-from datatypes import *
-
-__all__ = ['Reference', 'RefOrAlias', 'Node', 'ReferenceTypeNode',
-           'ObjectNode', 'VariableNode', 'VariableTypeNode',
-           'MethodNode', 'ObjectTypeNode', 'DataTypeNode', 'ViewNode']
-
-logger = logging.getLogger(__name__)
-
-if sys.version_info[0] >= 3:
-    # strings are already parsed to unicode
-    def unicode(s):
-        return s
-
-class Reference(object):
-    # all either nodeids or strings with an alias
-    def __init__(self, source, referenceType, target, isForward):
-        self.source = source
-        self.referenceType = referenceType
-        self.target = target
-        self.isForward = isForward
-
-    def __str__(self):
-        retval = str(self.source)
-        if not self.isForward:
-            retval = retval + "<"
-        retval = retval + "--[" + str(self.referenceType) + "]--"
-        if self.isForward:
-            retval = retval + ">"
-        return retval + str(self.target)
-
-    def __repr__(self):
-        return str(self)
-
-    def __eq__(self, other):
-        return str(self) == str(other)
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __hash__(self):
-        return hash(str(self))
-
-def RefOrAlias(s):
-    try:
-        return NodeId(s)
-    except Exception:
-        return s
-
-class Node(object):
-    def __init__(self):
-        self.id = None
-        self.browseName = None
-        self.displayName = None
-        self.description = None
-        self.symbolicName = None
-        self.writeMask = None
-        self.userWriteMask = None
-        self.references = set()
-        self.hidden = False
-        self.modelUri = None
-        self.parent = None
-        self.parentReference = None
-
-    def __str__(self):
-        return self.__class__.__name__ + "(" + str(self.id) + ")"
-
-    def __repr__(self):
-        return str(self)
-
-    def sanitize(self):
-        pass
-
-    def parseXML(self, xmlelement):
-        for idname in ['NodeId', 'NodeID', 'nodeid']:
-            if xmlelement.hasAttribute(idname):
-                self.id = RefOrAlias(xmlelement.getAttribute(idname))
-
-        for (at, av) in xmlelement.attributes.items():
-            if at == "BrowseName":
-                self.browseName = QualifiedName(av)
-            elif at == "DisplayName":
-                self.displayName = LocalizedText(av)
-            elif at == "Description":
-                self.description = LocalizedText(av)
-            elif at == "WriteMask":
-                self.writeMask = int(av)
-            elif at == "UserWriteMask":
-                self.userWriteMask = int(av)
-            elif at == "EventNotifier":
-                self.eventNotifier = int(av)
-            elif at == "SymbolicName":
-                self.symbolicName = String(av)
-
-        for x in xmlelement.childNodes:
-            if x.nodeType != x.ELEMENT_NODE:
-                continue
-            if x.firstChild:
-                if x.localName == "BrowseName":
-                    self.browseName = QualifiedName(x.firstChild.data)
-                elif x.localName == "DisplayName":
-                    self.displayName = LocalizedText(x.firstChild.data)
-                elif x.localName == "Description":
-                    self.description = LocalizedText(x.firstChild.data)
-                elif x.localName == "WriteMask":
-                    self.writeMask = int(unicode(x.firstChild.data))
-                elif x.localName == "UserWriteMask":
-                    self.userWriteMask = int(unicode(x.firstChild.data))
-                if x.localName == "References":
-                    self.parseXMLReferences(x)
-
-    def parseXMLReferences(self, xmlelement):
-        for ref in xmlelement.childNodes:
-            if ref.nodeType != ref.ELEMENT_NODE:
-                continue
-            source = RefOrAlias(str(self.id))  # deep-copy of the nodeid
-            target = RefOrAlias(ref.firstChild.data)
-
-            reftype = None
-            forward = True
-            for (at, av) in ref.attributes.items():
-                if at == "ReferenceType":
-                    reftype = RefOrAlias(av)
-                elif at == "IsForward":
-                    forward = not "false" in av.lower()
-            self.references.add(Reference(source, reftype, target, forward))
-
-    def getParentReference(self, parentreftypes):
-        # HasSubtype has precedence
-        for ref in self.references:
-            if ref.referenceType == NodeId("ns=0;i=45") and not ref.isForward:
-                return ref
-        for ref in self.references:
-            if ref.referenceType in parentreftypes and not ref.isForward:
-                return ref
-        return None
-
-    def popTypeDef(self):
-        for ref in self.references:
-            if ref.referenceType.i == 40 and ref.isForward:
-                self.references.remove(ref)
-                return ref
-        return Reference(NodeId(), NodeId(), NodeId(), False)
-
-    def replaceAliases(self, aliases):
-        if str(self.id) in aliases:
-            self.id = NodeId(aliases[self.id])
-        if isinstance(self, VariableNode) or isinstance(self, VariableTypeNode):
-            if str(self.dataType) in aliases:
-                self.dataType = NodeId(aliases[self.dataType])
-        new_refs = set()
-        for ref in self.references:
-            if str(ref.source) in aliases:
-                ref.source = NodeId(aliases[ref.source])
-            if str(ref.target) in aliases:
-                ref.target = NodeId(aliases[ref.target])
-            if str(ref.referenceType) in aliases:
-                ref.referenceType = NodeId(aliases[ref.referenceType])
-            new_refs.add(ref)
-        self.references = new_refs
-
-    def replaceNamespaces(self, nsMapping):
-        self.id.ns = nsMapping[self.id.ns]
-        self.browseName.ns = nsMapping[self.browseName.ns]
-        if hasattr(self, 'dataType') and isinstance(self.dataType, NodeId):
-            self.dataType.ns = nsMapping[self.dataType.ns]
-        new_refs = set()
-        for ref in self.references:
-            ref.source.ns = nsMapping[ref.source.ns]
-            ref.target.ns = nsMapping[ref.target.ns]
-            ref.referenceType.ns = nsMapping[ref.referenceType.ns]
-            new_refs.add(ref)
-        self.references = new_refs
-
-class ReferenceTypeNode(Node):
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.isAbstract = False
-        self.symmetric = False
-        self.inverseName = ""
-        if xmlelement:
-            ReferenceTypeNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "Symmetric":
-                self.symmetric = "false" not in av.lower()
-            elif at == "InverseName":
-                self.inverseName = str(av)
-            elif at == "IsAbstract":
-                self.isAbstract = "false" not in av.lower()
-
-        for x in xmlelement.childNodes:
-            if x.nodeType == x.ELEMENT_NODE:
-                if x.localName == "InverseName" and x.firstChild:
-                    self.inverseName = str(unicode(x.firstChild.data))
-
-class ObjectNode(Node):
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.eventNotifier = 0
-        if xmlelement:
-            ObjectNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "EventNotifier":
-                self.eventNotifier = int(av)
-
-class VariableNode(Node):
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.dataType = None
-        self.valueRank = None
-        self.arrayDimensions = []
-        # Set access levels to read by default
-        self.accessLevel = 1
-        self.userAccessLevel = 1
-        self.minimumSamplingInterval = 0.0
-        self.historizing = False
-        self.value = None
-        self.xmlValueDef = None
-        if xmlelement:
-            VariableNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "ValueRank":
-                self.valueRank = int(av)
-            elif at == "AccessLevel":
-                self.accessLevel = int(av)
-            elif at == "UserAccessLevel":
-                self.userAccessLevel = int(av)
-            elif at == "MinimumSamplingInterval":
-                self.minimumSamplingInterval = float(av)
-            elif at == "DataType":
-                self.dataType = RefOrAlias(av)
-            elif  at == "ArrayDimensions":
-                self.arrayDimensions = av.split(",")
-
-        for x in xmlelement.childNodes:
-            if x.nodeType != x.ELEMENT_NODE:
-                continue
-            if x.localName == "Value":
-                self.xmlValueDef = x
-            elif x.localName == "DataType":
-                self.dataType = RefOrAlias(av)
-            elif x.localName == "ValueRank":
-                self.valueRank = int(unicode(x.firstChild.data))
-            elif x.localName == "ArrayDimensions" and len(self.arrayDimensions) == 0:
-                elements = x.getElementsByTagName("ListOfUInt32");
-                if len(elements):
-                    for idx, v in enumerate(elements[0].getElementsByTagName("UInt32")):
-                        self.arrayDimensions.append(v.firstChild.data)
-            elif x.localName == "AccessLevel":
-                self.accessLevel = int(unicode(x.firstChild.data))
-            elif x.localName == "UserAccessLevel":
-                self.userAccessLevel = int(unicode(x.firstChild.data))
-            elif x.localName == "MinimumSamplingInterval":
-                self.minimumSamplingInterval = float(unicode(x.firstChild.data))
-            elif x.localName == "Historizing":
-                self.historizing = "false" not in x.lower()
-
-    def allocateValue(self, nodeset):
-        dataTypeNode = nodeset.getDataTypeNode(self.dataType)
-        if dataTypeNode is None:
-            return False
-
-        # FIXME: Don't build at all or allocate "defaults"? I'm for not building at all.
-        if self.xmlValueDef is None:
-            #logger.warn("Variable " + self.browseName() + "/" + str(self.id()) + " is not initialized. No memory will be allocated.")
-            return False
-
-        self.value = Value()
-        self.value.parseXMLEncoding(self.xmlValueDef, dataTypeNode, self)
-        return True
-
-
-class VariableTypeNode(VariableNode):
-    def __init__(self, xmlelement=None):
-        VariableNode.__init__(self)
-        self.isAbstract = False
-        if xmlelement:
-            VariableTypeNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        VariableNode.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "IsAbstract":
-                self.isAbstract = "false" not in av.lower()
-
-        for x in xmlelement.childNodes:
-            if x.nodeType != x.ELEMENT_NODE:
-                continue
-            if x.localName == "IsAbstract":
-                self.isAbstract = "false" not in av.lower()
-
-class MethodNode(Node):
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.executable = True
-        self.userExecutable = True
-        self.methodDecalaration = None
-        if xmlelement:
-            MethodNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "Executable":
-                self.executable = "false" not in av.lower()
-            if at == "UserExecutable":
-                self.userExecutable = "false" not in av.lower()
-            if at == "MethodDeclarationId":
-                self.methodDeclaration = str(av)
-
-class ObjectTypeNode(Node):
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.isAbstract = False
-        if xmlelement:
-            ObjectTypeNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "IsAbstract":
-                self.isAbstract = "false" not in av.lower()
-
-class DataTypeNode(Node):
-    """ DataTypeNode is a subtype of Node describing DataType nodes.
-
-        DataType contain definitions and structure information usable for Variables.
-        The format of this structure is determined by buildEncoding()
-        Two definition styles are distinguished in XML:
-        1) A DataType can be a structure of fields, each field having a name and a type.
-           The type must be either an encodable builtin node (ex. UInt32) or point to
-           another DataType node that inherits its encoding from a builtin type using
-           a inverse "hasSubtype" (hasSuperType) reference.
-        2) A DataType may be an enumeration, in which each field has a name and a numeric
-           value.
-        The definition is stored as an ordered list of tuples. Depending on which
-        definition style was used, the __definition__ will hold
-        1) A list of ("Fieldname", Node) tuples.
-        2) A list of ("Fieldname", int) tuples.
-
-        A DataType (and in consequence all Variables using it) shall be deemed not
-        encodable if any of its fields cannot be traced to an encodable builtin type.
-
-        A DataType shall be further deemed not encodable if it contains mixed structure/
-        enumaration definitions.
-
-        If encodable, the encoding can be retrieved using getEncoding().
-    """
-
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.isAbstract = False
-        self.__xmlDefinition__ = None
-        self.__baseTypeEncoding__ = []
-        self.__encodable__ = None
-        self.__definition__ = []
-        self.__isEnum__     = False
-        self.__isOptionSet__ = False
-        if xmlelement:
-            DataTypeNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "IsAbstract":
-                self.isAbstract = "false" not in av.lower()
-
-        for x in xmlelement.childNodes:
-            if x.nodeType == x.ELEMENT_NODE:
-                if x.localName == "Definition":
-                    self.__xmlDefinition__ = x
-
-    def isEncodable(self):
-        """ Will return True if buildEncoding() was able to determine which builtin
-            type corresponds to all fields of this DataType.
-
-            If no encoding has been build yet an exception will be thrown.
-            Make sure to call buildEncoding() first.
-        """
-        if self.__encodable__ is None:
-            raise Exception("Encoding needs to be built first using buildEncoding()")
-        return self.__encodable__
-
-    def getEncoding(self):
-        """ If the dataType is encodable, getEncoding() returns a nested list
-            containing the encoding the structure definition for this type.
-
-            If no encoding has been build yet an exception will be thrown.
-            Make sure to call buildEncoding() first.
-
-            If buildEncoding() has failed, an empty list will be returned.
-        """
-        if self.__encodable__ is None:
-            raise Exception("Encoding needs to be built first using buildEncoding()")
-        if not self.__encodable__:
-            return []
-        else:
-            return self.__baseTypeEncoding__
-
-
-    def buildEncoding(self, nodeset, indent=0, force=False, namespaceMapping=None):
-        """ buildEncoding() determines the structure and aliases used for variables
-            of this DataType.
-
-            The function will parse the XML <Definition> of the dataType and extract
-            "Name"-"Type" tuples. If successful, buildEncoding will return a nested
-            list of the following format:
-
-            [['Alias1', ['Alias2', ['BuiltinType']]], [Alias2, ['BuiltinType']], ...]
-
-            Aliases are fieldnames defined by this DataType or DataTypes referenced. A
-            list such as ['DataPoint', ['Int32']] indicates that a value will encode
-            an Int32 with the alias 'DataPoint' such as <DataPoint>12827</DataPoint>.
-            Only the first Alias of a nested list is considered valid for the BuiltinType.
-
-            Single-Elemented lists are always BuiltinTypes. Every nested list must
-            converge in a builtin type to be encodable. buildEncoding will follow
-            the first type inheritance reference (hasSupertype) of the dataType if
-            necessary;
-
-            If instead to "DataType" a numeric "Value" attribute is encountered,
-            the DataType will be considered an enumeration and all Variables using
-            it will be encoded as Int32.
-
-            DataTypes can be either structures or enumeration - mixed definitions will
-            be unencodable.
-
-            Calls to getEncoding() will be iterative. buildEncoding() can be called
-            only once per dataType, with all following calls returning the predetermined
-            value. Use of the 'force=True' parameter will force the Definition to be
-            reparsed.
-
-            After parsing, __definition__ holds the field definition as a list. Note
-            that this might deviate from the encoding, especially if inheritance was
-            used.
-        """
-
-        prefix = " " + "|" * indent + "+"
-
-        if force==True:
-            self.__encodable__ = None
-
-        if self.__encodable__ is not None and self.__encodable__:
-            if self.isEncodable():
-                logger.debug(prefix + str(self.__baseTypeEncoding__) + " (already analyzed)")
-            else:
-                logger.debug( prefix + str(self.__baseTypeEncoding__) + "(already analyzed, not encodable!)")
-            return self.__baseTypeEncoding__
-
-        self.__encodable__ = True
-
-        if indent==0:
-            logger.debug("Parsing DataType " + str(self.browseName) + " (" + str(self.id) + ")")
-
-        if valueIsInternalType(self.browseName.name):
-            self.__baseTypeEncoding__ = [self.browseName.name]
-            self.__encodable__ = True
-            logger.debug( prefix + str(self.browseName) + "*")
-            logger.debug("Encodable as: " + str(self.__baseTypeEncoding__))
-            logger.debug("")
-            return self.__baseTypeEncoding__
-
-
-        # Check if there is a supertype available
-        parentType = None
-        for ref in self.references:
-            if ref.isForward:
-                continue
-                # hasSubtype
-            if ref.referenceType.i == 45:
-                targetNode = nodeset.nodes[ref.target]
-                if targetNode is not None and isinstance(targetNode, DataTypeNode):
-                    parentType = targetNode
-                    break
-
-        if self.__xmlDefinition__ is None:
-            if parentType is not None:
-                logger.debug( prefix + "Attempting definition using supertype " + str(targetNode.browseName) + " for DataType " + " " + str(self.browseName))
-                subenc = targetNode.buildEncoding(nodeset=nodeset, indent=indent+1,
-                                                  namespaceMapping=namespaceMapping)
-                if not targetNode.isEncodable():
-                    self.__encodable__ = False
-                else:
-                    self.__baseTypeEncoding__ = self.__baseTypeEncoding__ + [self.browseName.name, subenc, None]
-            if len(self.__baseTypeEncoding__) == 0:
-                logger.debug(prefix + "No viable definition for " + str(self.browseName) + " " + str(self.id) + " found.")
-                self.__encodable__ = False
-
-            if indent==0:
-                if not self.__encodable__:
-                    logger.debug("Not encodable (partial): " + str(self.__baseTypeEncoding__))
-                else:
-                    logger.debug("Encodable as: " + str(self.__baseTypeEncoding__))
-                logger.debug( "")
-
-            return self.__baseTypeEncoding__
-
-        isEnum = False
-        # An option set is at the same time also an enum, at least for the encoding below
-        isOptionSet = parentType is not None and parentType.id.ns == 0 and parentType.id.i==12755
-
-        # We need to store the definition as ordered data, but can't use orderedDict
-        # for backward compatibility with Python 2.6 and 3.4
-        enumDict = []
-        typeDict = []
-
-        # An XML Definition is provided and will be parsed... now
-        for x in self.__xmlDefinition__.childNodes:
-            if x.nodeType == x.ELEMENT_NODE:
-                fname  = ""
-                fdtype = ""
-                enumVal = ""
-                valueRank = None
-                #symbolicName = None
-                for at,av in x.attributes.items():
-                    if at == "DataType":
-                        fdtype = str(av)
-                        if fdtype in nodeset.aliases:
-                            fdtype = nodeset.aliases[fdtype]
-                    elif at == "Name":
-                        fname = str(av)
-                    elif at == "SymbolicName":
-                        # ignore
-                        continue
-                    #    symbolicName = str(av)
-                    elif at == "Value":
-                        enumVal = int(av)
-                        isEnum = True
-                    elif at == "ValueRank":
-                        valueRank = int(av)
-                    else:
-                        logger.warn("Unknown Field Attribute " + str(at))
-                # This can either be an enumeration OR a structure, not both.
-                # Figure out which of the dictionaries gets the newly read value pair
-                if isEnum:
-                    # This is an enumeration
-                    enumDict.append((fname, enumVal))
-                    continue
-                else:
-                    if fdtype == "":
-                        # If no datatype given use base datatype
-                        fdtype = "i=24"
-
-                    # This might be a subtype... follow the node defined as datatype to find out
-                    # what encoding to use
-                    fdTypeNodeId = NodeId(fdtype)
-                    if namespaceMapping != None:
-                        fdTypeNodeId.ns = namespaceMapping[fdTypeNodeId.ns]
-                    if not fdTypeNodeId in nodeset.nodes:
-                        raise Exception("Node {} not found in nodeset".format(fdTypeNodeId))
-                    dtnode = nodeset.nodes[fdTypeNodeId]
-                    # The node in the datatype element was found. we inherit its encoding,
-                    # but must still ensure that the dtnode is itself validly encodable
-                    typeDict.append([fname, dtnode])
-                    fdtype = str(dtnode.browseName.name)
-                    logger.debug( prefix + fname + " : " + fdtype + " -> " + str(dtnode.id))
-                    subenc = dtnode.buildEncoding(nodeset=nodeset, indent=indent+1,
-                                                  namespaceMapping=namespaceMapping)
-                    self.__baseTypeEncoding__ = self.__baseTypeEncoding__ + [[fname, subenc, valueRank]]
-                    if not dtnode.isEncodable():
-                        # If we inherit an encoding from an unencodable node, this node is
-                        # also not encodable
-                        self.__encodable__ = False
-                        break
-
-        # If we used inheritance to determine an encoding without alias, there is a
-        # the possibility that lists got double-nested despite of only one element
-        # being encoded, such as [['Int32']] or [['alias',['int32']]]. Remove that
-        # enclosing list.
-        while len(self.__baseTypeEncoding__) == 1 and isinstance(self.__baseTypeEncoding__[0], list):
-            self.__baseTypeEncoding__ = self.__baseTypeEncoding__[0]
-
-        if isOptionSet == True:
-            self.__isOptionSet__ = True
-            subenc = parentType.buildEncoding(nodeset=nodeset, namespaceMapping=namespaceMapping)
-            if not parentType.isEncodable():
-                self.__encodable__ = False
-            else:
-                self.__baseTypeEncoding__ = self.__baseTypeEncoding__ + [self.browseName.name, subenc, None]
-                self.__definition__ = enumDict
-            return self.__baseTypeEncoding__
-
-        if isEnum == True:
-            self.__baseTypeEncoding__ = self.__baseTypeEncoding__ + ['Int32']
-            self.__definition__ = enumDict
-            self.__isEnum__ = True
-            logger.debug( prefix+"Int32* -> enumeration with dictionary " + str(enumDict) + " encodable " + str(self.__encodable__))
-            return self.__baseTypeEncoding__
-
-        if indent==0:
-            if not self.__encodable__:
-                logger.debug( "Not encodable (partial): " + str(self.__baseTypeEncoding__))
-            else:
-                logger.debug( "Encodable as: " + str(self.__baseTypeEncoding__))
-                self.__isEnum__ = False
-                self.__definition__ = typeDict
-            logger.debug( "")
-        return self.__baseTypeEncoding__
-
-class ViewNode(Node):
-    def __init__(self, xmlelement=None):
-        Node.__init__(self)
-        self.containsNoLoops = False
-        self.eventNotifier = False
-        if xmlelement:
-            ViewNode.parseXML(self, xmlelement)
-
-    def parseXML(self, xmlelement):
-        Node.parseXML(self, xmlelement)
-        for (at, av) in xmlelement.attributes.items():
-            if at == "ContainsNoLoops":
-                self.containsNoLoops = "false" not in av.lower()
-            if at == "EventNotifier":
-                self.eventNotifier = "false" not in av.lower()
diff --git a/ext/open62541/tools/nodeset_compiler/nodeset.py b/ext/open62541/tools/nodeset_compiler/nodeset.py
deleted file mode 100644
index 8024364..0000000
--- a/ext/open62541/tools/nodeset_compiler/nodeset.py
+++ /dev/null
@@ -1,349 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-from __future__ import print_function
-import sys
-import xml.dom.minidom as dom
-import logging
-import codecs
-import re
-from datatypes import *
-from nodes import *
-from opaque_type_mapping import opaque_type_mapping
-
-__all__ = ['NodeSet', 'getSubTypesOf']
-
-logger = logging.getLogger(__name__)
-
-if sys.version_info[0] >= 3:
-    # strings are already parsed to unicode
-    def unicode(s):
-        return s
-    string_types = str
-else:
-    string_types = basestring 
-
-####################
-# Helper Functions #
-####################
-
-hassubtype = NodeId("ns=0;i=45")
-
-def getSubTypesOf(nodeset, node, skipNodes=[]):
-    if node in skipNodes:
-        return []
-    re = set()
-    re.add(node)
-    for ref in node.references:
-        if (ref.referenceType == hassubtype):
-            skipAll = set()
-            skipAll.update(skipNodes)
-            skipAll.update(re)
-            if (ref.source == node.id and ref.isForward):
-                re.update(getSubTypesOf(nodeset, nodeset.nodes[ref.target], skipNodes=skipAll))
-            elif (ref.target == node.id and not ref.isForward):
-                re.update(getSubTypesOf(nodeset, nodeset.nodes[ref.source], skipNodes=skipAll))
-    return re
-
-def extractNamespaces(xmlfile):
-    # Extract a list of namespaces used. The first namespace is always
-    # "http://opcfoundation.org/UA/". minidom gobbles up
-    # <NamespaceUris></NamespaceUris> elements, without a decent way to reliably
-    # access this dom2 <uri></uri> elements (only attribute xmlns= are accessible
-    # using minidom). We need them for dereferencing though... This function
-    # attempts to do just that.
-
-    namespaces = ["http://opcfoundation.org/UA/"]
-    infile = codecs.open(xmlfile.name, encoding='utf-8')
-    foundURIs = False
-    nsline = ""
-    for line in infile:
-        if "<namespaceuris>" in line.lower():
-            foundURIs = True
-        elif "</namespaceuris>" in line.lower():
-            nsline = nsline + line
-            break
-        if foundURIs:
-            nsline = nsline + line
-
-    if len(nsline) > 0:
-        ns = dom.parseString(nsline).getElementsByTagName("NamespaceUris")
-        for uri in ns[0].childNodes:
-            if uri.nodeType != uri.ELEMENT_NODE:
-                continue
-            if uri.firstChild.data in namespaces:
-                continue
-            namespaces.append(uri.firstChild.data)
-    infile.close()
-    return namespaces
-
-def buildAliasList(xmlelement):
-    """Parses the <Alias> XML Element present in must XML NodeSet definitions.
-       Contents the Alias element are stored in a dictionary for further
-       dereferencing during pointer linkage (see linkOpenPointer())."""
-    aliases = {}
-    for al in xmlelement.childNodes:
-        if al.nodeType == al.ELEMENT_NODE:
-            if al.hasAttribute("Alias"):
-                aliasst = al.getAttribute("Alias")
-                aliasnd = unicode(al.firstChild.data)
-                aliases[aliasst] = aliasnd
-    return aliases
-
-class NodeSet(object):
-    """ This class handles parsing XML description of namespaces, instantiating
-        nodes, linking references, graphing the namespace and compiling a binary
-        representation.
-
-        Note that nodes assigned to this class are not restricted to having a
-        single namespace ID. This class represents the entire physical address
-        space of the binary representation and all nodes that are to be included
-        in that segment of memory.
-    """
-
-    def __init__(self):
-        self.nodes = {}
-        self.aliases = {}
-        self.namespaces = ["http://opcfoundation.org/UA/"]
-
-    def sanitize(self):
-        for n in self.nodes.values():
-            if n.sanitize() == False:
-                raise Exception("Failed to sanitize node " + str(n))
-
-        # Sanitize reference consistency
-        for n in self.nodes.values():
-            for ref in n.references:
-                if not ref.source == n.id:
-                    raise Exception("Reference " + str(ref) + " has an invalid source")
-                if not ref.referenceType in self.nodes:
-                    raise Exception("Reference " + str(ref) + " has an unknown reference type")
-                if not ref.target in self.nodes:
-                    print(self.namespaces)
-                    raise Exception("Reference " + str(ref) + " has an unknown target")
-
-    def addNamespace(self, nsURL):
-        if not nsURL in self.namespaces:
-            self.namespaces.append(nsURL)
-
-    def createNamespaceMapping(self, orig_namespaces):
-        """Creates a dict that maps from the nsindex in the original nodeset to the
-           nsindex in the combined nodeset"""
-        m = {}
-        for index, name in enumerate(orig_namespaces):
-            m[index] = self.namespaces.index(name)
-        return m
-
-    def getNodeByBrowseName(self, idstring):
-        return next((n for n in self.nodes.values() if idstring == n.browseName.name), None)
-
-    def getRoot(self):
-        return self.getNodeByBrowseName("Root")
-
-    def createNode(self, xmlelement, modelUri, hidden=False):
-        ndtype = xmlelement.localName.lower()
-        if ndtype[:2] == "ua":
-            ndtype = ndtype[2:]
-
-        node = None
-        if ndtype == 'variable':
-            node = VariableNode(xmlelement)
-        if ndtype == 'object':
-            node = ObjectNode(xmlelement)
-        if ndtype == 'method':
-            node = MethodNode(xmlelement)
-        if ndtype == 'objecttype':
-            node = ObjectTypeNode(xmlelement)
-        if ndtype == 'variabletype':
-            node = VariableTypeNode(xmlelement)
-        if ndtype == 'methodtype':
-            node = MethodNode(xmlelement)
-        if ndtype == 'datatype':
-            node = DataTypeNode(xmlelement)
-        if ndtype == 'referencetype':
-            node = ReferenceTypeNode(xmlelement)
-
-        if node is None:
-            return None
-
-        node.modelUri = modelUri
-        node.hidden = hidden
-        return node
-
-    def hide_node(self, nodeId, hidden=True):
-        if not nodeId in self.nodes:
-            return False
-        node = self.nodes[nodeId]
-        node.hidden = hidden
-        return True
-
-    def merge_dicts(self, *dict_args):
-        """
-        Given any number of dicts, shallow copy and merge into a new dict,
-        precedence goes to key value pairs in latter dicts.
-        """
-        result = {}
-        for dictionary in dict_args:
-            result.update(dictionary)
-        return result
-
-    def addNodeSet(self, xmlfile, hidden=False, typesArray="UA_TYPES"):
-        # Extract NodeSet DOM
-
-        fileContent = xmlfile.read()
-        # Remove BOM since the dom parser cannot handle it on python 3 windows
-        if fileContent.startswith( codecs.BOM_UTF8 ):
-            fileContent = fileContent.lstrip( codecs.BOM_UTF8 )
-        if (sys.version_info >= (3, 0)):
-            fileContent = fileContent.decode("utf-8")
-
-        # Remove the uax namespace from tags. UaModeler adds this namespace to some elements
-        fileContent = re.sub(r"<([/]?)uax:(.+?)([/]?)>", "<\g<1>\g<2>\g<3>>", fileContent)
-
-        nodesets = dom.parseString(fileContent).getElementsByTagName("UANodeSet")
-        if len(nodesets) == 0 or len(nodesets) > 1:
-            raise Exception(self, self.originXML + " contains no or more then 1 nodeset")
-        nodeset = nodesets[0]
-
-
-        # Extract the modelUri
-        try:
-            modelTag = nodeset.getElementsByTagName("Models")[0].getElementsByTagName("Model")[0]
-            modelUri = modelTag.attributes["ModelUri"].nodeValue
-        except Exception:
-            # Ignore exception and try to use namespace array
-            modelUri = None
-
-
-        # Create the namespace mapping
-        orig_namespaces = extractNamespaces(xmlfile)  # List of namespaces used in the xml file
-        if modelUri is None and len(orig_namespaces) > 1:
-            modelUri = orig_namespaces[1]
-
-        if modelUri is None:
-            raise Exception(self, self.originXML + " does not define the nodeset URI in Models/Model/ModelUri or NamespaceUris array.")
-
-        for ns in orig_namespaces:
-            self.addNamespace(ns)
-        namespaceMapping = self.createNamespaceMapping(orig_namespaces) # mapping for this file
-
-        # Extract the aliases
-        for nd in nodeset.childNodes:
-            if nd.nodeType != nd.ELEMENT_NODE:
-                continue
-            ndtype = nd.localName.lower()
-            if 'aliases' in ndtype:
-                self.aliases = self.merge_dicts(self.aliases, buildAliasList(nd))
-
-        # Instantiate nodes
-        newnodes = {}
-        for nd in nodeset.childNodes:
-            if nd.nodeType != nd.ELEMENT_NODE:
-                continue
-            node = self.createNode(nd, modelUri, hidden)
-            if not node:
-                continue
-            node.replaceAliases(self.aliases)
-            node.replaceNamespaces(namespaceMapping)
-            node.typesArray = typesArray
-
-            # Add the node the the global dict
-            if node.id in self.nodes:
-                raise Exception("XMLElement with duplicate ID " + str(node.id))
-            self.nodes[node.id] = node
-            newnodes[node.id] = node
-
-        # Parse Datatypes in order to find out what the XML keyed values actually
-        # represent.
-        # Ex. <rpm>123</rpm> is not encodable
-        #     only after parsing the datatypes, it is known that
-        #     rpm is encoded as a double
-        for n in newnodes.values():
-            if isinstance(n, DataTypeNode):
-                n.buildEncoding(self, namespaceMapping=namespaceMapping)
-
-    def getBinaryEncodingIdForNode(self, nodeId):
-        """
-        The node should have a 'HasEncoding' forward reference which points to the encoding ids.
-        These can be XML Encoding or Binary Encoding. Therefore we also need to check if the SymbolicName
-        of the target node is "DefaultBinary"
-        """
-        node = self.nodes[nodeId]
-        for ref in node.references:
-            if ref.referenceType.ns == 0 and ref.referenceType.i == 38:
-                refNode = self.nodes[ref.target]
-                if refNode.symbolicName.value == "DefaultBinary":
-                    return ref.target
-        raise Exception("No DefaultBinary encoding defined for node " + str(nodeId))
-
-    def allocateVariables(self):
-        for n in self.nodes.values():
-            if isinstance(n, VariableNode):
-                n.allocateValue(self)
-
-    def getBaseDataType(self, node):
-        if node is None:
-            return None
-        if node.browseName.name not in opaque_type_mapping:
-            return node
-        for ref in node.references:
-            if ref.isForward:
-                continue
-            if ref.referenceType.i == 45:
-                return self.getBaseDataType(self.nodes[ref.target])
-        return node
-
-    def getNodeTypeDefinition(self, node):
-        for ref in node.references:
-            # 40 = HasTypeDefinition
-            if ref.referenceType.i == 40 and ref.isForward:
-                return self.nodes[ref.target]
-        return None
-
-    def getDataTypeNode(self, dataType):
-        if isinstance(dataType, string_types):
-            if not valueIsInternalType(dataType):
-                logger.error("Not a valid dataType string: " + dataType)
-                return None
-            return self.nodes[NodeId(self.aliases[dataType])]
-        if isinstance(dataType, NodeId):
-            if dataType.i == 0:
-                return None
-            dataTypeNode = self.nodes[dataType]
-            if not isinstance(dataTypeNode, DataTypeNode):
-                logger.error("Node id " + str(dataType) + " is not reference a valid dataType.")
-                return None
-            return dataTypeNode
-        return None
-
-    def getRelevantOrderingReferences(self):
-        relevant_types = set()
-        relevant_types.update(getSubTypesOf(self, self.getNodeByBrowseName("HierarchicalReferences"), []))
-        relevant_types.update(getSubTypesOf(self, self.getNodeByBrowseName("HasEncoding"), []))
-        relevant_types.update(getSubTypesOf(self, self.getNodeByBrowseName("HasTypeDefinition"), []))
-        return list(map(lambda x: x.id, relevant_types))
-
-    def addInverseReferences(self):
-        # Ensure that every reference has an inverse reference in the target
-        for u in self.nodes.values():
-            for ref in u.references:
-                back = Reference(ref.target, ref.referenceType, ref.source, not ref.isForward)
-                self.nodes[ref.target].references.add(back) # ref set does not make a duplicate entry
-
-    def setNodeParent(self):
-        parentreftypes = getSubTypesOf(self, self.getNodeByBrowseName("HierarchicalReferences"))
-        parentreftypes = list(map(lambda x: x.id, parentreftypes))
-
-        for node in self.nodes.values():
-            parentref = node.getParentReference(parentreftypes)
-            if parentref is not None:
-                node.parent = self.nodes[parentref.target]
-                node.parentReference = self.nodes[parentref.referenceType]
diff --git a/ext/open62541/tools/nodeset_compiler/nodeset_compiler.py b/ext/open62541/tools/nodeset_compiler/nodeset_compiler.py
deleted file mode 100644
index 2aafd9b..0000000
--- a/ext/open62541/tools/nodeset_compiler/nodeset_compiler.py
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-
-import logging
-import argparse
-import sys
-from datatypes import NodeId
-from nodeset import *
-
-parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
-parser.add_argument('-e', '--existing',
-                    metavar="<existingNodeSetXML>",
-                    type=argparse.FileType('rb'),
-                    dest="existing",
-                    action='append',
-                    default=[],
-                    help='NodeSet XML files with nodes that are already present on the server.')
-
-parser.add_argument('-x', '--xml',
-                    metavar="<nodeSetXML>",
-                    type=argparse.FileType('rb'),
-                    action='append',
-                    dest="infiles",
-                    default=[],
-                    help='NodeSet XML files with nodes that shall be generated.')
-
-parser.add_argument('outputFile',
-                    metavar='<outputFile>',
-                    help='The path/basename for the <output file>.c and <output file>.h files to be generated. This will also be the function name used in the header and c-file.')
-
-parser.add_argument('--internal-headers',
-                    action='store_true',
-                    dest="internal_headers",
-                    help='Include internal headers instead of amalgamated header')
-
-parser.add_argument('-b', '--blacklist',
-                    metavar="<blacklistFile>",
-                    type=argparse.FileType('r'),
-                    action='append',
-                    dest="blacklistFiles",
-                    default=[],
-                    help='Loads a list of NodeIDs stored in blacklistFile (one NodeID per line). Any of the nodeIds encountered in this file will be removed from the nodeset prior to compilation. Any references to these nodes will also be removed')
-
-parser.add_argument('-i', '--ignore',
-                    metavar="<ignoreFile>",
-                    type=argparse.FileType('r'),
-                    action='append',
-                    dest="ignoreFiles",
-                    default=[],
-                    help='Loads a list of NodeIDs stored in ignoreFile (one NodeID per line). Any of the nodeIds encountered in this file will be kept in the nodestore but not printed in the generated code')
-
-parser.add_argument('-t', '--types-array',
-                    metavar="<typesArray>",
-                    action='append',
-                    type=str,
-                    dest="typesArray",
-                    default=[],
-                    help='Types array for the given namespace. Can be used mutliple times to define (in the same order as the .xml files, first for --existing, then --xml) the type arrays')
-
-parser.add_argument('-v', '--verbose', action='count',
-                    default=1,
-                    help='Make the script more verbose. Can be applied up to 4 times')
-
-parser.add_argument('--backend',
-                    default='open62541',
-                    const='open62541',
-                    nargs='?',
-                    choices=['open62541', 'graphviz'],
-                    help='Backend for the output files (default: %(default)s)')
-
-args = parser.parse_args()
-
-# Set up logging
-# By default logging outputs to stderr. We want to redirect it to stdout, otherwise build output from cmake
-# is in stdout and nodeset compiler in stderr
-logging.basicConfig(stream=sys.stdout)
-logger = logging.getLogger(__name__)
-logger.setLevel(logging.INFO)
-verbosity = 0
-if args.verbose:
-    verbosity = int(args.verbose)
-if (verbosity == 1):
-    logging.basicConfig(level=logging.ERROR)
-elif (verbosity == 2):
-    logging.basicConfig(level=logging.WARNING)
-elif (verbosity == 3):
-    logging.basicConfig(level=logging.INFO)
-elif (verbosity >= 4):
-    logging.basicConfig(level=logging.DEBUG)
-else:
-    logging.basicConfig(level=logging.CRITICAL)
-
-# Set up logging
-logger = logging.getLogger(__name__)
-# Create a new nodeset. The nodeset name is not significant.
-# Parse the XML files
-ns = NodeSet()
-nsCount = 0
-loadedFiles = list()
-
-
-def getTypesArray(nsIdx):
-    if nsIdx < len(args.typesArray):
-        return args.typesArray[nsIdx]
-    else:
-        return "UA_TYPES"
-
-for xmlfile in args.existing:
-    if xmlfile.name in loadedFiles:
-        logger.info("Skipping Nodeset since it is already loaded: {} ".format(xmlfile.name))
-        continue
-    loadedFiles.append(xmlfile.name)
-    logger.info("Preprocessing (existing) " + str(xmlfile.name))
-    ns.addNodeSet(xmlfile, True, typesArray=getTypesArray(nsCount))
-    nsCount +=1
-for xmlfile in args.infiles:
-    if xmlfile.name in loadedFiles:
-        logger.info("Skipping Nodeset since it is already loaded: {} ".format(xmlfile.name))
-        continue
-    loadedFiles.append(xmlfile.name)
-    logger.info("Preprocessing " + str(xmlfile.name))
-    ns.addNodeSet(xmlfile, typesArray=getTypesArray(nsCount))
-    nsCount +=1
-
-# # We need to notify the open62541 server of the namespaces used to be able to use i.e. ns=3
-# namespaceArrayNames = preProc.getUsedNamespaceArrayNames()
-# for key in namespaceArrayNames:
-#   ns.addNamespace(key, namespaceArrayNames[key])
-
-# Remove blacklisted nodes from the nodeset
-# Doing this now ensures that unlinkable pointers will be cleanly removed
-# during sanitation.
-for blacklist in args.blacklistFiles:
-    for line in blacklist.readlines():
-        line = line.replace(" ", "")
-        id = line.replace("\n", "")
-        if ns.getNodeByIDString(id) is None:
-            logger.info("Can't blacklist node, namespace does currently not contain a node with id " + str(id))
-        else:
-            ns.removeNodeById(line)
-    blacklist.close()
-
-# Set the nodes from the ignore list to hidden. This removes them from dependency calculation
-# and from printing their generated code.
-# These nodes should be already pre-created on the server to avoid any errors during
-# creation.
-for ignoreFile in args.ignoreFiles:
-    for line in ignoreFile.readlines():
-        line = line.replace(" ", "")
-        id = line.replace("\n", "")
-        ns.hide_node(NodeId(id))
-        #if not ns.hide_node(NodeId(id)):
-        #    logger.info("Can't ignore node, namespace does currently not contain a node with id " + str(id))
-    ignoreFile.close()
-
-# Remove nodes that are not printable or contain parsing errors, such as
-# unresolvable or no references or invalid NodeIDs
-ns.sanitize()
-
-# Allocate/Parse the data values. In order to do this, we must have run
-# buidEncodingRules.
-ns.allocateVariables()
-
-ns.addInverseReferences()
-
-ns.setNodeParent()
-
-logger.info("Generating Code for Backend: {}".format(args.backend))
-
-if args.backend == "open62541":
-    # Create the C code with the open62541 backend of the compiler
-    from backend_open62541 import generateOpen62541Code
-    generateOpen62541Code(ns, args.outputFile, args.internal_headers, args.typesArray)
-elif args.backend == "graphviz":
-    from backend_graphviz import generateGraphvizCode
-    generateGraphvizCode(ns, filename=args.outputFile)
-else:
-    logger.error("Unsupported backend: {}".format(args.backend))
-    exit(1)
-
-
-logger.info("NodeSet generation code successfully printed")
diff --git a/ext/open62541/tools/nodeset_compiler/nodeset_testing.py b/ext/open62541/tools/nodeset_compiler/nodeset_testing.py
deleted file mode 100644
index a112108..0000000
--- a/ext/open62541/tools/nodeset_compiler/nodeset_testing.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env python
-
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-import codecs
-from nodeset import *
-
-class testing:
-    def __init__(self):
-        self.ns = NodeSet("testing")
-
-        logger.debug("Phase 1: Reading XML file nodessets")
-        self.ns.parseXML("Opc.Ua.NodeSet2.xml")
-        # self.ns.parseXML("Opc.Ua.NodeSet2.Part4.xml")
-        # self.ns.parseXML("Opc.Ua.NodeSet2.Part5.xml")
-        # self.ns.parseXML("Opc.Ua.SimulationNodeSet2.xml")
-
-        logger.debug("Phase 2: Linking address space references and datatypes")
-        self.ns.linkOpenPointers()
-        self.ns.sanitize()
-
-        logger.debug("Phase 3: Allocating variable value data")
-        self.ns.allocateVariables()
-
-        bin = self.ns.buildBinary()
-        f = codecs.open("binary.base64", "w+", encoding='utf-8')
-        f.write(bin.encode("base64"))
-        f.close()
-
-        allnodes = self.ns.nodes
-        ns = [self.ns.getRoot()]
-
-        i = 0
-        # print "Starting depth search on " + str(len(allnodes)) + " nodes starting
-        # with from " + str(ns)
-        while (len(ns) < len(allnodes)):
-            i = i + 1
-            tmp = []
-            print("Iteration: " + str(i))
-            for n in ns:
-                tmp.append(n)
-                for r in n.getReferences():
-                    if (not r.target() in tmp):
-                        tmp.append(r.target())
-            print("...tmp, " + str(len(tmp)) + " nodes discovered")
-            ns = []
-            for n in tmp:
-                ns.append(n)
-            print("...done, " + str(len(ns)) + " nodes discovered")
-
-class testing_open62541_header:
-    def __init__(self):
-        self.ns = opcua_ns("testing")
-
-        logger.debug("Phase 1: Reading XML file nodessets")
-        self.ns.parseXML("Opc.Ua.NodeSet2.xml")
-        # self.ns.parseXML("Opc.Ua.NodeSet2.Part4.xml")
-        # self.ns.parseXML("Opc.Ua.NodeSet2.Part5.xml")
-        # self.ns.parseXML("Opc.Ua.SimulationNodeSet2.xml")
-
-        logger.debug("Phase 2: Linking address space references and datatypes")
-        self.ns.linkOpenPointers()
-        self.ns.sanitize()
-
-        logger.debug("Phase 3: Calling C Printers")
-        code = self.ns.printOpen62541Header()
-
-        codeout = codecs.open("./open62541_nodeset.c", "w+", encoding='utf-8')
-        for line in code:
-            codeout.write(line + "\n")
-        codeout.close()
-        return
-
-if __name__ == '__main__':
-    tst = testing_open62541_header()
diff --git a/ext/open62541/tools/nodeset_compiler/opaque_type_mapping.py b/ext/open62541/tools/nodeset_compiler/opaque_type_mapping.py
deleted file mode 100644
index 2906ed4..0000000
--- a/ext/open62541/tools/nodeset_compiler/opaque_type_mapping.py
+++ /dev/null
@@ -1,144 +0,0 @@
-### This Source Code Form is subject to the terms of the Mozilla Public
-### License, v. 2.0. If a copy of the MPL was not distributed with this
-### file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-###    Copyright 2014-2015 (c) TU-Dresden (Author: Chris Iatrou)
-###    Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
-###    Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
-
-# Opaque types are in general defined as simple byte strings. For the base opaque types there is a corresponding node id definition
-# in the nodeset. E.g. Opc.Ua.Types.bsd contains the simple definition for OpaqueType LocaleId. In Opc.Ua.NodeSet2.xml the LocaleId
-# is defined as a Subtype of String(i=12) thus LocaleId is a String object.
-# TODO we can automate this mapping by loading the NodeSet2.xml and read those mappings automatically. For now we just use this map
-opaque_type_mapping = {
-    'Image': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'Number': {
-        'ns': 0,
-        'id': 24,
-        'name': 'BaseDataType'
-    },
-    'UInteger': {
-        'ns': 0,
-        'id': 24,
-        'name': 'BaseDataType'
-    },
-    'ImageBMP': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'ImageGIF': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'ImageJPG': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'ImagePNG': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'BitFieldMaskDataType': {
-        'ns': 0,
-        'id': 9,
-        'name': 'UInt64'
-    },
-    'NormalizedString': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'DecimalString': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'DurationString': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'TimeString': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'DateString': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'Duration': {
-        'ns': 0,
-        'id': 11,
-        'name': 'Double'
-    },
-    'UtcTime': {
-        'ns': 0,
-        'id': 13,
-        'name': 'DateTime'
-    },
-    'LocaleId': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'IntegerId': {
-        'ns': 0,
-        'id': 7,
-        'name': 'UInt32'
-    },
-    'ApplicationInstanceCertificate': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'SessionAuthenticationToken': {
-        'ns': 0,
-        'id': 17,
-        'name': 'NodeId'
-    },
-    'ContinuationPoint': {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    },
-    'Counter': {
-        'ns': 0,
-        'id': 7,
-        'name': 'UInt32'
-    },
-    'NumericRange': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'Time': {
-        'ns': 0,
-        'id': 12,
-        'name': 'String'
-    },
-    'Date': {
-        'ns': 0,
-        'id': 13,
-        'name': 'DateTime'
-    }
-}
-
-def get_base_type_for_opaque(opaqueTypeName):
-    if opaqueTypeName in opaque_type_mapping:
-        return opaque_type_mapping[opaqueTypeName]
-    # Default if not in mapping is ByteString
-    return {
-        'ns': 0,
-        'id': 15,
-        'name': 'ByteString'
-    }
diff --git a/ext/open62541/tools/packaging/CMakeLists.txt b/ext/open62541/tools/packaging/CMakeLists.txt
deleted file mode 100644
index b1f7966..0000000
--- a/ext/open62541/tools/packaging/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-##########################
-# Packaging (DEB/RPM)    #
-##########################
-# invoke via `make package`
-
-set(CPACK_GENERATOR "TGZ;DEB;RPM")
-set(CPACK_PACKAGE_VENDOR "open62541 team")
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OPC UA implementation")
-set(CPACK_PACKAGE_DESCRIPTION "open62541 is a C-based library (linking with C++ projects is possible) with all necessary tools to implement dedicated OPC UA clients and servers, or to integrate OPC UA-based communication into existing applications.")
-set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md")
-set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
-set(CPACK_PACKAGE_VERSION_MAJOR "${OPEN62541_VER_MAJOR}")
-set(CPACK_PACKAGE_VERSION_MINOR "${OPEN62541_VER_MINOR}")
-set(CPACK_PACKAGE_VERSION_PATCH "${OPEN62541_VER_PATCH}${OPEN62541_VER_LABEL}")
-set(CPACK_DEBIAN_PACKAGE_MAINTAINER "open62541 team") #required
-
-include(CPack)
diff --git a/ext/open62541/tools/packaging/tito/tito.props b/ext/open62541/tools/packaging/tito/tito.props
deleted file mode 100644
index eab3f19..0000000
--- a/ext/open62541/tools/packaging/tito/tito.props
+++ /dev/null
@@ -1,5 +0,0 @@
-[buildconfig]
-builder = tito.builder.Builder
-tagger = tito.tagger.VersionTagger
-changelog_do_not_remove_cherrypick = 0
-changelog_format = %s (%ae)
diff --git a/ext/open62541/tools/prepare_packaging.py b/ext/open62541/tools/prepare_packaging.py
deleted file mode 100644
index 99b95f5..0000000
--- a/ext/open62541/tools/prepare_packaging.py
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/usr/bin/env python
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-import subprocess
-import os
-import re
-from email.utils import formatdate
-
-
-dirpath = os.path.join(os.path.dirname(os.path.realpath(__file__)),"..")
-
-git_describe_version = subprocess.check_output(["git", "describe", "--tags", "--dirty", "--match", "v*"]).decode('utf-8').strip()
-
-# v1.2
-# v1.2.3
-# v1.2.3-rc1
-# v1.2.3-rc1-dirty
-# v1.2.3-5-g4538abcd
-# v1.2.3-5-g4538abcd-dirty
-# git_describe_version = "v1.2.3"
-
-m = re.match(r"^v([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-(.*)+)?$", git_describe_version)
-version_major = m.group(1) if m.group(1) is not None else "0"
-version_minor = m.group(2).replace(".", "") if m.group(2) is not None else "0"
-version_patch = m.group(3).replace(".", "") if m.group(3) is not None else "0"
-version_label = m.group(4) if m.group(4) is not None else ""
-#print("major {} minor {} patch {} label {}".format(version_major, version_minor, version_patch, version_label))
-
-debian_distribution = "unstable"
-if version_label is not "":
-    debian_distribution = "UNRELEASED"
-
-debian_path = os.path.join(dirpath, "debian")
-changelog_file = os.path.join(debian_path, "changelog")
-
-# remove leading 'v'
-changelog_version = git_describe_version[1:] if git_describe_version[0] == 'v' else git_describe_version
-
-with open(changelog_file, 'r') as original: data = original.read()
-with open(changelog_file, 'w') as modified:
-    new_entry = """open62541 ({version}) {distribution}; urgency=medium
-
-  * Full changelog is available here: https://github.com/open62541/open62541/blob/master/CHANGELOG
-
- -- open62541 Team <open62541-core@googlegroups.com>  {time}
-""".format(version=changelog_version, time=formatdate(), distribution = debian_distribution)
-
-    modified.write(new_entry + "\n" + data)
-
-# Create control file and replace template variables
-control_file_template = os.path.join(debian_path, "control-template")
-control_file = os.path.join(debian_path, "control")
-os.rename(control_file_template, control_file)
-
-with open(control_file, 'r+') as f:
-    content = f.read()
-    f.seek(0)
-    f.truncate()
-    f.write(content.replace('<soname>', "{}".format(version_major)))
-
-
-# rename the install template to match the soname
-install_file_template = os.path.join(debian_path, "libopen62541.install-template")
-install_file = os.path.join(debian_path, "libopen62541-{}.install".format(version_major))
-os.rename(install_file_template, install_file)
-
-install_file_template = os.path.join(debian_path, "libopen62541-dev.install-template")
-install_file = os.path.join(debian_path, "libopen62541-{}-dev.install".format(version_major))
-os.rename(install_file_template, install_file)
-
-
-# Create rule file and replace template variables
-rule_file_template = os.path.join(debian_path, "rules-template")
-rule_file = os.path.join(debian_path, "rules")
-os.rename(rule_file_template, rule_file)
-
-with open(rule_file, 'r+') as f:
-    content = f.read()
-    f.seek(0)
-    f.truncate()
-    content = content.replace('<soname>', "{}".format(version_major))
-    f.write(content)
-
-# Update CMakeLists.txt to include full version string
-
-with open(os.path.join(dirpath,"CMakeLists.txt"), 'r+') as f:
-    lines = f.readlines()
-    f.seek(0)
-    f.truncate()
-    for idx, line in enumerate(lines):
-        if idx == 2:
-            f.write('set(OPEN62541_VERSION "{}")\n'.format(git_describe_version))
-        f.write(line)
diff --git a/ext/open62541/tools/schema/Custom.Opc.Ua.Transport.bsd b/ext/open62541/tools/schema/Custom.Opc.Ua.Transport.bsd
deleted file mode 100644
index 81a880c..0000000
--- a/ext/open62541/tools/schema/Custom.Opc.Ua.Transport.bsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<opc:TypeDictionary
-  xmlns:opc="http://opcfoundation.org/BinarySchema/"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:ua="http://opcfoundation.org/UA/"
-  xmlns:tns="http://opcfoundation.org/UA/"
-  DefaultByteOrder="LittleEndian"
-  TargetNamespace="http://opcfoundation.org/UA/"
->
-
-  <opc:Import Namespace="http://opcfoundation.org/BinarySchema/" />
-
-<!-- Transport types begin  -->
-
-  <opc:EnumeratedType Name="MessageType" LengthInBits="32">
-    <opc:Documentation>Message Type and whether the message contains an intermediate chunk</opc:Documentation>
-    <opc:EnumeratedValue Name="ACK" Value="0x4B4341" />
-    <opc:EnumeratedValue Name="HEL" Value="0x4C4548" />
-    <opc:EnumeratedValue Name="MSG" Value="0x47534D" />
-    <opc:EnumeratedValue Name="OPN" Value="0x4E504F" />
-    <opc:EnumeratedValue Name="CLO" Value="0x4F4C43" />
-    <opc:EnumeratedValue Name="ERR" Value="0x525245" />
-  </opc:EnumeratedType>
-  
-  <opc:EnumeratedType Name="ChunkType" LengthInBits="32">
-    <opc:Documentation>Type of the chunk</opc:Documentation>
-    <opc:EnumeratedValue Name="FINAL" Value="0x46000000" />
-    <opc:EnumeratedValue Name="INTERMEDIATE" Value="0x43000000" />
-    <opc:EnumeratedValue Name="ABORT" Value="0x41000000" />
-
-  </opc:EnumeratedType>
-
-   <opc:StructuredType Name="TcpMessageHeader">
-    <opc:Documentation>TCP Header</opc:Documentation>
-    <opc:Field Name="MessageTypeAndChunkType" TypeName="opc:UInt32" />
-    <opc:Field Name="MessageSize" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-  
-   <opc:StructuredType Name="TcpHelloMessage">
-    <opc:Documentation>Hello Message</opc:Documentation>
-    <opc:Field Name="ProtocolVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="ReceiveBufferSize" TypeName="opc:UInt32" />
-    <opc:Field Name="SendBufferSize" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxMessageSize" TypeName="opc:UInt32" />
-	<opc:Field Name="MaxChunkCount" TypeName="opc:UInt32" />
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-  </opc:StructuredType>
-  
-   <opc:StructuredType Name="TcpAcknowledgeMessage">
-    <opc:Documentation>Acknowledge Message</opc:Documentation>
-    <opc:Field Name="ProtocolVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="ReceiveBufferSize" TypeName="opc:UInt32" />
-    <opc:Field Name="SendBufferSize" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxMessageSize" TypeName="opc:UInt32" />
-	<opc:Field Name="MaxChunkCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TcpErrorMessage">
-    <opc:Documentation>Error Message</opc:Documentation>
-    <opc:Field Name="Error" TypeName="opc:UInt32" />
-    <opc:Field Name="Reason" TypeName="opc:String" />
-  </opc:StructuredType>
-  
-  <opc:StructuredType Name="SecureConversationMessageHeader">
-    <opc:Documentation>Secure Layer Sequence Header</opc:Documentation>
-    <opc:Field Name="MessageHeader" TypeName="opc:TcpMessageHeader" />
-    <opc:Field Name="SecureChannelId" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-  
-  <opc:StructuredType Name="AsymmetricAlgorithmSecurityHeader">
-    <opc:Documentation>Security Header</opc:Documentation>
-    <opc:Field Name="SecurityPolicyUri" TypeName="opc:ByteString" />
-    <opc:Field Name="SenderCertificate" TypeName="opc:ByteString" />
-    <opc:Field Name="ReceiverCertificateThumbprint" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-  
-  <opc:StructuredType Name="SymmetricAlgorithmSecurityHeader">
-    <opc:Documentation>Secure Layer Symmetric Algorithm Header</opc:Documentation>
-    <opc:Field Name="TokenId" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-  
-  <opc:StructuredType Name="SequenceHeader">
-    <opc:Documentation>Secure Layer Sequence Header</opc:Documentation>
-    <opc:Field Name="SequenceNumber" TypeName="opc:UInt32" />
-    <opc:Field Name="RequestId" TypeName="opc:UInt32"/>
-  </opc:StructuredType>
-  
-  <opc:StructuredType Name="SecureConversationMessageFooter">
-    <opc:Documentation>Secure Conversation Message Footer</opc:Documentation>
-    <opc:Field Name="PaddingSize" TypeName="opc:Byte" />
-    <opc:Field Name="Padding" TypeName="opc:Byte" LengthField="PaddingSize" />
-    <opc:Field Name="Signature" TypeName="opc:Byte"/>
-  </opc:StructuredType>
-  
-  <opc:StructuredType Name="SecureConversationMessageAbortBody">
-    <opc:Documentation>Secure Conversation Message Abort Body</opc:Documentation>
-    <opc:Field Name="Error" TypeName="opc:UInt32" />
-    <opc:Field Name="Reason" TypeName="opc:String" />
-  </opc:StructuredType>
- 
-<!-- Transport types end -->
-
-</opc:TypeDictionary>
diff --git a/ext/open62541/tools/schema/NodeIds.csv b/ext/open62541/tools/schema/NodeIds.csv
deleted file mode 100644
index 760f0c1..0000000
--- a/ext/open62541/tools/schema/NodeIds.csv
+++ /dev/null
@@ -1,10707 +0,0 @@
-Boolean,1,DataType
-SByte,2,DataType
-Byte,3,DataType
-Int16,4,DataType
-UInt16,5,DataType
-Int32,6,DataType
-UInt32,7,DataType
-Int64,8,DataType
-UInt64,9,DataType
-Float,10,DataType
-Double,11,DataType
-String,12,DataType
-DateTime,13,DataType
-Guid,14,DataType
-ByteString,15,DataType
-XmlElement,16,DataType
-NodeId,17,DataType
-ExpandedNodeId,18,DataType
-StatusCode,19,DataType
-QualifiedName,20,DataType
-LocalizedText,21,DataType
-Structure,22,DataType
-DataValue,23,DataType
-BaseDataType,24,DataType
-DiagnosticInfo,25,DataType
-Number,26,DataType
-Integer,27,DataType
-UInteger,28,DataType
-Enumeration,29,DataType
-Image,30,DataType
-References,31,ReferenceType
-NonHierarchicalReferences,32,ReferenceType
-HierarchicalReferences,33,ReferenceType
-HasChild,34,ReferenceType
-Organizes,35,ReferenceType
-HasEventSource,36,ReferenceType
-HasModellingRule,37,ReferenceType
-HasEncoding,38,ReferenceType
-HasDescription,39,ReferenceType
-HasTypeDefinition,40,ReferenceType
-GeneratesEvent,41,ReferenceType
-Aggregates,44,ReferenceType
-HasSubtype,45,ReferenceType
-HasProperty,46,ReferenceType
-HasComponent,47,ReferenceType
-HasNotifier,48,ReferenceType
-HasOrderedComponent,49,ReferenceType
-Decimal,50,DataType
-FromState,51,ReferenceType
-ToState,52,ReferenceType
-HasCause,53,ReferenceType
-HasEffect,54,ReferenceType
-HasHistoricalConfiguration,56,ReferenceType
-BaseObjectType,58,ObjectType
-FolderType,61,ObjectType
-BaseVariableType,62,VariableType
-BaseDataVariableType,63,VariableType
-PropertyType,68,VariableType
-DataTypeDescriptionType,69,VariableType
-DataTypeDictionaryType,72,VariableType
-DataTypeSystemType,75,ObjectType
-DataTypeEncodingType,76,ObjectType
-ModellingRuleType,77,ObjectType
-ModellingRule_Mandatory,78,Object
-ModellingRule_MandatoryShared,79,Object
-ModellingRule_Optional,80,Object
-ModellingRule_ExposesItsArray,83,Object
-RootFolder,84,Object
-ObjectsFolder,85,Object
-TypesFolder,86,Object
-ViewsFolder,87,Object
-ObjectTypesFolder,88,Object
-VariableTypesFolder,89,Object
-DataTypesFolder,90,Object
-ReferenceTypesFolder,91,Object
-XmlSchema_TypeSystem,92,Object
-OPCBinarySchema_TypeSystem,93,Object
-PermissionType,94,DataType
-AccessRestrictionType,95,DataType
-RolePermissionType,96,DataType
-DataTypeDefinition,97,DataType
-StructureType,98,DataType
-StructureDefinition,99,DataType
-EnumDefinition,100,DataType
-StructureField,101,DataType
-EnumField,102,DataType
-DataTypeDescriptionType_DataTypeVersion,104,Variable
-DataTypeDescriptionType_DictionaryFragment,105,Variable
-DataTypeDictionaryType_DataTypeVersion,106,Variable
-DataTypeDictionaryType_NamespaceUri,107,Variable
-ModellingRuleType_NamingRule,111,Variable
-ModellingRule_Mandatory_NamingRule,112,Variable
-ModellingRule_Optional_NamingRule,113,Variable
-ModellingRule_ExposesItsArray_NamingRule,114,Variable
-ModellingRule_MandatoryShared_NamingRule,116,Variable
-HasSubStateMachine,117,ReferenceType
-NamingRuleType,120,DataType
-DataTypeDefinition_Encoding_DefaultBinary,121,Object
-StructureDefinition_Encoding_DefaultBinary,122,Object
-EnumDefinition_Encoding_DefaultBinary,123,Object
-DataSetMetaDataType_Encoding_DefaultBinary,124,Object
-DataTypeDescription_Encoding_DefaultBinary,125,Object
-StructureDescription_Encoding_DefaultBinary,126,Object
-EnumDescription_Encoding_DefaultBinary,127,Object
-RolePermissionType_Encoding_DefaultBinary,128,Object
-HasArgumentDescription,129,ReferenceType
-HasOptionalInputArgumentDescription,131,ReferenceType
-IdType,256,DataType
-NodeClass,257,DataType
-Node,258,DataType
-Node_Encoding_DefaultXml,259,Object
-Node_Encoding_DefaultBinary,260,Object
-ObjectNode,261,DataType
-ObjectNode_Encoding_DefaultXml,262,Object
-ObjectNode_Encoding_DefaultBinary,263,Object
-ObjectTypeNode,264,DataType
-ObjectTypeNode_Encoding_DefaultXml,265,Object
-ObjectTypeNode_Encoding_DefaultBinary,266,Object
-VariableNode,267,DataType
-VariableNode_Encoding_DefaultXml,268,Object
-VariableNode_Encoding_DefaultBinary,269,Object
-VariableTypeNode,270,DataType
-VariableTypeNode_Encoding_DefaultXml,271,Object
-VariableTypeNode_Encoding_DefaultBinary,272,Object
-ReferenceTypeNode,273,DataType
-ReferenceTypeNode_Encoding_DefaultXml,274,Object
-ReferenceTypeNode_Encoding_DefaultBinary,275,Object
-MethodNode,276,DataType
-MethodNode_Encoding_DefaultXml,277,Object
-MethodNode_Encoding_DefaultBinary,278,Object
-ViewNode,279,DataType
-ViewNode_Encoding_DefaultXml,280,Object
-ViewNode_Encoding_DefaultBinary,281,Object
-DataTypeNode,282,DataType
-DataTypeNode_Encoding_DefaultXml,283,Object
-DataTypeNode_Encoding_DefaultBinary,284,Object
-ReferenceNode,285,DataType
-ReferenceNode_Encoding_DefaultXml,286,Object
-ReferenceNode_Encoding_DefaultBinary,287,Object
-IntegerId,288,DataType
-Counter,289,DataType
-Duration,290,DataType
-NumericRange,291,DataType
-Time,292,DataType
-Date,293,DataType
-UtcTime,294,DataType
-LocaleId,295,DataType
-Argument,296,DataType
-Argument_Encoding_DefaultXml,297,Object
-Argument_Encoding_DefaultBinary,298,Object
-StatusResult,299,DataType
-StatusResult_Encoding_DefaultXml,300,Object
-StatusResult_Encoding_DefaultBinary,301,Object
-MessageSecurityMode,302,DataType
-UserTokenType,303,DataType
-UserTokenPolicy,304,DataType
-UserTokenPolicy_Encoding_DefaultXml,305,Object
-UserTokenPolicy_Encoding_DefaultBinary,306,Object
-ApplicationType,307,DataType
-ApplicationDescription,308,DataType
-ApplicationDescription_Encoding_DefaultXml,309,Object
-ApplicationDescription_Encoding_DefaultBinary,310,Object
-ApplicationInstanceCertificate,311,DataType
-EndpointDescription,312,DataType
-EndpointDescription_Encoding_DefaultXml,313,Object
-EndpointDescription_Encoding_DefaultBinary,314,Object
-SecurityTokenRequestType,315,DataType
-UserIdentityToken,316,DataType
-UserIdentityToken_Encoding_DefaultXml,317,Object
-UserIdentityToken_Encoding_DefaultBinary,318,Object
-AnonymousIdentityToken,319,DataType
-AnonymousIdentityToken_Encoding_DefaultXml,320,Object
-AnonymousIdentityToken_Encoding_DefaultBinary,321,Object
-UserNameIdentityToken,322,DataType
-UserNameIdentityToken_Encoding_DefaultXml,323,Object
-UserNameIdentityToken_Encoding_DefaultBinary,324,Object
-X509IdentityToken,325,DataType
-X509IdentityToken_Encoding_DefaultXml,326,Object
-X509IdentityToken_Encoding_DefaultBinary,327,Object
-EndpointConfiguration,331,DataType
-EndpointConfiguration_Encoding_DefaultXml,332,Object
-EndpointConfiguration_Encoding_DefaultBinary,333,Object
-BuildInfo,338,DataType
-BuildInfo_Encoding_DefaultXml,339,Object
-BuildInfo_Encoding_DefaultBinary,340,Object
-SignedSoftwareCertificate,344,DataType
-SignedSoftwareCertificate_Encoding_DefaultXml,345,Object
-SignedSoftwareCertificate_Encoding_DefaultBinary,346,Object
-AttributeWriteMask,347,DataType
-NodeAttributesMask,348,DataType
-NodeAttributes,349,DataType
-NodeAttributes_Encoding_DefaultXml,350,Object
-NodeAttributes_Encoding_DefaultBinary,351,Object
-ObjectAttributes,352,DataType
-ObjectAttributes_Encoding_DefaultXml,353,Object
-ObjectAttributes_Encoding_DefaultBinary,354,Object
-VariableAttributes,355,DataType
-VariableAttributes_Encoding_DefaultXml,356,Object
-VariableAttributes_Encoding_DefaultBinary,357,Object
-MethodAttributes,358,DataType
-MethodAttributes_Encoding_DefaultXml,359,Object
-MethodAttributes_Encoding_DefaultBinary,360,Object
-ObjectTypeAttributes,361,DataType
-ObjectTypeAttributes_Encoding_DefaultXml,362,Object
-ObjectTypeAttributes_Encoding_DefaultBinary,363,Object
-VariableTypeAttributes,364,DataType
-VariableTypeAttributes_Encoding_DefaultXml,365,Object
-VariableTypeAttributes_Encoding_DefaultBinary,366,Object
-ReferenceTypeAttributes,367,DataType
-ReferenceTypeAttributes_Encoding_DefaultXml,368,Object
-ReferenceTypeAttributes_Encoding_DefaultBinary,369,Object
-DataTypeAttributes,370,DataType
-DataTypeAttributes_Encoding_DefaultXml,371,Object
-DataTypeAttributes_Encoding_DefaultBinary,372,Object
-ViewAttributes,373,DataType
-ViewAttributes_Encoding_DefaultXml,374,Object
-ViewAttributes_Encoding_DefaultBinary,375,Object
-AddNodesItem,376,DataType
-AddNodesItem_Encoding_DefaultXml,377,Object
-AddNodesItem_Encoding_DefaultBinary,378,Object
-AddReferencesItem,379,DataType
-AddReferencesItem_Encoding_DefaultXml,380,Object
-AddReferencesItem_Encoding_DefaultBinary,381,Object
-DeleteNodesItem,382,DataType
-DeleteNodesItem_Encoding_DefaultXml,383,Object
-DeleteNodesItem_Encoding_DefaultBinary,384,Object
-DeleteReferencesItem,385,DataType
-DeleteReferencesItem_Encoding_DefaultXml,386,Object
-DeleteReferencesItem_Encoding_DefaultBinary,387,Object
-SessionAuthenticationToken,388,DataType
-RequestHeader,389,DataType
-RequestHeader_Encoding_DefaultXml,390,Object
-RequestHeader_Encoding_DefaultBinary,391,Object
-ResponseHeader,392,DataType
-ResponseHeader_Encoding_DefaultXml,393,Object
-ResponseHeader_Encoding_DefaultBinary,394,Object
-ServiceFault,395,DataType
-ServiceFault_Encoding_DefaultXml,396,Object
-ServiceFault_Encoding_DefaultBinary,397,Object
-FindServersRequest,420,DataType
-FindServersRequest_Encoding_DefaultXml,421,Object
-FindServersRequest_Encoding_DefaultBinary,422,Object
-FindServersResponse,423,DataType
-FindServersResponse_Encoding_DefaultXml,424,Object
-FindServersResponse_Encoding_DefaultBinary,425,Object
-GetEndpointsRequest,426,DataType
-GetEndpointsRequest_Encoding_DefaultXml,427,Object
-GetEndpointsRequest_Encoding_DefaultBinary,428,Object
-GetEndpointsResponse,429,DataType
-GetEndpointsResponse_Encoding_DefaultXml,430,Object
-GetEndpointsResponse_Encoding_DefaultBinary,431,Object
-RegisteredServer,432,DataType
-RegisteredServer_Encoding_DefaultXml,433,Object
-RegisteredServer_Encoding_DefaultBinary,434,Object
-RegisterServerRequest,435,DataType
-RegisterServerRequest_Encoding_DefaultXml,436,Object
-RegisterServerRequest_Encoding_DefaultBinary,437,Object
-RegisterServerResponse,438,DataType
-RegisterServerResponse_Encoding_DefaultXml,439,Object
-RegisterServerResponse_Encoding_DefaultBinary,440,Object
-ChannelSecurityToken,441,DataType
-ChannelSecurityToken_Encoding_DefaultXml,442,Object
-ChannelSecurityToken_Encoding_DefaultBinary,443,Object
-OpenSecureChannelRequest,444,DataType
-OpenSecureChannelRequest_Encoding_DefaultXml,445,Object
-OpenSecureChannelRequest_Encoding_DefaultBinary,446,Object
-OpenSecureChannelResponse,447,DataType
-OpenSecureChannelResponse_Encoding_DefaultXml,448,Object
-OpenSecureChannelResponse_Encoding_DefaultBinary,449,Object
-CloseSecureChannelRequest,450,DataType
-CloseSecureChannelRequest_Encoding_DefaultXml,451,Object
-CloseSecureChannelRequest_Encoding_DefaultBinary,452,Object
-CloseSecureChannelResponse,453,DataType
-CloseSecureChannelResponse_Encoding_DefaultXml,454,Object
-CloseSecureChannelResponse_Encoding_DefaultBinary,455,Object
-SignatureData,456,DataType
-SignatureData_Encoding_DefaultXml,457,Object
-SignatureData_Encoding_DefaultBinary,458,Object
-CreateSessionRequest,459,DataType
-CreateSessionRequest_Encoding_DefaultXml,460,Object
-CreateSessionRequest_Encoding_DefaultBinary,461,Object
-CreateSessionResponse,462,DataType
-CreateSessionResponse_Encoding_DefaultXml,463,Object
-CreateSessionResponse_Encoding_DefaultBinary,464,Object
-ActivateSessionRequest,465,DataType
-ActivateSessionRequest_Encoding_DefaultXml,466,Object
-ActivateSessionRequest_Encoding_DefaultBinary,467,Object
-ActivateSessionResponse,468,DataType
-ActivateSessionResponse_Encoding_DefaultXml,469,Object
-ActivateSessionResponse_Encoding_DefaultBinary,470,Object
-CloseSessionRequest,471,DataType
-CloseSessionRequest_Encoding_DefaultXml,472,Object
-CloseSessionRequest_Encoding_DefaultBinary,473,Object
-CloseSessionResponse,474,DataType
-CloseSessionResponse_Encoding_DefaultXml,475,Object
-CloseSessionResponse_Encoding_DefaultBinary,476,Object
-CancelRequest,477,DataType
-CancelRequest_Encoding_DefaultXml,478,Object
-CancelRequest_Encoding_DefaultBinary,479,Object
-CancelResponse,480,DataType
-CancelResponse_Encoding_DefaultXml,481,Object
-CancelResponse_Encoding_DefaultBinary,482,Object
-AddNodesResult,483,DataType
-AddNodesResult_Encoding_DefaultXml,484,Object
-AddNodesResult_Encoding_DefaultBinary,485,Object
-AddNodesRequest,486,DataType
-AddNodesRequest_Encoding_DefaultXml,487,Object
-AddNodesRequest_Encoding_DefaultBinary,488,Object
-AddNodesResponse,489,DataType
-AddNodesResponse_Encoding_DefaultXml,490,Object
-AddNodesResponse_Encoding_DefaultBinary,491,Object
-AddReferencesRequest,492,DataType
-AddReferencesRequest_Encoding_DefaultXml,493,Object
-AddReferencesRequest_Encoding_DefaultBinary,494,Object
-AddReferencesResponse,495,DataType
-AddReferencesResponse_Encoding_DefaultXml,496,Object
-AddReferencesResponse_Encoding_DefaultBinary,497,Object
-DeleteNodesRequest,498,DataType
-DeleteNodesRequest_Encoding_DefaultXml,499,Object
-DeleteNodesRequest_Encoding_DefaultBinary,500,Object
-DeleteNodesResponse,501,DataType
-DeleteNodesResponse_Encoding_DefaultXml,502,Object
-DeleteNodesResponse_Encoding_DefaultBinary,503,Object
-DeleteReferencesRequest,504,DataType
-DeleteReferencesRequest_Encoding_DefaultXml,505,Object
-DeleteReferencesRequest_Encoding_DefaultBinary,506,Object
-DeleteReferencesResponse,507,DataType
-DeleteReferencesResponse_Encoding_DefaultXml,508,Object
-DeleteReferencesResponse_Encoding_DefaultBinary,509,Object
-BrowseDirection,510,DataType
-ViewDescription,511,DataType
-ViewDescription_Encoding_DefaultXml,512,Object
-ViewDescription_Encoding_DefaultBinary,513,Object
-BrowseDescription,514,DataType
-BrowseDescription_Encoding_DefaultXml,515,Object
-BrowseDescription_Encoding_DefaultBinary,516,Object
-BrowseResultMask,517,DataType
-ReferenceDescription,518,DataType
-ReferenceDescription_Encoding_DefaultXml,519,Object
-ReferenceDescription_Encoding_DefaultBinary,520,Object
-ContinuationPoint,521,DataType
-BrowseResult,522,DataType
-BrowseResult_Encoding_DefaultXml,523,Object
-BrowseResult_Encoding_DefaultBinary,524,Object
-BrowseRequest,525,DataType
-BrowseRequest_Encoding_DefaultXml,526,Object
-BrowseRequest_Encoding_DefaultBinary,527,Object
-BrowseResponse,528,DataType
-BrowseResponse_Encoding_DefaultXml,529,Object
-BrowseResponse_Encoding_DefaultBinary,530,Object
-BrowseNextRequest,531,DataType
-BrowseNextRequest_Encoding_DefaultXml,532,Object
-BrowseNextRequest_Encoding_DefaultBinary,533,Object
-BrowseNextResponse,534,DataType
-BrowseNextResponse_Encoding_DefaultXml,535,Object
-BrowseNextResponse_Encoding_DefaultBinary,536,Object
-RelativePathElement,537,DataType
-RelativePathElement_Encoding_DefaultXml,538,Object
-RelativePathElement_Encoding_DefaultBinary,539,Object
-RelativePath,540,DataType
-RelativePath_Encoding_DefaultXml,541,Object
-RelativePath_Encoding_DefaultBinary,542,Object
-BrowsePath,543,DataType
-BrowsePath_Encoding_DefaultXml,544,Object
-BrowsePath_Encoding_DefaultBinary,545,Object
-BrowsePathTarget,546,DataType
-BrowsePathTarget_Encoding_DefaultXml,547,Object
-BrowsePathTarget_Encoding_DefaultBinary,548,Object
-BrowsePathResult,549,DataType
-BrowsePathResult_Encoding_DefaultXml,550,Object
-BrowsePathResult_Encoding_DefaultBinary,551,Object
-TranslateBrowsePathsToNodeIdsRequest,552,DataType
-TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml,553,Object
-TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary,554,Object
-TranslateBrowsePathsToNodeIdsResponse,555,DataType
-TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml,556,Object
-TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary,557,Object
-RegisterNodesRequest,558,DataType
-RegisterNodesRequest_Encoding_DefaultXml,559,Object
-RegisterNodesRequest_Encoding_DefaultBinary,560,Object
-RegisterNodesResponse,561,DataType
-RegisterNodesResponse_Encoding_DefaultXml,562,Object
-RegisterNodesResponse_Encoding_DefaultBinary,563,Object
-UnregisterNodesRequest,564,DataType
-UnregisterNodesRequest_Encoding_DefaultXml,565,Object
-UnregisterNodesRequest_Encoding_DefaultBinary,566,Object
-UnregisterNodesResponse,567,DataType
-UnregisterNodesResponse_Encoding_DefaultXml,568,Object
-UnregisterNodesResponse_Encoding_DefaultBinary,569,Object
-QueryDataDescription,570,DataType
-QueryDataDescription_Encoding_DefaultXml,571,Object
-QueryDataDescription_Encoding_DefaultBinary,572,Object
-NodeTypeDescription,573,DataType
-NodeTypeDescription_Encoding_DefaultXml,574,Object
-NodeTypeDescription_Encoding_DefaultBinary,575,Object
-FilterOperator,576,DataType
-QueryDataSet,577,DataType
-QueryDataSet_Encoding_DefaultXml,578,Object
-QueryDataSet_Encoding_DefaultBinary,579,Object
-NodeReference,580,DataType
-NodeReference_Encoding_DefaultXml,581,Object
-NodeReference_Encoding_DefaultBinary,582,Object
-ContentFilterElement,583,DataType
-ContentFilterElement_Encoding_DefaultXml,584,Object
-ContentFilterElement_Encoding_DefaultBinary,585,Object
-ContentFilter,586,DataType
-ContentFilter_Encoding_DefaultXml,587,Object
-ContentFilter_Encoding_DefaultBinary,588,Object
-FilterOperand,589,DataType
-FilterOperand_Encoding_DefaultXml,590,Object
-FilterOperand_Encoding_DefaultBinary,591,Object
-ElementOperand,592,DataType
-ElementOperand_Encoding_DefaultXml,593,Object
-ElementOperand_Encoding_DefaultBinary,594,Object
-LiteralOperand,595,DataType
-LiteralOperand_Encoding_DefaultXml,596,Object
-LiteralOperand_Encoding_DefaultBinary,597,Object
-AttributeOperand,598,DataType
-AttributeOperand_Encoding_DefaultXml,599,Object
-AttributeOperand_Encoding_DefaultBinary,600,Object
-SimpleAttributeOperand,601,DataType
-SimpleAttributeOperand_Encoding_DefaultXml,602,Object
-SimpleAttributeOperand_Encoding_DefaultBinary,603,Object
-ContentFilterElementResult,604,DataType
-ContentFilterElementResult_Encoding_DefaultXml,605,Object
-ContentFilterElementResult_Encoding_DefaultBinary,606,Object
-ContentFilterResult,607,DataType
-ContentFilterResult_Encoding_DefaultXml,608,Object
-ContentFilterResult_Encoding_DefaultBinary,609,Object
-ParsingResult,610,DataType
-ParsingResult_Encoding_DefaultXml,611,Object
-ParsingResult_Encoding_DefaultBinary,612,Object
-QueryFirstRequest,613,DataType
-QueryFirstRequest_Encoding_DefaultXml,614,Object
-QueryFirstRequest_Encoding_DefaultBinary,615,Object
-QueryFirstResponse,616,DataType
-QueryFirstResponse_Encoding_DefaultXml,617,Object
-QueryFirstResponse_Encoding_DefaultBinary,618,Object
-QueryNextRequest,619,DataType
-QueryNextRequest_Encoding_DefaultXml,620,Object
-QueryNextRequest_Encoding_DefaultBinary,621,Object
-QueryNextResponse,622,DataType
-QueryNextResponse_Encoding_DefaultXml,623,Object
-QueryNextResponse_Encoding_DefaultBinary,624,Object
-TimestampsToReturn,625,DataType
-ReadValueId,626,DataType
-ReadValueId_Encoding_DefaultXml,627,Object
-ReadValueId_Encoding_DefaultBinary,628,Object
-ReadRequest,629,DataType
-ReadRequest_Encoding_DefaultXml,630,Object
-ReadRequest_Encoding_DefaultBinary,631,Object
-ReadResponse,632,DataType
-ReadResponse_Encoding_DefaultXml,633,Object
-ReadResponse_Encoding_DefaultBinary,634,Object
-HistoryReadValueId,635,DataType
-HistoryReadValueId_Encoding_DefaultXml,636,Object
-HistoryReadValueId_Encoding_DefaultBinary,637,Object
-HistoryReadResult,638,DataType
-HistoryReadResult_Encoding_DefaultXml,639,Object
-HistoryReadResult_Encoding_DefaultBinary,640,Object
-HistoryReadDetails,641,DataType
-HistoryReadDetails_Encoding_DefaultXml,642,Object
-HistoryReadDetails_Encoding_DefaultBinary,643,Object
-ReadEventDetails,644,DataType
-ReadEventDetails_Encoding_DefaultXml,645,Object
-ReadEventDetails_Encoding_DefaultBinary,646,Object
-ReadRawModifiedDetails,647,DataType
-ReadRawModifiedDetails_Encoding_DefaultXml,648,Object
-ReadRawModifiedDetails_Encoding_DefaultBinary,649,Object
-ReadProcessedDetails,650,DataType
-ReadProcessedDetails_Encoding_DefaultXml,651,Object
-ReadProcessedDetails_Encoding_DefaultBinary,652,Object
-ReadAtTimeDetails,653,DataType
-ReadAtTimeDetails_Encoding_DefaultXml,654,Object
-ReadAtTimeDetails_Encoding_DefaultBinary,655,Object
-HistoryData,656,DataType
-HistoryData_Encoding_DefaultXml,657,Object
-HistoryData_Encoding_DefaultBinary,658,Object
-HistoryEvent,659,DataType
-HistoryEvent_Encoding_DefaultXml,660,Object
-HistoryEvent_Encoding_DefaultBinary,661,Object
-HistoryReadRequest,662,DataType
-HistoryReadRequest_Encoding_DefaultXml,663,Object
-HistoryReadRequest_Encoding_DefaultBinary,664,Object
-HistoryReadResponse,665,DataType
-HistoryReadResponse_Encoding_DefaultXml,666,Object
-HistoryReadResponse_Encoding_DefaultBinary,667,Object
-WriteValue,668,DataType
-WriteValue_Encoding_DefaultXml,669,Object
-WriteValue_Encoding_DefaultBinary,670,Object
-WriteRequest,671,DataType
-WriteRequest_Encoding_DefaultXml,672,Object
-WriteRequest_Encoding_DefaultBinary,673,Object
-WriteResponse,674,DataType
-WriteResponse_Encoding_DefaultXml,675,Object
-WriteResponse_Encoding_DefaultBinary,676,Object
-HistoryUpdateDetails,677,DataType
-HistoryUpdateDetails_Encoding_DefaultXml,678,Object
-HistoryUpdateDetails_Encoding_DefaultBinary,679,Object
-UpdateDataDetails,680,DataType
-UpdateDataDetails_Encoding_DefaultXml,681,Object
-UpdateDataDetails_Encoding_DefaultBinary,682,Object
-UpdateEventDetails,683,DataType
-UpdateEventDetails_Encoding_DefaultXml,684,Object
-UpdateEventDetails_Encoding_DefaultBinary,685,Object
-DeleteRawModifiedDetails,686,DataType
-DeleteRawModifiedDetails_Encoding_DefaultXml,687,Object
-DeleteRawModifiedDetails_Encoding_DefaultBinary,688,Object
-DeleteAtTimeDetails,689,DataType
-DeleteAtTimeDetails_Encoding_DefaultXml,690,Object
-DeleteAtTimeDetails_Encoding_DefaultBinary,691,Object
-DeleteEventDetails,692,DataType
-DeleteEventDetails_Encoding_DefaultXml,693,Object
-DeleteEventDetails_Encoding_DefaultBinary,694,Object
-HistoryUpdateResult,695,DataType
-HistoryUpdateResult_Encoding_DefaultXml,696,Object
-HistoryUpdateResult_Encoding_DefaultBinary,697,Object
-HistoryUpdateRequest,698,DataType
-HistoryUpdateRequest_Encoding_DefaultXml,699,Object
-HistoryUpdateRequest_Encoding_DefaultBinary,700,Object
-HistoryUpdateResponse,701,DataType
-HistoryUpdateResponse_Encoding_DefaultXml,702,Object
-HistoryUpdateResponse_Encoding_DefaultBinary,703,Object
-CallMethodRequest,704,DataType
-CallMethodRequest_Encoding_DefaultXml,705,Object
-CallMethodRequest_Encoding_DefaultBinary,706,Object
-CallMethodResult,707,DataType
-CallMethodResult_Encoding_DefaultXml,708,Object
-CallMethodResult_Encoding_DefaultBinary,709,Object
-CallRequest,710,DataType
-CallRequest_Encoding_DefaultXml,711,Object
-CallRequest_Encoding_DefaultBinary,712,Object
-CallResponse,713,DataType
-CallResponse_Encoding_DefaultXml,714,Object
-CallResponse_Encoding_DefaultBinary,715,Object
-MonitoringMode,716,DataType
-DataChangeTrigger,717,DataType
-DeadbandType,718,DataType
-MonitoringFilter,719,DataType
-MonitoringFilter_Encoding_DefaultXml,720,Object
-MonitoringFilter_Encoding_DefaultBinary,721,Object
-DataChangeFilter,722,DataType
-DataChangeFilter_Encoding_DefaultXml,723,Object
-DataChangeFilter_Encoding_DefaultBinary,724,Object
-EventFilter,725,DataType
-EventFilter_Encoding_DefaultXml,726,Object
-EventFilter_Encoding_DefaultBinary,727,Object
-AggregateFilter,728,DataType
-AggregateFilter_Encoding_DefaultXml,729,Object
-AggregateFilter_Encoding_DefaultBinary,730,Object
-MonitoringFilterResult,731,DataType
-MonitoringFilterResult_Encoding_DefaultXml,732,Object
-MonitoringFilterResult_Encoding_DefaultBinary,733,Object
-EventFilterResult,734,DataType
-EventFilterResult_Encoding_DefaultXml,735,Object
-EventFilterResult_Encoding_DefaultBinary,736,Object
-AggregateFilterResult,737,DataType
-AggregateFilterResult_Encoding_DefaultXml,738,Object
-AggregateFilterResult_Encoding_DefaultBinary,739,Object
-MonitoringParameters,740,DataType
-MonitoringParameters_Encoding_DefaultXml,741,Object
-MonitoringParameters_Encoding_DefaultBinary,742,Object
-MonitoredItemCreateRequest,743,DataType
-MonitoredItemCreateRequest_Encoding_DefaultXml,744,Object
-MonitoredItemCreateRequest_Encoding_DefaultBinary,745,Object
-MonitoredItemCreateResult,746,DataType
-MonitoredItemCreateResult_Encoding_DefaultXml,747,Object
-MonitoredItemCreateResult_Encoding_DefaultBinary,748,Object
-CreateMonitoredItemsRequest,749,DataType
-CreateMonitoredItemsRequest_Encoding_DefaultXml,750,Object
-CreateMonitoredItemsRequest_Encoding_DefaultBinary,751,Object
-CreateMonitoredItemsResponse,752,DataType
-CreateMonitoredItemsResponse_Encoding_DefaultXml,753,Object
-CreateMonitoredItemsResponse_Encoding_DefaultBinary,754,Object
-MonitoredItemModifyRequest,755,DataType
-MonitoredItemModifyRequest_Encoding_DefaultXml,756,Object
-MonitoredItemModifyRequest_Encoding_DefaultBinary,757,Object
-MonitoredItemModifyResult,758,DataType
-MonitoredItemModifyResult_Encoding_DefaultXml,759,Object
-MonitoredItemModifyResult_Encoding_DefaultBinary,760,Object
-ModifyMonitoredItemsRequest,761,DataType
-ModifyMonitoredItemsRequest_Encoding_DefaultXml,762,Object
-ModifyMonitoredItemsRequest_Encoding_DefaultBinary,763,Object
-ModifyMonitoredItemsResponse,764,DataType
-ModifyMonitoredItemsResponse_Encoding_DefaultXml,765,Object
-ModifyMonitoredItemsResponse_Encoding_DefaultBinary,766,Object
-SetMonitoringModeRequest,767,DataType
-SetMonitoringModeRequest_Encoding_DefaultXml,768,Object
-SetMonitoringModeRequest_Encoding_DefaultBinary,769,Object
-SetMonitoringModeResponse,770,DataType
-SetMonitoringModeResponse_Encoding_DefaultXml,771,Object
-SetMonitoringModeResponse_Encoding_DefaultBinary,772,Object
-SetTriggeringRequest,773,DataType
-SetTriggeringRequest_Encoding_DefaultXml,774,Object
-SetTriggeringRequest_Encoding_DefaultBinary,775,Object
-SetTriggeringResponse,776,DataType
-SetTriggeringResponse_Encoding_DefaultXml,777,Object
-SetTriggeringResponse_Encoding_DefaultBinary,778,Object
-DeleteMonitoredItemsRequest,779,DataType
-DeleteMonitoredItemsRequest_Encoding_DefaultXml,780,Object
-DeleteMonitoredItemsRequest_Encoding_DefaultBinary,781,Object
-DeleteMonitoredItemsResponse,782,DataType
-DeleteMonitoredItemsResponse_Encoding_DefaultXml,783,Object
-DeleteMonitoredItemsResponse_Encoding_DefaultBinary,784,Object
-CreateSubscriptionRequest,785,DataType
-CreateSubscriptionRequest_Encoding_DefaultXml,786,Object
-CreateSubscriptionRequest_Encoding_DefaultBinary,787,Object
-CreateSubscriptionResponse,788,DataType
-CreateSubscriptionResponse_Encoding_DefaultXml,789,Object
-CreateSubscriptionResponse_Encoding_DefaultBinary,790,Object
-ModifySubscriptionRequest,791,DataType
-ModifySubscriptionRequest_Encoding_DefaultXml,792,Object
-ModifySubscriptionRequest_Encoding_DefaultBinary,793,Object
-ModifySubscriptionResponse,794,DataType
-ModifySubscriptionResponse_Encoding_DefaultXml,795,Object
-ModifySubscriptionResponse_Encoding_DefaultBinary,796,Object
-SetPublishingModeRequest,797,DataType
-SetPublishingModeRequest_Encoding_DefaultXml,798,Object
-SetPublishingModeRequest_Encoding_DefaultBinary,799,Object
-SetPublishingModeResponse,800,DataType
-SetPublishingModeResponse_Encoding_DefaultXml,801,Object
-SetPublishingModeResponse_Encoding_DefaultBinary,802,Object
-NotificationMessage,803,DataType
-NotificationMessage_Encoding_DefaultXml,804,Object
-NotificationMessage_Encoding_DefaultBinary,805,Object
-MonitoredItemNotification,806,DataType
-MonitoredItemNotification_Encoding_DefaultXml,807,Object
-MonitoredItemNotification_Encoding_DefaultBinary,808,Object
-DataChangeNotification,809,DataType
-DataChangeNotification_Encoding_DefaultXml,810,Object
-DataChangeNotification_Encoding_DefaultBinary,811,Object
-StatusChangeNotification,818,DataType
-StatusChangeNotification_Encoding_DefaultXml,819,Object
-StatusChangeNotification_Encoding_DefaultBinary,820,Object
-SubscriptionAcknowledgement,821,DataType
-SubscriptionAcknowledgement_Encoding_DefaultXml,822,Object
-SubscriptionAcknowledgement_Encoding_DefaultBinary,823,Object
-PublishRequest,824,DataType
-PublishRequest_Encoding_DefaultXml,825,Object
-PublishRequest_Encoding_DefaultBinary,826,Object
-PublishResponse,827,DataType
-PublishResponse_Encoding_DefaultXml,828,Object
-PublishResponse_Encoding_DefaultBinary,829,Object
-RepublishRequest,830,DataType
-RepublishRequest_Encoding_DefaultXml,831,Object
-RepublishRequest_Encoding_DefaultBinary,832,Object
-RepublishResponse,833,DataType
-RepublishResponse_Encoding_DefaultXml,834,Object
-RepublishResponse_Encoding_DefaultBinary,835,Object
-TransferResult,836,DataType
-TransferResult_Encoding_DefaultXml,837,Object
-TransferResult_Encoding_DefaultBinary,838,Object
-TransferSubscriptionsRequest,839,DataType
-TransferSubscriptionsRequest_Encoding_DefaultXml,840,Object
-TransferSubscriptionsRequest_Encoding_DefaultBinary,841,Object
-TransferSubscriptionsResponse,842,DataType
-TransferSubscriptionsResponse_Encoding_DefaultXml,843,Object
-TransferSubscriptionsResponse_Encoding_DefaultBinary,844,Object
-DeleteSubscriptionsRequest,845,DataType
-DeleteSubscriptionsRequest_Encoding_DefaultXml,846,Object
-DeleteSubscriptionsRequest_Encoding_DefaultBinary,847,Object
-DeleteSubscriptionsResponse,848,DataType
-DeleteSubscriptionsResponse_Encoding_DefaultXml,849,Object
-DeleteSubscriptionsResponse_Encoding_DefaultBinary,850,Object
-RedundancySupport,851,DataType
-ServerState,852,DataType
-RedundantServerDataType,853,DataType
-RedundantServerDataType_Encoding_DefaultXml,854,Object
-RedundantServerDataType_Encoding_DefaultBinary,855,Object
-SamplingIntervalDiagnosticsDataType,856,DataType
-SamplingIntervalDiagnosticsDataType_Encoding_DefaultXml,857,Object
-SamplingIntervalDiagnosticsDataType_Encoding_DefaultBinary,858,Object
-ServerDiagnosticsSummaryDataType,859,DataType
-ServerDiagnosticsSummaryDataType_Encoding_DefaultXml,860,Object
-ServerDiagnosticsSummaryDataType_Encoding_DefaultBinary,861,Object
-ServerStatusDataType,862,DataType
-ServerStatusDataType_Encoding_DefaultXml,863,Object
-ServerStatusDataType_Encoding_DefaultBinary,864,Object
-SessionDiagnosticsDataType,865,DataType
-SessionDiagnosticsDataType_Encoding_DefaultXml,866,Object
-SessionDiagnosticsDataType_Encoding_DefaultBinary,867,Object
-SessionSecurityDiagnosticsDataType,868,DataType
-SessionSecurityDiagnosticsDataType_Encoding_DefaultXml,869,Object
-SessionSecurityDiagnosticsDataType_Encoding_DefaultBinary,870,Object
-ServiceCounterDataType,871,DataType
-ServiceCounterDataType_Encoding_DefaultXml,872,Object
-ServiceCounterDataType_Encoding_DefaultBinary,873,Object
-SubscriptionDiagnosticsDataType,874,DataType
-SubscriptionDiagnosticsDataType_Encoding_DefaultXml,875,Object
-SubscriptionDiagnosticsDataType_Encoding_DefaultBinary,876,Object
-ModelChangeStructureDataType,877,DataType
-ModelChangeStructureDataType_Encoding_DefaultXml,878,Object
-ModelChangeStructureDataType_Encoding_DefaultBinary,879,Object
-Range,884,DataType
-Range_Encoding_DefaultXml,885,Object
-Range_Encoding_DefaultBinary,886,Object
-EUInformation,887,DataType
-EUInformation_Encoding_DefaultXml,888,Object
-EUInformation_Encoding_DefaultBinary,889,Object
-ExceptionDeviationFormat,890,DataType
-Annotation,891,DataType
-Annotation_Encoding_DefaultXml,892,Object
-Annotation_Encoding_DefaultBinary,893,Object
-ProgramDiagnosticDataType,894,DataType
-ProgramDiagnosticDataType_Encoding_DefaultXml,895,Object
-ProgramDiagnosticDataType_Encoding_DefaultBinary,896,Object
-SemanticChangeStructureDataType,897,DataType
-SemanticChangeStructureDataType_Encoding_DefaultXml,898,Object
-SemanticChangeStructureDataType_Encoding_DefaultBinary,899,Object
-EventNotificationList,914,DataType
-EventNotificationList_Encoding_DefaultXml,915,Object
-EventNotificationList_Encoding_DefaultBinary,916,Object
-EventFieldList,917,DataType
-EventFieldList_Encoding_DefaultXml,918,Object
-EventFieldList_Encoding_DefaultBinary,919,Object
-HistoryEventFieldList,920,DataType
-HistoryEventFieldList_Encoding_DefaultXml,921,Object
-HistoryEventFieldList_Encoding_DefaultBinary,922,Object
-IssuedIdentityToken,938,DataType
-IssuedIdentityToken_Encoding_DefaultXml,939,Object
-IssuedIdentityToken_Encoding_DefaultBinary,940,Object
-NotificationData,945,DataType
-NotificationData_Encoding_DefaultXml,946,Object
-NotificationData_Encoding_DefaultBinary,947,Object
-AggregateConfiguration,948,DataType
-AggregateConfiguration_Encoding_DefaultXml,949,Object
-AggregateConfiguration_Encoding_DefaultBinary,950,Object
-ImageBMP,2000,DataType
-ImageGIF,2001,DataType
-ImageJPG,2002,DataType
-ImagePNG,2003,DataType
-ServerType,2004,ObjectType
-ServerType_ServerArray,2005,Variable
-ServerType_NamespaceArray,2006,Variable
-ServerType_ServerStatus,2007,Variable
-ServerType_ServiceLevel,2008,Variable
-ServerType_ServerCapabilities,2009,Object
-ServerType_ServerDiagnostics,2010,Object
-ServerType_VendorServerInfo,2011,Object
-ServerType_ServerRedundancy,2012,Object
-ServerCapabilitiesType,2013,ObjectType
-ServerCapabilitiesType_ServerProfileArray,2014,Variable
-ServerCapabilitiesType_LocaleIdArray,2016,Variable
-ServerCapabilitiesType_MinSupportedSampleRate,2017,Variable
-ServerCapabilitiesType_ModellingRules,2019,Object
-ServerDiagnosticsType,2020,ObjectType
-ServerDiagnosticsType_ServerDiagnosticsSummary,2021,Variable
-ServerDiagnosticsType_SamplingIntervalDiagnosticsArray,2022,Variable
-ServerDiagnosticsType_SubscriptionDiagnosticsArray,2023,Variable
-ServerDiagnosticsType_EnabledFlag,2025,Variable
-SessionsDiagnosticsSummaryType,2026,ObjectType
-SessionsDiagnosticsSummaryType_SessionDiagnosticsArray,2027,Variable
-SessionsDiagnosticsSummaryType_SessionSecurityDiagnosticsArray,2028,Variable
-SessionDiagnosticsObjectType,2029,ObjectType
-SessionDiagnosticsObjectType_SessionDiagnostics,2030,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics,2031,Variable
-SessionDiagnosticsObjectType_SubscriptionDiagnosticsArray,2032,Variable
-VendorServerInfoType,2033,ObjectType
-ServerRedundancyType,2034,ObjectType
-ServerRedundancyType_RedundancySupport,2035,Variable
-TransparentRedundancyType,2036,ObjectType
-TransparentRedundancyType_CurrentServerId,2037,Variable
-TransparentRedundancyType_RedundantServerArray,2038,Variable
-NonTransparentRedundancyType,2039,ObjectType
-NonTransparentRedundancyType_ServerUriArray,2040,Variable
-BaseEventType,2041,ObjectType
-BaseEventType_EventId,2042,Variable
-BaseEventType_EventType,2043,Variable
-BaseEventType_SourceNode,2044,Variable
-BaseEventType_SourceName,2045,Variable
-BaseEventType_Time,2046,Variable
-BaseEventType_ReceiveTime,2047,Variable
-BaseEventType_Message,2050,Variable
-BaseEventType_Severity,2051,Variable
-AuditEventType,2052,ObjectType
-AuditEventType_ActionTimeStamp,2053,Variable
-AuditEventType_Status,2054,Variable
-AuditEventType_ServerId,2055,Variable
-AuditEventType_ClientAuditEntryId,2056,Variable
-AuditEventType_ClientUserId,2057,Variable
-AuditSecurityEventType,2058,ObjectType
-AuditChannelEventType,2059,ObjectType
-AuditOpenSecureChannelEventType,2060,ObjectType
-AuditOpenSecureChannelEventType_ClientCertificate,2061,Variable
-AuditOpenSecureChannelEventType_RequestType,2062,Variable
-AuditOpenSecureChannelEventType_SecurityPolicyUri,2063,Variable
-AuditOpenSecureChannelEventType_SecurityMode,2065,Variable
-AuditOpenSecureChannelEventType_RequestedLifetime,2066,Variable
-AuditSessionEventType,2069,ObjectType
-AuditSessionEventType_SessionId,2070,Variable
-AuditCreateSessionEventType,2071,ObjectType
-AuditCreateSessionEventType_SecureChannelId,2072,Variable
-AuditCreateSessionEventType_ClientCertificate,2073,Variable
-AuditCreateSessionEventType_RevisedSessionTimeout,2074,Variable
-AuditActivateSessionEventType,2075,ObjectType
-AuditActivateSessionEventType_ClientSoftwareCertificates,2076,Variable
-AuditActivateSessionEventType_UserIdentityToken,2077,Variable
-AuditCancelEventType,2078,ObjectType
-AuditCancelEventType_RequestHandle,2079,Variable
-AuditCertificateEventType,2080,ObjectType
-AuditCertificateEventType_Certificate,2081,Variable
-AuditCertificateDataMismatchEventType,2082,ObjectType
-AuditCertificateDataMismatchEventType_InvalidHostname,2083,Variable
-AuditCertificateDataMismatchEventType_InvalidUri,2084,Variable
-AuditCertificateExpiredEventType,2085,ObjectType
-AuditCertificateInvalidEventType,2086,ObjectType
-AuditCertificateUntrustedEventType,2087,ObjectType
-AuditCertificateRevokedEventType,2088,ObjectType
-AuditCertificateMismatchEventType,2089,ObjectType
-AuditNodeManagementEventType,2090,ObjectType
-AuditAddNodesEventType,2091,ObjectType
-AuditAddNodesEventType_NodesToAdd,2092,Variable
-AuditDeleteNodesEventType,2093,ObjectType
-AuditDeleteNodesEventType_NodesToDelete,2094,Variable
-AuditAddReferencesEventType,2095,ObjectType
-AuditAddReferencesEventType_ReferencesToAdd,2096,Variable
-AuditDeleteReferencesEventType,2097,ObjectType
-AuditDeleteReferencesEventType_ReferencesToDelete,2098,Variable
-AuditUpdateEventType,2099,ObjectType
-AuditWriteUpdateEventType,2100,ObjectType
-AuditWriteUpdateEventType_IndexRange,2101,Variable
-AuditWriteUpdateEventType_OldValue,2102,Variable
-AuditWriteUpdateEventType_NewValue,2103,Variable
-AuditHistoryUpdateEventType,2104,ObjectType
-AuditUpdateMethodEventType,2127,ObjectType
-AuditUpdateMethodEventType_MethodId,2128,Variable
-AuditUpdateMethodEventType_InputArguments,2129,Variable
-SystemEventType,2130,ObjectType
-DeviceFailureEventType,2131,ObjectType
-BaseModelChangeEventType,2132,ObjectType
-GeneralModelChangeEventType,2133,ObjectType
-GeneralModelChangeEventType_Changes,2134,Variable
-ServerVendorCapabilityType,2137,VariableType
-ServerStatusType,2138,VariableType
-ServerStatusType_StartTime,2139,Variable
-ServerStatusType_CurrentTime,2140,Variable
-ServerStatusType_State,2141,Variable
-ServerStatusType_BuildInfo,2142,Variable
-ServerDiagnosticsSummaryType,2150,VariableType
-ServerDiagnosticsSummaryType_ServerViewCount,2151,Variable
-ServerDiagnosticsSummaryType_CurrentSessionCount,2152,Variable
-ServerDiagnosticsSummaryType_CumulatedSessionCount,2153,Variable
-ServerDiagnosticsSummaryType_SecurityRejectedSessionCount,2154,Variable
-ServerDiagnosticsSummaryType_RejectedSessionCount,2155,Variable
-ServerDiagnosticsSummaryType_SessionTimeoutCount,2156,Variable
-ServerDiagnosticsSummaryType_SessionAbortCount,2157,Variable
-ServerDiagnosticsSummaryType_PublishingIntervalCount,2159,Variable
-ServerDiagnosticsSummaryType_CurrentSubscriptionCount,2160,Variable
-ServerDiagnosticsSummaryType_CumulatedSubscriptionCount,2161,Variable
-ServerDiagnosticsSummaryType_SecurityRejectedRequestsCount,2162,Variable
-ServerDiagnosticsSummaryType_RejectedRequestsCount,2163,Variable
-SamplingIntervalDiagnosticsArrayType,2164,VariableType
-SamplingIntervalDiagnosticsType,2165,VariableType
-SamplingIntervalDiagnosticsType_SamplingInterval,2166,Variable
-SubscriptionDiagnosticsArrayType,2171,VariableType
-SubscriptionDiagnosticsType,2172,VariableType
-SubscriptionDiagnosticsType_SessionId,2173,Variable
-SubscriptionDiagnosticsType_SubscriptionId,2174,Variable
-SubscriptionDiagnosticsType_Priority,2175,Variable
-SubscriptionDiagnosticsType_PublishingInterval,2176,Variable
-SubscriptionDiagnosticsType_MaxKeepAliveCount,2177,Variable
-SubscriptionDiagnosticsType_MaxNotificationsPerPublish,2179,Variable
-SubscriptionDiagnosticsType_PublishingEnabled,2180,Variable
-SubscriptionDiagnosticsType_ModifyCount,2181,Variable
-SubscriptionDiagnosticsType_EnableCount,2182,Variable
-SubscriptionDiagnosticsType_DisableCount,2183,Variable
-SubscriptionDiagnosticsType_RepublishRequestCount,2184,Variable
-SubscriptionDiagnosticsType_RepublishMessageRequestCount,2185,Variable
-SubscriptionDiagnosticsType_RepublishMessageCount,2186,Variable
-SubscriptionDiagnosticsType_TransferRequestCount,2187,Variable
-SubscriptionDiagnosticsType_TransferredToAltClientCount,2188,Variable
-SubscriptionDiagnosticsType_TransferredToSameClientCount,2189,Variable
-SubscriptionDiagnosticsType_PublishRequestCount,2190,Variable
-SubscriptionDiagnosticsType_DataChangeNotificationsCount,2191,Variable
-SubscriptionDiagnosticsType_NotificationsCount,2193,Variable
-SessionDiagnosticsArrayType,2196,VariableType
-SessionDiagnosticsVariableType,2197,VariableType
-SessionDiagnosticsVariableType_SessionId,2198,Variable
-SessionDiagnosticsVariableType_SessionName,2199,Variable
-SessionDiagnosticsVariableType_ClientDescription,2200,Variable
-SessionDiagnosticsVariableType_ServerUri,2201,Variable
-SessionDiagnosticsVariableType_EndpointUrl,2202,Variable
-SessionDiagnosticsVariableType_LocaleIds,2203,Variable
-SessionDiagnosticsVariableType_ActualSessionTimeout,2204,Variable
-SessionDiagnosticsVariableType_ClientConnectionTime,2205,Variable
-SessionDiagnosticsVariableType_ClientLastContactTime,2206,Variable
-SessionDiagnosticsVariableType_CurrentSubscriptionsCount,2207,Variable
-SessionDiagnosticsVariableType_CurrentMonitoredItemsCount,2208,Variable
-SessionDiagnosticsVariableType_CurrentPublishRequestsInQueue,2209,Variable
-SessionDiagnosticsVariableType_ReadCount,2217,Variable
-SessionDiagnosticsVariableType_HistoryReadCount,2218,Variable
-SessionDiagnosticsVariableType_WriteCount,2219,Variable
-SessionDiagnosticsVariableType_HistoryUpdateCount,2220,Variable
-SessionDiagnosticsVariableType_CallCount,2221,Variable
-SessionDiagnosticsVariableType_CreateMonitoredItemsCount,2222,Variable
-SessionDiagnosticsVariableType_ModifyMonitoredItemsCount,2223,Variable
-SessionDiagnosticsVariableType_SetMonitoringModeCount,2224,Variable
-SessionDiagnosticsVariableType_SetTriggeringCount,2225,Variable
-SessionDiagnosticsVariableType_DeleteMonitoredItemsCount,2226,Variable
-SessionDiagnosticsVariableType_CreateSubscriptionCount,2227,Variable
-SessionDiagnosticsVariableType_ModifySubscriptionCount,2228,Variable
-SessionDiagnosticsVariableType_SetPublishingModeCount,2229,Variable
-SessionDiagnosticsVariableType_PublishCount,2230,Variable
-SessionDiagnosticsVariableType_RepublishCount,2231,Variable
-SessionDiagnosticsVariableType_TransferSubscriptionsCount,2232,Variable
-SessionDiagnosticsVariableType_DeleteSubscriptionsCount,2233,Variable
-SessionDiagnosticsVariableType_AddNodesCount,2234,Variable
-SessionDiagnosticsVariableType_AddReferencesCount,2235,Variable
-SessionDiagnosticsVariableType_DeleteNodesCount,2236,Variable
-SessionDiagnosticsVariableType_DeleteReferencesCount,2237,Variable
-SessionDiagnosticsVariableType_BrowseCount,2238,Variable
-SessionDiagnosticsVariableType_BrowseNextCount,2239,Variable
-SessionDiagnosticsVariableType_TranslateBrowsePathsToNodeIdsCount,2240,Variable
-SessionDiagnosticsVariableType_QueryFirstCount,2241,Variable
-SessionDiagnosticsVariableType_QueryNextCount,2242,Variable
-SessionSecurityDiagnosticsArrayType,2243,VariableType
-SessionSecurityDiagnosticsType,2244,VariableType
-SessionSecurityDiagnosticsType_SessionId,2245,Variable
-SessionSecurityDiagnosticsType_ClientUserIdOfSession,2246,Variable
-SessionSecurityDiagnosticsType_ClientUserIdHistory,2247,Variable
-SessionSecurityDiagnosticsType_AuthenticationMechanism,2248,Variable
-SessionSecurityDiagnosticsType_Encoding,2249,Variable
-SessionSecurityDiagnosticsType_TransportProtocol,2250,Variable
-SessionSecurityDiagnosticsType_SecurityMode,2251,Variable
-SessionSecurityDiagnosticsType_SecurityPolicyUri,2252,Variable
-Server,2253,Object
-Server_ServerArray,2254,Variable
-Server_NamespaceArray,2255,Variable
-Server_ServerStatus,2256,Variable
-Server_ServerStatus_StartTime,2257,Variable
-Server_ServerStatus_CurrentTime,2258,Variable
-Server_ServerStatus_State,2259,Variable
-Server_ServerStatus_BuildInfo,2260,Variable
-Server_ServerStatus_BuildInfo_ProductName,2261,Variable
-Server_ServerStatus_BuildInfo_ProductUri,2262,Variable
-Server_ServerStatus_BuildInfo_ManufacturerName,2263,Variable
-Server_ServerStatus_BuildInfo_SoftwareVersion,2264,Variable
-Server_ServerStatus_BuildInfo_BuildNumber,2265,Variable
-Server_ServerStatus_BuildInfo_BuildDate,2266,Variable
-Server_ServiceLevel,2267,Variable
-Server_ServerCapabilities,2268,Object
-Server_ServerCapabilities_ServerProfileArray,2269,Variable
-Server_ServerCapabilities_LocaleIdArray,2271,Variable
-Server_ServerCapabilities_MinSupportedSampleRate,2272,Variable
-Server_ServerDiagnostics,2274,Object
-Server_ServerDiagnostics_ServerDiagnosticsSummary,2275,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_ServerViewCount,2276,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSessionCount,2277,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSessionCount,2278,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedSessionCount,2279,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_SessionTimeoutCount,2281,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_SessionAbortCount,2282,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_PublishingIntervalCount,2284,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSubscriptionCount,2285,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSubscriptionCount,2286,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedRequestsCount,2287,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_RejectedRequestsCount,2288,Variable
-Server_ServerDiagnostics_SamplingIntervalDiagnosticsArray,2289,Variable
-Server_ServerDiagnostics_SubscriptionDiagnosticsArray,2290,Variable
-Server_ServerDiagnostics_EnabledFlag,2294,Variable
-Server_VendorServerInfo,2295,Object
-Server_ServerRedundancy,2296,Object
-StateMachineType,2299,ObjectType
-StateType,2307,ObjectType
-StateType_StateNumber,2308,Variable
-InitialStateType,2309,ObjectType
-TransitionType,2310,ObjectType
-TransitionEventType,2311,ObjectType
-TransitionType_TransitionNumber,2312,Variable
-AuditUpdateStateEventType,2315,ObjectType
-HistoricalDataConfigurationType,2318,ObjectType
-HistoricalDataConfigurationType_Stepped,2323,Variable
-HistoricalDataConfigurationType_Definition,2324,Variable
-HistoricalDataConfigurationType_MaxTimeInterval,2325,Variable
-HistoricalDataConfigurationType_MinTimeInterval,2326,Variable
-HistoricalDataConfigurationType_ExceptionDeviation,2327,Variable
-HistoricalDataConfigurationType_ExceptionDeviationFormat,2328,Variable
-HistoryServerCapabilitiesType,2330,ObjectType
-HistoryServerCapabilitiesType_AccessHistoryDataCapability,2331,Variable
-HistoryServerCapabilitiesType_AccessHistoryEventsCapability,2332,Variable
-HistoryServerCapabilitiesType_InsertDataCapability,2334,Variable
-HistoryServerCapabilitiesType_ReplaceDataCapability,2335,Variable
-HistoryServerCapabilitiesType_UpdateDataCapability,2336,Variable
-HistoryServerCapabilitiesType_DeleteRawCapability,2337,Variable
-HistoryServerCapabilitiesType_DeleteAtTimeCapability,2338,Variable
-AggregateFunctionType,2340,ObjectType
-AggregateFunction_Interpolative,2341,Object
-AggregateFunction_Average,2342,Object
-AggregateFunction_TimeAverage,2343,Object
-AggregateFunction_Total,2344,Object
-AggregateFunction_Minimum,2346,Object
-AggregateFunction_Maximum,2347,Object
-AggregateFunction_MinimumActualTime,2348,Object
-AggregateFunction_MaximumActualTime,2349,Object
-AggregateFunction_Range,2350,Object
-AggregateFunction_AnnotationCount,2351,Object
-AggregateFunction_Count,2352,Object
-AggregateFunction_NumberOfTransitions,2355,Object
-AggregateFunction_Start,2357,Object
-AggregateFunction_End,2358,Object
-AggregateFunction_Delta,2359,Object
-AggregateFunction_DurationGood,2360,Object
-AggregateFunction_DurationBad,2361,Object
-AggregateFunction_PercentGood,2362,Object
-AggregateFunction_PercentBad,2363,Object
-AggregateFunction_WorstQuality,2364,Object
-DataItemType,2365,VariableType
-DataItemType_Definition,2366,Variable
-DataItemType_ValuePrecision,2367,Variable
-AnalogItemType,2368,VariableType
-AnalogItemType_EURange,2369,Variable
-AnalogItemType_InstrumentRange,2370,Variable
-AnalogItemType_EngineeringUnits,2371,Variable
-DiscreteItemType,2372,VariableType
-TwoStateDiscreteType,2373,VariableType
-TwoStateDiscreteType_FalseState,2374,Variable
-TwoStateDiscreteType_TrueState,2375,Variable
-MultiStateDiscreteType,2376,VariableType
-MultiStateDiscreteType_EnumStrings,2377,Variable
-ProgramTransitionEventType,2378,ObjectType
-ProgramTransitionEventType_IntermediateResult,2379,Variable
-ProgramDiagnosticType,2380,VariableType
-ProgramDiagnosticType_CreateSessionId,2381,Variable
-ProgramDiagnosticType_CreateClientName,2382,Variable
-ProgramDiagnosticType_InvocationCreationTime,2383,Variable
-ProgramDiagnosticType_LastTransitionTime,2384,Variable
-ProgramDiagnosticType_LastMethodCall,2385,Variable
-ProgramDiagnosticType_LastMethodSessionId,2386,Variable
-ProgramDiagnosticType_LastMethodInputArguments,2387,Variable
-ProgramDiagnosticType_LastMethodOutputArguments,2388,Variable
-ProgramDiagnosticType_LastMethodCallTime,2389,Variable
-ProgramDiagnosticType_LastMethodReturnStatus,2390,Variable
-ProgramStateMachineType,2391,ObjectType
-ProgramStateMachineType_Creatable,2392,Variable
-ProgramStateMachineType_Deletable,2393,Variable
-ProgramStateMachineType_AutoDelete,2394,Variable
-ProgramStateMachineType_RecycleCount,2395,Variable
-ProgramStateMachineType_InstanceCount,2396,Variable
-ProgramStateMachineType_MaxInstanceCount,2397,Variable
-ProgramStateMachineType_MaxRecycleCount,2398,Variable
-ProgramStateMachineType_ProgramDiagnostic,2399,Variable
-ProgramStateMachineType_Ready,2400,Object
-ProgramStateMachineType_Ready_StateNumber,2401,Variable
-ProgramStateMachineType_Running,2402,Object
-ProgramStateMachineType_Running_StateNumber,2403,Variable
-ProgramStateMachineType_Suspended,2404,Object
-ProgramStateMachineType_Suspended_StateNumber,2405,Variable
-ProgramStateMachineType_Halted,2406,Object
-ProgramStateMachineType_Halted_StateNumber,2407,Variable
-ProgramStateMachineType_HaltedToReady,2408,Object
-ProgramStateMachineType_HaltedToReady_TransitionNumber,2409,Variable
-ProgramStateMachineType_ReadyToRunning,2410,Object
-ProgramStateMachineType_ReadyToRunning_TransitionNumber,2411,Variable
-ProgramStateMachineType_RunningToHalted,2412,Object
-ProgramStateMachineType_RunningToHalted_TransitionNumber,2413,Variable
-ProgramStateMachineType_RunningToReady,2414,Object
-ProgramStateMachineType_RunningToReady_TransitionNumber,2415,Variable
-ProgramStateMachineType_RunningToSuspended,2416,Object
-ProgramStateMachineType_RunningToSuspended_TransitionNumber,2417,Variable
-ProgramStateMachineType_SuspendedToRunning,2418,Object
-ProgramStateMachineType_SuspendedToRunning_TransitionNumber,2419,Variable
-ProgramStateMachineType_SuspendedToHalted,2420,Object
-ProgramStateMachineType_SuspendedToHalted_TransitionNumber,2421,Variable
-ProgramStateMachineType_SuspendedToReady,2422,Object
-ProgramStateMachineType_SuspendedToReady_TransitionNumber,2423,Variable
-ProgramStateMachineType_ReadyToHalted,2424,Object
-ProgramStateMachineType_ReadyToHalted_TransitionNumber,2425,Variable
-ProgramStateMachineType_Start,2426,Method
-ProgramStateMachineType_Suspend,2427,Method
-ProgramStateMachineType_Resume,2428,Method
-ProgramStateMachineType_Halt,2429,Method
-ProgramStateMachineType_Reset,2430,Method
-SessionDiagnosticsVariableType_RegisterNodesCount,2730,Variable
-SessionDiagnosticsVariableType_UnregisterNodesCount,2731,Variable
-ServerCapabilitiesType_MaxBrowseContinuationPoints,2732,Variable
-ServerCapabilitiesType_MaxQueryContinuationPoints,2733,Variable
-ServerCapabilitiesType_MaxHistoryContinuationPoints,2734,Variable
-Server_ServerCapabilities_MaxBrowseContinuationPoints,2735,Variable
-Server_ServerCapabilities_MaxQueryContinuationPoints,2736,Variable
-Server_ServerCapabilities_MaxHistoryContinuationPoints,2737,Variable
-SemanticChangeEventType,2738,ObjectType
-SemanticChangeEventType_Changes,2739,Variable
-ServerType_Auditing,2742,Variable
-ServerDiagnosticsType_SessionsDiagnosticsSummary,2744,Object
-AuditChannelEventType_SecureChannelId,2745,Variable
-AuditOpenSecureChannelEventType_ClientCertificateThumbprint,2746,Variable
-AuditCreateSessionEventType_ClientCertificateThumbprint,2747,Variable
-AuditUrlMismatchEventType,2748,ObjectType
-AuditUrlMismatchEventType_EndpointUrl,2749,Variable
-AuditWriteUpdateEventType_AttributeId,2750,Variable
-AuditHistoryUpdateEventType_ParameterDataTypeId,2751,Variable
-ServerStatusType_SecondsTillShutdown,2752,Variable
-ServerStatusType_ShutdownReason,2753,Variable
-ServerCapabilitiesType_AggregateFunctions,2754,Object
-StateVariableType,2755,VariableType
-StateVariableType_Id,2756,Variable
-StateVariableType_Name,2757,Variable
-StateVariableType_Number,2758,Variable
-StateVariableType_EffectiveDisplayName,2759,Variable
-FiniteStateVariableType,2760,VariableType
-FiniteStateVariableType_Id,2761,Variable
-TransitionVariableType,2762,VariableType
-TransitionVariableType_Id,2763,Variable
-TransitionVariableType_Name,2764,Variable
-TransitionVariableType_Number,2765,Variable
-TransitionVariableType_TransitionTime,2766,Variable
-FiniteTransitionVariableType,2767,VariableType
-FiniteTransitionVariableType_Id,2768,Variable
-StateMachineType_CurrentState,2769,Variable
-StateMachineType_LastTransition,2770,Variable
-FiniteStateMachineType,2771,ObjectType
-FiniteStateMachineType_CurrentState,2772,Variable
-FiniteStateMachineType_LastTransition,2773,Variable
-TransitionEventType_Transition,2774,Variable
-TransitionEventType_FromState,2775,Variable
-TransitionEventType_ToState,2776,Variable
-AuditUpdateStateEventType_OldStateId,2777,Variable
-AuditUpdateStateEventType_NewStateId,2778,Variable
-ConditionType,2782,ObjectType
-RefreshStartEventType,2787,ObjectType
-RefreshEndEventType,2788,ObjectType
-RefreshRequiredEventType,2789,ObjectType
-AuditConditionEventType,2790,ObjectType
-AuditConditionEnableEventType,2803,ObjectType
-AuditConditionCommentEventType,2829,ObjectType
-DialogConditionType,2830,ObjectType
-DialogConditionType_Prompt,2831,Variable
-AcknowledgeableConditionType,2881,ObjectType
-AlarmConditionType,2915,ObjectType
-ShelvedStateMachineType,2929,ObjectType
-ShelvedStateMachineType_Unshelved,2930,Object
-ShelvedStateMachineType_TimedShelved,2932,Object
-ShelvedStateMachineType_OneShotShelved,2933,Object
-ShelvedStateMachineType_UnshelvedToTimedShelved,2935,Object
-ShelvedStateMachineType_UnshelvedToOneShotShelved,2936,Object
-ShelvedStateMachineType_TimedShelvedToUnshelved,2940,Object
-ShelvedStateMachineType_TimedShelvedToOneShotShelved,2942,Object
-ShelvedStateMachineType_OneShotShelvedToUnshelved,2943,Object
-ShelvedStateMachineType_OneShotShelvedToTimedShelved,2945,Object
-ShelvedStateMachineType_Unshelve,2947,Method
-ShelvedStateMachineType_OneShotShelve,2948,Method
-ShelvedStateMachineType_TimedShelve,2949,Method
-LimitAlarmType,2955,ObjectType
-ShelvedStateMachineType_TimedShelve_InputArguments,2991,Variable
-Server_ServerStatus_SecondsTillShutdown,2992,Variable
-Server_ServerStatus_ShutdownReason,2993,Variable
-Server_Auditing,2994,Variable
-Server_ServerCapabilities_ModellingRules,2996,Object
-Server_ServerCapabilities_AggregateFunctions,2997,Object
-SubscriptionDiagnosticsType_EventNotificationsCount,2998,Variable
-AuditHistoryEventUpdateEventType,2999,ObjectType
-AuditHistoryEventUpdateEventType_Filter,3003,Variable
-AuditHistoryValueUpdateEventType,3006,ObjectType
-AuditHistoryDeleteEventType,3012,ObjectType
-AuditHistoryRawModifyDeleteEventType,3014,ObjectType
-AuditHistoryRawModifyDeleteEventType_IsDeleteModified,3015,Variable
-AuditHistoryRawModifyDeleteEventType_StartTime,3016,Variable
-AuditHistoryRawModifyDeleteEventType_EndTime,3017,Variable
-AuditHistoryAtTimeDeleteEventType,3019,ObjectType
-AuditHistoryAtTimeDeleteEventType_ReqTimes,3020,Variable
-AuditHistoryAtTimeDeleteEventType_OldValues,3021,Variable
-AuditHistoryEventDeleteEventType,3022,ObjectType
-AuditHistoryEventDeleteEventType_EventIds,3023,Variable
-AuditHistoryEventDeleteEventType_OldValues,3024,Variable
-AuditHistoryEventUpdateEventType_UpdatedNode,3025,Variable
-AuditHistoryValueUpdateEventType_UpdatedNode,3026,Variable
-AuditHistoryDeleteEventType_UpdatedNode,3027,Variable
-AuditHistoryEventUpdateEventType_PerformInsertReplace,3028,Variable
-AuditHistoryEventUpdateEventType_NewValues,3029,Variable
-AuditHistoryEventUpdateEventType_OldValues,3030,Variable
-AuditHistoryValueUpdateEventType_PerformInsertReplace,3031,Variable
-AuditHistoryValueUpdateEventType_NewValues,3032,Variable
-AuditHistoryValueUpdateEventType_OldValues,3033,Variable
-AuditHistoryRawModifyDeleteEventType_OldValues,3034,Variable
-EventQueueOverflowEventType,3035,ObjectType
-EventTypesFolder,3048,Object
-ServerCapabilitiesType_SoftwareCertificates,3049,Variable
-SessionDiagnosticsVariableType_MaxResponseMessageSize,3050,Variable
-BuildInfoType,3051,VariableType
-BuildInfoType_ProductUri,3052,Variable
-BuildInfoType_ManufacturerName,3053,Variable
-BuildInfoType_ProductName,3054,Variable
-BuildInfoType_SoftwareVersion,3055,Variable
-BuildInfoType_BuildNumber,3056,Variable
-BuildInfoType_BuildDate,3057,Variable
-SessionSecurityDiagnosticsType_ClientCertificate,3058,Variable
-HistoricalDataConfigurationType_AggregateConfiguration,3059,Object
-DefaultBinary,3062,Object
-DefaultXml,3063,Object
-AlwaysGeneratesEvent,3065,ReferenceType
-Icon,3067,Variable
-NodeVersion,3068,Variable
-LocalTime,3069,Variable
-AllowNulls,3070,Variable
-EnumValues,3071,Variable
-InputArguments,3072,Variable
-OutputArguments,3073,Variable
-ServerType_ServerStatus_StartTime,3074,Variable
-ServerType_ServerStatus_CurrentTime,3075,Variable
-ServerType_ServerStatus_State,3076,Variable
-ServerType_ServerStatus_BuildInfo,3077,Variable
-ServerType_ServerStatus_BuildInfo_ProductUri,3078,Variable
-ServerType_ServerStatus_BuildInfo_ManufacturerName,3079,Variable
-ServerType_ServerStatus_BuildInfo_ProductName,3080,Variable
-ServerType_ServerStatus_BuildInfo_SoftwareVersion,3081,Variable
-ServerType_ServerStatus_BuildInfo_BuildNumber,3082,Variable
-ServerType_ServerStatus_BuildInfo_BuildDate,3083,Variable
-ServerType_ServerStatus_SecondsTillShutdown,3084,Variable
-ServerType_ServerStatus_ShutdownReason,3085,Variable
-ServerType_ServerCapabilities_ServerProfileArray,3086,Variable
-ServerType_ServerCapabilities_LocaleIdArray,3087,Variable
-ServerType_ServerCapabilities_MinSupportedSampleRate,3088,Variable
-ServerType_ServerCapabilities_MaxBrowseContinuationPoints,3089,Variable
-ServerType_ServerCapabilities_MaxQueryContinuationPoints,3090,Variable
-ServerType_ServerCapabilities_MaxHistoryContinuationPoints,3091,Variable
-ServerType_ServerCapabilities_SoftwareCertificates,3092,Variable
-ServerType_ServerCapabilities_ModellingRules,3093,Object
-ServerType_ServerCapabilities_AggregateFunctions,3094,Object
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary,3095,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_ServerViewCount,3096,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSessionCount,3097,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSessionCount,3098,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedSessionCount,3099,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_RejectedSessionCount,3100,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_SessionTimeoutCount,3101,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_SessionAbortCount,3102,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_PublishingIntervalCount,3104,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_CurrentSubscriptionCount,3105,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_CumulatedSubscriptionCount,3106,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_SecurityRejectedRequestsCount,3107,Variable
-ServerType_ServerDiagnostics_ServerDiagnosticsSummary_RejectedRequestsCount,3108,Variable
-ServerType_ServerDiagnostics_SamplingIntervalDiagnosticsArray,3109,Variable
-ServerType_ServerDiagnostics_SubscriptionDiagnosticsArray,3110,Variable
-ServerType_ServerDiagnostics_SessionsDiagnosticsSummary,3111,Object
-ServerType_ServerDiagnostics_SessionsDiagnosticsSummary_SessionDiagnosticsArray,3112,Variable
-ServerType_ServerDiagnostics_SessionsDiagnosticsSummary_SessionSecurityDiagnosticsArray,3113,Variable
-ServerType_ServerDiagnostics_EnabledFlag,3114,Variable
-ServerType_ServerRedundancy_RedundancySupport,3115,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_ServerViewCount,3116,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_CurrentSessionCount,3117,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_CumulatedSessionCount,3118,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_SecurityRejectedSessionCount,3119,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_RejectedSessionCount,3120,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_SessionTimeoutCount,3121,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_SessionAbortCount,3122,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_PublishingIntervalCount,3124,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_CurrentSubscriptionCount,3125,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_CumulatedSubscriptionCount,3126,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_SecurityRejectedRequestsCount,3127,Variable
-ServerDiagnosticsType_ServerDiagnosticsSummary_RejectedRequestsCount,3128,Variable
-ServerDiagnosticsType_SessionsDiagnosticsSummary_SessionDiagnosticsArray,3129,Variable
-ServerDiagnosticsType_SessionsDiagnosticsSummary_SessionSecurityDiagnosticsArray,3130,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_SessionId,3131,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_SessionName,3132,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ClientDescription,3133,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ServerUri,3134,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_EndpointUrl,3135,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_LocaleIds,3136,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ActualSessionTimeout,3137,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_MaxResponseMessageSize,3138,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ClientConnectionTime,3139,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ClientLastContactTime,3140,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_CurrentSubscriptionsCount,3141,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_CurrentMonitoredItemsCount,3142,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_CurrentPublishRequestsInQueue,3143,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ReadCount,3151,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_HistoryReadCount,3152,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_WriteCount,3153,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_HistoryUpdateCount,3154,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_CallCount,3155,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_CreateMonitoredItemsCount,3156,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ModifyMonitoredItemsCount,3157,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_SetMonitoringModeCount,3158,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_SetTriggeringCount,3159,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_DeleteMonitoredItemsCount,3160,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_CreateSubscriptionCount,3161,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_ModifySubscriptionCount,3162,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_SetPublishingModeCount,3163,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_PublishCount,3164,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_RepublishCount,3165,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_TransferSubscriptionsCount,3166,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_DeleteSubscriptionsCount,3167,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_AddNodesCount,3168,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_AddReferencesCount,3169,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_DeleteNodesCount,3170,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_DeleteReferencesCount,3171,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_BrowseCount,3172,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_BrowseNextCount,3173,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_TranslateBrowsePathsToNodeIdsCount,3174,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_QueryFirstCount,3175,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_QueryNextCount,3176,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_RegisterNodesCount,3177,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_UnregisterNodesCount,3178,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_SessionId,3179,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_ClientUserIdOfSession,3180,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_ClientUserIdHistory,3181,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_AuthenticationMechanism,3182,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_Encoding,3183,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_TransportProtocol,3184,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_SecurityMode,3185,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_SecurityPolicyUri,3186,Variable
-SessionDiagnosticsObjectType_SessionSecurityDiagnostics_ClientCertificate,3187,Variable
-TransparentRedundancyType_RedundancySupport,3188,Variable
-NonTransparentRedundancyType_RedundancySupport,3189,Variable
-BaseEventType_LocalTime,3190,Variable
-EventQueueOverflowEventType_EventId,3191,Variable
-EventQueueOverflowEventType_EventType,3192,Variable
-EventQueueOverflowEventType_SourceNode,3193,Variable
-EventQueueOverflowEventType_SourceName,3194,Variable
-EventQueueOverflowEventType_Time,3195,Variable
-EventQueueOverflowEventType_ReceiveTime,3196,Variable
-EventQueueOverflowEventType_LocalTime,3197,Variable
-EventQueueOverflowEventType_Message,3198,Variable
-EventQueueOverflowEventType_Severity,3199,Variable
-AuditEventType_EventId,3200,Variable
-AuditEventType_EventType,3201,Variable
-AuditEventType_SourceNode,3202,Variable
-AuditEventType_SourceName,3203,Variable
-AuditEventType_Time,3204,Variable
-AuditEventType_ReceiveTime,3205,Variable
-AuditEventType_LocalTime,3206,Variable
-AuditEventType_Message,3207,Variable
-AuditEventType_Severity,3208,Variable
-AuditSecurityEventType_EventId,3209,Variable
-AuditSecurityEventType_EventType,3210,Variable
-AuditSecurityEventType_SourceNode,3211,Variable
-AuditSecurityEventType_SourceName,3212,Variable
-AuditSecurityEventType_Time,3213,Variable
-AuditSecurityEventType_ReceiveTime,3214,Variable
-AuditSecurityEventType_LocalTime,3215,Variable
-AuditSecurityEventType_Message,3216,Variable
-AuditSecurityEventType_Severity,3217,Variable
-AuditSecurityEventType_ActionTimeStamp,3218,Variable
-AuditSecurityEventType_Status,3219,Variable
-AuditSecurityEventType_ServerId,3220,Variable
-AuditSecurityEventType_ClientAuditEntryId,3221,Variable
-AuditSecurityEventType_ClientUserId,3222,Variable
-AuditChannelEventType_EventId,3223,Variable
-AuditChannelEventType_EventType,3224,Variable
-AuditChannelEventType_SourceNode,3225,Variable
-AuditChannelEventType_SourceName,3226,Variable
-AuditChannelEventType_Time,3227,Variable
-AuditChannelEventType_ReceiveTime,3228,Variable
-AuditChannelEventType_LocalTime,3229,Variable
-AuditChannelEventType_Message,3230,Variable
-AuditChannelEventType_Severity,3231,Variable
-AuditChannelEventType_ActionTimeStamp,3232,Variable
-AuditChannelEventType_Status,3233,Variable
-AuditChannelEventType_ServerId,3234,Variable
-AuditChannelEventType_ClientAuditEntryId,3235,Variable
-AuditChannelEventType_ClientUserId,3236,Variable
-AuditOpenSecureChannelEventType_EventId,3237,Variable
-AuditOpenSecureChannelEventType_EventType,3238,Variable
-AuditOpenSecureChannelEventType_SourceNode,3239,Variable
-AuditOpenSecureChannelEventType_SourceName,3240,Variable
-AuditOpenSecureChannelEventType_Time,3241,Variable
-AuditOpenSecureChannelEventType_ReceiveTime,3242,Variable
-AuditOpenSecureChannelEventType_LocalTime,3243,Variable
-AuditOpenSecureChannelEventType_Message,3244,Variable
-AuditOpenSecureChannelEventType_Severity,3245,Variable
-AuditOpenSecureChannelEventType_ActionTimeStamp,3246,Variable
-AuditOpenSecureChannelEventType_Status,3247,Variable
-AuditOpenSecureChannelEventType_ServerId,3248,Variable
-AuditOpenSecureChannelEventType_ClientAuditEntryId,3249,Variable
-AuditOpenSecureChannelEventType_ClientUserId,3250,Variable
-AuditOpenSecureChannelEventType_SecureChannelId,3251,Variable
-AuditSessionEventType_EventId,3252,Variable
-AuditSessionEventType_EventType,3253,Variable
-AuditSessionEventType_SourceNode,3254,Variable
-AuditSessionEventType_SourceName,3255,Variable
-AuditSessionEventType_Time,3256,Variable
-AuditSessionEventType_ReceiveTime,3257,Variable
-AuditSessionEventType_LocalTime,3258,Variable
-AuditSessionEventType_Message,3259,Variable
-AuditSessionEventType_Severity,3260,Variable
-AuditSessionEventType_ActionTimeStamp,3261,Variable
-AuditSessionEventType_Status,3262,Variable
-AuditSessionEventType_ServerId,3263,Variable
-AuditSessionEventType_ClientAuditEntryId,3264,Variable
-AuditSessionEventType_ClientUserId,3265,Variable
-AuditCreateSessionEventType_EventId,3266,Variable
-AuditCreateSessionEventType_EventType,3267,Variable
-AuditCreateSessionEventType_SourceNode,3268,Variable
-AuditCreateSessionEventType_SourceName,3269,Variable
-AuditCreateSessionEventType_Time,3270,Variable
-AuditCreateSessionEventType_ReceiveTime,3271,Variable
-AuditCreateSessionEventType_LocalTime,3272,Variable
-AuditCreateSessionEventType_Message,3273,Variable
-AuditCreateSessionEventType_Severity,3274,Variable
-AuditCreateSessionEventType_ActionTimeStamp,3275,Variable
-AuditCreateSessionEventType_Status,3276,Variable
-AuditCreateSessionEventType_ServerId,3277,Variable
-AuditCreateSessionEventType_ClientAuditEntryId,3278,Variable
-AuditCreateSessionEventType_ClientUserId,3279,Variable
-AuditUrlMismatchEventType_EventId,3281,Variable
-AuditUrlMismatchEventType_EventType,3282,Variable
-AuditUrlMismatchEventType_SourceNode,3283,Variable
-AuditUrlMismatchEventType_SourceName,3284,Variable
-AuditUrlMismatchEventType_Time,3285,Variable
-AuditUrlMismatchEventType_ReceiveTime,3286,Variable
-AuditUrlMismatchEventType_LocalTime,3287,Variable
-AuditUrlMismatchEventType_Message,3288,Variable
-AuditUrlMismatchEventType_Severity,3289,Variable
-AuditUrlMismatchEventType_ActionTimeStamp,3290,Variable
-AuditUrlMismatchEventType_Status,3291,Variable
-AuditUrlMismatchEventType_ServerId,3292,Variable
-AuditUrlMismatchEventType_ClientAuditEntryId,3293,Variable
-AuditUrlMismatchEventType_ClientUserId,3294,Variable
-AuditUrlMismatchEventType_SecureChannelId,3296,Variable
-AuditUrlMismatchEventType_ClientCertificate,3297,Variable
-AuditUrlMismatchEventType_ClientCertificateThumbprint,3298,Variable
-AuditUrlMismatchEventType_RevisedSessionTimeout,3299,Variable
-AuditActivateSessionEventType_EventId,3300,Variable
-AuditActivateSessionEventType_EventType,3301,Variable
-AuditActivateSessionEventType_SourceNode,3302,Variable
-AuditActivateSessionEventType_SourceName,3303,Variable
-AuditActivateSessionEventType_Time,3304,Variable
-AuditActivateSessionEventType_ReceiveTime,3305,Variable
-AuditActivateSessionEventType_LocalTime,3306,Variable
-AuditActivateSessionEventType_Message,3307,Variable
-AuditActivateSessionEventType_Severity,3308,Variable
-AuditActivateSessionEventType_ActionTimeStamp,3309,Variable
-AuditActivateSessionEventType_Status,3310,Variable
-AuditActivateSessionEventType_ServerId,3311,Variable
-AuditActivateSessionEventType_ClientAuditEntryId,3312,Variable
-AuditActivateSessionEventType_ClientUserId,3313,Variable
-AuditActivateSessionEventType_SessionId,3314,Variable
-AuditCancelEventType_EventId,3315,Variable
-AuditCancelEventType_EventType,3316,Variable
-AuditCancelEventType_SourceNode,3317,Variable
-AuditCancelEventType_SourceName,3318,Variable
-AuditCancelEventType_Time,3319,Variable
-AuditCancelEventType_ReceiveTime,3320,Variable
-AuditCancelEventType_LocalTime,3321,Variable
-AuditCancelEventType_Message,3322,Variable
-AuditCancelEventType_Severity,3323,Variable
-AuditCancelEventType_ActionTimeStamp,3324,Variable
-AuditCancelEventType_Status,3325,Variable
-AuditCancelEventType_ServerId,3326,Variable
-AuditCancelEventType_ClientAuditEntryId,3327,Variable
-AuditCancelEventType_ClientUserId,3328,Variable
-AuditCancelEventType_SessionId,3329,Variable
-AuditCertificateEventType_EventId,3330,Variable
-AuditCertificateEventType_EventType,3331,Variable
-AuditCertificateEventType_SourceNode,3332,Variable
-AuditCertificateEventType_SourceName,3333,Variable
-AuditCertificateEventType_Time,3334,Variable
-AuditCertificateEventType_ReceiveTime,3335,Variable
-AuditCertificateEventType_LocalTime,3336,Variable
-AuditCertificateEventType_Message,3337,Variable
-AuditCertificateEventType_Severity,3338,Variable
-AuditCertificateEventType_ActionTimeStamp,3339,Variable
-AuditCertificateEventType_Status,3340,Variable
-AuditCertificateEventType_ServerId,3341,Variable
-AuditCertificateEventType_ClientAuditEntryId,3342,Variable
-AuditCertificateEventType_ClientUserId,3343,Variable
-AuditCertificateDataMismatchEventType_EventId,3344,Variable
-AuditCertificateDataMismatchEventType_EventType,3345,Variable
-AuditCertificateDataMismatchEventType_SourceNode,3346,Variable
-AuditCertificateDataMismatchEventType_SourceName,3347,Variable
-AuditCertificateDataMismatchEventType_Time,3348,Variable
-AuditCertificateDataMismatchEventType_ReceiveTime,3349,Variable
-AuditCertificateDataMismatchEventType_LocalTime,3350,Variable
-AuditCertificateDataMismatchEventType_Message,3351,Variable
-AuditCertificateDataMismatchEventType_Severity,3352,Variable
-AuditCertificateDataMismatchEventType_ActionTimeStamp,3353,Variable
-AuditCertificateDataMismatchEventType_Status,3354,Variable
-AuditCertificateDataMismatchEventType_ServerId,3355,Variable
-AuditCertificateDataMismatchEventType_ClientAuditEntryId,3356,Variable
-AuditCertificateDataMismatchEventType_ClientUserId,3357,Variable
-AuditCertificateDataMismatchEventType_Certificate,3358,Variable
-AuditCertificateExpiredEventType_EventId,3359,Variable
-AuditCertificateExpiredEventType_EventType,3360,Variable
-AuditCertificateExpiredEventType_SourceNode,3361,Variable
-AuditCertificateExpiredEventType_SourceName,3362,Variable
-AuditCertificateExpiredEventType_Time,3363,Variable
-AuditCertificateExpiredEventType_ReceiveTime,3364,Variable
-AuditCertificateExpiredEventType_LocalTime,3365,Variable
-AuditCertificateExpiredEventType_Message,3366,Variable
-AuditCertificateExpiredEventType_Severity,3367,Variable
-AuditCertificateExpiredEventType_ActionTimeStamp,3368,Variable
-AuditCertificateExpiredEventType_Status,3369,Variable
-AuditCertificateExpiredEventType_ServerId,3370,Variable
-AuditCertificateExpiredEventType_ClientAuditEntryId,3371,Variable
-AuditCertificateExpiredEventType_ClientUserId,3372,Variable
-AuditCertificateExpiredEventType_Certificate,3373,Variable
-AuditCertificateInvalidEventType_EventId,3374,Variable
-AuditCertificateInvalidEventType_EventType,3375,Variable
-AuditCertificateInvalidEventType_SourceNode,3376,Variable
-AuditCertificateInvalidEventType_SourceName,3377,Variable
-AuditCertificateInvalidEventType_Time,3378,Variable
-AuditCertificateInvalidEventType_ReceiveTime,3379,Variable
-AuditCertificateInvalidEventType_LocalTime,3380,Variable
-AuditCertificateInvalidEventType_Message,3381,Variable
-AuditCertificateInvalidEventType_Severity,3382,Variable
-AuditCertificateInvalidEventType_ActionTimeStamp,3383,Variable
-AuditCertificateInvalidEventType_Status,3384,Variable
-AuditCertificateInvalidEventType_ServerId,3385,Variable
-AuditCertificateInvalidEventType_ClientAuditEntryId,3386,Variable
-AuditCertificateInvalidEventType_ClientUserId,3387,Variable
-AuditCertificateInvalidEventType_Certificate,3388,Variable
-AuditCertificateUntrustedEventType_EventId,3389,Variable
-AuditCertificateUntrustedEventType_EventType,3390,Variable
-AuditCertificateUntrustedEventType_SourceNode,3391,Variable
-AuditCertificateUntrustedEventType_SourceName,3392,Variable
-AuditCertificateUntrustedEventType_Time,3393,Variable
-AuditCertificateUntrustedEventType_ReceiveTime,3394,Variable
-AuditCertificateUntrustedEventType_LocalTime,3395,Variable
-AuditCertificateUntrustedEventType_Message,3396,Variable
-AuditCertificateUntrustedEventType_Severity,3397,Variable
-AuditCertificateUntrustedEventType_ActionTimeStamp,3398,Variable
-AuditCertificateUntrustedEventType_Status,3399,Variable
-AuditCertificateUntrustedEventType_ServerId,3400,Variable
-AuditCertificateUntrustedEventType_ClientAuditEntryId,3401,Variable
-AuditCertificateUntrustedEventType_ClientUserId,3402,Variable
-AuditCertificateUntrustedEventType_Certificate,3403,Variable
-AuditCertificateRevokedEventType_EventId,3404,Variable
-AuditCertificateRevokedEventType_EventType,3405,Variable
-AuditCertificateRevokedEventType_SourceNode,3406,Variable
-AuditCertificateRevokedEventType_SourceName,3407,Variable
-AuditCertificateRevokedEventType_Time,3408,Variable
-AuditCertificateRevokedEventType_ReceiveTime,3409,Variable
-AuditCertificateRevokedEventType_LocalTime,3410,Variable
-AuditCertificateRevokedEventType_Message,3411,Variable
-AuditCertificateRevokedEventType_Severity,3412,Variable
-AuditCertificateRevokedEventType_ActionTimeStamp,3413,Variable
-AuditCertificateRevokedEventType_Status,3414,Variable
-AuditCertificateRevokedEventType_ServerId,3415,Variable
-AuditCertificateRevokedEventType_ClientAuditEntryId,3416,Variable
-AuditCertificateRevokedEventType_ClientUserId,3417,Variable
-AuditCertificateRevokedEventType_Certificate,3418,Variable
-AuditCertificateMismatchEventType_EventId,3419,Variable
-AuditCertificateMismatchEventType_EventType,3420,Variable
-AuditCertificateMismatchEventType_SourceNode,3421,Variable
-AuditCertificateMismatchEventType_SourceName,3422,Variable
-AuditCertificateMismatchEventType_Time,3423,Variable
-AuditCertificateMismatchEventType_ReceiveTime,3424,Variable
-AuditCertificateMismatchEventType_LocalTime,3425,Variable
-AuditCertificateMismatchEventType_Message,3426,Variable
-AuditCertificateMismatchEventType_Severity,3427,Variable
-AuditCertificateMismatchEventType_ActionTimeStamp,3428,Variable
-AuditCertificateMismatchEventType_Status,3429,Variable
-AuditCertificateMismatchEventType_ServerId,3430,Variable
-AuditCertificateMismatchEventType_ClientAuditEntryId,3431,Variable
-AuditCertificateMismatchEventType_ClientUserId,3432,Variable
-AuditCertificateMismatchEventType_Certificate,3433,Variable
-AuditNodeManagementEventType_EventId,3434,Variable
-AuditNodeManagementEventType_EventType,3435,Variable
-AuditNodeManagementEventType_SourceNode,3436,Variable
-AuditNodeManagementEventType_SourceName,3437,Variable
-AuditNodeManagementEventType_Time,3438,Variable
-AuditNodeManagementEventType_ReceiveTime,3439,Variable
-AuditNodeManagementEventType_LocalTime,3440,Variable
-AuditNodeManagementEventType_Message,3441,Variable
-AuditNodeManagementEventType_Severity,3442,Variable
-AuditNodeManagementEventType_ActionTimeStamp,3443,Variable
-AuditNodeManagementEventType_Status,3444,Variable
-AuditNodeManagementEventType_ServerId,3445,Variable
-AuditNodeManagementEventType_ClientAuditEntryId,3446,Variable
-AuditNodeManagementEventType_ClientUserId,3447,Variable
-AuditAddNodesEventType_EventId,3448,Variable
-AuditAddNodesEventType_EventType,3449,Variable
-AuditAddNodesEventType_SourceNode,3450,Variable
-AuditAddNodesEventType_SourceName,3451,Variable
-AuditAddNodesEventType_Time,3452,Variable
-AuditAddNodesEventType_ReceiveTime,3453,Variable
-AuditAddNodesEventType_LocalTime,3454,Variable
-AuditAddNodesEventType_Message,3455,Variable
-AuditAddNodesEventType_Severity,3456,Variable
-AuditAddNodesEventType_ActionTimeStamp,3457,Variable
-AuditAddNodesEventType_Status,3458,Variable
-AuditAddNodesEventType_ServerId,3459,Variable
-AuditAddNodesEventType_ClientAuditEntryId,3460,Variable
-AuditAddNodesEventType_ClientUserId,3461,Variable
-AuditDeleteNodesEventType_EventId,3462,Variable
-AuditDeleteNodesEventType_EventType,3463,Variable
-AuditDeleteNodesEventType_SourceNode,3464,Variable
-AuditDeleteNodesEventType_SourceName,3465,Variable
-AuditDeleteNodesEventType_Time,3466,Variable
-AuditDeleteNodesEventType_ReceiveTime,3467,Variable
-AuditDeleteNodesEventType_LocalTime,3468,Variable
-AuditDeleteNodesEventType_Message,3469,Variable
-AuditDeleteNodesEventType_Severity,3470,Variable
-AuditDeleteNodesEventType_ActionTimeStamp,3471,Variable
-AuditDeleteNodesEventType_Status,3472,Variable
-AuditDeleteNodesEventType_ServerId,3473,Variable
-AuditDeleteNodesEventType_ClientAuditEntryId,3474,Variable
-AuditDeleteNodesEventType_ClientUserId,3475,Variable
-AuditAddReferencesEventType_EventId,3476,Variable
-AuditAddReferencesEventType_EventType,3477,Variable
-AuditAddReferencesEventType_SourceNode,3478,Variable
-AuditAddReferencesEventType_SourceName,3479,Variable
-AuditAddReferencesEventType_Time,3480,Variable
-AuditAddReferencesEventType_ReceiveTime,3481,Variable
-AuditAddReferencesEventType_LocalTime,3482,Variable
-AuditAddReferencesEventType_Message,3483,Variable
-AuditAddReferencesEventType_Severity,3484,Variable
-AuditAddReferencesEventType_ActionTimeStamp,3485,Variable
-AuditAddReferencesEventType_Status,3486,Variable
-AuditAddReferencesEventType_ServerId,3487,Variable
-AuditAddReferencesEventType_ClientAuditEntryId,3488,Variable
-AuditAddReferencesEventType_ClientUserId,3489,Variable
-AuditDeleteReferencesEventType_EventId,3490,Variable
-AuditDeleteReferencesEventType_EventType,3491,Variable
-AuditDeleteReferencesEventType_SourceNode,3492,Variable
-AuditDeleteReferencesEventType_SourceName,3493,Variable
-AuditDeleteReferencesEventType_Time,3494,Variable
-AuditDeleteReferencesEventType_ReceiveTime,3495,Variable
-AuditDeleteReferencesEventType_LocalTime,3496,Variable
-AuditDeleteReferencesEventType_Message,3497,Variable
-AuditDeleteReferencesEventType_Severity,3498,Variable
-AuditDeleteReferencesEventType_ActionTimeStamp,3499,Variable
-AuditDeleteReferencesEventType_Status,3500,Variable
-AuditDeleteReferencesEventType_ServerId,3501,Variable
-AuditDeleteReferencesEventType_ClientAuditEntryId,3502,Variable
-AuditDeleteReferencesEventType_ClientUserId,3503,Variable
-AuditUpdateEventType_EventId,3504,Variable
-AuditUpdateEventType_EventType,3505,Variable
-AuditUpdateEventType_SourceNode,3506,Variable
-AuditUpdateEventType_SourceName,3507,Variable
-AuditUpdateEventType_Time,3508,Variable
-AuditUpdateEventType_ReceiveTime,3509,Variable
-AuditUpdateEventType_LocalTime,3510,Variable
-AuditUpdateEventType_Message,3511,Variable
-AuditUpdateEventType_Severity,3512,Variable
-AuditUpdateEventType_ActionTimeStamp,3513,Variable
-AuditUpdateEventType_Status,3514,Variable
-AuditUpdateEventType_ServerId,3515,Variable
-AuditUpdateEventType_ClientAuditEntryId,3516,Variable
-AuditUpdateEventType_ClientUserId,3517,Variable
-AuditWriteUpdateEventType_EventId,3518,Variable
-AuditWriteUpdateEventType_EventType,3519,Variable
-AuditWriteUpdateEventType_SourceNode,3520,Variable
-AuditWriteUpdateEventType_SourceName,3521,Variable
-AuditWriteUpdateEventType_Time,3522,Variable
-AuditWriteUpdateEventType_ReceiveTime,3523,Variable
-AuditWriteUpdateEventType_LocalTime,3524,Variable
-AuditWriteUpdateEventType_Message,3525,Variable
-AuditWriteUpdateEventType_Severity,3526,Variable
-AuditWriteUpdateEventType_ActionTimeStamp,3527,Variable
-AuditWriteUpdateEventType_Status,3528,Variable
-AuditWriteUpdateEventType_ServerId,3529,Variable
-AuditWriteUpdateEventType_ClientAuditEntryId,3530,Variable
-AuditWriteUpdateEventType_ClientUserId,3531,Variable
-AuditHistoryUpdateEventType_EventId,3532,Variable
-AuditHistoryUpdateEventType_EventType,3533,Variable
-AuditHistoryUpdateEventType_SourceNode,3534,Variable
-AuditHistoryUpdateEventType_SourceName,3535,Variable
-AuditHistoryUpdateEventType_Time,3536,Variable
-AuditHistoryUpdateEventType_ReceiveTime,3537,Variable
-AuditHistoryUpdateEventType_LocalTime,3538,Variable
-AuditHistoryUpdateEventType_Message,3539,Variable
-AuditHistoryUpdateEventType_Severity,3540,Variable
-AuditHistoryUpdateEventType_ActionTimeStamp,3541,Variable
-AuditHistoryUpdateEventType_Status,3542,Variable
-AuditHistoryUpdateEventType_ServerId,3543,Variable
-AuditHistoryUpdateEventType_ClientAuditEntryId,3544,Variable
-AuditHistoryUpdateEventType_ClientUserId,3545,Variable
-AuditHistoryEventUpdateEventType_EventId,3546,Variable
-AuditHistoryEventUpdateEventType_EventType,3547,Variable
-AuditHistoryEventUpdateEventType_SourceNode,3548,Variable
-AuditHistoryEventUpdateEventType_SourceName,3549,Variable
-AuditHistoryEventUpdateEventType_Time,3550,Variable
-AuditHistoryEventUpdateEventType_ReceiveTime,3551,Variable
-AuditHistoryEventUpdateEventType_LocalTime,3552,Variable
-AuditHistoryEventUpdateEventType_Message,3553,Variable
-AuditHistoryEventUpdateEventType_Severity,3554,Variable
-AuditHistoryEventUpdateEventType_ActionTimeStamp,3555,Variable
-AuditHistoryEventUpdateEventType_Status,3556,Variable
-AuditHistoryEventUpdateEventType_ServerId,3557,Variable
-AuditHistoryEventUpdateEventType_ClientAuditEntryId,3558,Variable
-AuditHistoryEventUpdateEventType_ClientUserId,3559,Variable
-AuditHistoryEventUpdateEventType_ParameterDataTypeId,3560,Variable
-AuditHistoryValueUpdateEventType_EventId,3561,Variable
-AuditHistoryValueUpdateEventType_EventType,3562,Variable
-AuditHistoryValueUpdateEventType_SourceNode,3563,Variable
-AuditHistoryValueUpdateEventType_SourceName,3564,Variable
-AuditHistoryValueUpdateEventType_Time,3565,Variable
-AuditHistoryValueUpdateEventType_ReceiveTime,3566,Variable
-AuditHistoryValueUpdateEventType_LocalTime,3567,Variable
-AuditHistoryValueUpdateEventType_Message,3568,Variable
-AuditHistoryValueUpdateEventType_Severity,3569,Variable
-AuditHistoryValueUpdateEventType_ActionTimeStamp,3570,Variable
-AuditHistoryValueUpdateEventType_Status,3571,Variable
-AuditHistoryValueUpdateEventType_ServerId,3572,Variable
-AuditHistoryValueUpdateEventType_ClientAuditEntryId,3573,Variable
-AuditHistoryValueUpdateEventType_ClientUserId,3574,Variable
-AuditHistoryValueUpdateEventType_ParameterDataTypeId,3575,Variable
-AuditHistoryDeleteEventType_EventId,3576,Variable
-AuditHistoryDeleteEventType_EventType,3577,Variable
-AuditHistoryDeleteEventType_SourceNode,3578,Variable
-AuditHistoryDeleteEventType_SourceName,3579,Variable
-AuditHistoryDeleteEventType_Time,3580,Variable
-AuditHistoryDeleteEventType_ReceiveTime,3581,Variable
-AuditHistoryDeleteEventType_LocalTime,3582,Variable
-AuditHistoryDeleteEventType_Message,3583,Variable
-AuditHistoryDeleteEventType_Severity,3584,Variable
-AuditHistoryDeleteEventType_ActionTimeStamp,3585,Variable
-AuditHistoryDeleteEventType_Status,3586,Variable
-AuditHistoryDeleteEventType_ServerId,3587,Variable
-AuditHistoryDeleteEventType_ClientAuditEntryId,3588,Variable
-AuditHistoryDeleteEventType_ClientUserId,3589,Variable
-AuditHistoryDeleteEventType_ParameterDataTypeId,3590,Variable
-AuditHistoryRawModifyDeleteEventType_EventId,3591,Variable
-AuditHistoryRawModifyDeleteEventType_EventType,3592,Variable
-AuditHistoryRawModifyDeleteEventType_SourceNode,3593,Variable
-AuditHistoryRawModifyDeleteEventType_SourceName,3594,Variable
-AuditHistoryRawModifyDeleteEventType_Time,3595,Variable
-AuditHistoryRawModifyDeleteEventType_ReceiveTime,3596,Variable
-AuditHistoryRawModifyDeleteEventType_LocalTime,3597,Variable
-AuditHistoryRawModifyDeleteEventType_Message,3598,Variable
-AuditHistoryRawModifyDeleteEventType_Severity,3599,Variable
-AuditHistoryRawModifyDeleteEventType_ActionTimeStamp,3600,Variable
-AuditHistoryRawModifyDeleteEventType_Status,3601,Variable
-AuditHistoryRawModifyDeleteEventType_ServerId,3602,Variable
-AuditHistoryRawModifyDeleteEventType_ClientAuditEntryId,3603,Variable
-AuditHistoryRawModifyDeleteEventType_ClientUserId,3604,Variable
-AuditHistoryRawModifyDeleteEventType_ParameterDataTypeId,3605,Variable
-AuditHistoryRawModifyDeleteEventType_UpdatedNode,3606,Variable
-AuditHistoryAtTimeDeleteEventType_EventId,3607,Variable
-AuditHistoryAtTimeDeleteEventType_EventType,3608,Variable
-AuditHistoryAtTimeDeleteEventType_SourceNode,3609,Variable
-AuditHistoryAtTimeDeleteEventType_SourceName,3610,Variable
-AuditHistoryAtTimeDeleteEventType_Time,3611,Variable
-AuditHistoryAtTimeDeleteEventType_ReceiveTime,3612,Variable
-AuditHistoryAtTimeDeleteEventType_LocalTime,3613,Variable
-AuditHistoryAtTimeDeleteEventType_Message,3614,Variable
-AuditHistoryAtTimeDeleteEventType_Severity,3615,Variable
-AuditHistoryAtTimeDeleteEventType_ActionTimeStamp,3616,Variable
-AuditHistoryAtTimeDeleteEventType_Status,3617,Variable
-AuditHistoryAtTimeDeleteEventType_ServerId,3618,Variable
-AuditHistoryAtTimeDeleteEventType_ClientAuditEntryId,3619,Variable
-AuditHistoryAtTimeDeleteEventType_ClientUserId,3620,Variable
-AuditHistoryAtTimeDeleteEventType_ParameterDataTypeId,3621,Variable
-AuditHistoryAtTimeDeleteEventType_UpdatedNode,3622,Variable
-AuditHistoryEventDeleteEventType_EventId,3623,Variable
-AuditHistoryEventDeleteEventType_EventType,3624,Variable
-AuditHistoryEventDeleteEventType_SourceNode,3625,Variable
-AuditHistoryEventDeleteEventType_SourceName,3626,Variable
-AuditHistoryEventDeleteEventType_Time,3627,Variable
-AuditHistoryEventDeleteEventType_ReceiveTime,3628,Variable
-AuditHistoryEventDeleteEventType_LocalTime,3629,Variable
-AuditHistoryEventDeleteEventType_Message,3630,Variable
-AuditHistoryEventDeleteEventType_Severity,3631,Variable
-AuditHistoryEventDeleteEventType_ActionTimeStamp,3632,Variable
-AuditHistoryEventDeleteEventType_Status,3633,Variable
-AuditHistoryEventDeleteEventType_ServerId,3634,Variable
-AuditHistoryEventDeleteEventType_ClientAuditEntryId,3635,Variable
-AuditHistoryEventDeleteEventType_ClientUserId,3636,Variable
-AuditHistoryEventDeleteEventType_ParameterDataTypeId,3637,Variable
-AuditHistoryEventDeleteEventType_UpdatedNode,3638,Variable
-AuditUpdateMethodEventType_EventId,3639,Variable
-AuditUpdateMethodEventType_EventType,3640,Variable
-AuditUpdateMethodEventType_SourceNode,3641,Variable
-AuditUpdateMethodEventType_SourceName,3642,Variable
-AuditUpdateMethodEventType_Time,3643,Variable
-AuditUpdateMethodEventType_ReceiveTime,3644,Variable
-AuditUpdateMethodEventType_LocalTime,3645,Variable
-AuditUpdateMethodEventType_Message,3646,Variable
-AuditUpdateMethodEventType_Severity,3647,Variable
-AuditUpdateMethodEventType_ActionTimeStamp,3648,Variable
-AuditUpdateMethodEventType_Status,3649,Variable
-AuditUpdateMethodEventType_ServerId,3650,Variable
-AuditUpdateMethodEventType_ClientAuditEntryId,3651,Variable
-AuditUpdateMethodEventType_ClientUserId,3652,Variable
-SystemEventType_EventId,3653,Variable
-SystemEventType_EventType,3654,Variable
-SystemEventType_SourceNode,3655,Variable
-SystemEventType_SourceName,3656,Variable
-SystemEventType_Time,3657,Variable
-SystemEventType_ReceiveTime,3658,Variable
-SystemEventType_LocalTime,3659,Variable
-SystemEventType_Message,3660,Variable
-SystemEventType_Severity,3661,Variable
-DeviceFailureEventType_EventId,3662,Variable
-DeviceFailureEventType_EventType,3663,Variable
-DeviceFailureEventType_SourceNode,3664,Variable
-DeviceFailureEventType_SourceName,3665,Variable
-DeviceFailureEventType_Time,3666,Variable
-DeviceFailureEventType_ReceiveTime,3667,Variable
-DeviceFailureEventType_LocalTime,3668,Variable
-DeviceFailureEventType_Message,3669,Variable
-DeviceFailureEventType_Severity,3670,Variable
-BaseModelChangeEventType_EventId,3671,Variable
-BaseModelChangeEventType_EventType,3672,Variable
-BaseModelChangeEventType_SourceNode,3673,Variable
-BaseModelChangeEventType_SourceName,3674,Variable
-BaseModelChangeEventType_Time,3675,Variable
-BaseModelChangeEventType_ReceiveTime,3676,Variable
-BaseModelChangeEventType_LocalTime,3677,Variable
-BaseModelChangeEventType_Message,3678,Variable
-BaseModelChangeEventType_Severity,3679,Variable
-GeneralModelChangeEventType_EventId,3680,Variable
-GeneralModelChangeEventType_EventType,3681,Variable
-GeneralModelChangeEventType_SourceNode,3682,Variable
-GeneralModelChangeEventType_SourceName,3683,Variable
-GeneralModelChangeEventType_Time,3684,Variable
-GeneralModelChangeEventType_ReceiveTime,3685,Variable
-GeneralModelChangeEventType_LocalTime,3686,Variable
-GeneralModelChangeEventType_Message,3687,Variable
-GeneralModelChangeEventType_Severity,3688,Variable
-SemanticChangeEventType_EventId,3689,Variable
-SemanticChangeEventType_EventType,3690,Variable
-SemanticChangeEventType_SourceNode,3691,Variable
-SemanticChangeEventType_SourceName,3692,Variable
-SemanticChangeEventType_Time,3693,Variable
-SemanticChangeEventType_ReceiveTime,3694,Variable
-SemanticChangeEventType_LocalTime,3695,Variable
-SemanticChangeEventType_Message,3696,Variable
-SemanticChangeEventType_Severity,3697,Variable
-ServerStatusType_BuildInfo_ProductUri,3698,Variable
-ServerStatusType_BuildInfo_ManufacturerName,3699,Variable
-ServerStatusType_BuildInfo_ProductName,3700,Variable
-ServerStatusType_BuildInfo_SoftwareVersion,3701,Variable
-ServerStatusType_BuildInfo_BuildNumber,3702,Variable
-ServerStatusType_BuildInfo_BuildDate,3703,Variable
-Server_ServerCapabilities_SoftwareCertificates,3704,Variable
-Server_ServerDiagnostics_ServerDiagnosticsSummary_RejectedSessionCount,3705,Variable
-Server_ServerDiagnostics_SessionsDiagnosticsSummary,3706,Object
-Server_ServerDiagnostics_SessionsDiagnosticsSummary_SessionDiagnosticsArray,3707,Variable
-Server_ServerDiagnostics_SessionsDiagnosticsSummary_SessionSecurityDiagnosticsArray,3708,Variable
-Server_ServerRedundancy_RedundancySupport,3709,Variable
-FiniteStateVariableType_Name,3714,Variable
-FiniteStateVariableType_Number,3715,Variable
-FiniteStateVariableType_EffectiveDisplayName,3716,Variable
-FiniteTransitionVariableType_Name,3717,Variable
-FiniteTransitionVariableType_Number,3718,Variable
-FiniteTransitionVariableType_TransitionTime,3719,Variable
-StateMachineType_CurrentState_Id,3720,Variable
-StateMachineType_CurrentState_Name,3721,Variable
-StateMachineType_CurrentState_Number,3722,Variable
-StateMachineType_CurrentState_EffectiveDisplayName,3723,Variable
-StateMachineType_LastTransition_Id,3724,Variable
-StateMachineType_LastTransition_Name,3725,Variable
-StateMachineType_LastTransition_Number,3726,Variable
-StateMachineType_LastTransition_TransitionTime,3727,Variable
-FiniteStateMachineType_CurrentState_Id,3728,Variable
-FiniteStateMachineType_CurrentState_Name,3729,Variable
-FiniteStateMachineType_CurrentState_Number,3730,Variable
-FiniteStateMachineType_CurrentState_EffectiveDisplayName,3731,Variable
-FiniteStateMachineType_LastTransition_Id,3732,Variable
-FiniteStateMachineType_LastTransition_Name,3733,Variable
-FiniteStateMachineType_LastTransition_Number,3734,Variable
-FiniteStateMachineType_LastTransition_TransitionTime,3735,Variable
-InitialStateType_StateNumber,3736,Variable
-TransitionEventType_EventId,3737,Variable
-TransitionEventType_EventType,3738,Variable
-TransitionEventType_SourceNode,3739,Variable
-TransitionEventType_SourceName,3740,Variable
-TransitionEventType_Time,3741,Variable
-TransitionEventType_ReceiveTime,3742,Variable
-TransitionEventType_LocalTime,3743,Variable
-TransitionEventType_Message,3744,Variable
-TransitionEventType_Severity,3745,Variable
-TransitionEventType_FromState_Id,3746,Variable
-TransitionEventType_FromState_Name,3747,Variable
-TransitionEventType_FromState_Number,3748,Variable
-TransitionEventType_FromState_EffectiveDisplayName,3749,Variable
-TransitionEventType_ToState_Id,3750,Variable
-TransitionEventType_ToState_Name,3751,Variable
-TransitionEventType_ToState_Number,3752,Variable
-TransitionEventType_ToState_EffectiveDisplayName,3753,Variable
-TransitionEventType_Transition_Id,3754,Variable
-TransitionEventType_Transition_Name,3755,Variable
-TransitionEventType_Transition_Number,3756,Variable
-TransitionEventType_Transition_TransitionTime,3757,Variable
-AuditUpdateStateEventType_EventId,3758,Variable
-AuditUpdateStateEventType_EventType,3759,Variable
-AuditUpdateStateEventType_SourceNode,3760,Variable
-AuditUpdateStateEventType_SourceName,3761,Variable
-AuditUpdateStateEventType_Time,3762,Variable
-AuditUpdateStateEventType_ReceiveTime,3763,Variable
-AuditUpdateStateEventType_LocalTime,3764,Variable
-AuditUpdateStateEventType_Message,3765,Variable
-AuditUpdateStateEventType_Severity,3766,Variable
-AuditUpdateStateEventType_ActionTimeStamp,3767,Variable
-AuditUpdateStateEventType_Status,3768,Variable
-AuditUpdateStateEventType_ServerId,3769,Variable
-AuditUpdateStateEventType_ClientAuditEntryId,3770,Variable
-AuditUpdateStateEventType_ClientUserId,3771,Variable
-AuditUpdateStateEventType_MethodId,3772,Variable
-AuditUpdateStateEventType_InputArguments,3773,Variable
-AnalogItemType_Definition,3774,Variable
-AnalogItemType_ValuePrecision,3775,Variable
-DiscreteItemType_Definition,3776,Variable
-DiscreteItemType_ValuePrecision,3777,Variable
-TwoStateDiscreteType_Definition,3778,Variable
-TwoStateDiscreteType_ValuePrecision,3779,Variable
-MultiStateDiscreteType_Definition,3780,Variable
-MultiStateDiscreteType_ValuePrecision,3781,Variable
-ProgramTransitionEventType_EventId,3782,Variable
-ProgramTransitionEventType_EventType,3783,Variable
-ProgramTransitionEventType_SourceNode,3784,Variable
-ProgramTransitionEventType_SourceName,3785,Variable
-ProgramTransitionEventType_Time,3786,Variable
-ProgramTransitionEventType_ReceiveTime,3787,Variable
-ProgramTransitionEventType_LocalTime,3788,Variable
-ProgramTransitionEventType_Message,3789,Variable
-ProgramTransitionEventType_Severity,3790,Variable
-ProgramTransitionEventType_FromState,3791,Variable
-ProgramTransitionEventType_FromState_Id,3792,Variable
-ProgramTransitionEventType_FromState_Name,3793,Variable
-ProgramTransitionEventType_FromState_Number,3794,Variable
-ProgramTransitionEventType_FromState_EffectiveDisplayName,3795,Variable
-ProgramTransitionEventType_ToState,3796,Variable
-ProgramTransitionEventType_ToState_Id,3797,Variable
-ProgramTransitionEventType_ToState_Name,3798,Variable
-ProgramTransitionEventType_ToState_Number,3799,Variable
-ProgramTransitionEventType_ToState_EffectiveDisplayName,3800,Variable
-ProgramTransitionEventType_Transition,3801,Variable
-ProgramTransitionEventType_Transition_Id,3802,Variable
-ProgramTransitionEventType_Transition_Name,3803,Variable
-ProgramTransitionEventType_Transition_Number,3804,Variable
-ProgramTransitionEventType_Transition_TransitionTime,3805,Variable
-ProgramTransitionAuditEventType,3806,ObjectType
-ProgramTransitionAuditEventType_EventId,3807,Variable
-ProgramTransitionAuditEventType_EventType,3808,Variable
-ProgramTransitionAuditEventType_SourceNode,3809,Variable
-ProgramTransitionAuditEventType_SourceName,3810,Variable
-ProgramTransitionAuditEventType_Time,3811,Variable
-ProgramTransitionAuditEventType_ReceiveTime,3812,Variable
-ProgramTransitionAuditEventType_LocalTime,3813,Variable
-ProgramTransitionAuditEventType_Message,3814,Variable
-ProgramTransitionAuditEventType_Severity,3815,Variable
-ProgramTransitionAuditEventType_ActionTimeStamp,3816,Variable
-ProgramTransitionAuditEventType_Status,3817,Variable
-ProgramTransitionAuditEventType_ServerId,3818,Variable
-ProgramTransitionAuditEventType_ClientAuditEntryId,3819,Variable
-ProgramTransitionAuditEventType_ClientUserId,3820,Variable
-ProgramTransitionAuditEventType_MethodId,3821,Variable
-ProgramTransitionAuditEventType_InputArguments,3822,Variable
-ProgramTransitionAuditEventType_OldStateId,3823,Variable
-ProgramTransitionAuditEventType_NewStateId,3824,Variable
-ProgramTransitionAuditEventType_Transition,3825,Variable
-ProgramTransitionAuditEventType_Transition_Id,3826,Variable
-ProgramTransitionAuditEventType_Transition_Name,3827,Variable
-ProgramTransitionAuditEventType_Transition_Number,3828,Variable
-ProgramTransitionAuditEventType_Transition_TransitionTime,3829,Variable
-ProgramStateMachineType_CurrentState,3830,Variable
-ProgramStateMachineType_CurrentState_Id,3831,Variable
-ProgramStateMachineType_CurrentState_Name,3832,Variable
-ProgramStateMachineType_CurrentState_Number,3833,Variable
-ProgramStateMachineType_CurrentState_EffectiveDisplayName,3834,Variable
-ProgramStateMachineType_LastTransition,3835,Variable
-ProgramStateMachineType_LastTransition_Id,3836,Variable
-ProgramStateMachineType_LastTransition_Name,3837,Variable
-ProgramStateMachineType_LastTransition_Number,3838,Variable
-ProgramStateMachineType_LastTransition_TransitionTime,3839,Variable
-ProgramStateMachineType_ProgramDiagnostic_CreateSessionId,3840,Variable
-ProgramStateMachineType_ProgramDiagnostic_CreateClientName,3841,Variable
-ProgramStateMachineType_ProgramDiagnostic_InvocationCreationTime,3842,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastTransitionTime,3843,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodCall,3844,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodSessionId,3845,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodInputArguments,3846,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodOutputArguments,3847,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodCallTime,3848,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodReturnStatus,3849,Variable
-ProgramStateMachineType_FinalResultData,3850,Object
-AddCommentMethodType,3863,Method
-AddCommentMethodType_InputArguments,3864,Variable
-ConditionType_EventId,3865,Variable
-ConditionType_EventType,3866,Variable
-ConditionType_SourceNode,3867,Variable
-ConditionType_SourceName,3868,Variable
-ConditionType_Time,3869,Variable
-ConditionType_ReceiveTime,3870,Variable
-ConditionType_LocalTime,3871,Variable
-ConditionType_Message,3872,Variable
-ConditionType_Severity,3873,Variable
-ConditionType_Retain,3874,Variable
-ConditionType_ConditionRefresh,3875,Method
-ConditionType_ConditionRefresh_InputArguments,3876,Variable
-RefreshStartEventType_EventId,3969,Variable
-RefreshStartEventType_EventType,3970,Variable
-RefreshStartEventType_SourceNode,3971,Variable
-RefreshStartEventType_SourceName,3972,Variable
-RefreshStartEventType_Time,3973,Variable
-RefreshStartEventType_ReceiveTime,3974,Variable
-RefreshStartEventType_LocalTime,3975,Variable
-RefreshStartEventType_Message,3976,Variable
-RefreshStartEventType_Severity,3977,Variable
-RefreshEndEventType_EventId,3978,Variable
-RefreshEndEventType_EventType,3979,Variable
-RefreshEndEventType_SourceNode,3980,Variable
-RefreshEndEventType_SourceName,3981,Variable
-RefreshEndEventType_Time,3982,Variable
-RefreshEndEventType_ReceiveTime,3983,Variable
-RefreshEndEventType_LocalTime,3984,Variable
-RefreshEndEventType_Message,3985,Variable
-RefreshEndEventType_Severity,3986,Variable
-RefreshRequiredEventType_EventId,3987,Variable
-RefreshRequiredEventType_EventType,3988,Variable
-RefreshRequiredEventType_SourceNode,3989,Variable
-RefreshRequiredEventType_SourceName,3990,Variable
-RefreshRequiredEventType_Time,3991,Variable
-RefreshRequiredEventType_ReceiveTime,3992,Variable
-RefreshRequiredEventType_LocalTime,3993,Variable
-RefreshRequiredEventType_Message,3994,Variable
-RefreshRequiredEventType_Severity,3995,Variable
-AuditConditionEventType_EventId,3996,Variable
-AuditConditionEventType_EventType,3997,Variable
-AuditConditionEventType_SourceNode,3998,Variable
-AuditConditionEventType_SourceName,3999,Variable
-AuditConditionEventType_Time,4000,Variable
-AuditConditionEventType_ReceiveTime,4001,Variable
-AuditConditionEventType_LocalTime,4002,Variable
-AuditConditionEventType_Message,4003,Variable
-AuditConditionEventType_Severity,4004,Variable
-AuditConditionEventType_ActionTimeStamp,4005,Variable
-AuditConditionEventType_Status,4006,Variable
-AuditConditionEventType_ServerId,4007,Variable
-AuditConditionEventType_ClientAuditEntryId,4008,Variable
-AuditConditionEventType_ClientUserId,4009,Variable
-AuditConditionEventType_MethodId,4010,Variable
-AuditConditionEventType_InputArguments,4011,Variable
-AuditConditionEnableEventType_EventId,4106,Variable
-AuditConditionEnableEventType_EventType,4107,Variable
-AuditConditionEnableEventType_SourceNode,4108,Variable
-AuditConditionEnableEventType_SourceName,4109,Variable
-AuditConditionEnableEventType_Time,4110,Variable
-AuditConditionEnableEventType_ReceiveTime,4111,Variable
-AuditConditionEnableEventType_LocalTime,4112,Variable
-AuditConditionEnableEventType_Message,4113,Variable
-AuditConditionEnableEventType_Severity,4114,Variable
-AuditConditionEnableEventType_ActionTimeStamp,4115,Variable
-AuditConditionEnableEventType_Status,4116,Variable
-AuditConditionEnableEventType_ServerId,4117,Variable
-AuditConditionEnableEventType_ClientAuditEntryId,4118,Variable
-AuditConditionEnableEventType_ClientUserId,4119,Variable
-AuditConditionEnableEventType_MethodId,4120,Variable
-AuditConditionEnableEventType_InputArguments,4121,Variable
-AuditConditionCommentEventType_EventId,4170,Variable
-AuditConditionCommentEventType_EventType,4171,Variable
-AuditConditionCommentEventType_SourceNode,4172,Variable
-AuditConditionCommentEventType_SourceName,4173,Variable
-AuditConditionCommentEventType_Time,4174,Variable
-AuditConditionCommentEventType_ReceiveTime,4175,Variable
-AuditConditionCommentEventType_LocalTime,4176,Variable
-AuditConditionCommentEventType_Message,4177,Variable
-AuditConditionCommentEventType_Severity,4178,Variable
-AuditConditionCommentEventType_ActionTimeStamp,4179,Variable
-AuditConditionCommentEventType_Status,4180,Variable
-AuditConditionCommentEventType_ServerId,4181,Variable
-AuditConditionCommentEventType_ClientAuditEntryId,4182,Variable
-AuditConditionCommentEventType_ClientUserId,4183,Variable
-AuditConditionCommentEventType_MethodId,4184,Variable
-AuditConditionCommentEventType_InputArguments,4185,Variable
-DialogConditionType_EventId,4188,Variable
-DialogConditionType_EventType,4189,Variable
-DialogConditionType_SourceNode,4190,Variable
-DialogConditionType_SourceName,4191,Variable
-DialogConditionType_Time,4192,Variable
-DialogConditionType_ReceiveTime,4193,Variable
-DialogConditionType_LocalTime,4194,Variable
-DialogConditionType_Message,4195,Variable
-DialogConditionType_Severity,4196,Variable
-DialogConditionType_Retain,4197,Variable
-DialogConditionType_ConditionRefresh,4198,Method
-DialogConditionType_ConditionRefresh_InputArguments,4199,Variable
-AcknowledgeableConditionType_EventId,5113,Variable
-AcknowledgeableConditionType_EventType,5114,Variable
-AcknowledgeableConditionType_SourceNode,5115,Variable
-AcknowledgeableConditionType_SourceName,5116,Variable
-AcknowledgeableConditionType_Time,5117,Variable
-AcknowledgeableConditionType_ReceiveTime,5118,Variable
-AcknowledgeableConditionType_LocalTime,5119,Variable
-AcknowledgeableConditionType_Message,5120,Variable
-AcknowledgeableConditionType_Severity,5121,Variable
-AcknowledgeableConditionType_Retain,5122,Variable
-AcknowledgeableConditionType_ConditionRefresh,5123,Method
-AcknowledgeableConditionType_ConditionRefresh_InputArguments,5124,Variable
-AlarmConditionType_EventId,5540,Variable
-AlarmConditionType_EventType,5541,Variable
-AlarmConditionType_SourceNode,5542,Variable
-AlarmConditionType_SourceName,5543,Variable
-AlarmConditionType_Time,5544,Variable
-AlarmConditionType_ReceiveTime,5545,Variable
-AlarmConditionType_LocalTime,5546,Variable
-AlarmConditionType_Message,5547,Variable
-AlarmConditionType_Severity,5548,Variable
-AlarmConditionType_Retain,5549,Variable
-AlarmConditionType_ConditionRefresh,5550,Method
-AlarmConditionType_ConditionRefresh_InputArguments,5551,Variable
-ShelvedStateMachineType_CurrentState,6088,Variable
-ShelvedStateMachineType_CurrentState_Id,6089,Variable
-ShelvedStateMachineType_CurrentState_Name,6090,Variable
-ShelvedStateMachineType_CurrentState_Number,6091,Variable
-ShelvedStateMachineType_CurrentState_EffectiveDisplayName,6092,Variable
-ShelvedStateMachineType_LastTransition,6093,Variable
-ShelvedStateMachineType_LastTransition_Id,6094,Variable
-ShelvedStateMachineType_LastTransition_Name,6095,Variable
-ShelvedStateMachineType_LastTransition_Number,6096,Variable
-ShelvedStateMachineType_LastTransition_TransitionTime,6097,Variable
-ShelvedStateMachineType_Unshelved_StateNumber,6098,Variable
-ShelvedStateMachineType_TimedShelved_StateNumber,6100,Variable
-ShelvedStateMachineType_OneShotShelved_StateNumber,6101,Variable
-TimedShelveMethodType,6102,Method
-TimedShelveMethodType_InputArguments,6103,Variable
-LimitAlarmType_EventId,6116,Variable
-LimitAlarmType_EventType,6117,Variable
-LimitAlarmType_SourceNode,6118,Variable
-LimitAlarmType_SourceName,6119,Variable
-LimitAlarmType_Time,6120,Variable
-LimitAlarmType_ReceiveTime,6121,Variable
-LimitAlarmType_LocalTime,6122,Variable
-LimitAlarmType_Message,6123,Variable
-LimitAlarmType_Severity,6124,Variable
-LimitAlarmType_Retain,6125,Variable
-LimitAlarmType_ConditionRefresh,6126,Method
-LimitAlarmType_ConditionRefresh_InputArguments,6127,Variable
-IdType_EnumStrings,7591,Variable
-EnumValueType,7594,DataType
-MessageSecurityMode_EnumStrings,7595,Variable
-UserTokenType_EnumStrings,7596,Variable
-ApplicationType_EnumStrings,7597,Variable
-SecurityTokenRequestType_EnumStrings,7598,Variable
-BrowseDirection_EnumStrings,7603,Variable
-FilterOperator_EnumStrings,7605,Variable
-TimestampsToReturn_EnumStrings,7606,Variable
-MonitoringMode_EnumStrings,7608,Variable
-DataChangeTrigger_EnumStrings,7609,Variable
-DeadbandType_EnumStrings,7610,Variable
-RedundancySupport_EnumStrings,7611,Variable
-ServerState_EnumStrings,7612,Variable
-ExceptionDeviationFormat_EnumStrings,7614,Variable
-EnumValueType_Encoding_DefaultXml,7616,Object
-OpcUa_BinarySchema,7617,Variable
-OpcUa_BinarySchema_DataTypeVersion,7618,Variable
-OpcUa_BinarySchema_NamespaceUri,7619,Variable
-OpcUa_BinarySchema_Argument,7650,Variable
-OpcUa_BinarySchema_Argument_DataTypeVersion,7651,Variable
-OpcUa_BinarySchema_Argument_DictionaryFragment,7652,Variable
-OpcUa_BinarySchema_EnumValueType,7656,Variable
-OpcUa_BinarySchema_EnumValueType_DataTypeVersion,7657,Variable
-OpcUa_BinarySchema_EnumValueType_DictionaryFragment,7658,Variable
-OpcUa_BinarySchema_StatusResult,7659,Variable
-OpcUa_BinarySchema_StatusResult_DataTypeVersion,7660,Variable
-OpcUa_BinarySchema_StatusResult_DictionaryFragment,7661,Variable
-OpcUa_BinarySchema_UserTokenPolicy,7662,Variable
-OpcUa_BinarySchema_UserTokenPolicy_DataTypeVersion,7663,Variable
-OpcUa_BinarySchema_UserTokenPolicy_DictionaryFragment,7664,Variable
-OpcUa_BinarySchema_ApplicationDescription,7665,Variable
-OpcUa_BinarySchema_ApplicationDescription_DataTypeVersion,7666,Variable
-OpcUa_BinarySchema_ApplicationDescription_DictionaryFragment,7667,Variable
-OpcUa_BinarySchema_EndpointDescription,7668,Variable
-OpcUa_BinarySchema_EndpointDescription_DataTypeVersion,7669,Variable
-OpcUa_BinarySchema_EndpointDescription_DictionaryFragment,7670,Variable
-OpcUa_BinarySchema_UserIdentityToken,7671,Variable
-OpcUa_BinarySchema_UserIdentityToken_DataTypeVersion,7672,Variable
-OpcUa_BinarySchema_UserIdentityToken_DictionaryFragment,7673,Variable
-OpcUa_BinarySchema_AnonymousIdentityToken,7674,Variable
-OpcUa_BinarySchema_AnonymousIdentityToken_DataTypeVersion,7675,Variable
-OpcUa_BinarySchema_AnonymousIdentityToken_DictionaryFragment,7676,Variable
-OpcUa_BinarySchema_UserNameIdentityToken,7677,Variable
-OpcUa_BinarySchema_UserNameIdentityToken_DataTypeVersion,7678,Variable
-OpcUa_BinarySchema_UserNameIdentityToken_DictionaryFragment,7679,Variable
-OpcUa_BinarySchema_X509IdentityToken,7680,Variable
-OpcUa_BinarySchema_X509IdentityToken_DataTypeVersion,7681,Variable
-OpcUa_BinarySchema_X509IdentityToken_DictionaryFragment,7682,Variable
-OpcUa_BinarySchema_IssuedIdentityToken,7683,Variable
-OpcUa_BinarySchema_IssuedIdentityToken_DataTypeVersion,7684,Variable
-OpcUa_BinarySchema_IssuedIdentityToken_DictionaryFragment,7685,Variable
-OpcUa_BinarySchema_EndpointConfiguration,7686,Variable
-OpcUa_BinarySchema_EndpointConfiguration_DataTypeVersion,7687,Variable
-OpcUa_BinarySchema_EndpointConfiguration_DictionaryFragment,7688,Variable
-OpcUa_BinarySchema_BuildInfo,7692,Variable
-OpcUa_BinarySchema_BuildInfo_DataTypeVersion,7693,Variable
-OpcUa_BinarySchema_BuildInfo_DictionaryFragment,7694,Variable
-OpcUa_BinarySchema_SignedSoftwareCertificate,7698,Variable
-OpcUa_BinarySchema_SignedSoftwareCertificate_DataTypeVersion,7699,Variable
-OpcUa_BinarySchema_SignedSoftwareCertificate_DictionaryFragment,7700,Variable
-OpcUa_BinarySchema_AddNodesItem,7728,Variable
-OpcUa_BinarySchema_AddNodesItem_DataTypeVersion,7729,Variable
-OpcUa_BinarySchema_AddNodesItem_DictionaryFragment,7730,Variable
-OpcUa_BinarySchema_AddReferencesItem,7731,Variable
-OpcUa_BinarySchema_AddReferencesItem_DataTypeVersion,7732,Variable
-OpcUa_BinarySchema_AddReferencesItem_DictionaryFragment,7733,Variable
-OpcUa_BinarySchema_DeleteNodesItem,7734,Variable
-OpcUa_BinarySchema_DeleteNodesItem_DataTypeVersion,7735,Variable
-OpcUa_BinarySchema_DeleteNodesItem_DictionaryFragment,7736,Variable
-OpcUa_BinarySchema_DeleteReferencesItem,7737,Variable
-OpcUa_BinarySchema_DeleteReferencesItem_DataTypeVersion,7738,Variable
-OpcUa_BinarySchema_DeleteReferencesItem_DictionaryFragment,7739,Variable
-OpcUa_BinarySchema_RegisteredServer,7782,Variable
-OpcUa_BinarySchema_RegisteredServer_DataTypeVersion,7783,Variable
-OpcUa_BinarySchema_RegisteredServer_DictionaryFragment,7784,Variable
-OpcUa_BinarySchema_ContentFilterElement,7929,Variable
-OpcUa_BinarySchema_ContentFilterElement_DataTypeVersion,7930,Variable
-OpcUa_BinarySchema_ContentFilterElement_DictionaryFragment,7931,Variable
-OpcUa_BinarySchema_ContentFilter,7932,Variable
-OpcUa_BinarySchema_ContentFilter_DataTypeVersion,7933,Variable
-OpcUa_BinarySchema_ContentFilter_DictionaryFragment,7934,Variable
-OpcUa_BinarySchema_FilterOperand,7935,Variable
-OpcUa_BinarySchema_FilterOperand_DataTypeVersion,7936,Variable
-OpcUa_BinarySchema_FilterOperand_DictionaryFragment,7937,Variable
-OpcUa_BinarySchema_ElementOperand,7938,Variable
-OpcUa_BinarySchema_ElementOperand_DataTypeVersion,7939,Variable
-OpcUa_BinarySchema_ElementOperand_DictionaryFragment,7940,Variable
-OpcUa_BinarySchema_LiteralOperand,7941,Variable
-OpcUa_BinarySchema_LiteralOperand_DataTypeVersion,7942,Variable
-OpcUa_BinarySchema_LiteralOperand_DictionaryFragment,7943,Variable
-OpcUa_BinarySchema_AttributeOperand,7944,Variable
-OpcUa_BinarySchema_AttributeOperand_DataTypeVersion,7945,Variable
-OpcUa_BinarySchema_AttributeOperand_DictionaryFragment,7946,Variable
-OpcUa_BinarySchema_SimpleAttributeOperand,7947,Variable
-OpcUa_BinarySchema_SimpleAttributeOperand_DataTypeVersion,7948,Variable
-OpcUa_BinarySchema_SimpleAttributeOperand_DictionaryFragment,7949,Variable
-OpcUa_BinarySchema_HistoryEvent,8004,Variable
-OpcUa_BinarySchema_HistoryEvent_DataTypeVersion,8005,Variable
-OpcUa_BinarySchema_HistoryEvent_DictionaryFragment,8006,Variable
-OpcUa_BinarySchema_MonitoringFilter,8067,Variable
-OpcUa_BinarySchema_MonitoringFilter_DataTypeVersion,8068,Variable
-OpcUa_BinarySchema_MonitoringFilter_DictionaryFragment,8069,Variable
-OpcUa_BinarySchema_EventFilter,8073,Variable
-OpcUa_BinarySchema_EventFilter_DataTypeVersion,8074,Variable
-OpcUa_BinarySchema_EventFilter_DictionaryFragment,8075,Variable
-OpcUa_BinarySchema_AggregateConfiguration,8076,Variable
-OpcUa_BinarySchema_AggregateConfiguration_DataTypeVersion,8077,Variable
-OpcUa_BinarySchema_AggregateConfiguration_DictionaryFragment,8078,Variable
-OpcUa_BinarySchema_HistoryEventFieldList,8172,Variable
-OpcUa_BinarySchema_HistoryEventFieldList_DataTypeVersion,8173,Variable
-OpcUa_BinarySchema_HistoryEventFieldList_DictionaryFragment,8174,Variable
-OpcUa_BinarySchema_RedundantServerDataType,8208,Variable
-OpcUa_BinarySchema_RedundantServerDataType_DataTypeVersion,8209,Variable
-OpcUa_BinarySchema_RedundantServerDataType_DictionaryFragment,8210,Variable
-OpcUa_BinarySchema_SamplingIntervalDiagnosticsDataType,8211,Variable
-OpcUa_BinarySchema_SamplingIntervalDiagnosticsDataType_DataTypeVersion,8212,Variable
-OpcUa_BinarySchema_SamplingIntervalDiagnosticsDataType_DictionaryFragment,8213,Variable
-OpcUa_BinarySchema_ServerDiagnosticsSummaryDataType,8214,Variable
-OpcUa_BinarySchema_ServerDiagnosticsSummaryDataType_DataTypeVersion,8215,Variable
-OpcUa_BinarySchema_ServerDiagnosticsSummaryDataType_DictionaryFragment,8216,Variable
-OpcUa_BinarySchema_ServerStatusDataType,8217,Variable
-OpcUa_BinarySchema_ServerStatusDataType_DataTypeVersion,8218,Variable
-OpcUa_BinarySchema_ServerStatusDataType_DictionaryFragment,8219,Variable
-OpcUa_BinarySchema_SessionDiagnosticsDataType,8220,Variable
-OpcUa_BinarySchema_SessionDiagnosticsDataType_DataTypeVersion,8221,Variable
-OpcUa_BinarySchema_SessionDiagnosticsDataType_DictionaryFragment,8222,Variable
-OpcUa_BinarySchema_SessionSecurityDiagnosticsDataType,8223,Variable
-OpcUa_BinarySchema_SessionSecurityDiagnosticsDataType_DataTypeVersion,8224,Variable
-OpcUa_BinarySchema_SessionSecurityDiagnosticsDataType_DictionaryFragment,8225,Variable
-OpcUa_BinarySchema_ServiceCounterDataType,8226,Variable
-OpcUa_BinarySchema_ServiceCounterDataType_DataTypeVersion,8227,Variable
-OpcUa_BinarySchema_ServiceCounterDataType_DictionaryFragment,8228,Variable
-OpcUa_BinarySchema_SubscriptionDiagnosticsDataType,8229,Variable
-OpcUa_BinarySchema_SubscriptionDiagnosticsDataType_DataTypeVersion,8230,Variable
-OpcUa_BinarySchema_SubscriptionDiagnosticsDataType_DictionaryFragment,8231,Variable
-OpcUa_BinarySchema_ModelChangeStructureDataType,8232,Variable
-OpcUa_BinarySchema_ModelChangeStructureDataType_DataTypeVersion,8233,Variable
-OpcUa_BinarySchema_ModelChangeStructureDataType_DictionaryFragment,8234,Variable
-OpcUa_BinarySchema_SemanticChangeStructureDataType,8235,Variable
-OpcUa_BinarySchema_SemanticChangeStructureDataType_DataTypeVersion,8236,Variable
-OpcUa_BinarySchema_SemanticChangeStructureDataType_DictionaryFragment,8237,Variable
-OpcUa_BinarySchema_Range,8238,Variable
-OpcUa_BinarySchema_Range_DataTypeVersion,8239,Variable
-OpcUa_BinarySchema_Range_DictionaryFragment,8240,Variable
-OpcUa_BinarySchema_EUInformation,8241,Variable
-OpcUa_BinarySchema_EUInformation_DataTypeVersion,8242,Variable
-OpcUa_BinarySchema_EUInformation_DictionaryFragment,8243,Variable
-OpcUa_BinarySchema_Annotation,8244,Variable
-OpcUa_BinarySchema_Annotation_DataTypeVersion,8245,Variable
-OpcUa_BinarySchema_Annotation_DictionaryFragment,8246,Variable
-OpcUa_BinarySchema_ProgramDiagnosticDataType,8247,Variable
-OpcUa_BinarySchema_ProgramDiagnosticDataType_DataTypeVersion,8248,Variable
-OpcUa_BinarySchema_ProgramDiagnosticDataType_DictionaryFragment,8249,Variable
-EnumValueType_Encoding_DefaultBinary,8251,Object
-OpcUa_XmlSchema,8252,Variable
-OpcUa_XmlSchema_DataTypeVersion,8253,Variable
-OpcUa_XmlSchema_NamespaceUri,8254,Variable
-OpcUa_XmlSchema_Argument,8285,Variable
-OpcUa_XmlSchema_Argument_DataTypeVersion,8286,Variable
-OpcUa_XmlSchema_Argument_DictionaryFragment,8287,Variable
-OpcUa_XmlSchema_EnumValueType,8291,Variable
-OpcUa_XmlSchema_EnumValueType_DataTypeVersion,8292,Variable
-OpcUa_XmlSchema_EnumValueType_DictionaryFragment,8293,Variable
-OpcUa_XmlSchema_StatusResult,8294,Variable
-OpcUa_XmlSchema_StatusResult_DataTypeVersion,8295,Variable
-OpcUa_XmlSchema_StatusResult_DictionaryFragment,8296,Variable
-OpcUa_XmlSchema_UserTokenPolicy,8297,Variable
-OpcUa_XmlSchema_UserTokenPolicy_DataTypeVersion,8298,Variable
-OpcUa_XmlSchema_UserTokenPolicy_DictionaryFragment,8299,Variable
-OpcUa_XmlSchema_ApplicationDescription,8300,Variable
-OpcUa_XmlSchema_ApplicationDescription_DataTypeVersion,8301,Variable
-OpcUa_XmlSchema_ApplicationDescription_DictionaryFragment,8302,Variable
-OpcUa_XmlSchema_EndpointDescription,8303,Variable
-OpcUa_XmlSchema_EndpointDescription_DataTypeVersion,8304,Variable
-OpcUa_XmlSchema_EndpointDescription_DictionaryFragment,8305,Variable
-OpcUa_XmlSchema_UserIdentityToken,8306,Variable
-OpcUa_XmlSchema_UserIdentityToken_DataTypeVersion,8307,Variable
-OpcUa_XmlSchema_UserIdentityToken_DictionaryFragment,8308,Variable
-OpcUa_XmlSchema_AnonymousIdentityToken,8309,Variable
-OpcUa_XmlSchema_AnonymousIdentityToken_DataTypeVersion,8310,Variable
-OpcUa_XmlSchema_AnonymousIdentityToken_DictionaryFragment,8311,Variable
-OpcUa_XmlSchema_UserNameIdentityToken,8312,Variable
-OpcUa_XmlSchema_UserNameIdentityToken_DataTypeVersion,8313,Variable
-OpcUa_XmlSchema_UserNameIdentityToken_DictionaryFragment,8314,Variable
-OpcUa_XmlSchema_X509IdentityToken,8315,Variable
-OpcUa_XmlSchema_X509IdentityToken_DataTypeVersion,8316,Variable
-OpcUa_XmlSchema_X509IdentityToken_DictionaryFragment,8317,Variable
-OpcUa_XmlSchema_IssuedIdentityToken,8318,Variable
-OpcUa_XmlSchema_IssuedIdentityToken_DataTypeVersion,8319,Variable
-OpcUa_XmlSchema_IssuedIdentityToken_DictionaryFragment,8320,Variable
-OpcUa_XmlSchema_EndpointConfiguration,8321,Variable
-OpcUa_XmlSchema_EndpointConfiguration_DataTypeVersion,8322,Variable
-OpcUa_XmlSchema_EndpointConfiguration_DictionaryFragment,8323,Variable
-OpcUa_XmlSchema_BuildInfo,8327,Variable
-OpcUa_XmlSchema_BuildInfo_DataTypeVersion,8328,Variable
-OpcUa_XmlSchema_BuildInfo_DictionaryFragment,8329,Variable
-OpcUa_XmlSchema_SignedSoftwareCertificate,8333,Variable
-OpcUa_XmlSchema_SignedSoftwareCertificate_DataTypeVersion,8334,Variable
-OpcUa_XmlSchema_SignedSoftwareCertificate_DictionaryFragment,8335,Variable
-OpcUa_XmlSchema_AddNodesItem,8363,Variable
-OpcUa_XmlSchema_AddNodesItem_DataTypeVersion,8364,Variable
-OpcUa_XmlSchema_AddNodesItem_DictionaryFragment,8365,Variable
-OpcUa_XmlSchema_AddReferencesItem,8366,Variable
-OpcUa_XmlSchema_AddReferencesItem_DataTypeVersion,8367,Variable
-OpcUa_XmlSchema_AddReferencesItem_DictionaryFragment,8368,Variable
-OpcUa_XmlSchema_DeleteNodesItem,8369,Variable
-OpcUa_XmlSchema_DeleteNodesItem_DataTypeVersion,8370,Variable
-OpcUa_XmlSchema_DeleteNodesItem_DictionaryFragment,8371,Variable
-OpcUa_XmlSchema_DeleteReferencesItem,8372,Variable
-OpcUa_XmlSchema_DeleteReferencesItem_DataTypeVersion,8373,Variable
-OpcUa_XmlSchema_DeleteReferencesItem_DictionaryFragment,8374,Variable
-OpcUa_XmlSchema_RegisteredServer,8417,Variable
-OpcUa_XmlSchema_RegisteredServer_DataTypeVersion,8418,Variable
-OpcUa_XmlSchema_RegisteredServer_DictionaryFragment,8419,Variable
-OpcUa_XmlSchema_ContentFilterElement,8564,Variable
-OpcUa_XmlSchema_ContentFilterElement_DataTypeVersion,8565,Variable
-OpcUa_XmlSchema_ContentFilterElement_DictionaryFragment,8566,Variable
-OpcUa_XmlSchema_ContentFilter,8567,Variable
-OpcUa_XmlSchema_ContentFilter_DataTypeVersion,8568,Variable
-OpcUa_XmlSchema_ContentFilter_DictionaryFragment,8569,Variable
-OpcUa_XmlSchema_FilterOperand,8570,Variable
-OpcUa_XmlSchema_FilterOperand_DataTypeVersion,8571,Variable
-OpcUa_XmlSchema_FilterOperand_DictionaryFragment,8572,Variable
-OpcUa_XmlSchema_ElementOperand,8573,Variable
-OpcUa_XmlSchema_ElementOperand_DataTypeVersion,8574,Variable
-OpcUa_XmlSchema_ElementOperand_DictionaryFragment,8575,Variable
-OpcUa_XmlSchema_LiteralOperand,8576,Variable
-OpcUa_XmlSchema_LiteralOperand_DataTypeVersion,8577,Variable
-OpcUa_XmlSchema_LiteralOperand_DictionaryFragment,8578,Variable
-OpcUa_XmlSchema_AttributeOperand,8579,Variable
-OpcUa_XmlSchema_AttributeOperand_DataTypeVersion,8580,Variable
-OpcUa_XmlSchema_AttributeOperand_DictionaryFragment,8581,Variable
-OpcUa_XmlSchema_SimpleAttributeOperand,8582,Variable
-OpcUa_XmlSchema_SimpleAttributeOperand_DataTypeVersion,8583,Variable
-OpcUa_XmlSchema_SimpleAttributeOperand_DictionaryFragment,8584,Variable
-OpcUa_XmlSchema_HistoryEvent,8639,Variable
-OpcUa_XmlSchema_HistoryEvent_DataTypeVersion,8640,Variable
-OpcUa_XmlSchema_HistoryEvent_DictionaryFragment,8641,Variable
-OpcUa_XmlSchema_MonitoringFilter,8702,Variable
-OpcUa_XmlSchema_MonitoringFilter_DataTypeVersion,8703,Variable
-OpcUa_XmlSchema_MonitoringFilter_DictionaryFragment,8704,Variable
-OpcUa_XmlSchema_EventFilter,8708,Variable
-OpcUa_XmlSchema_EventFilter_DataTypeVersion,8709,Variable
-OpcUa_XmlSchema_EventFilter_DictionaryFragment,8710,Variable
-OpcUa_XmlSchema_AggregateConfiguration,8711,Variable
-OpcUa_XmlSchema_AggregateConfiguration_DataTypeVersion,8712,Variable
-OpcUa_XmlSchema_AggregateConfiguration_DictionaryFragment,8713,Variable
-OpcUa_XmlSchema_HistoryEventFieldList,8807,Variable
-OpcUa_XmlSchema_HistoryEventFieldList_DataTypeVersion,8808,Variable
-OpcUa_XmlSchema_HistoryEventFieldList_DictionaryFragment,8809,Variable
-OpcUa_XmlSchema_RedundantServerDataType,8843,Variable
-OpcUa_XmlSchema_RedundantServerDataType_DataTypeVersion,8844,Variable
-OpcUa_XmlSchema_RedundantServerDataType_DictionaryFragment,8845,Variable
-OpcUa_XmlSchema_SamplingIntervalDiagnosticsDataType,8846,Variable
-OpcUa_XmlSchema_SamplingIntervalDiagnosticsDataType_DataTypeVersion,8847,Variable
-OpcUa_XmlSchema_SamplingIntervalDiagnosticsDataType_DictionaryFragment,8848,Variable
-OpcUa_XmlSchema_ServerDiagnosticsSummaryDataType,8849,Variable
-OpcUa_XmlSchema_ServerDiagnosticsSummaryDataType_DataTypeVersion,8850,Variable
-OpcUa_XmlSchema_ServerDiagnosticsSummaryDataType_DictionaryFragment,8851,Variable
-OpcUa_XmlSchema_ServerStatusDataType,8852,Variable
-OpcUa_XmlSchema_ServerStatusDataType_DataTypeVersion,8853,Variable
-OpcUa_XmlSchema_ServerStatusDataType_DictionaryFragment,8854,Variable
-OpcUa_XmlSchema_SessionDiagnosticsDataType,8855,Variable
-OpcUa_XmlSchema_SessionDiagnosticsDataType_DataTypeVersion,8856,Variable
-OpcUa_XmlSchema_SessionDiagnosticsDataType_DictionaryFragment,8857,Variable
-OpcUa_XmlSchema_SessionSecurityDiagnosticsDataType,8858,Variable
-OpcUa_XmlSchema_SessionSecurityDiagnosticsDataType_DataTypeVersion,8859,Variable
-OpcUa_XmlSchema_SessionSecurityDiagnosticsDataType_DictionaryFragment,8860,Variable
-OpcUa_XmlSchema_ServiceCounterDataType,8861,Variable
-OpcUa_XmlSchema_ServiceCounterDataType_DataTypeVersion,8862,Variable
-OpcUa_XmlSchema_ServiceCounterDataType_DictionaryFragment,8863,Variable
-OpcUa_XmlSchema_SubscriptionDiagnosticsDataType,8864,Variable
-OpcUa_XmlSchema_SubscriptionDiagnosticsDataType_DataTypeVersion,8865,Variable
-OpcUa_XmlSchema_SubscriptionDiagnosticsDataType_DictionaryFragment,8866,Variable
-OpcUa_XmlSchema_ModelChangeStructureDataType,8867,Variable
-OpcUa_XmlSchema_ModelChangeStructureDataType_DataTypeVersion,8868,Variable
-OpcUa_XmlSchema_ModelChangeStructureDataType_DictionaryFragment,8869,Variable
-OpcUa_XmlSchema_SemanticChangeStructureDataType,8870,Variable
-OpcUa_XmlSchema_SemanticChangeStructureDataType_DataTypeVersion,8871,Variable
-OpcUa_XmlSchema_SemanticChangeStructureDataType_DictionaryFragment,8872,Variable
-OpcUa_XmlSchema_Range,8873,Variable
-OpcUa_XmlSchema_Range_DataTypeVersion,8874,Variable
-OpcUa_XmlSchema_Range_DictionaryFragment,8875,Variable
-OpcUa_XmlSchema_EUInformation,8876,Variable
-OpcUa_XmlSchema_EUInformation_DataTypeVersion,8877,Variable
-OpcUa_XmlSchema_EUInformation_DictionaryFragment,8878,Variable
-OpcUa_XmlSchema_Annotation,8879,Variable
-OpcUa_XmlSchema_Annotation_DataTypeVersion,8880,Variable
-OpcUa_XmlSchema_Annotation_DictionaryFragment,8881,Variable
-OpcUa_XmlSchema_ProgramDiagnosticDataType,8882,Variable
-OpcUa_XmlSchema_ProgramDiagnosticDataType_DataTypeVersion,8883,Variable
-OpcUa_XmlSchema_ProgramDiagnosticDataType_DictionaryFragment,8884,Variable
-SubscriptionDiagnosticsType_MaxLifetimeCount,8888,Variable
-SubscriptionDiagnosticsType_LatePublishRequestCount,8889,Variable
-SubscriptionDiagnosticsType_CurrentKeepAliveCount,8890,Variable
-SubscriptionDiagnosticsType_CurrentLifetimeCount,8891,Variable
-SubscriptionDiagnosticsType_UnacknowledgedMessageCount,8892,Variable
-SubscriptionDiagnosticsType_DiscardedMessageCount,8893,Variable
-SubscriptionDiagnosticsType_MonitoredItemCount,8894,Variable
-SubscriptionDiagnosticsType_DisabledMonitoredItemCount,8895,Variable
-SubscriptionDiagnosticsType_MonitoringQueueOverflowCount,8896,Variable
-SubscriptionDiagnosticsType_NextSequenceNumber,8897,Variable
-SessionDiagnosticsObjectType_SessionDiagnostics_TotalRequestCount,8898,Variable
-SessionDiagnosticsVariableType_TotalRequestCount,8900,Variable
-SubscriptionDiagnosticsType_EventQueueOverflowCount,8902,Variable
-TimeZoneDataType,8912,DataType
-TimeZoneDataType_Encoding_DefaultXml,8913,Object
-OpcUa_BinarySchema_TimeZoneDataType,8914,Variable
-OpcUa_BinarySchema_TimeZoneDataType_DataTypeVersion,8915,Variable
-OpcUa_BinarySchema_TimeZoneDataType_DictionaryFragment,8916,Variable
-TimeZoneDataType_Encoding_DefaultBinary,8917,Object
-OpcUa_XmlSchema_TimeZoneDataType,8918,Variable
-OpcUa_XmlSchema_TimeZoneDataType_DataTypeVersion,8919,Variable
-OpcUa_XmlSchema_TimeZoneDataType_DictionaryFragment,8920,Variable
-AuditConditionRespondEventType,8927,ObjectType
-AuditConditionRespondEventType_EventId,8928,Variable
-AuditConditionRespondEventType_EventType,8929,Variable
-AuditConditionRespondEventType_SourceNode,8930,Variable
-AuditConditionRespondEventType_SourceName,8931,Variable
-AuditConditionRespondEventType_Time,8932,Variable
-AuditConditionRespondEventType_ReceiveTime,8933,Variable
-AuditConditionRespondEventType_LocalTime,8934,Variable
-AuditConditionRespondEventType_Message,8935,Variable
-AuditConditionRespondEventType_Severity,8936,Variable
-AuditConditionRespondEventType_ActionTimeStamp,8937,Variable
-AuditConditionRespondEventType_Status,8938,Variable
-AuditConditionRespondEventType_ServerId,8939,Variable
-AuditConditionRespondEventType_ClientAuditEntryId,8940,Variable
-AuditConditionRespondEventType_ClientUserId,8941,Variable
-AuditConditionRespondEventType_MethodId,8942,Variable
-AuditConditionRespondEventType_InputArguments,8943,Variable
-AuditConditionAcknowledgeEventType,8944,ObjectType
-AuditConditionAcknowledgeEventType_EventId,8945,Variable
-AuditConditionAcknowledgeEventType_EventType,8946,Variable
-AuditConditionAcknowledgeEventType_SourceNode,8947,Variable
-AuditConditionAcknowledgeEventType_SourceName,8948,Variable
-AuditConditionAcknowledgeEventType_Time,8949,Variable
-AuditConditionAcknowledgeEventType_ReceiveTime,8950,Variable
-AuditConditionAcknowledgeEventType_LocalTime,8951,Variable
-AuditConditionAcknowledgeEventType_Message,8952,Variable
-AuditConditionAcknowledgeEventType_Severity,8953,Variable
-AuditConditionAcknowledgeEventType_ActionTimeStamp,8954,Variable
-AuditConditionAcknowledgeEventType_Status,8955,Variable
-AuditConditionAcknowledgeEventType_ServerId,8956,Variable
-AuditConditionAcknowledgeEventType_ClientAuditEntryId,8957,Variable
-AuditConditionAcknowledgeEventType_ClientUserId,8958,Variable
-AuditConditionAcknowledgeEventType_MethodId,8959,Variable
-AuditConditionAcknowledgeEventType_InputArguments,8960,Variable
-AuditConditionConfirmEventType,8961,ObjectType
-AuditConditionConfirmEventType_EventId,8962,Variable
-AuditConditionConfirmEventType_EventType,8963,Variable
-AuditConditionConfirmEventType_SourceNode,8964,Variable
-AuditConditionConfirmEventType_SourceName,8965,Variable
-AuditConditionConfirmEventType_Time,8966,Variable
-AuditConditionConfirmEventType_ReceiveTime,8967,Variable
-AuditConditionConfirmEventType_LocalTime,8968,Variable
-AuditConditionConfirmEventType_Message,8969,Variable
-AuditConditionConfirmEventType_Severity,8970,Variable
-AuditConditionConfirmEventType_ActionTimeStamp,8971,Variable
-AuditConditionConfirmEventType_Status,8972,Variable
-AuditConditionConfirmEventType_ServerId,8973,Variable
-AuditConditionConfirmEventType_ClientAuditEntryId,8974,Variable
-AuditConditionConfirmEventType_ClientUserId,8975,Variable
-AuditConditionConfirmEventType_MethodId,8976,Variable
-AuditConditionConfirmEventType_InputArguments,8977,Variable
-TwoStateVariableType,8995,VariableType
-TwoStateVariableType_Id,8996,Variable
-TwoStateVariableType_Name,8997,Variable
-TwoStateVariableType_Number,8998,Variable
-TwoStateVariableType_EffectiveDisplayName,8999,Variable
-TwoStateVariableType_TransitionTime,9000,Variable
-TwoStateVariableType_EffectiveTransitionTime,9001,Variable
-ConditionVariableType,9002,VariableType
-ConditionVariableType_SourceTimestamp,9003,Variable
-HasTrueSubState,9004,ReferenceType
-HasFalseSubState,9005,ReferenceType
-HasCondition,9006,ReferenceType
-ConditionRefreshMethodType,9007,Method
-ConditionRefreshMethodType_InputArguments,9008,Variable
-ConditionType_ConditionName,9009,Variable
-ConditionType_BranchId,9010,Variable
-ConditionType_EnabledState,9011,Variable
-ConditionType_EnabledState_Id,9012,Variable
-ConditionType_EnabledState_Name,9013,Variable
-ConditionType_EnabledState_Number,9014,Variable
-ConditionType_EnabledState_EffectiveDisplayName,9015,Variable
-ConditionType_EnabledState_TransitionTime,9016,Variable
-ConditionType_EnabledState_EffectiveTransitionTime,9017,Variable
-ConditionType_EnabledState_TrueState,9018,Variable
-ConditionType_EnabledState_FalseState,9019,Variable
-ConditionType_Quality,9020,Variable
-ConditionType_Quality_SourceTimestamp,9021,Variable
-ConditionType_LastSeverity,9022,Variable
-ConditionType_LastSeverity_SourceTimestamp,9023,Variable
-ConditionType_Comment,9024,Variable
-ConditionType_Comment_SourceTimestamp,9025,Variable
-ConditionType_ClientUserId,9026,Variable
-ConditionType_Enable,9027,Method
-ConditionType_Disable,9028,Method
-ConditionType_AddComment,9029,Method
-ConditionType_AddComment_InputArguments,9030,Variable
-DialogResponseMethodType,9031,Method
-DialogResponseMethodType_InputArguments,9032,Variable
-DialogConditionType_ConditionName,9033,Variable
-DialogConditionType_BranchId,9034,Variable
-DialogConditionType_EnabledState,9035,Variable
-DialogConditionType_EnabledState_Id,9036,Variable
-DialogConditionType_EnabledState_Name,9037,Variable
-DialogConditionType_EnabledState_Number,9038,Variable
-DialogConditionType_EnabledState_EffectiveDisplayName,9039,Variable
-DialogConditionType_EnabledState_TransitionTime,9040,Variable
-DialogConditionType_EnabledState_EffectiveTransitionTime,9041,Variable
-DialogConditionType_EnabledState_TrueState,9042,Variable
-DialogConditionType_EnabledState_FalseState,9043,Variable
-DialogConditionType_Quality,9044,Variable
-DialogConditionType_Quality_SourceTimestamp,9045,Variable
-DialogConditionType_LastSeverity,9046,Variable
-DialogConditionType_LastSeverity_SourceTimestamp,9047,Variable
-DialogConditionType_Comment,9048,Variable
-DialogConditionType_Comment_SourceTimestamp,9049,Variable
-DialogConditionType_ClientUserId,9050,Variable
-DialogConditionType_Enable,9051,Method
-DialogConditionType_Disable,9052,Method
-DialogConditionType_AddComment,9053,Method
-DialogConditionType_AddComment_InputArguments,9054,Variable
-DialogConditionType_DialogState,9055,Variable
-DialogConditionType_DialogState_Id,9056,Variable
-DialogConditionType_DialogState_Name,9057,Variable
-DialogConditionType_DialogState_Number,9058,Variable
-DialogConditionType_DialogState_EffectiveDisplayName,9059,Variable
-DialogConditionType_DialogState_TransitionTime,9060,Variable
-DialogConditionType_DialogState_EffectiveTransitionTime,9061,Variable
-DialogConditionType_DialogState_TrueState,9062,Variable
-DialogConditionType_DialogState_FalseState,9063,Variable
-DialogConditionType_ResponseOptionSet,9064,Variable
-DialogConditionType_DefaultResponse,9065,Variable
-DialogConditionType_OkResponse,9066,Variable
-DialogConditionType_CancelResponse,9067,Variable
-DialogConditionType_LastResponse,9068,Variable
-DialogConditionType_Respond,9069,Method
-DialogConditionType_Respond_InputArguments,9070,Variable
-AcknowledgeableConditionType_ConditionName,9071,Variable
-AcknowledgeableConditionType_BranchId,9072,Variable
-AcknowledgeableConditionType_EnabledState,9073,Variable
-AcknowledgeableConditionType_EnabledState_Id,9074,Variable
-AcknowledgeableConditionType_EnabledState_Name,9075,Variable
-AcknowledgeableConditionType_EnabledState_Number,9076,Variable
-AcknowledgeableConditionType_EnabledState_EffectiveDisplayName,9077,Variable
-AcknowledgeableConditionType_EnabledState_TransitionTime,9078,Variable
-AcknowledgeableConditionType_EnabledState_EffectiveTransitionTime,9079,Variable
-AcknowledgeableConditionType_EnabledState_TrueState,9080,Variable
-AcknowledgeableConditionType_EnabledState_FalseState,9081,Variable
-AcknowledgeableConditionType_Quality,9082,Variable
-AcknowledgeableConditionType_Quality_SourceTimestamp,9083,Variable
-AcknowledgeableConditionType_LastSeverity,9084,Variable
-AcknowledgeableConditionType_LastSeverity_SourceTimestamp,9085,Variable
-AcknowledgeableConditionType_Comment,9086,Variable
-AcknowledgeableConditionType_Comment_SourceTimestamp,9087,Variable
-AcknowledgeableConditionType_ClientUserId,9088,Variable
-AcknowledgeableConditionType_Enable,9089,Method
-AcknowledgeableConditionType_Disable,9090,Method
-AcknowledgeableConditionType_AddComment,9091,Method
-AcknowledgeableConditionType_AddComment_InputArguments,9092,Variable
-AcknowledgeableConditionType_AckedState,9093,Variable
-AcknowledgeableConditionType_AckedState_Id,9094,Variable
-AcknowledgeableConditionType_AckedState_Name,9095,Variable
-AcknowledgeableConditionType_AckedState_Number,9096,Variable
-AcknowledgeableConditionType_AckedState_EffectiveDisplayName,9097,Variable
-AcknowledgeableConditionType_AckedState_TransitionTime,9098,Variable
-AcknowledgeableConditionType_AckedState_EffectiveTransitionTime,9099,Variable
-AcknowledgeableConditionType_AckedState_TrueState,9100,Variable
-AcknowledgeableConditionType_AckedState_FalseState,9101,Variable
-AcknowledgeableConditionType_ConfirmedState,9102,Variable
-AcknowledgeableConditionType_ConfirmedState_Id,9103,Variable
-AcknowledgeableConditionType_ConfirmedState_Name,9104,Variable
-AcknowledgeableConditionType_ConfirmedState_Number,9105,Variable
-AcknowledgeableConditionType_ConfirmedState_EffectiveDisplayName,9106,Variable
-AcknowledgeableConditionType_ConfirmedState_TransitionTime,9107,Variable
-AcknowledgeableConditionType_ConfirmedState_EffectiveTransitionTime,9108,Variable
-AcknowledgeableConditionType_ConfirmedState_TrueState,9109,Variable
-AcknowledgeableConditionType_ConfirmedState_FalseState,9110,Variable
-AcknowledgeableConditionType_Acknowledge,9111,Method
-AcknowledgeableConditionType_Acknowledge_InputArguments,9112,Variable
-AcknowledgeableConditionType_Confirm,9113,Method
-AcknowledgeableConditionType_Confirm_InputArguments,9114,Variable
-ShelvedStateMachineType_UnshelveTime,9115,Variable
-AlarmConditionType_ConditionName,9116,Variable
-AlarmConditionType_BranchId,9117,Variable
-AlarmConditionType_EnabledState,9118,Variable
-AlarmConditionType_EnabledState_Id,9119,Variable
-AlarmConditionType_EnabledState_Name,9120,Variable
-AlarmConditionType_EnabledState_Number,9121,Variable
-AlarmConditionType_EnabledState_EffectiveDisplayName,9122,Variable
-AlarmConditionType_EnabledState_TransitionTime,9123,Variable
-AlarmConditionType_EnabledState_EffectiveTransitionTime,9124,Variable
-AlarmConditionType_EnabledState_TrueState,9125,Variable
-AlarmConditionType_EnabledState_FalseState,9126,Variable
-AlarmConditionType_Quality,9127,Variable
-AlarmConditionType_Quality_SourceTimestamp,9128,Variable
-AlarmConditionType_LastSeverity,9129,Variable
-AlarmConditionType_LastSeverity_SourceTimestamp,9130,Variable
-AlarmConditionType_Comment,9131,Variable
-AlarmConditionType_Comment_SourceTimestamp,9132,Variable
-AlarmConditionType_ClientUserId,9133,Variable
-AlarmConditionType_Enable,9134,Method
-AlarmConditionType_Disable,9135,Method
-AlarmConditionType_AddComment,9136,Method
-AlarmConditionType_AddComment_InputArguments,9137,Variable
-AlarmConditionType_AckedState,9138,Variable
-AlarmConditionType_AckedState_Id,9139,Variable
-AlarmConditionType_AckedState_Name,9140,Variable
-AlarmConditionType_AckedState_Number,9141,Variable
-AlarmConditionType_AckedState_EffectiveDisplayName,9142,Variable
-AlarmConditionType_AckedState_TransitionTime,9143,Variable
-AlarmConditionType_AckedState_EffectiveTransitionTime,9144,Variable
-AlarmConditionType_AckedState_TrueState,9145,Variable
-AlarmConditionType_AckedState_FalseState,9146,Variable
-AlarmConditionType_ConfirmedState,9147,Variable
-AlarmConditionType_ConfirmedState_Id,9148,Variable
-AlarmConditionType_ConfirmedState_Name,9149,Variable
-AlarmConditionType_ConfirmedState_Number,9150,Variable
-AlarmConditionType_ConfirmedState_EffectiveDisplayName,9151,Variable
-AlarmConditionType_ConfirmedState_TransitionTime,9152,Variable
-AlarmConditionType_ConfirmedState_EffectiveTransitionTime,9153,Variable
-AlarmConditionType_ConfirmedState_TrueState,9154,Variable
-AlarmConditionType_ConfirmedState_FalseState,9155,Variable
-AlarmConditionType_Acknowledge,9156,Method
-AlarmConditionType_Acknowledge_InputArguments,9157,Variable
-AlarmConditionType_Confirm,9158,Method
-AlarmConditionType_Confirm_InputArguments,9159,Variable
-AlarmConditionType_ActiveState,9160,Variable
-AlarmConditionType_ActiveState_Id,9161,Variable
-AlarmConditionType_ActiveState_Name,9162,Variable
-AlarmConditionType_ActiveState_Number,9163,Variable
-AlarmConditionType_ActiveState_EffectiveDisplayName,9164,Variable
-AlarmConditionType_ActiveState_TransitionTime,9165,Variable
-AlarmConditionType_ActiveState_EffectiveTransitionTime,9166,Variable
-AlarmConditionType_ActiveState_TrueState,9167,Variable
-AlarmConditionType_ActiveState_FalseState,9168,Variable
-AlarmConditionType_SuppressedState,9169,Variable
-AlarmConditionType_SuppressedState_Id,9170,Variable
-AlarmConditionType_SuppressedState_Name,9171,Variable
-AlarmConditionType_SuppressedState_Number,9172,Variable
-AlarmConditionType_SuppressedState_EffectiveDisplayName,9173,Variable
-AlarmConditionType_SuppressedState_TransitionTime,9174,Variable
-AlarmConditionType_SuppressedState_EffectiveTransitionTime,9175,Variable
-AlarmConditionType_SuppressedState_TrueState,9176,Variable
-AlarmConditionType_SuppressedState_FalseState,9177,Variable
-AlarmConditionType_ShelvingState,9178,Object
-AlarmConditionType_ShelvingState_CurrentState,9179,Variable
-AlarmConditionType_ShelvingState_CurrentState_Id,9180,Variable
-AlarmConditionType_ShelvingState_CurrentState_Name,9181,Variable
-AlarmConditionType_ShelvingState_CurrentState_Number,9182,Variable
-AlarmConditionType_ShelvingState_CurrentState_EffectiveDisplayName,9183,Variable
-AlarmConditionType_ShelvingState_LastTransition,9184,Variable
-AlarmConditionType_ShelvingState_LastTransition_Id,9185,Variable
-AlarmConditionType_ShelvingState_LastTransition_Name,9186,Variable
-AlarmConditionType_ShelvingState_LastTransition_Number,9187,Variable
-AlarmConditionType_ShelvingState_LastTransition_TransitionTime,9188,Variable
-AlarmConditionType_ShelvingState_UnshelveTime,9189,Variable
-AlarmConditionType_ShelvingState_Unshelve,9211,Method
-AlarmConditionType_ShelvingState_OneShotShelve,9212,Method
-AlarmConditionType_ShelvingState_TimedShelve,9213,Method
-AlarmConditionType_ShelvingState_TimedShelve_InputArguments,9214,Variable
-AlarmConditionType_SuppressedOrShelved,9215,Variable
-AlarmConditionType_MaxTimeShelved,9216,Variable
-LimitAlarmType_ConditionName,9217,Variable
-LimitAlarmType_BranchId,9218,Variable
-LimitAlarmType_EnabledState,9219,Variable
-LimitAlarmType_EnabledState_Id,9220,Variable
-LimitAlarmType_EnabledState_Name,9221,Variable
-LimitAlarmType_EnabledState_Number,9222,Variable
-LimitAlarmType_EnabledState_EffectiveDisplayName,9223,Variable
-LimitAlarmType_EnabledState_TransitionTime,9224,Variable
-LimitAlarmType_EnabledState_EffectiveTransitionTime,9225,Variable
-LimitAlarmType_EnabledState_TrueState,9226,Variable
-LimitAlarmType_EnabledState_FalseState,9227,Variable
-LimitAlarmType_Quality,9228,Variable
-LimitAlarmType_Quality_SourceTimestamp,9229,Variable
-LimitAlarmType_LastSeverity,9230,Variable
-LimitAlarmType_LastSeverity_SourceTimestamp,9231,Variable
-LimitAlarmType_Comment,9232,Variable
-LimitAlarmType_Comment_SourceTimestamp,9233,Variable
-LimitAlarmType_ClientUserId,9234,Variable
-LimitAlarmType_Enable,9235,Method
-LimitAlarmType_Disable,9236,Method
-LimitAlarmType_AddComment,9237,Method
-LimitAlarmType_AddComment_InputArguments,9238,Variable
-LimitAlarmType_AckedState,9239,Variable
-LimitAlarmType_AckedState_Id,9240,Variable
-LimitAlarmType_AckedState_Name,9241,Variable
-LimitAlarmType_AckedState_Number,9242,Variable
-LimitAlarmType_AckedState_EffectiveDisplayName,9243,Variable
-LimitAlarmType_AckedState_TransitionTime,9244,Variable
-LimitAlarmType_AckedState_EffectiveTransitionTime,9245,Variable
-LimitAlarmType_AckedState_TrueState,9246,Variable
-LimitAlarmType_AckedState_FalseState,9247,Variable
-LimitAlarmType_ConfirmedState,9248,Variable
-LimitAlarmType_ConfirmedState_Id,9249,Variable
-LimitAlarmType_ConfirmedState_Name,9250,Variable
-LimitAlarmType_ConfirmedState_Number,9251,Variable
-LimitAlarmType_ConfirmedState_EffectiveDisplayName,9252,Variable
-LimitAlarmType_ConfirmedState_TransitionTime,9253,Variable
-LimitAlarmType_ConfirmedState_EffectiveTransitionTime,9254,Variable
-LimitAlarmType_ConfirmedState_TrueState,9255,Variable
-LimitAlarmType_ConfirmedState_FalseState,9256,Variable
-LimitAlarmType_Acknowledge,9257,Method
-LimitAlarmType_Acknowledge_InputArguments,9258,Variable
-LimitAlarmType_Confirm,9259,Method
-LimitAlarmType_Confirm_InputArguments,9260,Variable
-LimitAlarmType_ActiveState,9261,Variable
-LimitAlarmType_ActiveState_Id,9262,Variable
-LimitAlarmType_ActiveState_Name,9263,Variable
-LimitAlarmType_ActiveState_Number,9264,Variable
-LimitAlarmType_ActiveState_EffectiveDisplayName,9265,Variable
-LimitAlarmType_ActiveState_TransitionTime,9266,Variable
-LimitAlarmType_ActiveState_EffectiveTransitionTime,9267,Variable
-LimitAlarmType_ActiveState_TrueState,9268,Variable
-LimitAlarmType_ActiveState_FalseState,9269,Variable
-LimitAlarmType_SuppressedState,9270,Variable
-LimitAlarmType_SuppressedState_Id,9271,Variable
-LimitAlarmType_SuppressedState_Name,9272,Variable
-LimitAlarmType_SuppressedState_Number,9273,Variable
-LimitAlarmType_SuppressedState_EffectiveDisplayName,9274,Variable
-LimitAlarmType_SuppressedState_TransitionTime,9275,Variable
-LimitAlarmType_SuppressedState_EffectiveTransitionTime,9276,Variable
-LimitAlarmType_SuppressedState_TrueState,9277,Variable
-LimitAlarmType_SuppressedState_FalseState,9278,Variable
-LimitAlarmType_ShelvingState,9279,Object
-LimitAlarmType_ShelvingState_CurrentState,9280,Variable
-LimitAlarmType_ShelvingState_CurrentState_Id,9281,Variable
-LimitAlarmType_ShelvingState_CurrentState_Name,9282,Variable
-LimitAlarmType_ShelvingState_CurrentState_Number,9283,Variable
-LimitAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,9284,Variable
-LimitAlarmType_ShelvingState_LastTransition,9285,Variable
-LimitAlarmType_ShelvingState_LastTransition_Id,9286,Variable
-LimitAlarmType_ShelvingState_LastTransition_Name,9287,Variable
-LimitAlarmType_ShelvingState_LastTransition_Number,9288,Variable
-LimitAlarmType_ShelvingState_LastTransition_TransitionTime,9289,Variable
-LimitAlarmType_ShelvingState_UnshelveTime,9290,Variable
-LimitAlarmType_ShelvingState_Unshelve,9312,Method
-LimitAlarmType_ShelvingState_OneShotShelve,9313,Method
-LimitAlarmType_ShelvingState_TimedShelve,9314,Method
-LimitAlarmType_ShelvingState_TimedShelve_InputArguments,9315,Variable
-LimitAlarmType_SuppressedOrShelved,9316,Variable
-LimitAlarmType_MaxTimeShelved,9317,Variable
-ExclusiveLimitStateMachineType,9318,ObjectType
-ExclusiveLimitStateMachineType_CurrentState,9319,Variable
-ExclusiveLimitStateMachineType_CurrentState_Id,9320,Variable
-ExclusiveLimitStateMachineType_CurrentState_Name,9321,Variable
-ExclusiveLimitStateMachineType_CurrentState_Number,9322,Variable
-ExclusiveLimitStateMachineType_CurrentState_EffectiveDisplayName,9323,Variable
-ExclusiveLimitStateMachineType_LastTransition,9324,Variable
-ExclusiveLimitStateMachineType_LastTransition_Id,9325,Variable
-ExclusiveLimitStateMachineType_LastTransition_Name,9326,Variable
-ExclusiveLimitStateMachineType_LastTransition_Number,9327,Variable
-ExclusiveLimitStateMachineType_LastTransition_TransitionTime,9328,Variable
-ExclusiveLimitStateMachineType_HighHigh,9329,Object
-ExclusiveLimitStateMachineType_HighHigh_StateNumber,9330,Variable
-ExclusiveLimitStateMachineType_High,9331,Object
-ExclusiveLimitStateMachineType_High_StateNumber,9332,Variable
-ExclusiveLimitStateMachineType_Low,9333,Object
-ExclusiveLimitStateMachineType_Low_StateNumber,9334,Variable
-ExclusiveLimitStateMachineType_LowLow,9335,Object
-ExclusiveLimitStateMachineType_LowLow_StateNumber,9336,Variable
-ExclusiveLimitStateMachineType_LowLowToLow,9337,Object
-ExclusiveLimitStateMachineType_LowToLowLow,9338,Object
-ExclusiveLimitStateMachineType_HighHighToHigh,9339,Object
-ExclusiveLimitStateMachineType_HighToHighHigh,9340,Object
-ExclusiveLimitAlarmType,9341,ObjectType
-ExclusiveLimitAlarmType_EventId,9342,Variable
-ExclusiveLimitAlarmType_EventType,9343,Variable
-ExclusiveLimitAlarmType_SourceNode,9344,Variable
-ExclusiveLimitAlarmType_SourceName,9345,Variable
-ExclusiveLimitAlarmType_Time,9346,Variable
-ExclusiveLimitAlarmType_ReceiveTime,9347,Variable
-ExclusiveLimitAlarmType_LocalTime,9348,Variable
-ExclusiveLimitAlarmType_Message,9349,Variable
-ExclusiveLimitAlarmType_Severity,9350,Variable
-ExclusiveLimitAlarmType_ConditionName,9351,Variable
-ExclusiveLimitAlarmType_BranchId,9352,Variable
-ExclusiveLimitAlarmType_Retain,9353,Variable
-ExclusiveLimitAlarmType_EnabledState,9354,Variable
-ExclusiveLimitAlarmType_EnabledState_Id,9355,Variable
-ExclusiveLimitAlarmType_EnabledState_Name,9356,Variable
-ExclusiveLimitAlarmType_EnabledState_Number,9357,Variable
-ExclusiveLimitAlarmType_EnabledState_EffectiveDisplayName,9358,Variable
-ExclusiveLimitAlarmType_EnabledState_TransitionTime,9359,Variable
-ExclusiveLimitAlarmType_EnabledState_EffectiveTransitionTime,9360,Variable
-ExclusiveLimitAlarmType_EnabledState_TrueState,9361,Variable
-ExclusiveLimitAlarmType_EnabledState_FalseState,9362,Variable
-ExclusiveLimitAlarmType_Quality,9363,Variable
-ExclusiveLimitAlarmType_Quality_SourceTimestamp,9364,Variable
-ExclusiveLimitAlarmType_LastSeverity,9365,Variable
-ExclusiveLimitAlarmType_LastSeverity_SourceTimestamp,9366,Variable
-ExclusiveLimitAlarmType_Comment,9367,Variable
-ExclusiveLimitAlarmType_Comment_SourceTimestamp,9368,Variable
-ExclusiveLimitAlarmType_ClientUserId,9369,Variable
-ExclusiveLimitAlarmType_Enable,9370,Method
-ExclusiveLimitAlarmType_Disable,9371,Method
-ExclusiveLimitAlarmType_AddComment,9372,Method
-ExclusiveLimitAlarmType_AddComment_InputArguments,9373,Variable
-ExclusiveLimitAlarmType_ConditionRefresh,9374,Method
-ExclusiveLimitAlarmType_ConditionRefresh_InputArguments,9375,Variable
-ExclusiveLimitAlarmType_AckedState,9376,Variable
-ExclusiveLimitAlarmType_AckedState_Id,9377,Variable
-ExclusiveLimitAlarmType_AckedState_Name,9378,Variable
-ExclusiveLimitAlarmType_AckedState_Number,9379,Variable
-ExclusiveLimitAlarmType_AckedState_EffectiveDisplayName,9380,Variable
-ExclusiveLimitAlarmType_AckedState_TransitionTime,9381,Variable
-ExclusiveLimitAlarmType_AckedState_EffectiveTransitionTime,9382,Variable
-ExclusiveLimitAlarmType_AckedState_TrueState,9383,Variable
-ExclusiveLimitAlarmType_AckedState_FalseState,9384,Variable
-ExclusiveLimitAlarmType_ConfirmedState,9385,Variable
-ExclusiveLimitAlarmType_ConfirmedState_Id,9386,Variable
-ExclusiveLimitAlarmType_ConfirmedState_Name,9387,Variable
-ExclusiveLimitAlarmType_ConfirmedState_Number,9388,Variable
-ExclusiveLimitAlarmType_ConfirmedState_EffectiveDisplayName,9389,Variable
-ExclusiveLimitAlarmType_ConfirmedState_TransitionTime,9390,Variable
-ExclusiveLimitAlarmType_ConfirmedState_EffectiveTransitionTime,9391,Variable
-ExclusiveLimitAlarmType_ConfirmedState_TrueState,9392,Variable
-ExclusiveLimitAlarmType_ConfirmedState_FalseState,9393,Variable
-ExclusiveLimitAlarmType_Acknowledge,9394,Method
-ExclusiveLimitAlarmType_Acknowledge_InputArguments,9395,Variable
-ExclusiveLimitAlarmType_Confirm,9396,Method
-ExclusiveLimitAlarmType_Confirm_InputArguments,9397,Variable
-ExclusiveLimitAlarmType_ActiveState,9398,Variable
-ExclusiveLimitAlarmType_ActiveState_Id,9399,Variable
-ExclusiveLimitAlarmType_ActiveState_Name,9400,Variable
-ExclusiveLimitAlarmType_ActiveState_Number,9401,Variable
-ExclusiveLimitAlarmType_ActiveState_EffectiveDisplayName,9402,Variable
-ExclusiveLimitAlarmType_ActiveState_TransitionTime,9403,Variable
-ExclusiveLimitAlarmType_ActiveState_EffectiveTransitionTime,9404,Variable
-ExclusiveLimitAlarmType_ActiveState_TrueState,9405,Variable
-ExclusiveLimitAlarmType_ActiveState_FalseState,9406,Variable
-ExclusiveLimitAlarmType_SuppressedState,9407,Variable
-ExclusiveLimitAlarmType_SuppressedState_Id,9408,Variable
-ExclusiveLimitAlarmType_SuppressedState_Name,9409,Variable
-ExclusiveLimitAlarmType_SuppressedState_Number,9410,Variable
-ExclusiveLimitAlarmType_SuppressedState_EffectiveDisplayName,9411,Variable
-ExclusiveLimitAlarmType_SuppressedState_TransitionTime,9412,Variable
-ExclusiveLimitAlarmType_SuppressedState_EffectiveTransitionTime,9413,Variable
-ExclusiveLimitAlarmType_SuppressedState_TrueState,9414,Variable
-ExclusiveLimitAlarmType_SuppressedState_FalseState,9415,Variable
-ExclusiveLimitAlarmType_ShelvingState,9416,Object
-ExclusiveLimitAlarmType_ShelvingState_CurrentState,9417,Variable
-ExclusiveLimitAlarmType_ShelvingState_CurrentState_Id,9418,Variable
-ExclusiveLimitAlarmType_ShelvingState_CurrentState_Name,9419,Variable
-ExclusiveLimitAlarmType_ShelvingState_CurrentState_Number,9420,Variable
-ExclusiveLimitAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,9421,Variable
-ExclusiveLimitAlarmType_ShelvingState_LastTransition,9422,Variable
-ExclusiveLimitAlarmType_ShelvingState_LastTransition_Id,9423,Variable
-ExclusiveLimitAlarmType_ShelvingState_LastTransition_Name,9424,Variable
-ExclusiveLimitAlarmType_ShelvingState_LastTransition_Number,9425,Variable
-ExclusiveLimitAlarmType_ShelvingState_LastTransition_TransitionTime,9426,Variable
-ExclusiveLimitAlarmType_ShelvingState_UnshelveTime,9427,Variable
-ExclusiveLimitAlarmType_ShelvingState_Unshelve,9449,Method
-ExclusiveLimitAlarmType_ShelvingState_OneShotShelve,9450,Method
-ExclusiveLimitAlarmType_ShelvingState_TimedShelve,9451,Method
-ExclusiveLimitAlarmType_ShelvingState_TimedShelve_InputArguments,9452,Variable
-ExclusiveLimitAlarmType_SuppressedOrShelved,9453,Variable
-ExclusiveLimitAlarmType_MaxTimeShelved,9454,Variable
-ExclusiveLimitAlarmType_LimitState,9455,Object
-ExclusiveLimitAlarmType_LimitState_CurrentState,9456,Variable
-ExclusiveLimitAlarmType_LimitState_CurrentState_Id,9457,Variable
-ExclusiveLimitAlarmType_LimitState_CurrentState_Name,9458,Variable
-ExclusiveLimitAlarmType_LimitState_CurrentState_Number,9459,Variable
-ExclusiveLimitAlarmType_LimitState_CurrentState_EffectiveDisplayName,9460,Variable
-ExclusiveLimitAlarmType_LimitState_LastTransition,9461,Variable
-ExclusiveLimitAlarmType_LimitState_LastTransition_Id,9462,Variable
-ExclusiveLimitAlarmType_LimitState_LastTransition_Name,9463,Variable
-ExclusiveLimitAlarmType_LimitState_LastTransition_Number,9464,Variable
-ExclusiveLimitAlarmType_LimitState_LastTransition_TransitionTime,9465,Variable
-ExclusiveLimitAlarmType_HighHighLimit,9478,Variable
-ExclusiveLimitAlarmType_HighLimit,9479,Variable
-ExclusiveLimitAlarmType_LowLimit,9480,Variable
-ExclusiveLimitAlarmType_LowLowLimit,9481,Variable
-ExclusiveLevelAlarmType,9482,ObjectType
-ExclusiveLevelAlarmType_EventId,9483,Variable
-ExclusiveLevelAlarmType_EventType,9484,Variable
-ExclusiveLevelAlarmType_SourceNode,9485,Variable
-ExclusiveLevelAlarmType_SourceName,9486,Variable
-ExclusiveLevelAlarmType_Time,9487,Variable
-ExclusiveLevelAlarmType_ReceiveTime,9488,Variable
-ExclusiveLevelAlarmType_LocalTime,9489,Variable
-ExclusiveLevelAlarmType_Message,9490,Variable
-ExclusiveLevelAlarmType_Severity,9491,Variable
-ExclusiveLevelAlarmType_ConditionName,9492,Variable
-ExclusiveLevelAlarmType_BranchId,9493,Variable
-ExclusiveLevelAlarmType_Retain,9494,Variable
-ExclusiveLevelAlarmType_EnabledState,9495,Variable
-ExclusiveLevelAlarmType_EnabledState_Id,9496,Variable
-ExclusiveLevelAlarmType_EnabledState_Name,9497,Variable
-ExclusiveLevelAlarmType_EnabledState_Number,9498,Variable
-ExclusiveLevelAlarmType_EnabledState_EffectiveDisplayName,9499,Variable
-ExclusiveLevelAlarmType_EnabledState_TransitionTime,9500,Variable
-ExclusiveLevelAlarmType_EnabledState_EffectiveTransitionTime,9501,Variable
-ExclusiveLevelAlarmType_EnabledState_TrueState,9502,Variable
-ExclusiveLevelAlarmType_EnabledState_FalseState,9503,Variable
-ExclusiveLevelAlarmType_Quality,9504,Variable
-ExclusiveLevelAlarmType_Quality_SourceTimestamp,9505,Variable
-ExclusiveLevelAlarmType_LastSeverity,9506,Variable
-ExclusiveLevelAlarmType_LastSeverity_SourceTimestamp,9507,Variable
-ExclusiveLevelAlarmType_Comment,9508,Variable
-ExclusiveLevelAlarmType_Comment_SourceTimestamp,9509,Variable
-ExclusiveLevelAlarmType_ClientUserId,9510,Variable
-ExclusiveLevelAlarmType_Enable,9511,Method
-ExclusiveLevelAlarmType_Disable,9512,Method
-ExclusiveLevelAlarmType_AddComment,9513,Method
-ExclusiveLevelAlarmType_AddComment_InputArguments,9514,Variable
-ExclusiveLevelAlarmType_ConditionRefresh,9515,Method
-ExclusiveLevelAlarmType_ConditionRefresh_InputArguments,9516,Variable
-ExclusiveLevelAlarmType_AckedState,9517,Variable
-ExclusiveLevelAlarmType_AckedState_Id,9518,Variable
-ExclusiveLevelAlarmType_AckedState_Name,9519,Variable
-ExclusiveLevelAlarmType_AckedState_Number,9520,Variable
-ExclusiveLevelAlarmType_AckedState_EffectiveDisplayName,9521,Variable
-ExclusiveLevelAlarmType_AckedState_TransitionTime,9522,Variable
-ExclusiveLevelAlarmType_AckedState_EffectiveTransitionTime,9523,Variable
-ExclusiveLevelAlarmType_AckedState_TrueState,9524,Variable
-ExclusiveLevelAlarmType_AckedState_FalseState,9525,Variable
-ExclusiveLevelAlarmType_ConfirmedState,9526,Variable
-ExclusiveLevelAlarmType_ConfirmedState_Id,9527,Variable
-ExclusiveLevelAlarmType_ConfirmedState_Name,9528,Variable
-ExclusiveLevelAlarmType_ConfirmedState_Number,9529,Variable
-ExclusiveLevelAlarmType_ConfirmedState_EffectiveDisplayName,9530,Variable
-ExclusiveLevelAlarmType_ConfirmedState_TransitionTime,9531,Variable
-ExclusiveLevelAlarmType_ConfirmedState_EffectiveTransitionTime,9532,Variable
-ExclusiveLevelAlarmType_ConfirmedState_TrueState,9533,Variable
-ExclusiveLevelAlarmType_ConfirmedState_FalseState,9534,Variable
-ExclusiveLevelAlarmType_Acknowledge,9535,Method
-ExclusiveLevelAlarmType_Acknowledge_InputArguments,9536,Variable
-ExclusiveLevelAlarmType_Confirm,9537,Method
-ExclusiveLevelAlarmType_Confirm_InputArguments,9538,Variable
-ExclusiveLevelAlarmType_ActiveState,9539,Variable
-ExclusiveLevelAlarmType_ActiveState_Id,9540,Variable
-ExclusiveLevelAlarmType_ActiveState_Name,9541,Variable
-ExclusiveLevelAlarmType_ActiveState_Number,9542,Variable
-ExclusiveLevelAlarmType_ActiveState_EffectiveDisplayName,9543,Variable
-ExclusiveLevelAlarmType_ActiveState_TransitionTime,9544,Variable
-ExclusiveLevelAlarmType_ActiveState_EffectiveTransitionTime,9545,Variable
-ExclusiveLevelAlarmType_ActiveState_TrueState,9546,Variable
-ExclusiveLevelAlarmType_ActiveState_FalseState,9547,Variable
-ExclusiveLevelAlarmType_SuppressedState,9548,Variable
-ExclusiveLevelAlarmType_SuppressedState_Id,9549,Variable
-ExclusiveLevelAlarmType_SuppressedState_Name,9550,Variable
-ExclusiveLevelAlarmType_SuppressedState_Number,9551,Variable
-ExclusiveLevelAlarmType_SuppressedState_EffectiveDisplayName,9552,Variable
-ExclusiveLevelAlarmType_SuppressedState_TransitionTime,9553,Variable
-ExclusiveLevelAlarmType_SuppressedState_EffectiveTransitionTime,9554,Variable
-ExclusiveLevelAlarmType_SuppressedState_TrueState,9555,Variable
-ExclusiveLevelAlarmType_SuppressedState_FalseState,9556,Variable
-ExclusiveLevelAlarmType_ShelvingState,9557,Object
-ExclusiveLevelAlarmType_ShelvingState_CurrentState,9558,Variable
-ExclusiveLevelAlarmType_ShelvingState_CurrentState_Id,9559,Variable
-ExclusiveLevelAlarmType_ShelvingState_CurrentState_Name,9560,Variable
-ExclusiveLevelAlarmType_ShelvingState_CurrentState_Number,9561,Variable
-ExclusiveLevelAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,9562,Variable
-ExclusiveLevelAlarmType_ShelvingState_LastTransition,9563,Variable
-ExclusiveLevelAlarmType_ShelvingState_LastTransition_Id,9564,Variable
-ExclusiveLevelAlarmType_ShelvingState_LastTransition_Name,9565,Variable
-ExclusiveLevelAlarmType_ShelvingState_LastTransition_Number,9566,Variable
-ExclusiveLevelAlarmType_ShelvingState_LastTransition_TransitionTime,9567,Variable
-ExclusiveLevelAlarmType_ShelvingState_UnshelveTime,9568,Variable
-ExclusiveLevelAlarmType_ShelvingState_Unshelve,9590,Method
-ExclusiveLevelAlarmType_ShelvingState_OneShotShelve,9591,Method
-ExclusiveLevelAlarmType_ShelvingState_TimedShelve,9592,Method
-ExclusiveLevelAlarmType_ShelvingState_TimedShelve_InputArguments,9593,Variable
-ExclusiveLevelAlarmType_SuppressedOrShelved,9594,Variable
-ExclusiveLevelAlarmType_MaxTimeShelved,9595,Variable
-ExclusiveLevelAlarmType_LimitState,9596,Object
-ExclusiveLevelAlarmType_LimitState_CurrentState,9597,Variable
-ExclusiveLevelAlarmType_LimitState_CurrentState_Id,9598,Variable
-ExclusiveLevelAlarmType_LimitState_CurrentState_Name,9599,Variable
-ExclusiveLevelAlarmType_LimitState_CurrentState_Number,9600,Variable
-ExclusiveLevelAlarmType_LimitState_CurrentState_EffectiveDisplayName,9601,Variable
-ExclusiveLevelAlarmType_LimitState_LastTransition,9602,Variable
-ExclusiveLevelAlarmType_LimitState_LastTransition_Id,9603,Variable
-ExclusiveLevelAlarmType_LimitState_LastTransition_Name,9604,Variable
-ExclusiveLevelAlarmType_LimitState_LastTransition_Number,9605,Variable
-ExclusiveLevelAlarmType_LimitState_LastTransition_TransitionTime,9606,Variable
-ExclusiveLevelAlarmType_HighHighLimit,9619,Variable
-ExclusiveLevelAlarmType_HighLimit,9620,Variable
-ExclusiveLevelAlarmType_LowLimit,9621,Variable
-ExclusiveLevelAlarmType_LowLowLimit,9622,Variable
-ExclusiveRateOfChangeAlarmType,9623,ObjectType
-ExclusiveRateOfChangeAlarmType_EventId,9624,Variable
-ExclusiveRateOfChangeAlarmType_EventType,9625,Variable
-ExclusiveRateOfChangeAlarmType_SourceNode,9626,Variable
-ExclusiveRateOfChangeAlarmType_SourceName,9627,Variable
-ExclusiveRateOfChangeAlarmType_Time,9628,Variable
-ExclusiveRateOfChangeAlarmType_ReceiveTime,9629,Variable
-ExclusiveRateOfChangeAlarmType_LocalTime,9630,Variable
-ExclusiveRateOfChangeAlarmType_Message,9631,Variable
-ExclusiveRateOfChangeAlarmType_Severity,9632,Variable
-ExclusiveRateOfChangeAlarmType_ConditionName,9633,Variable
-ExclusiveRateOfChangeAlarmType_BranchId,9634,Variable
-ExclusiveRateOfChangeAlarmType_Retain,9635,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState,9636,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_Id,9637,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_Name,9638,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_Number,9639,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_EffectiveDisplayName,9640,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_TransitionTime,9641,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_EffectiveTransitionTime,9642,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_TrueState,9643,Variable
-ExclusiveRateOfChangeAlarmType_EnabledState_FalseState,9644,Variable
-ExclusiveRateOfChangeAlarmType_Quality,9645,Variable
-ExclusiveRateOfChangeAlarmType_Quality_SourceTimestamp,9646,Variable
-ExclusiveRateOfChangeAlarmType_LastSeverity,9647,Variable
-ExclusiveRateOfChangeAlarmType_LastSeverity_SourceTimestamp,9648,Variable
-ExclusiveRateOfChangeAlarmType_Comment,9649,Variable
-ExclusiveRateOfChangeAlarmType_Comment_SourceTimestamp,9650,Variable
-ExclusiveRateOfChangeAlarmType_ClientUserId,9651,Variable
-ExclusiveRateOfChangeAlarmType_Enable,9652,Method
-ExclusiveRateOfChangeAlarmType_Disable,9653,Method
-ExclusiveRateOfChangeAlarmType_AddComment,9654,Method
-ExclusiveRateOfChangeAlarmType_AddComment_InputArguments,9655,Variable
-ExclusiveRateOfChangeAlarmType_ConditionRefresh,9656,Method
-ExclusiveRateOfChangeAlarmType_ConditionRefresh_InputArguments,9657,Variable
-ExclusiveRateOfChangeAlarmType_AckedState,9658,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_Id,9659,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_Name,9660,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_Number,9661,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_EffectiveDisplayName,9662,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_TransitionTime,9663,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_EffectiveTransitionTime,9664,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_TrueState,9665,Variable
-ExclusiveRateOfChangeAlarmType_AckedState_FalseState,9666,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState,9667,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_Id,9668,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_Name,9669,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_Number,9670,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_EffectiveDisplayName,9671,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_TransitionTime,9672,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_EffectiveTransitionTime,9673,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_TrueState,9674,Variable
-ExclusiveRateOfChangeAlarmType_ConfirmedState_FalseState,9675,Variable
-ExclusiveRateOfChangeAlarmType_Acknowledge,9676,Method
-ExclusiveRateOfChangeAlarmType_Acknowledge_InputArguments,9677,Variable
-ExclusiveRateOfChangeAlarmType_Confirm,9678,Method
-ExclusiveRateOfChangeAlarmType_Confirm_InputArguments,9679,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState,9680,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_Id,9681,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_Name,9682,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_Number,9683,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_EffectiveDisplayName,9684,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_TransitionTime,9685,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_EffectiveTransitionTime,9686,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_TrueState,9687,Variable
-ExclusiveRateOfChangeAlarmType_ActiveState_FalseState,9688,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState,9689,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_Id,9690,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_Name,9691,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_Number,9692,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_EffectiveDisplayName,9693,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_TransitionTime,9694,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_EffectiveTransitionTime,9695,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_TrueState,9696,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedState_FalseState,9697,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState,9698,Object
-ExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState,9699,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_Id,9700,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_Name,9701,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_Number,9702,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,9703,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition,9704,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_Id,9705,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_Name,9706,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_Number,9707,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_TransitionTime,9708,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_UnshelveTime,9709,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_Unshelve,9731,Method
-ExclusiveRateOfChangeAlarmType_ShelvingState_OneShotShelve,9732,Method
-ExclusiveRateOfChangeAlarmType_ShelvingState_TimedShelve,9733,Method
-ExclusiveRateOfChangeAlarmType_ShelvingState_TimedShelve_InputArguments,9734,Variable
-ExclusiveRateOfChangeAlarmType_SuppressedOrShelved,9735,Variable
-ExclusiveRateOfChangeAlarmType_MaxTimeShelved,9736,Variable
-ExclusiveRateOfChangeAlarmType_LimitState,9737,Object
-ExclusiveRateOfChangeAlarmType_LimitState_CurrentState,9738,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_CurrentState_Id,9739,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_CurrentState_Name,9740,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_CurrentState_Number,9741,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_CurrentState_EffectiveDisplayName,9742,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_LastTransition,9743,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_LastTransition_Id,9744,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_LastTransition_Name,9745,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_LastTransition_Number,9746,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_LastTransition_TransitionTime,9747,Variable
-ExclusiveRateOfChangeAlarmType_HighHighLimit,9760,Variable
-ExclusiveRateOfChangeAlarmType_HighLimit,9761,Variable
-ExclusiveRateOfChangeAlarmType_LowLimit,9762,Variable
-ExclusiveRateOfChangeAlarmType_LowLowLimit,9763,Variable
-ExclusiveDeviationAlarmType,9764,ObjectType
-ExclusiveDeviationAlarmType_EventId,9765,Variable
-ExclusiveDeviationAlarmType_EventType,9766,Variable
-ExclusiveDeviationAlarmType_SourceNode,9767,Variable
-ExclusiveDeviationAlarmType_SourceName,9768,Variable
-ExclusiveDeviationAlarmType_Time,9769,Variable
-ExclusiveDeviationAlarmType_ReceiveTime,9770,Variable
-ExclusiveDeviationAlarmType_LocalTime,9771,Variable
-ExclusiveDeviationAlarmType_Message,9772,Variable
-ExclusiveDeviationAlarmType_Severity,9773,Variable
-ExclusiveDeviationAlarmType_ConditionName,9774,Variable
-ExclusiveDeviationAlarmType_BranchId,9775,Variable
-ExclusiveDeviationAlarmType_Retain,9776,Variable
-ExclusiveDeviationAlarmType_EnabledState,9777,Variable
-ExclusiveDeviationAlarmType_EnabledState_Id,9778,Variable
-ExclusiveDeviationAlarmType_EnabledState_Name,9779,Variable
-ExclusiveDeviationAlarmType_EnabledState_Number,9780,Variable
-ExclusiveDeviationAlarmType_EnabledState_EffectiveDisplayName,9781,Variable
-ExclusiveDeviationAlarmType_EnabledState_TransitionTime,9782,Variable
-ExclusiveDeviationAlarmType_EnabledState_EffectiveTransitionTime,9783,Variable
-ExclusiveDeviationAlarmType_EnabledState_TrueState,9784,Variable
-ExclusiveDeviationAlarmType_EnabledState_FalseState,9785,Variable
-ExclusiveDeviationAlarmType_Quality,9786,Variable
-ExclusiveDeviationAlarmType_Quality_SourceTimestamp,9787,Variable
-ExclusiveDeviationAlarmType_LastSeverity,9788,Variable
-ExclusiveDeviationAlarmType_LastSeverity_SourceTimestamp,9789,Variable
-ExclusiveDeviationAlarmType_Comment,9790,Variable
-ExclusiveDeviationAlarmType_Comment_SourceTimestamp,9791,Variable
-ExclusiveDeviationAlarmType_ClientUserId,9792,Variable
-ExclusiveDeviationAlarmType_Enable,9793,Method
-ExclusiveDeviationAlarmType_Disable,9794,Method
-ExclusiveDeviationAlarmType_AddComment,9795,Method
-ExclusiveDeviationAlarmType_AddComment_InputArguments,9796,Variable
-ExclusiveDeviationAlarmType_ConditionRefresh,9797,Method
-ExclusiveDeviationAlarmType_ConditionRefresh_InputArguments,9798,Variable
-ExclusiveDeviationAlarmType_AckedState,9799,Variable
-ExclusiveDeviationAlarmType_AckedState_Id,9800,Variable
-ExclusiveDeviationAlarmType_AckedState_Name,9801,Variable
-ExclusiveDeviationAlarmType_AckedState_Number,9802,Variable
-ExclusiveDeviationAlarmType_AckedState_EffectiveDisplayName,9803,Variable
-ExclusiveDeviationAlarmType_AckedState_TransitionTime,9804,Variable
-ExclusiveDeviationAlarmType_AckedState_EffectiveTransitionTime,9805,Variable
-ExclusiveDeviationAlarmType_AckedState_TrueState,9806,Variable
-ExclusiveDeviationAlarmType_AckedState_FalseState,9807,Variable
-ExclusiveDeviationAlarmType_ConfirmedState,9808,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_Id,9809,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_Name,9810,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_Number,9811,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_EffectiveDisplayName,9812,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_TransitionTime,9813,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_EffectiveTransitionTime,9814,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_TrueState,9815,Variable
-ExclusiveDeviationAlarmType_ConfirmedState_FalseState,9816,Variable
-ExclusiveDeviationAlarmType_Acknowledge,9817,Method
-ExclusiveDeviationAlarmType_Acknowledge_InputArguments,9818,Variable
-ExclusiveDeviationAlarmType_Confirm,9819,Method
-ExclusiveDeviationAlarmType_Confirm_InputArguments,9820,Variable
-ExclusiveDeviationAlarmType_ActiveState,9821,Variable
-ExclusiveDeviationAlarmType_ActiveState_Id,9822,Variable
-ExclusiveDeviationAlarmType_ActiveState_Name,9823,Variable
-ExclusiveDeviationAlarmType_ActiveState_Number,9824,Variable
-ExclusiveDeviationAlarmType_ActiveState_EffectiveDisplayName,9825,Variable
-ExclusiveDeviationAlarmType_ActiveState_TransitionTime,9826,Variable
-ExclusiveDeviationAlarmType_ActiveState_EffectiveTransitionTime,9827,Variable
-ExclusiveDeviationAlarmType_ActiveState_TrueState,9828,Variable
-ExclusiveDeviationAlarmType_ActiveState_FalseState,9829,Variable
-ExclusiveDeviationAlarmType_SuppressedState,9830,Variable
-ExclusiveDeviationAlarmType_SuppressedState_Id,9831,Variable
-ExclusiveDeviationAlarmType_SuppressedState_Name,9832,Variable
-ExclusiveDeviationAlarmType_SuppressedState_Number,9833,Variable
-ExclusiveDeviationAlarmType_SuppressedState_EffectiveDisplayName,9834,Variable
-ExclusiveDeviationAlarmType_SuppressedState_TransitionTime,9835,Variable
-ExclusiveDeviationAlarmType_SuppressedState_EffectiveTransitionTime,9836,Variable
-ExclusiveDeviationAlarmType_SuppressedState_TrueState,9837,Variable
-ExclusiveDeviationAlarmType_SuppressedState_FalseState,9838,Variable
-ExclusiveDeviationAlarmType_ShelvingState,9839,Object
-ExclusiveDeviationAlarmType_ShelvingState_CurrentState,9840,Variable
-ExclusiveDeviationAlarmType_ShelvingState_CurrentState_Id,9841,Variable
-ExclusiveDeviationAlarmType_ShelvingState_CurrentState_Name,9842,Variable
-ExclusiveDeviationAlarmType_ShelvingState_CurrentState_Number,9843,Variable
-ExclusiveDeviationAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,9844,Variable
-ExclusiveDeviationAlarmType_ShelvingState_LastTransition,9845,Variable
-ExclusiveDeviationAlarmType_ShelvingState_LastTransition_Id,9846,Variable
-ExclusiveDeviationAlarmType_ShelvingState_LastTransition_Name,9847,Variable
-ExclusiveDeviationAlarmType_ShelvingState_LastTransition_Number,9848,Variable
-ExclusiveDeviationAlarmType_ShelvingState_LastTransition_TransitionTime,9849,Variable
-ExclusiveDeviationAlarmType_ShelvingState_UnshelveTime,9850,Variable
-ExclusiveDeviationAlarmType_ShelvingState_Unshelve,9872,Method
-ExclusiveDeviationAlarmType_ShelvingState_OneShotShelve,9873,Method
-ExclusiveDeviationAlarmType_ShelvingState_TimedShelve,9874,Method
-ExclusiveDeviationAlarmType_ShelvingState_TimedShelve_InputArguments,9875,Variable
-ExclusiveDeviationAlarmType_SuppressedOrShelved,9876,Variable
-ExclusiveDeviationAlarmType_MaxTimeShelved,9877,Variable
-ExclusiveDeviationAlarmType_LimitState,9878,Object
-ExclusiveDeviationAlarmType_LimitState_CurrentState,9879,Variable
-ExclusiveDeviationAlarmType_LimitState_CurrentState_Id,9880,Variable
-ExclusiveDeviationAlarmType_LimitState_CurrentState_Name,9881,Variable
-ExclusiveDeviationAlarmType_LimitState_CurrentState_Number,9882,Variable
-ExclusiveDeviationAlarmType_LimitState_CurrentState_EffectiveDisplayName,9883,Variable
-ExclusiveDeviationAlarmType_LimitState_LastTransition,9884,Variable
-ExclusiveDeviationAlarmType_LimitState_LastTransition_Id,9885,Variable
-ExclusiveDeviationAlarmType_LimitState_LastTransition_Name,9886,Variable
-ExclusiveDeviationAlarmType_LimitState_LastTransition_Number,9887,Variable
-ExclusiveDeviationAlarmType_LimitState_LastTransition_TransitionTime,9888,Variable
-ExclusiveDeviationAlarmType_HighHighLimit,9901,Variable
-ExclusiveDeviationAlarmType_HighLimit,9902,Variable
-ExclusiveDeviationAlarmType_LowLimit,9903,Variable
-ExclusiveDeviationAlarmType_LowLowLimit,9904,Variable
-ExclusiveDeviationAlarmType_SetpointNode,9905,Variable
-NonExclusiveLimitAlarmType,9906,ObjectType
-NonExclusiveLimitAlarmType_EventId,9907,Variable
-NonExclusiveLimitAlarmType_EventType,9908,Variable
-NonExclusiveLimitAlarmType_SourceNode,9909,Variable
-NonExclusiveLimitAlarmType_SourceName,9910,Variable
-NonExclusiveLimitAlarmType_Time,9911,Variable
-NonExclusiveLimitAlarmType_ReceiveTime,9912,Variable
-NonExclusiveLimitAlarmType_LocalTime,9913,Variable
-NonExclusiveLimitAlarmType_Message,9914,Variable
-NonExclusiveLimitAlarmType_Severity,9915,Variable
-NonExclusiveLimitAlarmType_ConditionName,9916,Variable
-NonExclusiveLimitAlarmType_BranchId,9917,Variable
-NonExclusiveLimitAlarmType_Retain,9918,Variable
-NonExclusiveLimitAlarmType_EnabledState,9919,Variable
-NonExclusiveLimitAlarmType_EnabledState_Id,9920,Variable
-NonExclusiveLimitAlarmType_EnabledState_Name,9921,Variable
-NonExclusiveLimitAlarmType_EnabledState_Number,9922,Variable
-NonExclusiveLimitAlarmType_EnabledState_EffectiveDisplayName,9923,Variable
-NonExclusiveLimitAlarmType_EnabledState_TransitionTime,9924,Variable
-NonExclusiveLimitAlarmType_EnabledState_EffectiveTransitionTime,9925,Variable
-NonExclusiveLimitAlarmType_EnabledState_TrueState,9926,Variable
-NonExclusiveLimitAlarmType_EnabledState_FalseState,9927,Variable
-NonExclusiveLimitAlarmType_Quality,9928,Variable
-NonExclusiveLimitAlarmType_Quality_SourceTimestamp,9929,Variable
-NonExclusiveLimitAlarmType_LastSeverity,9930,Variable
-NonExclusiveLimitAlarmType_LastSeverity_SourceTimestamp,9931,Variable
-NonExclusiveLimitAlarmType_Comment,9932,Variable
-NonExclusiveLimitAlarmType_Comment_SourceTimestamp,9933,Variable
-NonExclusiveLimitAlarmType_ClientUserId,9934,Variable
-NonExclusiveLimitAlarmType_Enable,9935,Method
-NonExclusiveLimitAlarmType_Disable,9936,Method
-NonExclusiveLimitAlarmType_AddComment,9937,Method
-NonExclusiveLimitAlarmType_AddComment_InputArguments,9938,Variable
-NonExclusiveLimitAlarmType_ConditionRefresh,9939,Method
-NonExclusiveLimitAlarmType_ConditionRefresh_InputArguments,9940,Variable
-NonExclusiveLimitAlarmType_AckedState,9941,Variable
-NonExclusiveLimitAlarmType_AckedState_Id,9942,Variable
-NonExclusiveLimitAlarmType_AckedState_Name,9943,Variable
-NonExclusiveLimitAlarmType_AckedState_Number,9944,Variable
-NonExclusiveLimitAlarmType_AckedState_EffectiveDisplayName,9945,Variable
-NonExclusiveLimitAlarmType_AckedState_TransitionTime,9946,Variable
-NonExclusiveLimitAlarmType_AckedState_EffectiveTransitionTime,9947,Variable
-NonExclusiveLimitAlarmType_AckedState_TrueState,9948,Variable
-NonExclusiveLimitAlarmType_AckedState_FalseState,9949,Variable
-NonExclusiveLimitAlarmType_ConfirmedState,9950,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_Id,9951,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_Name,9952,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_Number,9953,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_EffectiveDisplayName,9954,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_TransitionTime,9955,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_EffectiveTransitionTime,9956,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_TrueState,9957,Variable
-NonExclusiveLimitAlarmType_ConfirmedState_FalseState,9958,Variable
-NonExclusiveLimitAlarmType_Acknowledge,9959,Method
-NonExclusiveLimitAlarmType_Acknowledge_InputArguments,9960,Variable
-NonExclusiveLimitAlarmType_Confirm,9961,Method
-NonExclusiveLimitAlarmType_Confirm_InputArguments,9962,Variable
-NonExclusiveLimitAlarmType_ActiveState,9963,Variable
-NonExclusiveLimitAlarmType_ActiveState_Id,9964,Variable
-NonExclusiveLimitAlarmType_ActiveState_Name,9965,Variable
-NonExclusiveLimitAlarmType_ActiveState_Number,9966,Variable
-NonExclusiveLimitAlarmType_ActiveState_EffectiveDisplayName,9967,Variable
-NonExclusiveLimitAlarmType_ActiveState_TransitionTime,9968,Variable
-NonExclusiveLimitAlarmType_ActiveState_EffectiveTransitionTime,9969,Variable
-NonExclusiveLimitAlarmType_ActiveState_TrueState,9970,Variable
-NonExclusiveLimitAlarmType_ActiveState_FalseState,9971,Variable
-NonExclusiveLimitAlarmType_SuppressedState,9972,Variable
-NonExclusiveLimitAlarmType_SuppressedState_Id,9973,Variable
-NonExclusiveLimitAlarmType_SuppressedState_Name,9974,Variable
-NonExclusiveLimitAlarmType_SuppressedState_Number,9975,Variable
-NonExclusiveLimitAlarmType_SuppressedState_EffectiveDisplayName,9976,Variable
-NonExclusiveLimitAlarmType_SuppressedState_TransitionTime,9977,Variable
-NonExclusiveLimitAlarmType_SuppressedState_EffectiveTransitionTime,9978,Variable
-NonExclusiveLimitAlarmType_SuppressedState_TrueState,9979,Variable
-NonExclusiveLimitAlarmType_SuppressedState_FalseState,9980,Variable
-NonExclusiveLimitAlarmType_ShelvingState,9981,Object
-NonExclusiveLimitAlarmType_ShelvingState_CurrentState,9982,Variable
-NonExclusiveLimitAlarmType_ShelvingState_CurrentState_Id,9983,Variable
-NonExclusiveLimitAlarmType_ShelvingState_CurrentState_Name,9984,Variable
-NonExclusiveLimitAlarmType_ShelvingState_CurrentState_Number,9985,Variable
-NonExclusiveLimitAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,9986,Variable
-NonExclusiveLimitAlarmType_ShelvingState_LastTransition,9987,Variable
-NonExclusiveLimitAlarmType_ShelvingState_LastTransition_Id,9988,Variable
-NonExclusiveLimitAlarmType_ShelvingState_LastTransition_Name,9989,Variable
-NonExclusiveLimitAlarmType_ShelvingState_LastTransition_Number,9990,Variable
-NonExclusiveLimitAlarmType_ShelvingState_LastTransition_TransitionTime,9991,Variable
-NonExclusiveLimitAlarmType_ShelvingState_UnshelveTime,9992,Variable
-NonExclusiveLimitAlarmType_ShelvingState_Unshelve,10014,Method
-NonExclusiveLimitAlarmType_ShelvingState_OneShotShelve,10015,Method
-NonExclusiveLimitAlarmType_ShelvingState_TimedShelve,10016,Method
-NonExclusiveLimitAlarmType_ShelvingState_TimedShelve_InputArguments,10017,Variable
-NonExclusiveLimitAlarmType_SuppressedOrShelved,10018,Variable
-NonExclusiveLimitAlarmType_MaxTimeShelved,10019,Variable
-NonExclusiveLimitAlarmType_HighHighState,10020,Variable
-NonExclusiveLimitAlarmType_HighHighState_Id,10021,Variable
-NonExclusiveLimitAlarmType_HighHighState_Name,10022,Variable
-NonExclusiveLimitAlarmType_HighHighState_Number,10023,Variable
-NonExclusiveLimitAlarmType_HighHighState_EffectiveDisplayName,10024,Variable
-NonExclusiveLimitAlarmType_HighHighState_TransitionTime,10025,Variable
-NonExclusiveLimitAlarmType_HighHighState_EffectiveTransitionTime,10026,Variable
-NonExclusiveLimitAlarmType_HighHighState_TrueState,10027,Variable
-NonExclusiveLimitAlarmType_HighHighState_FalseState,10028,Variable
-NonExclusiveLimitAlarmType_HighState,10029,Variable
-NonExclusiveLimitAlarmType_HighState_Id,10030,Variable
-NonExclusiveLimitAlarmType_HighState_Name,10031,Variable
-NonExclusiveLimitAlarmType_HighState_Number,10032,Variable
-NonExclusiveLimitAlarmType_HighState_EffectiveDisplayName,10033,Variable
-NonExclusiveLimitAlarmType_HighState_TransitionTime,10034,Variable
-NonExclusiveLimitAlarmType_HighState_EffectiveTransitionTime,10035,Variable
-NonExclusiveLimitAlarmType_HighState_TrueState,10036,Variable
-NonExclusiveLimitAlarmType_HighState_FalseState,10037,Variable
-NonExclusiveLimitAlarmType_LowState,10038,Variable
-NonExclusiveLimitAlarmType_LowState_Id,10039,Variable
-NonExclusiveLimitAlarmType_LowState_Name,10040,Variable
-NonExclusiveLimitAlarmType_LowState_Number,10041,Variable
-NonExclusiveLimitAlarmType_LowState_EffectiveDisplayName,10042,Variable
-NonExclusiveLimitAlarmType_LowState_TransitionTime,10043,Variable
-NonExclusiveLimitAlarmType_LowState_EffectiveTransitionTime,10044,Variable
-NonExclusiveLimitAlarmType_LowState_TrueState,10045,Variable
-NonExclusiveLimitAlarmType_LowState_FalseState,10046,Variable
-NonExclusiveLimitAlarmType_LowLowState,10047,Variable
-NonExclusiveLimitAlarmType_LowLowState_Id,10048,Variable
-NonExclusiveLimitAlarmType_LowLowState_Name,10049,Variable
-NonExclusiveLimitAlarmType_LowLowState_Number,10050,Variable
-NonExclusiveLimitAlarmType_LowLowState_EffectiveDisplayName,10051,Variable
-NonExclusiveLimitAlarmType_LowLowState_TransitionTime,10052,Variable
-NonExclusiveLimitAlarmType_LowLowState_EffectiveTransitionTime,10053,Variable
-NonExclusiveLimitAlarmType_LowLowState_TrueState,10054,Variable
-NonExclusiveLimitAlarmType_LowLowState_FalseState,10055,Variable
-NonExclusiveLimitAlarmType_HighHighLimit,10056,Variable
-NonExclusiveLimitAlarmType_HighLimit,10057,Variable
-NonExclusiveLimitAlarmType_LowLimit,10058,Variable
-NonExclusiveLimitAlarmType_LowLowLimit,10059,Variable
-NonExclusiveLevelAlarmType,10060,ObjectType
-NonExclusiveLevelAlarmType_EventId,10061,Variable
-NonExclusiveLevelAlarmType_EventType,10062,Variable
-NonExclusiveLevelAlarmType_SourceNode,10063,Variable
-NonExclusiveLevelAlarmType_SourceName,10064,Variable
-NonExclusiveLevelAlarmType_Time,10065,Variable
-NonExclusiveLevelAlarmType_ReceiveTime,10066,Variable
-NonExclusiveLevelAlarmType_LocalTime,10067,Variable
-NonExclusiveLevelAlarmType_Message,10068,Variable
-NonExclusiveLevelAlarmType_Severity,10069,Variable
-NonExclusiveLevelAlarmType_ConditionName,10070,Variable
-NonExclusiveLevelAlarmType_BranchId,10071,Variable
-NonExclusiveLevelAlarmType_Retain,10072,Variable
-NonExclusiveLevelAlarmType_EnabledState,10073,Variable
-NonExclusiveLevelAlarmType_EnabledState_Id,10074,Variable
-NonExclusiveLevelAlarmType_EnabledState_Name,10075,Variable
-NonExclusiveLevelAlarmType_EnabledState_Number,10076,Variable
-NonExclusiveLevelAlarmType_EnabledState_EffectiveDisplayName,10077,Variable
-NonExclusiveLevelAlarmType_EnabledState_TransitionTime,10078,Variable
-NonExclusiveLevelAlarmType_EnabledState_EffectiveTransitionTime,10079,Variable
-NonExclusiveLevelAlarmType_EnabledState_TrueState,10080,Variable
-NonExclusiveLevelAlarmType_EnabledState_FalseState,10081,Variable
-NonExclusiveLevelAlarmType_Quality,10082,Variable
-NonExclusiveLevelAlarmType_Quality_SourceTimestamp,10083,Variable
-NonExclusiveLevelAlarmType_LastSeverity,10084,Variable
-NonExclusiveLevelAlarmType_LastSeverity_SourceTimestamp,10085,Variable
-NonExclusiveLevelAlarmType_Comment,10086,Variable
-NonExclusiveLevelAlarmType_Comment_SourceTimestamp,10087,Variable
-NonExclusiveLevelAlarmType_ClientUserId,10088,Variable
-NonExclusiveLevelAlarmType_Enable,10089,Method
-NonExclusiveLevelAlarmType_Disable,10090,Method
-NonExclusiveLevelAlarmType_AddComment,10091,Method
-NonExclusiveLevelAlarmType_AddComment_InputArguments,10092,Variable
-NonExclusiveLevelAlarmType_ConditionRefresh,10093,Method
-NonExclusiveLevelAlarmType_ConditionRefresh_InputArguments,10094,Variable
-NonExclusiveLevelAlarmType_AckedState,10095,Variable
-NonExclusiveLevelAlarmType_AckedState_Id,10096,Variable
-NonExclusiveLevelAlarmType_AckedState_Name,10097,Variable
-NonExclusiveLevelAlarmType_AckedState_Number,10098,Variable
-NonExclusiveLevelAlarmType_AckedState_EffectiveDisplayName,10099,Variable
-NonExclusiveLevelAlarmType_AckedState_TransitionTime,10100,Variable
-NonExclusiveLevelAlarmType_AckedState_EffectiveTransitionTime,10101,Variable
-NonExclusiveLevelAlarmType_AckedState_TrueState,10102,Variable
-NonExclusiveLevelAlarmType_AckedState_FalseState,10103,Variable
-NonExclusiveLevelAlarmType_ConfirmedState,10104,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_Id,10105,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_Name,10106,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_Number,10107,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_EffectiveDisplayName,10108,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_TransitionTime,10109,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_EffectiveTransitionTime,10110,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_TrueState,10111,Variable
-NonExclusiveLevelAlarmType_ConfirmedState_FalseState,10112,Variable
-NonExclusiveLevelAlarmType_Acknowledge,10113,Method
-NonExclusiveLevelAlarmType_Acknowledge_InputArguments,10114,Variable
-NonExclusiveLevelAlarmType_Confirm,10115,Method
-NonExclusiveLevelAlarmType_Confirm_InputArguments,10116,Variable
-NonExclusiveLevelAlarmType_ActiveState,10117,Variable
-NonExclusiveLevelAlarmType_ActiveState_Id,10118,Variable
-NonExclusiveLevelAlarmType_ActiveState_Name,10119,Variable
-NonExclusiveLevelAlarmType_ActiveState_Number,10120,Variable
-NonExclusiveLevelAlarmType_ActiveState_EffectiveDisplayName,10121,Variable
-NonExclusiveLevelAlarmType_ActiveState_TransitionTime,10122,Variable
-NonExclusiveLevelAlarmType_ActiveState_EffectiveTransitionTime,10123,Variable
-NonExclusiveLevelAlarmType_ActiveState_TrueState,10124,Variable
-NonExclusiveLevelAlarmType_ActiveState_FalseState,10125,Variable
-NonExclusiveLevelAlarmType_SuppressedState,10126,Variable
-NonExclusiveLevelAlarmType_SuppressedState_Id,10127,Variable
-NonExclusiveLevelAlarmType_SuppressedState_Name,10128,Variable
-NonExclusiveLevelAlarmType_SuppressedState_Number,10129,Variable
-NonExclusiveLevelAlarmType_SuppressedState_EffectiveDisplayName,10130,Variable
-NonExclusiveLevelAlarmType_SuppressedState_TransitionTime,10131,Variable
-NonExclusiveLevelAlarmType_SuppressedState_EffectiveTransitionTime,10132,Variable
-NonExclusiveLevelAlarmType_SuppressedState_TrueState,10133,Variable
-NonExclusiveLevelAlarmType_SuppressedState_FalseState,10134,Variable
-NonExclusiveLevelAlarmType_ShelvingState,10135,Object
-NonExclusiveLevelAlarmType_ShelvingState_CurrentState,10136,Variable
-NonExclusiveLevelAlarmType_ShelvingState_CurrentState_Id,10137,Variable
-NonExclusiveLevelAlarmType_ShelvingState_CurrentState_Name,10138,Variable
-NonExclusiveLevelAlarmType_ShelvingState_CurrentState_Number,10139,Variable
-NonExclusiveLevelAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,10140,Variable
-NonExclusiveLevelAlarmType_ShelvingState_LastTransition,10141,Variable
-NonExclusiveLevelAlarmType_ShelvingState_LastTransition_Id,10142,Variable
-NonExclusiveLevelAlarmType_ShelvingState_LastTransition_Name,10143,Variable
-NonExclusiveLevelAlarmType_ShelvingState_LastTransition_Number,10144,Variable
-NonExclusiveLevelAlarmType_ShelvingState_LastTransition_TransitionTime,10145,Variable
-NonExclusiveLevelAlarmType_ShelvingState_UnshelveTime,10146,Variable
-NonExclusiveLevelAlarmType_ShelvingState_Unshelve,10168,Method
-NonExclusiveLevelAlarmType_ShelvingState_OneShotShelve,10169,Method
-NonExclusiveLevelAlarmType_ShelvingState_TimedShelve,10170,Method
-NonExclusiveLevelAlarmType_ShelvingState_TimedShelve_InputArguments,10171,Variable
-NonExclusiveLevelAlarmType_SuppressedOrShelved,10172,Variable
-NonExclusiveLevelAlarmType_MaxTimeShelved,10173,Variable
-NonExclusiveLevelAlarmType_HighHighState,10174,Variable
-NonExclusiveLevelAlarmType_HighHighState_Id,10175,Variable
-NonExclusiveLevelAlarmType_HighHighState_Name,10176,Variable
-NonExclusiveLevelAlarmType_HighHighState_Number,10177,Variable
-NonExclusiveLevelAlarmType_HighHighState_EffectiveDisplayName,10178,Variable
-NonExclusiveLevelAlarmType_HighHighState_TransitionTime,10179,Variable
-NonExclusiveLevelAlarmType_HighHighState_EffectiveTransitionTime,10180,Variable
-NonExclusiveLevelAlarmType_HighHighState_TrueState,10181,Variable
-NonExclusiveLevelAlarmType_HighHighState_FalseState,10182,Variable
-NonExclusiveLevelAlarmType_HighState,10183,Variable
-NonExclusiveLevelAlarmType_HighState_Id,10184,Variable
-NonExclusiveLevelAlarmType_HighState_Name,10185,Variable
-NonExclusiveLevelAlarmType_HighState_Number,10186,Variable
-NonExclusiveLevelAlarmType_HighState_EffectiveDisplayName,10187,Variable
-NonExclusiveLevelAlarmType_HighState_TransitionTime,10188,Variable
-NonExclusiveLevelAlarmType_HighState_EffectiveTransitionTime,10189,Variable
-NonExclusiveLevelAlarmType_HighState_TrueState,10190,Variable
-NonExclusiveLevelAlarmType_HighState_FalseState,10191,Variable
-NonExclusiveLevelAlarmType_LowState,10192,Variable
-NonExclusiveLevelAlarmType_LowState_Id,10193,Variable
-NonExclusiveLevelAlarmType_LowState_Name,10194,Variable
-NonExclusiveLevelAlarmType_LowState_Number,10195,Variable
-NonExclusiveLevelAlarmType_LowState_EffectiveDisplayName,10196,Variable
-NonExclusiveLevelAlarmType_LowState_TransitionTime,10197,Variable
-NonExclusiveLevelAlarmType_LowState_EffectiveTransitionTime,10198,Variable
-NonExclusiveLevelAlarmType_LowState_TrueState,10199,Variable
-NonExclusiveLevelAlarmType_LowState_FalseState,10200,Variable
-NonExclusiveLevelAlarmType_LowLowState,10201,Variable
-NonExclusiveLevelAlarmType_LowLowState_Id,10202,Variable
-NonExclusiveLevelAlarmType_LowLowState_Name,10203,Variable
-NonExclusiveLevelAlarmType_LowLowState_Number,10204,Variable
-NonExclusiveLevelAlarmType_LowLowState_EffectiveDisplayName,10205,Variable
-NonExclusiveLevelAlarmType_LowLowState_TransitionTime,10206,Variable
-NonExclusiveLevelAlarmType_LowLowState_EffectiveTransitionTime,10207,Variable
-NonExclusiveLevelAlarmType_LowLowState_TrueState,10208,Variable
-NonExclusiveLevelAlarmType_LowLowState_FalseState,10209,Variable
-NonExclusiveLevelAlarmType_HighHighLimit,10210,Variable
-NonExclusiveLevelAlarmType_HighLimit,10211,Variable
-NonExclusiveLevelAlarmType_LowLimit,10212,Variable
-NonExclusiveLevelAlarmType_LowLowLimit,10213,Variable
-NonExclusiveRateOfChangeAlarmType,10214,ObjectType
-NonExclusiveRateOfChangeAlarmType_EventId,10215,Variable
-NonExclusiveRateOfChangeAlarmType_EventType,10216,Variable
-NonExclusiveRateOfChangeAlarmType_SourceNode,10217,Variable
-NonExclusiveRateOfChangeAlarmType_SourceName,10218,Variable
-NonExclusiveRateOfChangeAlarmType_Time,10219,Variable
-NonExclusiveRateOfChangeAlarmType_ReceiveTime,10220,Variable
-NonExclusiveRateOfChangeAlarmType_LocalTime,10221,Variable
-NonExclusiveRateOfChangeAlarmType_Message,10222,Variable
-NonExclusiveRateOfChangeAlarmType_Severity,10223,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionName,10224,Variable
-NonExclusiveRateOfChangeAlarmType_BranchId,10225,Variable
-NonExclusiveRateOfChangeAlarmType_Retain,10226,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState,10227,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_Id,10228,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_Name,10229,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_Number,10230,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_EffectiveDisplayName,10231,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_TransitionTime,10232,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_EffectiveTransitionTime,10233,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_TrueState,10234,Variable
-NonExclusiveRateOfChangeAlarmType_EnabledState_FalseState,10235,Variable
-NonExclusiveRateOfChangeAlarmType_Quality,10236,Variable
-NonExclusiveRateOfChangeAlarmType_Quality_SourceTimestamp,10237,Variable
-NonExclusiveRateOfChangeAlarmType_LastSeverity,10238,Variable
-NonExclusiveRateOfChangeAlarmType_LastSeverity_SourceTimestamp,10239,Variable
-NonExclusiveRateOfChangeAlarmType_Comment,10240,Variable
-NonExclusiveRateOfChangeAlarmType_Comment_SourceTimestamp,10241,Variable
-NonExclusiveRateOfChangeAlarmType_ClientUserId,10242,Variable
-NonExclusiveRateOfChangeAlarmType_Enable,10243,Method
-NonExclusiveRateOfChangeAlarmType_Disable,10244,Method
-NonExclusiveRateOfChangeAlarmType_AddComment,10245,Method
-NonExclusiveRateOfChangeAlarmType_AddComment_InputArguments,10246,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionRefresh,10247,Method
-NonExclusiveRateOfChangeAlarmType_ConditionRefresh_InputArguments,10248,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState,10249,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_Id,10250,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_Name,10251,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_Number,10252,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_EffectiveDisplayName,10253,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_TransitionTime,10254,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_EffectiveTransitionTime,10255,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_TrueState,10256,Variable
-NonExclusiveRateOfChangeAlarmType_AckedState_FalseState,10257,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState,10258,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_Id,10259,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_Name,10260,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_Number,10261,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_EffectiveDisplayName,10262,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_TransitionTime,10263,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_EffectiveTransitionTime,10264,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_TrueState,10265,Variable
-NonExclusiveRateOfChangeAlarmType_ConfirmedState_FalseState,10266,Variable
-NonExclusiveRateOfChangeAlarmType_Acknowledge,10267,Method
-NonExclusiveRateOfChangeAlarmType_Acknowledge_InputArguments,10268,Variable
-NonExclusiveRateOfChangeAlarmType_Confirm,10269,Method
-NonExclusiveRateOfChangeAlarmType_Confirm_InputArguments,10270,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState,10271,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_Id,10272,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_Name,10273,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_Number,10274,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_EffectiveDisplayName,10275,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_TransitionTime,10276,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_EffectiveTransitionTime,10277,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_TrueState,10278,Variable
-NonExclusiveRateOfChangeAlarmType_ActiveState_FalseState,10279,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState,10280,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_Id,10281,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_Name,10282,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_Number,10283,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_EffectiveDisplayName,10284,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_TransitionTime,10285,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_EffectiveTransitionTime,10286,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_TrueState,10287,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedState_FalseState,10288,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState,10289,Object
-NonExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState,10290,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_Id,10291,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_Name,10292,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_Number,10293,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,10294,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition,10295,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_Id,10296,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_Name,10297,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_Number,10298,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_TransitionTime,10299,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_UnshelveTime,10300,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_Unshelve,10322,Method
-NonExclusiveRateOfChangeAlarmType_ShelvingState_OneShotShelve,10323,Method
-NonExclusiveRateOfChangeAlarmType_ShelvingState_TimedShelve,10324,Method
-NonExclusiveRateOfChangeAlarmType_ShelvingState_TimedShelve_InputArguments,10325,Variable
-NonExclusiveRateOfChangeAlarmType_SuppressedOrShelved,10326,Variable
-NonExclusiveRateOfChangeAlarmType_MaxTimeShelved,10327,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState,10328,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_Id,10329,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_Name,10330,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_Number,10331,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_EffectiveDisplayName,10332,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_TransitionTime,10333,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_EffectiveTransitionTime,10334,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_TrueState,10335,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighState_FalseState,10336,Variable
-NonExclusiveRateOfChangeAlarmType_HighState,10337,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_Id,10338,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_Name,10339,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_Number,10340,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_EffectiveDisplayName,10341,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_TransitionTime,10342,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_EffectiveTransitionTime,10343,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_TrueState,10344,Variable
-NonExclusiveRateOfChangeAlarmType_HighState_FalseState,10345,Variable
-NonExclusiveRateOfChangeAlarmType_LowState,10346,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_Id,10347,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_Name,10348,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_Number,10349,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_EffectiveDisplayName,10350,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_TransitionTime,10351,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_EffectiveTransitionTime,10352,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_TrueState,10353,Variable
-NonExclusiveRateOfChangeAlarmType_LowState_FalseState,10354,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState,10355,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_Id,10356,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_Name,10357,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_Number,10358,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_EffectiveDisplayName,10359,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_TransitionTime,10360,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_EffectiveTransitionTime,10361,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_TrueState,10362,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowState_FalseState,10363,Variable
-NonExclusiveRateOfChangeAlarmType_HighHighLimit,10364,Variable
-NonExclusiveRateOfChangeAlarmType_HighLimit,10365,Variable
-NonExclusiveRateOfChangeAlarmType_LowLimit,10366,Variable
-NonExclusiveRateOfChangeAlarmType_LowLowLimit,10367,Variable
-NonExclusiveDeviationAlarmType,10368,ObjectType
-NonExclusiveDeviationAlarmType_EventId,10369,Variable
-NonExclusiveDeviationAlarmType_EventType,10370,Variable
-NonExclusiveDeviationAlarmType_SourceNode,10371,Variable
-NonExclusiveDeviationAlarmType_SourceName,10372,Variable
-NonExclusiveDeviationAlarmType_Time,10373,Variable
-NonExclusiveDeviationAlarmType_ReceiveTime,10374,Variable
-NonExclusiveDeviationAlarmType_LocalTime,10375,Variable
-NonExclusiveDeviationAlarmType_Message,10376,Variable
-NonExclusiveDeviationAlarmType_Severity,10377,Variable
-NonExclusiveDeviationAlarmType_ConditionName,10378,Variable
-NonExclusiveDeviationAlarmType_BranchId,10379,Variable
-NonExclusiveDeviationAlarmType_Retain,10380,Variable
-NonExclusiveDeviationAlarmType_EnabledState,10381,Variable
-NonExclusiveDeviationAlarmType_EnabledState_Id,10382,Variable
-NonExclusiveDeviationAlarmType_EnabledState_Name,10383,Variable
-NonExclusiveDeviationAlarmType_EnabledState_Number,10384,Variable
-NonExclusiveDeviationAlarmType_EnabledState_EffectiveDisplayName,10385,Variable
-NonExclusiveDeviationAlarmType_EnabledState_TransitionTime,10386,Variable
-NonExclusiveDeviationAlarmType_EnabledState_EffectiveTransitionTime,10387,Variable
-NonExclusiveDeviationAlarmType_EnabledState_TrueState,10388,Variable
-NonExclusiveDeviationAlarmType_EnabledState_FalseState,10389,Variable
-NonExclusiveDeviationAlarmType_Quality,10390,Variable
-NonExclusiveDeviationAlarmType_Quality_SourceTimestamp,10391,Variable
-NonExclusiveDeviationAlarmType_LastSeverity,10392,Variable
-NonExclusiveDeviationAlarmType_LastSeverity_SourceTimestamp,10393,Variable
-NonExclusiveDeviationAlarmType_Comment,10394,Variable
-NonExclusiveDeviationAlarmType_Comment_SourceTimestamp,10395,Variable
-NonExclusiveDeviationAlarmType_ClientUserId,10396,Variable
-NonExclusiveDeviationAlarmType_Enable,10397,Method
-NonExclusiveDeviationAlarmType_Disable,10398,Method
-NonExclusiveDeviationAlarmType_AddComment,10399,Method
-NonExclusiveDeviationAlarmType_AddComment_InputArguments,10400,Variable
-NonExclusiveDeviationAlarmType_ConditionRefresh,10401,Method
-NonExclusiveDeviationAlarmType_ConditionRefresh_InputArguments,10402,Variable
-NonExclusiveDeviationAlarmType_AckedState,10403,Variable
-NonExclusiveDeviationAlarmType_AckedState_Id,10404,Variable
-NonExclusiveDeviationAlarmType_AckedState_Name,10405,Variable
-NonExclusiveDeviationAlarmType_AckedState_Number,10406,Variable
-NonExclusiveDeviationAlarmType_AckedState_EffectiveDisplayName,10407,Variable
-NonExclusiveDeviationAlarmType_AckedState_TransitionTime,10408,Variable
-NonExclusiveDeviationAlarmType_AckedState_EffectiveTransitionTime,10409,Variable
-NonExclusiveDeviationAlarmType_AckedState_TrueState,10410,Variable
-NonExclusiveDeviationAlarmType_AckedState_FalseState,10411,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState,10412,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_Id,10413,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_Name,10414,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_Number,10415,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_EffectiveDisplayName,10416,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_TransitionTime,10417,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_EffectiveTransitionTime,10418,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_TrueState,10419,Variable
-NonExclusiveDeviationAlarmType_ConfirmedState_FalseState,10420,Variable
-NonExclusiveDeviationAlarmType_Acknowledge,10421,Method
-NonExclusiveDeviationAlarmType_Acknowledge_InputArguments,10422,Variable
-NonExclusiveDeviationAlarmType_Confirm,10423,Method
-NonExclusiveDeviationAlarmType_Confirm_InputArguments,10424,Variable
-NonExclusiveDeviationAlarmType_ActiveState,10425,Variable
-NonExclusiveDeviationAlarmType_ActiveState_Id,10426,Variable
-NonExclusiveDeviationAlarmType_ActiveState_Name,10427,Variable
-NonExclusiveDeviationAlarmType_ActiveState_Number,10428,Variable
-NonExclusiveDeviationAlarmType_ActiveState_EffectiveDisplayName,10429,Variable
-NonExclusiveDeviationAlarmType_ActiveState_TransitionTime,10430,Variable
-NonExclusiveDeviationAlarmType_ActiveState_EffectiveTransitionTime,10431,Variable
-NonExclusiveDeviationAlarmType_ActiveState_TrueState,10432,Variable
-NonExclusiveDeviationAlarmType_ActiveState_FalseState,10433,Variable
-NonExclusiveDeviationAlarmType_SuppressedState,10434,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_Id,10435,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_Name,10436,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_Number,10437,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_EffectiveDisplayName,10438,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_TransitionTime,10439,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_EffectiveTransitionTime,10440,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_TrueState,10441,Variable
-NonExclusiveDeviationAlarmType_SuppressedState_FalseState,10442,Variable
-NonExclusiveDeviationAlarmType_ShelvingState,10443,Object
-NonExclusiveDeviationAlarmType_ShelvingState_CurrentState,10444,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_CurrentState_Id,10445,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_CurrentState_Name,10446,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_CurrentState_Number,10447,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,10448,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_LastTransition,10449,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_LastTransition_Id,10450,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_LastTransition_Name,10451,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_LastTransition_Number,10452,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_LastTransition_TransitionTime,10453,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_UnshelveTime,10454,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_Unshelve,10476,Method
-NonExclusiveDeviationAlarmType_ShelvingState_OneShotShelve,10477,Method
-NonExclusiveDeviationAlarmType_ShelvingState_TimedShelve,10478,Method
-NonExclusiveDeviationAlarmType_ShelvingState_TimedShelve_InputArguments,10479,Variable
-NonExclusiveDeviationAlarmType_SuppressedOrShelved,10480,Variable
-NonExclusiveDeviationAlarmType_MaxTimeShelved,10481,Variable
-NonExclusiveDeviationAlarmType_HighHighState,10482,Variable
-NonExclusiveDeviationAlarmType_HighHighState_Id,10483,Variable
-NonExclusiveDeviationAlarmType_HighHighState_Name,10484,Variable
-NonExclusiveDeviationAlarmType_HighHighState_Number,10485,Variable
-NonExclusiveDeviationAlarmType_HighHighState_EffectiveDisplayName,10486,Variable
-NonExclusiveDeviationAlarmType_HighHighState_TransitionTime,10487,Variable
-NonExclusiveDeviationAlarmType_HighHighState_EffectiveTransitionTime,10488,Variable
-NonExclusiveDeviationAlarmType_HighHighState_TrueState,10489,Variable
-NonExclusiveDeviationAlarmType_HighHighState_FalseState,10490,Variable
-NonExclusiveDeviationAlarmType_HighState,10491,Variable
-NonExclusiveDeviationAlarmType_HighState_Id,10492,Variable
-NonExclusiveDeviationAlarmType_HighState_Name,10493,Variable
-NonExclusiveDeviationAlarmType_HighState_Number,10494,Variable
-NonExclusiveDeviationAlarmType_HighState_EffectiveDisplayName,10495,Variable
-NonExclusiveDeviationAlarmType_HighState_TransitionTime,10496,Variable
-NonExclusiveDeviationAlarmType_HighState_EffectiveTransitionTime,10497,Variable
-NonExclusiveDeviationAlarmType_HighState_TrueState,10498,Variable
-NonExclusiveDeviationAlarmType_HighState_FalseState,10499,Variable
-NonExclusiveDeviationAlarmType_LowState,10500,Variable
-NonExclusiveDeviationAlarmType_LowState_Id,10501,Variable
-NonExclusiveDeviationAlarmType_LowState_Name,10502,Variable
-NonExclusiveDeviationAlarmType_LowState_Number,10503,Variable
-NonExclusiveDeviationAlarmType_LowState_EffectiveDisplayName,10504,Variable
-NonExclusiveDeviationAlarmType_LowState_TransitionTime,10505,Variable
-NonExclusiveDeviationAlarmType_LowState_EffectiveTransitionTime,10506,Variable
-NonExclusiveDeviationAlarmType_LowState_TrueState,10507,Variable
-NonExclusiveDeviationAlarmType_LowState_FalseState,10508,Variable
-NonExclusiveDeviationAlarmType_LowLowState,10509,Variable
-NonExclusiveDeviationAlarmType_LowLowState_Id,10510,Variable
-NonExclusiveDeviationAlarmType_LowLowState_Name,10511,Variable
-NonExclusiveDeviationAlarmType_LowLowState_Number,10512,Variable
-NonExclusiveDeviationAlarmType_LowLowState_EffectiveDisplayName,10513,Variable
-NonExclusiveDeviationAlarmType_LowLowState_TransitionTime,10514,Variable
-NonExclusiveDeviationAlarmType_LowLowState_EffectiveTransitionTime,10515,Variable
-NonExclusiveDeviationAlarmType_LowLowState_TrueState,10516,Variable
-NonExclusiveDeviationAlarmType_LowLowState_FalseState,10517,Variable
-NonExclusiveDeviationAlarmType_HighHighLimit,10518,Variable
-NonExclusiveDeviationAlarmType_HighLimit,10519,Variable
-NonExclusiveDeviationAlarmType_LowLimit,10520,Variable
-NonExclusiveDeviationAlarmType_LowLowLimit,10521,Variable
-NonExclusiveDeviationAlarmType_SetpointNode,10522,Variable
-DiscreteAlarmType,10523,ObjectType
-DiscreteAlarmType_EventId,10524,Variable
-DiscreteAlarmType_EventType,10525,Variable
-DiscreteAlarmType_SourceNode,10526,Variable
-DiscreteAlarmType_SourceName,10527,Variable
-DiscreteAlarmType_Time,10528,Variable
-DiscreteAlarmType_ReceiveTime,10529,Variable
-DiscreteAlarmType_LocalTime,10530,Variable
-DiscreteAlarmType_Message,10531,Variable
-DiscreteAlarmType_Severity,10532,Variable
-DiscreteAlarmType_ConditionName,10533,Variable
-DiscreteAlarmType_BranchId,10534,Variable
-DiscreteAlarmType_Retain,10535,Variable
-DiscreteAlarmType_EnabledState,10536,Variable
-DiscreteAlarmType_EnabledState_Id,10537,Variable
-DiscreteAlarmType_EnabledState_Name,10538,Variable
-DiscreteAlarmType_EnabledState_Number,10539,Variable
-DiscreteAlarmType_EnabledState_EffectiveDisplayName,10540,Variable
-DiscreteAlarmType_EnabledState_TransitionTime,10541,Variable
-DiscreteAlarmType_EnabledState_EffectiveTransitionTime,10542,Variable
-DiscreteAlarmType_EnabledState_TrueState,10543,Variable
-DiscreteAlarmType_EnabledState_FalseState,10544,Variable
-DiscreteAlarmType_Quality,10545,Variable
-DiscreteAlarmType_Quality_SourceTimestamp,10546,Variable
-DiscreteAlarmType_LastSeverity,10547,Variable
-DiscreteAlarmType_LastSeverity_SourceTimestamp,10548,Variable
-DiscreteAlarmType_Comment,10549,Variable
-DiscreteAlarmType_Comment_SourceTimestamp,10550,Variable
-DiscreteAlarmType_ClientUserId,10551,Variable
-DiscreteAlarmType_Enable,10552,Method
-DiscreteAlarmType_Disable,10553,Method
-DiscreteAlarmType_AddComment,10554,Method
-DiscreteAlarmType_AddComment_InputArguments,10555,Variable
-DiscreteAlarmType_ConditionRefresh,10556,Method
-DiscreteAlarmType_ConditionRefresh_InputArguments,10557,Variable
-DiscreteAlarmType_AckedState,10558,Variable
-DiscreteAlarmType_AckedState_Id,10559,Variable
-DiscreteAlarmType_AckedState_Name,10560,Variable
-DiscreteAlarmType_AckedState_Number,10561,Variable
-DiscreteAlarmType_AckedState_EffectiveDisplayName,10562,Variable
-DiscreteAlarmType_AckedState_TransitionTime,10563,Variable
-DiscreteAlarmType_AckedState_EffectiveTransitionTime,10564,Variable
-DiscreteAlarmType_AckedState_TrueState,10565,Variable
-DiscreteAlarmType_AckedState_FalseState,10566,Variable
-DiscreteAlarmType_ConfirmedState,10567,Variable
-DiscreteAlarmType_ConfirmedState_Id,10568,Variable
-DiscreteAlarmType_ConfirmedState_Name,10569,Variable
-DiscreteAlarmType_ConfirmedState_Number,10570,Variable
-DiscreteAlarmType_ConfirmedState_EffectiveDisplayName,10571,Variable
-DiscreteAlarmType_ConfirmedState_TransitionTime,10572,Variable
-DiscreteAlarmType_ConfirmedState_EffectiveTransitionTime,10573,Variable
-DiscreteAlarmType_ConfirmedState_TrueState,10574,Variable
-DiscreteAlarmType_ConfirmedState_FalseState,10575,Variable
-DiscreteAlarmType_Acknowledge,10576,Method
-DiscreteAlarmType_Acknowledge_InputArguments,10577,Variable
-DiscreteAlarmType_Confirm,10578,Method
-DiscreteAlarmType_Confirm_InputArguments,10579,Variable
-DiscreteAlarmType_ActiveState,10580,Variable
-DiscreteAlarmType_ActiveState_Id,10581,Variable
-DiscreteAlarmType_ActiveState_Name,10582,Variable
-DiscreteAlarmType_ActiveState_Number,10583,Variable
-DiscreteAlarmType_ActiveState_EffectiveDisplayName,10584,Variable
-DiscreteAlarmType_ActiveState_TransitionTime,10585,Variable
-DiscreteAlarmType_ActiveState_EffectiveTransitionTime,10586,Variable
-DiscreteAlarmType_ActiveState_TrueState,10587,Variable
-DiscreteAlarmType_ActiveState_FalseState,10588,Variable
-DiscreteAlarmType_SuppressedState,10589,Variable
-DiscreteAlarmType_SuppressedState_Id,10590,Variable
-DiscreteAlarmType_SuppressedState_Name,10591,Variable
-DiscreteAlarmType_SuppressedState_Number,10592,Variable
-DiscreteAlarmType_SuppressedState_EffectiveDisplayName,10593,Variable
-DiscreteAlarmType_SuppressedState_TransitionTime,10594,Variable
-DiscreteAlarmType_SuppressedState_EffectiveTransitionTime,10595,Variable
-DiscreteAlarmType_SuppressedState_TrueState,10596,Variable
-DiscreteAlarmType_SuppressedState_FalseState,10597,Variable
-DiscreteAlarmType_ShelvingState,10598,Object
-DiscreteAlarmType_ShelvingState_CurrentState,10599,Variable
-DiscreteAlarmType_ShelvingState_CurrentState_Id,10600,Variable
-DiscreteAlarmType_ShelvingState_CurrentState_Name,10601,Variable
-DiscreteAlarmType_ShelvingState_CurrentState_Number,10602,Variable
-DiscreteAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,10603,Variable
-DiscreteAlarmType_ShelvingState_LastTransition,10604,Variable
-DiscreteAlarmType_ShelvingState_LastTransition_Id,10605,Variable
-DiscreteAlarmType_ShelvingState_LastTransition_Name,10606,Variable
-DiscreteAlarmType_ShelvingState_LastTransition_Number,10607,Variable
-DiscreteAlarmType_ShelvingState_LastTransition_TransitionTime,10608,Variable
-DiscreteAlarmType_ShelvingState_UnshelveTime,10609,Variable
-DiscreteAlarmType_ShelvingState_Unshelve,10631,Method
-DiscreteAlarmType_ShelvingState_OneShotShelve,10632,Method
-DiscreteAlarmType_ShelvingState_TimedShelve,10633,Method
-DiscreteAlarmType_ShelvingState_TimedShelve_InputArguments,10634,Variable
-DiscreteAlarmType_SuppressedOrShelved,10635,Variable
-DiscreteAlarmType_MaxTimeShelved,10636,Variable
-OffNormalAlarmType,10637,ObjectType
-OffNormalAlarmType_EventId,10638,Variable
-OffNormalAlarmType_EventType,10639,Variable
-OffNormalAlarmType_SourceNode,10640,Variable
-OffNormalAlarmType_SourceName,10641,Variable
-OffNormalAlarmType_Time,10642,Variable
-OffNormalAlarmType_ReceiveTime,10643,Variable
-OffNormalAlarmType_LocalTime,10644,Variable
-OffNormalAlarmType_Message,10645,Variable
-OffNormalAlarmType_Severity,10646,Variable
-OffNormalAlarmType_ConditionName,10647,Variable
-OffNormalAlarmType_BranchId,10648,Variable
-OffNormalAlarmType_Retain,10649,Variable
-OffNormalAlarmType_EnabledState,10650,Variable
-OffNormalAlarmType_EnabledState_Id,10651,Variable
-OffNormalAlarmType_EnabledState_Name,10652,Variable
-OffNormalAlarmType_EnabledState_Number,10653,Variable
-OffNormalAlarmType_EnabledState_EffectiveDisplayName,10654,Variable
-OffNormalAlarmType_EnabledState_TransitionTime,10655,Variable
-OffNormalAlarmType_EnabledState_EffectiveTransitionTime,10656,Variable
-OffNormalAlarmType_EnabledState_TrueState,10657,Variable
-OffNormalAlarmType_EnabledState_FalseState,10658,Variable
-OffNormalAlarmType_Quality,10659,Variable
-OffNormalAlarmType_Quality_SourceTimestamp,10660,Variable
-OffNormalAlarmType_LastSeverity,10661,Variable
-OffNormalAlarmType_LastSeverity_SourceTimestamp,10662,Variable
-OffNormalAlarmType_Comment,10663,Variable
-OffNormalAlarmType_Comment_SourceTimestamp,10664,Variable
-OffNormalAlarmType_ClientUserId,10665,Variable
-OffNormalAlarmType_Enable,10666,Method
-OffNormalAlarmType_Disable,10667,Method
-OffNormalAlarmType_AddComment,10668,Method
-OffNormalAlarmType_AddComment_InputArguments,10669,Variable
-OffNormalAlarmType_ConditionRefresh,10670,Method
-OffNormalAlarmType_ConditionRefresh_InputArguments,10671,Variable
-OffNormalAlarmType_AckedState,10672,Variable
-OffNormalAlarmType_AckedState_Id,10673,Variable
-OffNormalAlarmType_AckedState_Name,10674,Variable
-OffNormalAlarmType_AckedState_Number,10675,Variable
-OffNormalAlarmType_AckedState_EffectiveDisplayName,10676,Variable
-OffNormalAlarmType_AckedState_TransitionTime,10677,Variable
-OffNormalAlarmType_AckedState_EffectiveTransitionTime,10678,Variable
-OffNormalAlarmType_AckedState_TrueState,10679,Variable
-OffNormalAlarmType_AckedState_FalseState,10680,Variable
-OffNormalAlarmType_ConfirmedState,10681,Variable
-OffNormalAlarmType_ConfirmedState_Id,10682,Variable
-OffNormalAlarmType_ConfirmedState_Name,10683,Variable
-OffNormalAlarmType_ConfirmedState_Number,10684,Variable
-OffNormalAlarmType_ConfirmedState_EffectiveDisplayName,10685,Variable
-OffNormalAlarmType_ConfirmedState_TransitionTime,10686,Variable
-OffNormalAlarmType_ConfirmedState_EffectiveTransitionTime,10687,Variable
-OffNormalAlarmType_ConfirmedState_TrueState,10688,Variable
-OffNormalAlarmType_ConfirmedState_FalseState,10689,Variable
-OffNormalAlarmType_Acknowledge,10690,Method
-OffNormalAlarmType_Acknowledge_InputArguments,10691,Variable
-OffNormalAlarmType_Confirm,10692,Method
-OffNormalAlarmType_Confirm_InputArguments,10693,Variable
-OffNormalAlarmType_ActiveState,10694,Variable
-OffNormalAlarmType_ActiveState_Id,10695,Variable
-OffNormalAlarmType_ActiveState_Name,10696,Variable
-OffNormalAlarmType_ActiveState_Number,10697,Variable
-OffNormalAlarmType_ActiveState_EffectiveDisplayName,10698,Variable
-OffNormalAlarmType_ActiveState_TransitionTime,10699,Variable
-OffNormalAlarmType_ActiveState_EffectiveTransitionTime,10700,Variable
-OffNormalAlarmType_ActiveState_TrueState,10701,Variable
-OffNormalAlarmType_ActiveState_FalseState,10702,Variable
-OffNormalAlarmType_SuppressedState,10703,Variable
-OffNormalAlarmType_SuppressedState_Id,10704,Variable
-OffNormalAlarmType_SuppressedState_Name,10705,Variable
-OffNormalAlarmType_SuppressedState_Number,10706,Variable
-OffNormalAlarmType_SuppressedState_EffectiveDisplayName,10707,Variable
-OffNormalAlarmType_SuppressedState_TransitionTime,10708,Variable
-OffNormalAlarmType_SuppressedState_EffectiveTransitionTime,10709,Variable
-OffNormalAlarmType_SuppressedState_TrueState,10710,Variable
-OffNormalAlarmType_SuppressedState_FalseState,10711,Variable
-OffNormalAlarmType_ShelvingState,10712,Object
-OffNormalAlarmType_ShelvingState_CurrentState,10713,Variable
-OffNormalAlarmType_ShelvingState_CurrentState_Id,10714,Variable
-OffNormalAlarmType_ShelvingState_CurrentState_Name,10715,Variable
-OffNormalAlarmType_ShelvingState_CurrentState_Number,10716,Variable
-OffNormalAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,10717,Variable
-OffNormalAlarmType_ShelvingState_LastTransition,10718,Variable
-OffNormalAlarmType_ShelvingState_LastTransition_Id,10719,Variable
-OffNormalAlarmType_ShelvingState_LastTransition_Name,10720,Variable
-OffNormalAlarmType_ShelvingState_LastTransition_Number,10721,Variable
-OffNormalAlarmType_ShelvingState_LastTransition_TransitionTime,10722,Variable
-OffNormalAlarmType_ShelvingState_UnshelveTime,10723,Variable
-OffNormalAlarmType_ShelvingState_Unshelve,10745,Method
-OffNormalAlarmType_ShelvingState_OneShotShelve,10746,Method
-OffNormalAlarmType_ShelvingState_TimedShelve,10747,Method
-OffNormalAlarmType_ShelvingState_TimedShelve_InputArguments,10748,Variable
-OffNormalAlarmType_SuppressedOrShelved,10749,Variable
-OffNormalAlarmType_MaxTimeShelved,10750,Variable
-TripAlarmType,10751,ObjectType
-TripAlarmType_EventId,10752,Variable
-TripAlarmType_EventType,10753,Variable
-TripAlarmType_SourceNode,10754,Variable
-TripAlarmType_SourceName,10755,Variable
-TripAlarmType_Time,10756,Variable
-TripAlarmType_ReceiveTime,10757,Variable
-TripAlarmType_LocalTime,10758,Variable
-TripAlarmType_Message,10759,Variable
-TripAlarmType_Severity,10760,Variable
-TripAlarmType_ConditionName,10761,Variable
-TripAlarmType_BranchId,10762,Variable
-TripAlarmType_Retain,10763,Variable
-TripAlarmType_EnabledState,10764,Variable
-TripAlarmType_EnabledState_Id,10765,Variable
-TripAlarmType_EnabledState_Name,10766,Variable
-TripAlarmType_EnabledState_Number,10767,Variable
-TripAlarmType_EnabledState_EffectiveDisplayName,10768,Variable
-TripAlarmType_EnabledState_TransitionTime,10769,Variable
-TripAlarmType_EnabledState_EffectiveTransitionTime,10770,Variable
-TripAlarmType_EnabledState_TrueState,10771,Variable
-TripAlarmType_EnabledState_FalseState,10772,Variable
-TripAlarmType_Quality,10773,Variable
-TripAlarmType_Quality_SourceTimestamp,10774,Variable
-TripAlarmType_LastSeverity,10775,Variable
-TripAlarmType_LastSeverity_SourceTimestamp,10776,Variable
-TripAlarmType_Comment,10777,Variable
-TripAlarmType_Comment_SourceTimestamp,10778,Variable
-TripAlarmType_ClientUserId,10779,Variable
-TripAlarmType_Enable,10780,Method
-TripAlarmType_Disable,10781,Method
-TripAlarmType_AddComment,10782,Method
-TripAlarmType_AddComment_InputArguments,10783,Variable
-TripAlarmType_ConditionRefresh,10784,Method
-TripAlarmType_ConditionRefresh_InputArguments,10785,Variable
-TripAlarmType_AckedState,10786,Variable
-TripAlarmType_AckedState_Id,10787,Variable
-TripAlarmType_AckedState_Name,10788,Variable
-TripAlarmType_AckedState_Number,10789,Variable
-TripAlarmType_AckedState_EffectiveDisplayName,10790,Variable
-TripAlarmType_AckedState_TransitionTime,10791,Variable
-TripAlarmType_AckedState_EffectiveTransitionTime,10792,Variable
-TripAlarmType_AckedState_TrueState,10793,Variable
-TripAlarmType_AckedState_FalseState,10794,Variable
-TripAlarmType_ConfirmedState,10795,Variable
-TripAlarmType_ConfirmedState_Id,10796,Variable
-TripAlarmType_ConfirmedState_Name,10797,Variable
-TripAlarmType_ConfirmedState_Number,10798,Variable
-TripAlarmType_ConfirmedState_EffectiveDisplayName,10799,Variable
-TripAlarmType_ConfirmedState_TransitionTime,10800,Variable
-TripAlarmType_ConfirmedState_EffectiveTransitionTime,10801,Variable
-TripAlarmType_ConfirmedState_TrueState,10802,Variable
-TripAlarmType_ConfirmedState_FalseState,10803,Variable
-TripAlarmType_Acknowledge,10804,Method
-TripAlarmType_Acknowledge_InputArguments,10805,Variable
-TripAlarmType_Confirm,10806,Method
-TripAlarmType_Confirm_InputArguments,10807,Variable
-TripAlarmType_ActiveState,10808,Variable
-TripAlarmType_ActiveState_Id,10809,Variable
-TripAlarmType_ActiveState_Name,10810,Variable
-TripAlarmType_ActiveState_Number,10811,Variable
-TripAlarmType_ActiveState_EffectiveDisplayName,10812,Variable
-TripAlarmType_ActiveState_TransitionTime,10813,Variable
-TripAlarmType_ActiveState_EffectiveTransitionTime,10814,Variable
-TripAlarmType_ActiveState_TrueState,10815,Variable
-TripAlarmType_ActiveState_FalseState,10816,Variable
-TripAlarmType_SuppressedState,10817,Variable
-TripAlarmType_SuppressedState_Id,10818,Variable
-TripAlarmType_SuppressedState_Name,10819,Variable
-TripAlarmType_SuppressedState_Number,10820,Variable
-TripAlarmType_SuppressedState_EffectiveDisplayName,10821,Variable
-TripAlarmType_SuppressedState_TransitionTime,10822,Variable
-TripAlarmType_SuppressedState_EffectiveTransitionTime,10823,Variable
-TripAlarmType_SuppressedState_TrueState,10824,Variable
-TripAlarmType_SuppressedState_FalseState,10825,Variable
-TripAlarmType_ShelvingState,10826,Object
-TripAlarmType_ShelvingState_CurrentState,10827,Variable
-TripAlarmType_ShelvingState_CurrentState_Id,10828,Variable
-TripAlarmType_ShelvingState_CurrentState_Name,10829,Variable
-TripAlarmType_ShelvingState_CurrentState_Number,10830,Variable
-TripAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,10831,Variable
-TripAlarmType_ShelvingState_LastTransition,10832,Variable
-TripAlarmType_ShelvingState_LastTransition_Id,10833,Variable
-TripAlarmType_ShelvingState_LastTransition_Name,10834,Variable
-TripAlarmType_ShelvingState_LastTransition_Number,10835,Variable
-TripAlarmType_ShelvingState_LastTransition_TransitionTime,10836,Variable
-TripAlarmType_ShelvingState_UnshelveTime,10837,Variable
-TripAlarmType_ShelvingState_Unshelve,10859,Method
-TripAlarmType_ShelvingState_OneShotShelve,10860,Method
-TripAlarmType_ShelvingState_TimedShelve,10861,Method
-TripAlarmType_ShelvingState_TimedShelve_InputArguments,10862,Variable
-TripAlarmType_SuppressedOrShelved,10863,Variable
-TripAlarmType_MaxTimeShelved,10864,Variable
-AuditConditionShelvingEventType,11093,ObjectType
-AuditConditionShelvingEventType_EventId,11094,Variable
-AuditConditionShelvingEventType_EventType,11095,Variable
-AuditConditionShelvingEventType_SourceNode,11096,Variable
-AuditConditionShelvingEventType_SourceName,11097,Variable
-AuditConditionShelvingEventType_Time,11098,Variable
-AuditConditionShelvingEventType_ReceiveTime,11099,Variable
-AuditConditionShelvingEventType_LocalTime,11100,Variable
-AuditConditionShelvingEventType_Message,11101,Variable
-AuditConditionShelvingEventType_Severity,11102,Variable
-AuditConditionShelvingEventType_ActionTimeStamp,11103,Variable
-AuditConditionShelvingEventType_Status,11104,Variable
-AuditConditionShelvingEventType_ServerId,11105,Variable
-AuditConditionShelvingEventType_ClientAuditEntryId,11106,Variable
-AuditConditionShelvingEventType_ClientUserId,11107,Variable
-AuditConditionShelvingEventType_MethodId,11108,Variable
-AuditConditionShelvingEventType_InputArguments,11109,Variable
-TwoStateVariableType_TrueState,11110,Variable
-TwoStateVariableType_FalseState,11111,Variable
-ConditionType_ConditionClassId,11112,Variable
-ConditionType_ConditionClassName,11113,Variable
-DialogConditionType_ConditionClassId,11114,Variable
-DialogConditionType_ConditionClassName,11115,Variable
-AcknowledgeableConditionType_ConditionClassId,11116,Variable
-AcknowledgeableConditionType_ConditionClassName,11117,Variable
-AlarmConditionType_ConditionClassId,11118,Variable
-AlarmConditionType_ConditionClassName,11119,Variable
-AlarmConditionType_InputNode,11120,Variable
-LimitAlarmType_ConditionClassId,11121,Variable
-LimitAlarmType_ConditionClassName,11122,Variable
-LimitAlarmType_InputNode,11123,Variable
-LimitAlarmType_HighHighLimit,11124,Variable
-LimitAlarmType_HighLimit,11125,Variable
-LimitAlarmType_LowLimit,11126,Variable
-LimitAlarmType_LowLowLimit,11127,Variable
-ExclusiveLimitAlarmType_ConditionClassId,11128,Variable
-ExclusiveLimitAlarmType_ConditionClassName,11129,Variable
-ExclusiveLimitAlarmType_InputNode,11130,Variable
-ExclusiveLevelAlarmType_ConditionClassId,11131,Variable
-ExclusiveLevelAlarmType_ConditionClassName,11132,Variable
-ExclusiveLevelAlarmType_InputNode,11133,Variable
-ExclusiveRateOfChangeAlarmType_ConditionClassId,11134,Variable
-ExclusiveRateOfChangeAlarmType_ConditionClassName,11135,Variable
-ExclusiveRateOfChangeAlarmType_InputNode,11136,Variable
-ExclusiveDeviationAlarmType_ConditionClassId,11137,Variable
-ExclusiveDeviationAlarmType_ConditionClassName,11138,Variable
-ExclusiveDeviationAlarmType_InputNode,11139,Variable
-NonExclusiveLimitAlarmType_ConditionClassId,11140,Variable
-NonExclusiveLimitAlarmType_ConditionClassName,11141,Variable
-NonExclusiveLimitAlarmType_InputNode,11142,Variable
-NonExclusiveLevelAlarmType_ConditionClassId,11143,Variable
-NonExclusiveLevelAlarmType_ConditionClassName,11144,Variable
-NonExclusiveLevelAlarmType_InputNode,11145,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionClassId,11146,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionClassName,11147,Variable
-NonExclusiveRateOfChangeAlarmType_InputNode,11148,Variable
-NonExclusiveDeviationAlarmType_ConditionClassId,11149,Variable
-NonExclusiveDeviationAlarmType_ConditionClassName,11150,Variable
-NonExclusiveDeviationAlarmType_InputNode,11151,Variable
-DiscreteAlarmType_ConditionClassId,11152,Variable
-DiscreteAlarmType_ConditionClassName,11153,Variable
-DiscreteAlarmType_InputNode,11154,Variable
-OffNormalAlarmType_ConditionClassId,11155,Variable
-OffNormalAlarmType_ConditionClassName,11156,Variable
-OffNormalAlarmType_InputNode,11157,Variable
-OffNormalAlarmType_NormalState,11158,Variable
-TripAlarmType_ConditionClassId,11159,Variable
-TripAlarmType_ConditionClassName,11160,Variable
-TripAlarmType_InputNode,11161,Variable
-TripAlarmType_NormalState,11162,Variable
-BaseConditionClassType,11163,ObjectType
-ProcessConditionClassType,11164,ObjectType
-MaintenanceConditionClassType,11165,ObjectType
-SystemConditionClassType,11166,ObjectType
-HistoricalDataConfigurationType_AggregateConfiguration_TreatUncertainAsBad,11168,Variable
-HistoricalDataConfigurationType_AggregateConfiguration_PercentDataBad,11169,Variable
-HistoricalDataConfigurationType_AggregateConfiguration_PercentDataGood,11170,Variable
-HistoricalDataConfigurationType_AggregateConfiguration_UseSlopedExtrapolation,11171,Variable
-HistoryServerCapabilitiesType_AggregateFunctions,11172,Object
-AggregateConfigurationType,11187,ObjectType
-AggregateConfigurationType_TreatUncertainAsBad,11188,Variable
-AggregateConfigurationType_PercentDataBad,11189,Variable
-AggregateConfigurationType_PercentDataGood,11190,Variable
-AggregateConfigurationType_UseSlopedExtrapolation,11191,Variable
-HistoryServerCapabilities,11192,Object
-HistoryServerCapabilities_AccessHistoryDataCapability,11193,Variable
-HistoryServerCapabilities_InsertDataCapability,11196,Variable
-HistoryServerCapabilities_ReplaceDataCapability,11197,Variable
-HistoryServerCapabilities_UpdateDataCapability,11198,Variable
-HistoryServerCapabilities_DeleteRawCapability,11199,Variable
-HistoryServerCapabilities_DeleteAtTimeCapability,11200,Variable
-HistoryServerCapabilities_AggregateFunctions,11201,Object
-HAConfiguration,11202,Object
-HAConfiguration_AggregateConfiguration,11203,Object
-HAConfiguration_AggregateConfiguration_TreatUncertainAsBad,11204,Variable
-HAConfiguration_AggregateConfiguration_PercentDataBad,11205,Variable
-HAConfiguration_AggregateConfiguration_PercentDataGood,11206,Variable
-HAConfiguration_AggregateConfiguration_UseSlopedExtrapolation,11207,Variable
-HAConfiguration_Stepped,11208,Variable
-HAConfiguration_Definition,11209,Variable
-HAConfiguration_MaxTimeInterval,11210,Variable
-HAConfiguration_MinTimeInterval,11211,Variable
-HAConfiguration_ExceptionDeviation,11212,Variable
-HAConfiguration_ExceptionDeviationFormat,11213,Variable
-Annotations,11214,Variable
-HistoricalEventFilter,11215,Variable
-ModificationInfo,11216,DataType
-HistoryModifiedData,11217,DataType
-ModificationInfo_Encoding_DefaultXml,11218,Object
-HistoryModifiedData_Encoding_DefaultXml,11219,Object
-ModificationInfo_Encoding_DefaultBinary,11226,Object
-HistoryModifiedData_Encoding_DefaultBinary,11227,Object
-HistoryUpdateType,11234,DataType
-MultiStateValueDiscreteType,11238,VariableType
-MultiStateValueDiscreteType_Definition,11239,Variable
-MultiStateValueDiscreteType_ValuePrecision,11240,Variable
-MultiStateValueDiscreteType_EnumValues,11241,Variable
-HistoryServerCapabilities_AccessHistoryEventsCapability,11242,Variable
-HistoryServerCapabilitiesType_MaxReturnDataValues,11268,Variable
-HistoryServerCapabilitiesType_MaxReturnEventValues,11269,Variable
-HistoryServerCapabilitiesType_InsertAnnotationCapability,11270,Variable
-HistoryServerCapabilities_MaxReturnDataValues,11273,Variable
-HistoryServerCapabilities_MaxReturnEventValues,11274,Variable
-HistoryServerCapabilities_InsertAnnotationCapability,11275,Variable
-HistoryServerCapabilitiesType_InsertEventCapability,11278,Variable
-HistoryServerCapabilitiesType_ReplaceEventCapability,11279,Variable
-HistoryServerCapabilitiesType_UpdateEventCapability,11280,Variable
-HistoryServerCapabilities_InsertEventCapability,11281,Variable
-HistoryServerCapabilities_ReplaceEventCapability,11282,Variable
-HistoryServerCapabilities_UpdateEventCapability,11283,Variable
-AggregateFunction_TimeAverage2,11285,Object
-AggregateFunction_Minimum2,11286,Object
-AggregateFunction_Maximum2,11287,Object
-AggregateFunction_Range2,11288,Object
-AggregateFunction_WorstQuality2,11292,Object
-PerformUpdateType,11293,DataType
-UpdateStructureDataDetails,11295,DataType
-UpdateStructureDataDetails_Encoding_DefaultXml,11296,Object
-UpdateStructureDataDetails_Encoding_DefaultBinary,11300,Object
-AggregateFunction_Total2,11304,Object
-AggregateFunction_MinimumActualTime2,11305,Object
-AggregateFunction_MaximumActualTime2,11306,Object
-AggregateFunction_DurationInStateZero,11307,Object
-AggregateFunction_DurationInStateNonZero,11308,Object
-Server_ServerRedundancy_CurrentServerId,11312,Variable
-Server_ServerRedundancy_RedundantServerArray,11313,Variable
-Server_ServerRedundancy_ServerUriArray,11314,Variable
-ShelvedStateMachineType_UnshelvedToTimedShelved_TransitionNumber,11322,Variable
-ShelvedStateMachineType_UnshelvedToOneShotShelved_TransitionNumber,11323,Variable
-ShelvedStateMachineType_TimedShelvedToUnshelved_TransitionNumber,11324,Variable
-ShelvedStateMachineType_TimedShelvedToOneShotShelved_TransitionNumber,11325,Variable
-ShelvedStateMachineType_OneShotShelvedToUnshelved_TransitionNumber,11326,Variable
-ShelvedStateMachineType_OneShotShelvedToTimedShelved_TransitionNumber,11327,Variable
-ExclusiveLimitStateMachineType_LowLowToLow_TransitionNumber,11340,Variable
-ExclusiveLimitStateMachineType_LowToLowLow_TransitionNumber,11341,Variable
-ExclusiveLimitStateMachineType_HighHighToHigh_TransitionNumber,11342,Variable
-ExclusiveLimitStateMachineType_HighToHighHigh_TransitionNumber,11343,Variable
-AggregateFunction_StandardDeviationSample,11426,Object
-AggregateFunction_StandardDeviationPopulation,11427,Object
-AggregateFunction_VarianceSample,11428,Object
-AggregateFunction_VariancePopulation,11429,Object
-EnumStrings,11432,Variable
-ValueAsText,11433,Variable
-ProgressEventType,11436,ObjectType
-ProgressEventType_EventId,11437,Variable
-ProgressEventType_EventType,11438,Variable
-ProgressEventType_SourceNode,11439,Variable
-ProgressEventType_SourceName,11440,Variable
-ProgressEventType_Time,11441,Variable
-ProgressEventType_ReceiveTime,11442,Variable
-ProgressEventType_LocalTime,11443,Variable
-ProgressEventType_Message,11444,Variable
-ProgressEventType_Severity,11445,Variable
-SystemStatusChangeEventType,11446,ObjectType
-SystemStatusChangeEventType_EventId,11447,Variable
-SystemStatusChangeEventType_EventType,11448,Variable
-SystemStatusChangeEventType_SourceNode,11449,Variable
-SystemStatusChangeEventType_SourceName,11450,Variable
-SystemStatusChangeEventType_Time,11451,Variable
-SystemStatusChangeEventType_ReceiveTime,11452,Variable
-SystemStatusChangeEventType_LocalTime,11453,Variable
-SystemStatusChangeEventType_Message,11454,Variable
-SystemStatusChangeEventType_Severity,11455,Variable
-TransitionVariableType_EffectiveTransitionTime,11456,Variable
-FiniteTransitionVariableType_EffectiveTransitionTime,11457,Variable
-StateMachineType_LastTransition_EffectiveTransitionTime,11458,Variable
-FiniteStateMachineType_LastTransition_EffectiveTransitionTime,11459,Variable
-TransitionEventType_Transition_EffectiveTransitionTime,11460,Variable
-MultiStateValueDiscreteType_ValueAsText,11461,Variable
-ProgramTransitionEventType_Transition_EffectiveTransitionTime,11462,Variable
-ProgramTransitionAuditEventType_Transition_EffectiveTransitionTime,11463,Variable
-ProgramStateMachineType_LastTransition_EffectiveTransitionTime,11464,Variable
-ShelvedStateMachineType_LastTransition_EffectiveTransitionTime,11465,Variable
-AlarmConditionType_ShelvingState_LastTransition_EffectiveTransitionTime,11466,Variable
-LimitAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11467,Variable
-ExclusiveLimitStateMachineType_LastTransition_EffectiveTransitionTime,11468,Variable
-ExclusiveLimitAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11469,Variable
-ExclusiveLimitAlarmType_LimitState_LastTransition_EffectiveTransitionTime,11470,Variable
-ExclusiveLevelAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11471,Variable
-ExclusiveLevelAlarmType_LimitState_LastTransition_EffectiveTransitionTime,11472,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11473,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_LastTransition_EffectiveTransitionTime,11474,Variable
-ExclusiveDeviationAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11475,Variable
-ExclusiveDeviationAlarmType_LimitState_LastTransition_EffectiveTransitionTime,11476,Variable
-NonExclusiveLimitAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11477,Variable
-NonExclusiveLevelAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11478,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11479,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11480,Variable
-DiscreteAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11481,Variable
-OffNormalAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11482,Variable
-TripAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11483,Variable
-AuditActivateSessionEventType_SecureChannelId,11485,Variable
-OptionSetType,11487,VariableType
-OptionSetType_OptionSetValues,11488,Variable
-ServerType_GetMonitoredItems,11489,Method
-ServerType_GetMonitoredItems_InputArguments,11490,Variable
-ServerType_GetMonitoredItems_OutputArguments,11491,Variable
-Server_GetMonitoredItems,11492,Method
-Server_GetMonitoredItems_InputArguments,11493,Variable
-Server_GetMonitoredItems_OutputArguments,11494,Variable
-GetMonitoredItemsMethodType,11495,Method
-GetMonitoredItemsMethodType_InputArguments,11496,Variable
-GetMonitoredItemsMethodType_OutputArguments,11497,Variable
-MaxStringLength,11498,Variable
-HistoricalDataConfigurationType_StartOfArchive,11499,Variable
-HistoricalDataConfigurationType_StartOfOnlineArchive,11500,Variable
-HistoryServerCapabilitiesType_DeleteEventCapability,11501,Variable
-HistoryServerCapabilities_DeleteEventCapability,11502,Variable
-HAConfiguration_StartOfArchive,11503,Variable
-HAConfiguration_StartOfOnlineArchive,11504,Variable
-AggregateFunction_StartBound,11505,Object
-AggregateFunction_EndBound,11506,Object
-AggregateFunction_DeltaBounds,11507,Object
-ModellingRule_OptionalPlaceholder,11508,Object
-ModellingRule_OptionalPlaceholder_NamingRule,11509,Variable
-ModellingRule_MandatoryPlaceholder,11510,Object
-ModellingRule_MandatoryPlaceholder_NamingRule,11511,Variable
-MaxArrayLength,11512,Variable
-EngineeringUnits,11513,Variable
-ServerType_ServerCapabilities_MaxArrayLength,11514,Variable
-ServerType_ServerCapabilities_MaxStringLength,11515,Variable
-ServerType_ServerCapabilities_OperationLimits,11516,Object
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerRead,11517,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerWrite,11519,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerMethodCall,11521,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerBrowse,11522,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerRegisterNodes,11523,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerTranslateBrowsePathsToNodeIds,11524,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerNodeManagement,11525,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxMonitoredItemsPerCall,11526,Variable
-ServerType_Namespaces,11527,Object
-ServerCapabilitiesType_MaxArrayLength,11549,Variable
-ServerCapabilitiesType_MaxStringLength,11550,Variable
-ServerCapabilitiesType_OperationLimits,11551,Object
-ServerCapabilitiesType_OperationLimits_MaxNodesPerRead,11552,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerWrite,11554,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerMethodCall,11556,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerBrowse,11557,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerRegisterNodes,11558,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerTranslateBrowsePathsToNodeIds,11559,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerNodeManagement,11560,Variable
-ServerCapabilitiesType_OperationLimits_MaxMonitoredItemsPerCall,11561,Variable
-ServerCapabilitiesType_VendorCapability_Placeholder,11562,Variable
-OperationLimitsType,11564,ObjectType
-OperationLimitsType_MaxNodesPerRead,11565,Variable
-OperationLimitsType_MaxNodesPerWrite,11567,Variable
-OperationLimitsType_MaxNodesPerMethodCall,11569,Variable
-OperationLimitsType_MaxNodesPerBrowse,11570,Variable
-OperationLimitsType_MaxNodesPerRegisterNodes,11571,Variable
-OperationLimitsType_MaxNodesPerTranslateBrowsePathsToNodeIds,11572,Variable
-OperationLimitsType_MaxNodesPerNodeManagement,11573,Variable
-OperationLimitsType_MaxMonitoredItemsPerCall,11574,Variable
-FileType,11575,ObjectType
-FileType_Size,11576,Variable
-FileType_OpenCount,11579,Variable
-FileType_Open,11580,Method
-FileType_Open_InputArguments,11581,Variable
-FileType_Open_OutputArguments,11582,Variable
-FileType_Close,11583,Method
-FileType_Close_InputArguments,11584,Variable
-FileType_Read,11585,Method
-FileType_Read_InputArguments,11586,Variable
-FileType_Read_OutputArguments,11587,Variable
-FileType_Write,11588,Method
-FileType_Write_InputArguments,11589,Variable
-FileType_GetPosition,11590,Method
-FileType_GetPosition_InputArguments,11591,Variable
-FileType_GetPosition_OutputArguments,11592,Variable
-FileType_SetPosition,11593,Method
-FileType_SetPosition_InputArguments,11594,Variable
-AddressSpaceFileType,11595,ObjectType
-AddressSpaceFileType_Size,11596,Variable
-AddressSpaceFileType_OpenCount,11599,Variable
-AddressSpaceFileType_Open,11600,Method
-AddressSpaceFileType_Open_InputArguments,11601,Variable
-AddressSpaceFileType_Open_OutputArguments,11602,Variable
-AddressSpaceFileType_Close,11603,Method
-AddressSpaceFileType_Close_InputArguments,11604,Variable
-AddressSpaceFileType_Read,11605,Method
-AddressSpaceFileType_Read_InputArguments,11606,Variable
-AddressSpaceFileType_Read_OutputArguments,11607,Variable
-AddressSpaceFileType_Write,11608,Method
-AddressSpaceFileType_Write_InputArguments,11609,Variable
-AddressSpaceFileType_GetPosition,11610,Method
-AddressSpaceFileType_GetPosition_InputArguments,11611,Variable
-AddressSpaceFileType_GetPosition_OutputArguments,11612,Variable
-AddressSpaceFileType_SetPosition,11613,Method
-AddressSpaceFileType_SetPosition_InputArguments,11614,Variable
-AddressSpaceFileType_ExportNamespace,11615,Method
-NamespaceMetadataType,11616,ObjectType
-NamespaceMetadataType_NamespaceUri,11617,Variable
-NamespaceMetadataType_NamespaceVersion,11618,Variable
-NamespaceMetadataType_NamespacePublicationDate,11619,Variable
-NamespaceMetadataType_IsNamespaceSubset,11620,Variable
-NamespaceMetadataType_StaticNodeIdTypes,11621,Variable
-NamespaceMetadataType_StaticNumericNodeIdRange,11622,Variable
-NamespaceMetadataType_StaticStringNodeIdPattern,11623,Variable
-NamespaceMetadataType_NamespaceFile,11624,Object
-NamespaceMetadataType_NamespaceFile_Size,11625,Variable
-NamespaceMetadataType_NamespaceFile_OpenCount,11628,Variable
-NamespaceMetadataType_NamespaceFile_Open,11629,Method
-NamespaceMetadataType_NamespaceFile_Open_InputArguments,11630,Variable
-NamespaceMetadataType_NamespaceFile_Open_OutputArguments,11631,Variable
-NamespaceMetadataType_NamespaceFile_Close,11632,Method
-NamespaceMetadataType_NamespaceFile_Close_InputArguments,11633,Variable
-NamespaceMetadataType_NamespaceFile_Read,11634,Method
-NamespaceMetadataType_NamespaceFile_Read_InputArguments,11635,Variable
-NamespaceMetadataType_NamespaceFile_Read_OutputArguments,11636,Variable
-NamespaceMetadataType_NamespaceFile_Write,11637,Method
-NamespaceMetadataType_NamespaceFile_Write_InputArguments,11638,Variable
-NamespaceMetadataType_NamespaceFile_GetPosition,11639,Method
-NamespaceMetadataType_NamespaceFile_GetPosition_InputArguments,11640,Variable
-NamespaceMetadataType_NamespaceFile_GetPosition_OutputArguments,11641,Variable
-NamespaceMetadataType_NamespaceFile_SetPosition,11642,Method
-NamespaceMetadataType_NamespaceFile_SetPosition_InputArguments,11643,Variable
-NamespaceMetadataType_NamespaceFile_ExportNamespace,11644,Method
-NamespacesType,11645,ObjectType
-NamespacesType_NamespaceIdentifier_Placeholder,11646,Object
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceUri,11647,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceVersion,11648,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespacePublicationDate,11649,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_IsNamespaceSubset,11650,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_StaticNodeIdTypes,11651,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_StaticNumericNodeIdRange,11652,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_StaticStringNodeIdPattern,11653,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile,11654,Object
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Size,11655,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_OpenCount,11658,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Open,11659,Method
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Open_InputArguments,11660,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Open_OutputArguments,11661,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Close,11662,Method
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Close_InputArguments,11663,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Read,11664,Method
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Read_InputArguments,11665,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Read_OutputArguments,11666,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Write,11667,Method
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Write_InputArguments,11668,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_GetPosition,11669,Method
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_GetPosition_InputArguments,11670,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_GetPosition_OutputArguments,11671,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_SetPosition,11672,Method
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_SetPosition_InputArguments,11673,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_ExportNamespace,11674,Method
-SystemStatusChangeEventType_SystemState,11696,Variable
-SamplingIntervalDiagnosticsType_SampledMonitoredItemsCount,11697,Variable
-SamplingIntervalDiagnosticsType_MaxSampledMonitoredItemsCount,11698,Variable
-SamplingIntervalDiagnosticsType_DisabledMonitoredItemsSamplingCount,11699,Variable
-OptionSetType_BitMask,11701,Variable
-Server_ServerCapabilities_MaxArrayLength,11702,Variable
-Server_ServerCapabilities_MaxStringLength,11703,Variable
-Server_ServerCapabilities_OperationLimits,11704,Object
-Server_ServerCapabilities_OperationLimits_MaxNodesPerRead,11705,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerWrite,11707,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerMethodCall,11709,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerBrowse,11710,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerRegisterNodes,11711,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerTranslateBrowsePathsToNodeIds,11712,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerNodeManagement,11713,Variable
-Server_ServerCapabilities_OperationLimits_MaxMonitoredItemsPerCall,11714,Variable
-Server_Namespaces,11715,Object
-BitFieldMaskDataType,11737,DataType
-OpenMethodType,11738,Method
-OpenMethodType_InputArguments,11739,Variable
-OpenMethodType_OutputArguments,11740,Variable
-CloseMethodType,11741,Method
-CloseMethodType_InputArguments,11742,Variable
-ReadMethodType,11743,Method
-ReadMethodType_InputArguments,11744,Variable
-ReadMethodType_OutputArguments,11745,Variable
-WriteMethodType,11746,Method
-WriteMethodType_InputArguments,11747,Variable
-GetPositionMethodType,11748,Method
-GetPositionMethodType_InputArguments,11749,Variable
-GetPositionMethodType_OutputArguments,11750,Variable
-SetPositionMethodType,11751,Method
-SetPositionMethodType_InputArguments,11752,Variable
-SystemOffNormalAlarmType,11753,ObjectType
-SystemOffNormalAlarmType_EventId,11754,Variable
-SystemOffNormalAlarmType_EventType,11755,Variable
-SystemOffNormalAlarmType_SourceNode,11756,Variable
-SystemOffNormalAlarmType_SourceName,11757,Variable
-SystemOffNormalAlarmType_Time,11758,Variable
-SystemOffNormalAlarmType_ReceiveTime,11759,Variable
-SystemOffNormalAlarmType_LocalTime,11760,Variable
-SystemOffNormalAlarmType_Message,11761,Variable
-SystemOffNormalAlarmType_Severity,11762,Variable
-SystemOffNormalAlarmType_ConditionClassId,11763,Variable
-SystemOffNormalAlarmType_ConditionClassName,11764,Variable
-SystemOffNormalAlarmType_ConditionName,11765,Variable
-SystemOffNormalAlarmType_BranchId,11766,Variable
-SystemOffNormalAlarmType_Retain,11767,Variable
-SystemOffNormalAlarmType_EnabledState,11768,Variable
-SystemOffNormalAlarmType_EnabledState_Id,11769,Variable
-SystemOffNormalAlarmType_EnabledState_Name,11770,Variable
-SystemOffNormalAlarmType_EnabledState_Number,11771,Variable
-SystemOffNormalAlarmType_EnabledState_EffectiveDisplayName,11772,Variable
-SystemOffNormalAlarmType_EnabledState_TransitionTime,11773,Variable
-SystemOffNormalAlarmType_EnabledState_EffectiveTransitionTime,11774,Variable
-SystemOffNormalAlarmType_EnabledState_TrueState,11775,Variable
-SystemOffNormalAlarmType_EnabledState_FalseState,11776,Variable
-SystemOffNormalAlarmType_Quality,11777,Variable
-SystemOffNormalAlarmType_Quality_SourceTimestamp,11778,Variable
-SystemOffNormalAlarmType_LastSeverity,11779,Variable
-SystemOffNormalAlarmType_LastSeverity_SourceTimestamp,11780,Variable
-SystemOffNormalAlarmType_Comment,11781,Variable
-SystemOffNormalAlarmType_Comment_SourceTimestamp,11782,Variable
-SystemOffNormalAlarmType_ClientUserId,11783,Variable
-SystemOffNormalAlarmType_Disable,11784,Method
-SystemOffNormalAlarmType_Enable,11785,Method
-SystemOffNormalAlarmType_AddComment,11786,Method
-SystemOffNormalAlarmType_AddComment_InputArguments,11787,Variable
-SystemOffNormalAlarmType_ConditionRefresh,11788,Method
-SystemOffNormalAlarmType_ConditionRefresh_InputArguments,11789,Variable
-SystemOffNormalAlarmType_AckedState,11790,Variable
-SystemOffNormalAlarmType_AckedState_Id,11791,Variable
-SystemOffNormalAlarmType_AckedState_Name,11792,Variable
-SystemOffNormalAlarmType_AckedState_Number,11793,Variable
-SystemOffNormalAlarmType_AckedState_EffectiveDisplayName,11794,Variable
-SystemOffNormalAlarmType_AckedState_TransitionTime,11795,Variable
-SystemOffNormalAlarmType_AckedState_EffectiveTransitionTime,11796,Variable
-SystemOffNormalAlarmType_AckedState_TrueState,11797,Variable
-SystemOffNormalAlarmType_AckedState_FalseState,11798,Variable
-SystemOffNormalAlarmType_ConfirmedState,11799,Variable
-SystemOffNormalAlarmType_ConfirmedState_Id,11800,Variable
-SystemOffNormalAlarmType_ConfirmedState_Name,11801,Variable
-SystemOffNormalAlarmType_ConfirmedState_Number,11802,Variable
-SystemOffNormalAlarmType_ConfirmedState_EffectiveDisplayName,11803,Variable
-SystemOffNormalAlarmType_ConfirmedState_TransitionTime,11804,Variable
-SystemOffNormalAlarmType_ConfirmedState_EffectiveTransitionTime,11805,Variable
-SystemOffNormalAlarmType_ConfirmedState_TrueState,11806,Variable
-SystemOffNormalAlarmType_ConfirmedState_FalseState,11807,Variable
-SystemOffNormalAlarmType_Acknowledge,11808,Method
-SystemOffNormalAlarmType_Acknowledge_InputArguments,11809,Variable
-SystemOffNormalAlarmType_Confirm,11810,Method
-SystemOffNormalAlarmType_Confirm_InputArguments,11811,Variable
-SystemOffNormalAlarmType_ActiveState,11812,Variable
-SystemOffNormalAlarmType_ActiveState_Id,11813,Variable
-SystemOffNormalAlarmType_ActiveState_Name,11814,Variable
-SystemOffNormalAlarmType_ActiveState_Number,11815,Variable
-SystemOffNormalAlarmType_ActiveState_EffectiveDisplayName,11816,Variable
-SystemOffNormalAlarmType_ActiveState_TransitionTime,11817,Variable
-SystemOffNormalAlarmType_ActiveState_EffectiveTransitionTime,11818,Variable
-SystemOffNormalAlarmType_ActiveState_TrueState,11819,Variable
-SystemOffNormalAlarmType_ActiveState_FalseState,11820,Variable
-SystemOffNormalAlarmType_InputNode,11821,Variable
-SystemOffNormalAlarmType_SuppressedState,11822,Variable
-SystemOffNormalAlarmType_SuppressedState_Id,11823,Variable
-SystemOffNormalAlarmType_SuppressedState_Name,11824,Variable
-SystemOffNormalAlarmType_SuppressedState_Number,11825,Variable
-SystemOffNormalAlarmType_SuppressedState_EffectiveDisplayName,11826,Variable
-SystemOffNormalAlarmType_SuppressedState_TransitionTime,11827,Variable
-SystemOffNormalAlarmType_SuppressedState_EffectiveTransitionTime,11828,Variable
-SystemOffNormalAlarmType_SuppressedState_TrueState,11829,Variable
-SystemOffNormalAlarmType_SuppressedState_FalseState,11830,Variable
-SystemOffNormalAlarmType_ShelvingState,11831,Object
-SystemOffNormalAlarmType_ShelvingState_CurrentState,11832,Variable
-SystemOffNormalAlarmType_ShelvingState_CurrentState_Id,11833,Variable
-SystemOffNormalAlarmType_ShelvingState_CurrentState_Name,11834,Variable
-SystemOffNormalAlarmType_ShelvingState_CurrentState_Number,11835,Variable
-SystemOffNormalAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,11836,Variable
-SystemOffNormalAlarmType_ShelvingState_LastTransition,11837,Variable
-SystemOffNormalAlarmType_ShelvingState_LastTransition_Id,11838,Variable
-SystemOffNormalAlarmType_ShelvingState_LastTransition_Name,11839,Variable
-SystemOffNormalAlarmType_ShelvingState_LastTransition_Number,11840,Variable
-SystemOffNormalAlarmType_ShelvingState_LastTransition_TransitionTime,11841,Variable
-SystemOffNormalAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,11842,Variable
-SystemOffNormalAlarmType_ShelvingState_UnshelveTime,11843,Variable
-SystemOffNormalAlarmType_ShelvingState_Unshelve,11844,Method
-SystemOffNormalAlarmType_ShelvingState_OneShotShelve,11845,Method
-SystemOffNormalAlarmType_ShelvingState_TimedShelve,11846,Method
-SystemOffNormalAlarmType_ShelvingState_TimedShelve_InputArguments,11847,Variable
-SystemOffNormalAlarmType_SuppressedOrShelved,11848,Variable
-SystemOffNormalAlarmType_MaxTimeShelved,11849,Variable
-SystemOffNormalAlarmType_NormalState,11850,Variable
-AuditConditionCommentEventType_Comment,11851,Variable
-AuditConditionRespondEventType_SelectedResponse,11852,Variable
-AuditConditionAcknowledgeEventType_Comment,11853,Variable
-AuditConditionConfirmEventType_Comment,11854,Variable
-AuditConditionShelvingEventType_ShelvingTime,11855,Variable
-AuditProgramTransitionEventType,11856,ObjectType
-AuditProgramTransitionEventType_EventId,11857,Variable
-AuditProgramTransitionEventType_EventType,11858,Variable
-AuditProgramTransitionEventType_SourceNode,11859,Variable
-AuditProgramTransitionEventType_SourceName,11860,Variable
-AuditProgramTransitionEventType_Time,11861,Variable
-AuditProgramTransitionEventType_ReceiveTime,11862,Variable
-AuditProgramTransitionEventType_LocalTime,11863,Variable
-AuditProgramTransitionEventType_Message,11864,Variable
-AuditProgramTransitionEventType_Severity,11865,Variable
-AuditProgramTransitionEventType_ActionTimeStamp,11866,Variable
-AuditProgramTransitionEventType_Status,11867,Variable
-AuditProgramTransitionEventType_ServerId,11868,Variable
-AuditProgramTransitionEventType_ClientAuditEntryId,11869,Variable
-AuditProgramTransitionEventType_ClientUserId,11870,Variable
-AuditProgramTransitionEventType_MethodId,11871,Variable
-AuditProgramTransitionEventType_InputArguments,11872,Variable
-AuditProgramTransitionEventType_OldStateId,11873,Variable
-AuditProgramTransitionEventType_NewStateId,11874,Variable
-AuditProgramTransitionEventType_TransitionNumber,11875,Variable
-HistoricalDataConfigurationType_AggregateFunctions,11876,Object
-HAConfiguration_AggregateFunctions,11877,Object
-NodeClass_EnumValues,11878,Variable
-InstanceNode,11879,DataType
-TypeNode,11880,DataType
-NodeAttributesMask_EnumValues,11881,Variable
-BrowseResultMask_EnumValues,11883,Variable
-HistoryUpdateType_EnumValues,11884,Variable
-PerformUpdateType_EnumValues,11885,Variable
-InstanceNode_Encoding_DefaultXml,11887,Object
-TypeNode_Encoding_DefaultXml,11888,Object
-InstanceNode_Encoding_DefaultBinary,11889,Object
-TypeNode_Encoding_DefaultBinary,11890,Object
-SessionDiagnosticsObjectType_SessionDiagnostics_UnauthorizedRequestCount,11891,Variable
-SessionDiagnosticsVariableType_UnauthorizedRequestCount,11892,Variable
-OpenFileMode,11939,DataType
-OpenFileMode_EnumValues,11940,Variable
-ModelChangeStructureVerbMask,11941,DataType
-ModelChangeStructureVerbMask_EnumValues,11942,Variable
-EndpointUrlListDataType,11943,DataType
-NetworkGroupDataType,11944,DataType
-NonTransparentNetworkRedundancyType,11945,ObjectType
-NonTransparentNetworkRedundancyType_RedundancySupport,11946,Variable
-NonTransparentNetworkRedundancyType_ServerUriArray,11947,Variable
-NonTransparentNetworkRedundancyType_ServerNetworkGroups,11948,Variable
-EndpointUrlListDataType_Encoding_DefaultXml,11949,Object
-NetworkGroupDataType_Encoding_DefaultXml,11950,Object
-OpcUa_XmlSchema_EndpointUrlListDataType,11951,Variable
-OpcUa_XmlSchema_EndpointUrlListDataType_DataTypeVersion,11952,Variable
-OpcUa_XmlSchema_EndpointUrlListDataType_DictionaryFragment,11953,Variable
-OpcUa_XmlSchema_NetworkGroupDataType,11954,Variable
-OpcUa_XmlSchema_NetworkGroupDataType_DataTypeVersion,11955,Variable
-OpcUa_XmlSchema_NetworkGroupDataType_DictionaryFragment,11956,Variable
-EndpointUrlListDataType_Encoding_DefaultBinary,11957,Object
-NetworkGroupDataType_Encoding_DefaultBinary,11958,Object
-OpcUa_BinarySchema_EndpointUrlListDataType,11959,Variable
-OpcUa_BinarySchema_EndpointUrlListDataType_DataTypeVersion,11960,Variable
-OpcUa_BinarySchema_EndpointUrlListDataType_DictionaryFragment,11961,Variable
-OpcUa_BinarySchema_NetworkGroupDataType,11962,Variable
-OpcUa_BinarySchema_NetworkGroupDataType_DataTypeVersion,11963,Variable
-OpcUa_BinarySchema_NetworkGroupDataType_DictionaryFragment,11964,Variable
-ArrayItemType,12021,VariableType
-ArrayItemType_Definition,12022,Variable
-ArrayItemType_ValuePrecision,12023,Variable
-ArrayItemType_InstrumentRange,12024,Variable
-ArrayItemType_EURange,12025,Variable
-ArrayItemType_EngineeringUnits,12026,Variable
-ArrayItemType_Title,12027,Variable
-ArrayItemType_AxisScaleType,12028,Variable
-YArrayItemType,12029,VariableType
-YArrayItemType_Definition,12030,Variable
-YArrayItemType_ValuePrecision,12031,Variable
-YArrayItemType_InstrumentRange,12032,Variable
-YArrayItemType_EURange,12033,Variable
-YArrayItemType_EngineeringUnits,12034,Variable
-YArrayItemType_Title,12035,Variable
-YArrayItemType_AxisScaleType,12036,Variable
-YArrayItemType_XAxisDefinition,12037,Variable
-XYArrayItemType,12038,VariableType
-XYArrayItemType_Definition,12039,Variable
-XYArrayItemType_ValuePrecision,12040,Variable
-XYArrayItemType_InstrumentRange,12041,Variable
-XYArrayItemType_EURange,12042,Variable
-XYArrayItemType_EngineeringUnits,12043,Variable
-XYArrayItemType_Title,12044,Variable
-XYArrayItemType_AxisScaleType,12045,Variable
-XYArrayItemType_XAxisDefinition,12046,Variable
-ImageItemType,12047,VariableType
-ImageItemType_Definition,12048,Variable
-ImageItemType_ValuePrecision,12049,Variable
-ImageItemType_InstrumentRange,12050,Variable
-ImageItemType_EURange,12051,Variable
-ImageItemType_EngineeringUnits,12052,Variable
-ImageItemType_Title,12053,Variable
-ImageItemType_AxisScaleType,12054,Variable
-ImageItemType_XAxisDefinition,12055,Variable
-ImageItemType_YAxisDefinition,12056,Variable
-CubeItemType,12057,VariableType
-CubeItemType_Definition,12058,Variable
-CubeItemType_ValuePrecision,12059,Variable
-CubeItemType_InstrumentRange,12060,Variable
-CubeItemType_EURange,12061,Variable
-CubeItemType_EngineeringUnits,12062,Variable
-CubeItemType_Title,12063,Variable
-CubeItemType_AxisScaleType,12064,Variable
-CubeItemType_XAxisDefinition,12065,Variable
-CubeItemType_YAxisDefinition,12066,Variable
-CubeItemType_ZAxisDefinition,12067,Variable
-NDimensionArrayItemType,12068,VariableType
-NDimensionArrayItemType_Definition,12069,Variable
-NDimensionArrayItemType_ValuePrecision,12070,Variable
-NDimensionArrayItemType_InstrumentRange,12071,Variable
-NDimensionArrayItemType_EURange,12072,Variable
-NDimensionArrayItemType_EngineeringUnits,12073,Variable
-NDimensionArrayItemType_Title,12074,Variable
-NDimensionArrayItemType_AxisScaleType,12075,Variable
-NDimensionArrayItemType_AxisDefinition,12076,Variable
-AxisScaleEnumeration,12077,DataType
-AxisScaleEnumeration_EnumStrings,12078,Variable
-AxisInformation,12079,DataType
-XVType,12080,DataType
-AxisInformation_Encoding_DefaultXml,12081,Object
-XVType_Encoding_DefaultXml,12082,Object
-OpcUa_XmlSchema_AxisInformation,12083,Variable
-OpcUa_XmlSchema_AxisInformation_DataTypeVersion,12084,Variable
-OpcUa_XmlSchema_AxisInformation_DictionaryFragment,12085,Variable
-OpcUa_XmlSchema_XVType,12086,Variable
-OpcUa_XmlSchema_XVType_DataTypeVersion,12087,Variable
-OpcUa_XmlSchema_XVType_DictionaryFragment,12088,Variable
-AxisInformation_Encoding_DefaultBinary,12089,Object
-XVType_Encoding_DefaultBinary,12090,Object
-OpcUa_BinarySchema_AxisInformation,12091,Variable
-OpcUa_BinarySchema_AxisInformation_DataTypeVersion,12092,Variable
-OpcUa_BinarySchema_AxisInformation_DictionaryFragment,12093,Variable
-OpcUa_BinarySchema_XVType,12094,Variable
-OpcUa_BinarySchema_XVType_DataTypeVersion,12095,Variable
-OpcUa_BinarySchema_XVType_DictionaryFragment,12096,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder,12097,Object
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics,12098,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_SessionId,12099,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_SessionName,12100,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ClientDescription,12101,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ServerUri,12102,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_EndpointUrl,12103,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_LocaleIds,12104,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ActualSessionTimeout,12105,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_MaxResponseMessageSize,12106,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ClientConnectionTime,12107,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ClientLastContactTime,12108,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_CurrentSubscriptionsCount,12109,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_CurrentMonitoredItemsCount,12110,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_CurrentPublishRequestsInQueue,12111,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_TotalRequestCount,12112,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_UnauthorizedRequestCount,12113,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ReadCount,12114,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_HistoryReadCount,12115,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_WriteCount,12116,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_HistoryUpdateCount,12117,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_CallCount,12118,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_CreateMonitoredItemsCount,12119,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ModifyMonitoredItemsCount,12120,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_SetMonitoringModeCount,12121,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_SetTriggeringCount,12122,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_DeleteMonitoredItemsCount,12123,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_CreateSubscriptionCount,12124,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_ModifySubscriptionCount,12125,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_SetPublishingModeCount,12126,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_PublishCount,12127,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_RepublishCount,12128,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_TransferSubscriptionsCount,12129,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_DeleteSubscriptionsCount,12130,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_AddNodesCount,12131,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_AddReferencesCount,12132,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_DeleteNodesCount,12133,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_DeleteReferencesCount,12134,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_BrowseCount,12135,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_BrowseNextCount,12136,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_TranslateBrowsePathsToNodeIdsCount,12137,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_QueryFirstCount,12138,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_QueryNextCount,12139,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_RegisterNodesCount,12140,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionDiagnostics_UnregisterNodesCount,12141,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics,12142,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_SessionId,12143,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_ClientUserIdOfSession,12144,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_ClientUserIdHistory,12145,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_AuthenticationMechanism,12146,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_Encoding,12147,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_TransportProtocol,12148,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_SecurityMode,12149,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_SecurityPolicyUri,12150,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SessionSecurityDiagnostics_ClientCertificate,12151,Variable
-SessionsDiagnosticsSummaryType_ClientName_Placeholder_SubscriptionDiagnosticsArray,12152,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerHistoryReadData,12153,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerHistoryReadEvents,12154,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerHistoryUpdateData,12155,Variable
-ServerType_ServerCapabilities_OperationLimits_MaxNodesPerHistoryUpdateEvents,12156,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerHistoryReadData,12157,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerHistoryReadEvents,12158,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerHistoryUpdateData,12159,Variable
-ServerCapabilitiesType_OperationLimits_MaxNodesPerHistoryUpdateEvents,12160,Variable
-OperationLimitsType_MaxNodesPerHistoryReadData,12161,Variable
-OperationLimitsType_MaxNodesPerHistoryReadEvents,12162,Variable
-OperationLimitsType_MaxNodesPerHistoryUpdateData,12163,Variable
-OperationLimitsType_MaxNodesPerHistoryUpdateEvents,12164,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryReadData,12165,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryReadEvents,12166,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryUpdateData,12167,Variable
-Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryUpdateEvents,12168,Variable
-NamingRuleType_EnumValues,12169,Variable
-ViewVersion,12170,Variable
-ComplexNumberType,12171,DataType
-DoubleComplexNumberType,12172,DataType
-ComplexNumberType_Encoding_DefaultXml,12173,Object
-DoubleComplexNumberType_Encoding_DefaultXml,12174,Object
-OpcUa_XmlSchema_ComplexNumberType,12175,Variable
-OpcUa_XmlSchema_ComplexNumberType_DataTypeVersion,12176,Variable
-OpcUa_XmlSchema_ComplexNumberType_DictionaryFragment,12177,Variable
-OpcUa_XmlSchema_DoubleComplexNumberType,12178,Variable
-OpcUa_XmlSchema_DoubleComplexNumberType_DataTypeVersion,12179,Variable
-OpcUa_XmlSchema_DoubleComplexNumberType_DictionaryFragment,12180,Variable
-ComplexNumberType_Encoding_DefaultBinary,12181,Object
-DoubleComplexNumberType_Encoding_DefaultBinary,12182,Object
-OpcUa_BinarySchema_ComplexNumberType,12183,Variable
-OpcUa_BinarySchema_ComplexNumberType_DataTypeVersion,12184,Variable
-OpcUa_BinarySchema_ComplexNumberType_DictionaryFragment,12185,Variable
-OpcUa_BinarySchema_DoubleComplexNumberType,12186,Variable
-OpcUa_BinarySchema_DoubleComplexNumberType_DataTypeVersion,12187,Variable
-OpcUa_BinarySchema_DoubleComplexNumberType_DictionaryFragment,12188,Variable
-ServerOnNetwork,12189,DataType
-FindServersOnNetworkRequest,12190,DataType
-FindServersOnNetworkResponse,12191,DataType
-RegisterServer2Request,12193,DataType
-RegisterServer2Response,12194,DataType
-ServerOnNetwork_Encoding_DefaultXml,12195,Object
-FindServersOnNetworkRequest_Encoding_DefaultXml,12196,Object
-FindServersOnNetworkResponse_Encoding_DefaultXml,12197,Object
-RegisterServer2Request_Encoding_DefaultXml,12199,Object
-RegisterServer2Response_Encoding_DefaultXml,12200,Object
-OpcUa_XmlSchema_ServerOnNetwork,12201,Variable
-OpcUa_XmlSchema_ServerOnNetwork_DataTypeVersion,12202,Variable
-OpcUa_XmlSchema_ServerOnNetwork_DictionaryFragment,12203,Variable
-ServerOnNetwork_Encoding_DefaultBinary,12207,Object
-FindServersOnNetworkRequest_Encoding_DefaultBinary,12208,Object
-FindServersOnNetworkResponse_Encoding_DefaultBinary,12209,Object
-RegisterServer2Request_Encoding_DefaultBinary,12211,Object
-RegisterServer2Response_Encoding_DefaultBinary,12212,Object
-OpcUa_BinarySchema_ServerOnNetwork,12213,Variable
-OpcUa_BinarySchema_ServerOnNetwork_DataTypeVersion,12214,Variable
-OpcUa_BinarySchema_ServerOnNetwork_DictionaryFragment,12215,Variable
-ProgressEventType_Context,12502,Variable
-ProgressEventType_Progress,12503,Variable
-OpenWithMasksMethodType,12513,Method
-OpenWithMasksMethodType_InputArguments,12514,Variable
-OpenWithMasksMethodType_OutputArguments,12515,Variable
-CloseAndUpdateMethodType,12516,Method
-CloseAndUpdateMethodType_OutputArguments,12517,Variable
-AddCertificateMethodType,12518,Method
-AddCertificateMethodType_InputArguments,12519,Variable
-RemoveCertificateMethodType,12520,Method
-RemoveCertificateMethodType_InputArguments,12521,Variable
-TrustListType,12522,ObjectType
-TrustListType_Size,12523,Variable
-TrustListType_OpenCount,12526,Variable
-TrustListType_Open,12527,Method
-TrustListType_Open_InputArguments,12528,Variable
-TrustListType_Open_OutputArguments,12529,Variable
-TrustListType_Close,12530,Method
-TrustListType_Close_InputArguments,12531,Variable
-TrustListType_Read,12532,Method
-TrustListType_Read_InputArguments,12533,Variable
-TrustListType_Read_OutputArguments,12534,Variable
-TrustListType_Write,12535,Method
-TrustListType_Write_InputArguments,12536,Variable
-TrustListType_GetPosition,12537,Method
-TrustListType_GetPosition_InputArguments,12538,Variable
-TrustListType_GetPosition_OutputArguments,12539,Variable
-TrustListType_SetPosition,12540,Method
-TrustListType_SetPosition_InputArguments,12541,Variable
-TrustListType_LastUpdateTime,12542,Variable
-TrustListType_OpenWithMasks,12543,Method
-TrustListType_OpenWithMasks_InputArguments,12544,Variable
-TrustListType_OpenWithMasks_OutputArguments,12545,Variable
-TrustListType_CloseAndUpdate,12546,Method
-TrustListType_CloseAndUpdate_OutputArguments,12547,Variable
-TrustListType_AddCertificate,12548,Method
-TrustListType_AddCertificate_InputArguments,12549,Variable
-TrustListType_RemoveCertificate,12550,Method
-TrustListType_RemoveCertificate_InputArguments,12551,Variable
-TrustListMasks,12552,DataType
-TrustListMasks_EnumValues,12553,Variable
-TrustListDataType,12554,DataType
-CertificateGroupType,12555,ObjectType
-CertificateType,12556,ObjectType
-ApplicationCertificateType,12557,ObjectType
-HttpsCertificateType,12558,ObjectType
-RsaMinApplicationCertificateType,12559,ObjectType
-RsaSha256ApplicationCertificateType,12560,ObjectType
-TrustListUpdatedAuditEventType,12561,ObjectType
-TrustListUpdatedAuditEventType_EventId,12562,Variable
-TrustListUpdatedAuditEventType_EventType,12563,Variable
-TrustListUpdatedAuditEventType_SourceNode,12564,Variable
-TrustListUpdatedAuditEventType_SourceName,12565,Variable
-TrustListUpdatedAuditEventType_Time,12566,Variable
-TrustListUpdatedAuditEventType_ReceiveTime,12567,Variable
-TrustListUpdatedAuditEventType_LocalTime,12568,Variable
-TrustListUpdatedAuditEventType_Message,12569,Variable
-TrustListUpdatedAuditEventType_Severity,12570,Variable
-TrustListUpdatedAuditEventType_ActionTimeStamp,12571,Variable
-TrustListUpdatedAuditEventType_Status,12572,Variable
-TrustListUpdatedAuditEventType_ServerId,12573,Variable
-TrustListUpdatedAuditEventType_ClientAuditEntryId,12574,Variable
-TrustListUpdatedAuditEventType_ClientUserId,12575,Variable
-TrustListUpdatedAuditEventType_MethodId,12576,Variable
-TrustListUpdatedAuditEventType_InputArguments,12577,Variable
-UpdateCertificateMethodType,12578,Method
-UpdateCertificateMethodType_InputArguments,12579,Variable
-UpdateCertificateMethodType_OutputArguments,12580,Variable
-ServerConfigurationType,12581,ObjectType
-ServerConfigurationType_SupportedPrivateKeyFormats,12583,Variable
-ServerConfigurationType_MaxTrustListSize,12584,Variable
-ServerConfigurationType_MulticastDnsEnabled,12585,Variable
-ServerConfigurationType_UpdateCertificate,12616,Method
-ServerConfigurationType_UpdateCertificate_InputArguments,12617,Variable
-ServerConfigurationType_UpdateCertificate_OutputArguments,12618,Variable
-CertificateUpdatedAuditEventType,12620,ObjectType
-CertificateUpdatedAuditEventType_EventId,12621,Variable
-CertificateUpdatedAuditEventType_EventType,12622,Variable
-CertificateUpdatedAuditEventType_SourceNode,12623,Variable
-CertificateUpdatedAuditEventType_SourceName,12624,Variable
-CertificateUpdatedAuditEventType_Time,12625,Variable
-CertificateUpdatedAuditEventType_ReceiveTime,12626,Variable
-CertificateUpdatedAuditEventType_LocalTime,12627,Variable
-CertificateUpdatedAuditEventType_Message,12628,Variable
-CertificateUpdatedAuditEventType_Severity,12629,Variable
-CertificateUpdatedAuditEventType_ActionTimeStamp,12630,Variable
-CertificateUpdatedAuditEventType_Status,12631,Variable
-CertificateUpdatedAuditEventType_ServerId,12632,Variable
-CertificateUpdatedAuditEventType_ClientAuditEntryId,12633,Variable
-CertificateUpdatedAuditEventType_ClientUserId,12634,Variable
-CertificateUpdatedAuditEventType_MethodId,12635,Variable
-CertificateUpdatedAuditEventType_InputArguments,12636,Variable
-ServerConfiguration,12637,Object
-ServerConfiguration_SupportedPrivateKeyFormats,12639,Variable
-ServerConfiguration_MaxTrustListSize,12640,Variable
-ServerConfiguration_MulticastDnsEnabled,12641,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList,12642,Object
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Size,12643,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_OpenCount,12646,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Open,12647,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Open_InputArguments,12648,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Open_OutputArguments,12649,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Close,12650,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Close_InputArguments,12651,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Read,12652,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Read_InputArguments,12653,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Read_OutputArguments,12654,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Write,12655,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Write_InputArguments,12656,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_GetPosition,12657,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_GetPosition_InputArguments,12658,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_GetPosition_OutputArguments,12659,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_SetPosition,12660,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_SetPosition_InputArguments,12661,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_LastUpdateTime,12662,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_OpenWithMasks,12663,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_OpenWithMasks_InputArguments,12664,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_OpenWithMasks_OutputArguments,12665,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_CloseAndUpdate,12666,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_CloseAndUpdate_OutputArguments,12667,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_AddCertificate,12668,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_AddCertificate_InputArguments,12669,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_RemoveCertificate,12670,Method
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_RemoveCertificate_InputArguments,12671,Variable
-TrustListDataType_Encoding_DefaultXml,12676,Object
-OpcUa_XmlSchema_TrustListDataType,12677,Variable
-OpcUa_XmlSchema_TrustListDataType_DataTypeVersion,12678,Variable
-OpcUa_XmlSchema_TrustListDataType_DictionaryFragment,12679,Variable
-TrustListDataType_Encoding_DefaultBinary,12680,Object
-OpcUa_BinarySchema_TrustListDataType,12681,Variable
-OpcUa_BinarySchema_TrustListDataType_DataTypeVersion,12682,Variable
-OpcUa_BinarySchema_TrustListDataType_DictionaryFragment,12683,Variable
-FileType_Writable,12686,Variable
-FileType_UserWritable,12687,Variable
-AddressSpaceFileType_Writable,12688,Variable
-AddressSpaceFileType_UserWritable,12689,Variable
-NamespaceMetadataType_NamespaceFile_Writable,12690,Variable
-NamespaceMetadataType_NamespaceFile_UserWritable,12691,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_Writable,12692,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_UserWritable,12693,Variable
-TrustListType_Writable,12698,Variable
-TrustListType_UserWritable,12699,Variable
-CloseAndUpdateMethodType_InputArguments,12704,Variable
-TrustListType_CloseAndUpdate_InputArguments,12705,Variable
-ServerConfigurationType_ServerCapabilities,12708,Variable
-ServerConfiguration_ServerCapabilities,12710,Variable
-OpcUa_XmlSchema_RelativePathElement,12712,Variable
-OpcUa_XmlSchema_RelativePathElement_DataTypeVersion,12713,Variable
-OpcUa_XmlSchema_RelativePathElement_DictionaryFragment,12714,Variable
-OpcUa_XmlSchema_RelativePath,12715,Variable
-OpcUa_XmlSchema_RelativePath_DataTypeVersion,12716,Variable
-OpcUa_XmlSchema_RelativePath_DictionaryFragment,12717,Variable
-OpcUa_BinarySchema_RelativePathElement,12718,Variable
-OpcUa_BinarySchema_RelativePathElement_DataTypeVersion,12719,Variable
-OpcUa_BinarySchema_RelativePathElement_DictionaryFragment,12720,Variable
-OpcUa_BinarySchema_RelativePath,12721,Variable
-OpcUa_BinarySchema_RelativePath_DataTypeVersion,12722,Variable
-OpcUa_BinarySchema_RelativePath_DictionaryFragment,12723,Variable
-ServerConfigurationType_CreateSigningRequest,12731,Method
-ServerConfigurationType_CreateSigningRequest_InputArguments,12732,Variable
-ServerConfigurationType_CreateSigningRequest_OutputArguments,12733,Variable
-ServerConfigurationType_ApplyChanges,12734,Method
-ServerConfiguration_CreateSigningRequest,12737,Method
-ServerConfiguration_CreateSigningRequest_InputArguments,12738,Variable
-ServerConfiguration_CreateSigningRequest_OutputArguments,12739,Variable
-ServerConfiguration_ApplyChanges,12740,Method
-CreateSigningRequestMethodType,12741,Method
-CreateSigningRequestMethodType_InputArguments,12742,Variable
-CreateSigningRequestMethodType_OutputArguments,12743,Variable
-OptionSetValues,12745,Variable
-ServerType_SetSubscriptionDurable,12746,Method
-ServerType_SetSubscriptionDurable_InputArguments,12747,Variable
-ServerType_SetSubscriptionDurable_OutputArguments,12748,Variable
-Server_SetSubscriptionDurable,12749,Method
-Server_SetSubscriptionDurable_InputArguments,12750,Variable
-Server_SetSubscriptionDurable_OutputArguments,12751,Variable
-SetSubscriptionDurableMethodType,12752,Method
-SetSubscriptionDurableMethodType_InputArguments,12753,Variable
-SetSubscriptionDurableMethodType_OutputArguments,12754,Variable
-OptionSet,12755,DataType
-Union,12756,DataType
-OptionSet_Encoding_DefaultXml,12757,Object
-Union_Encoding_DefaultXml,12758,Object
-OpcUa_XmlSchema_OptionSet,12759,Variable
-OpcUa_XmlSchema_OptionSet_DataTypeVersion,12760,Variable
-OpcUa_XmlSchema_OptionSet_DictionaryFragment,12761,Variable
-OpcUa_XmlSchema_Union,12762,Variable
-OpcUa_XmlSchema_Union_DataTypeVersion,12763,Variable
-OpcUa_XmlSchema_Union_DictionaryFragment,12764,Variable
-OptionSet_Encoding_DefaultBinary,12765,Object
-Union_Encoding_DefaultBinary,12766,Object
-OpcUa_BinarySchema_OptionSet,12767,Variable
-OpcUa_BinarySchema_OptionSet_DataTypeVersion,12768,Variable
-OpcUa_BinarySchema_OptionSet_DictionaryFragment,12769,Variable
-OpcUa_BinarySchema_Union,12770,Variable
-OpcUa_BinarySchema_Union_DataTypeVersion,12771,Variable
-OpcUa_BinarySchema_Union_DictionaryFragment,12772,Variable
-GetRejectedListMethodType,12773,Method
-GetRejectedListMethodType_OutputArguments,12774,Variable
-ServerConfigurationType_GetRejectedList,12775,Method
-ServerConfigurationType_GetRejectedList_OutputArguments,12776,Variable
-ServerConfiguration_GetRejectedList,12777,Method
-ServerConfiguration_GetRejectedList_OutputArguments,12778,Variable
-SamplingIntervalDiagnosticsArrayType_SamplingIntervalDiagnostics,12779,Variable
-SamplingIntervalDiagnosticsArrayType_SamplingIntervalDiagnostics_SamplingInterval,12780,Variable
-SamplingIntervalDiagnosticsArrayType_SamplingIntervalDiagnostics_SampledMonitoredItemsCount,12781,Variable
-SamplingIntervalDiagnosticsArrayType_SamplingIntervalDiagnostics_MaxSampledMonitoredItemsCount,12782,Variable
-SamplingIntervalDiagnosticsArrayType_SamplingIntervalDiagnostics_DisabledMonitoredItemsSamplingCount,12783,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics,12784,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_SessionId,12785,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_SubscriptionId,12786,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_Priority,12787,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_PublishingInterval,12788,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_MaxKeepAliveCount,12789,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_MaxLifetimeCount,12790,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_MaxNotificationsPerPublish,12791,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_PublishingEnabled,12792,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_ModifyCount,12793,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_EnableCount,12794,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_DisableCount,12795,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_RepublishRequestCount,12796,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_RepublishMessageRequestCount,12797,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_RepublishMessageCount,12798,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_TransferRequestCount,12799,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_TransferredToAltClientCount,12800,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_TransferredToSameClientCount,12801,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_PublishRequestCount,12802,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_DataChangeNotificationsCount,12803,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_EventNotificationsCount,12804,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_NotificationsCount,12805,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_LatePublishRequestCount,12806,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_CurrentKeepAliveCount,12807,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_CurrentLifetimeCount,12808,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_UnacknowledgedMessageCount,12809,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_DiscardedMessageCount,12810,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_MonitoredItemCount,12811,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_DisabledMonitoredItemCount,12812,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_MonitoringQueueOverflowCount,12813,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_NextSequenceNumber,12814,Variable
-SubscriptionDiagnosticsArrayType_SubscriptionDiagnostics_EventQueueOverflowCount,12815,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics,12816,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_SessionId,12817,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_SessionName,12818,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ClientDescription,12819,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ServerUri,12820,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_EndpointUrl,12821,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_LocaleIds,12822,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ActualSessionTimeout,12823,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_MaxResponseMessageSize,12824,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ClientConnectionTime,12825,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ClientLastContactTime,12826,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_CurrentSubscriptionsCount,12827,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_CurrentMonitoredItemsCount,12828,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_CurrentPublishRequestsInQueue,12829,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_TotalRequestCount,12830,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_UnauthorizedRequestCount,12831,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ReadCount,12832,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_HistoryReadCount,12833,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_WriteCount,12834,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_HistoryUpdateCount,12835,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_CallCount,12836,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_CreateMonitoredItemsCount,12837,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ModifyMonitoredItemsCount,12838,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_SetMonitoringModeCount,12839,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_SetTriggeringCount,12840,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_DeleteMonitoredItemsCount,12841,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_CreateSubscriptionCount,12842,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_ModifySubscriptionCount,12843,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_SetPublishingModeCount,12844,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_PublishCount,12845,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_RepublishCount,12846,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_TransferSubscriptionsCount,12847,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_DeleteSubscriptionsCount,12848,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_AddNodesCount,12849,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_AddReferencesCount,12850,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_DeleteNodesCount,12851,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_DeleteReferencesCount,12852,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_BrowseCount,12853,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_BrowseNextCount,12854,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_TranslateBrowsePathsToNodeIdsCount,12855,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_QueryFirstCount,12856,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_QueryNextCount,12857,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_RegisterNodesCount,12858,Variable
-SessionDiagnosticsArrayType_SessionDiagnostics_UnregisterNodesCount,12859,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics,12860,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_SessionId,12861,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_ClientUserIdOfSession,12862,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_ClientUserIdHistory,12863,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_AuthenticationMechanism,12864,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_Encoding,12865,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_TransportProtocol,12866,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_SecurityMode,12867,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_SecurityPolicyUri,12868,Variable
-SessionSecurityDiagnosticsArrayType_SessionSecurityDiagnostics_ClientCertificate,12869,Variable
-ServerType_ResendData,12871,Method
-ServerType_ResendData_InputArguments,12872,Variable
-Server_ResendData,12873,Method
-Server_ResendData_InputArguments,12874,Variable
-ResendDataMethodType,12875,Method
-ResendDataMethodType_InputArguments,12876,Variable
-NormalizedString,12877,DataType
-DecimalString,12878,DataType
-DurationString,12879,DataType
-TimeString,12880,DataType
-DateString,12881,DataType
-ServerType_EstimatedReturnTime,12882,Variable
-ServerType_RequestServerStateChange,12883,Method
-ServerType_RequestServerStateChange_InputArguments,12884,Variable
-Server_EstimatedReturnTime,12885,Variable
-Server_RequestServerStateChange,12886,Method
-Server_RequestServerStateChange_InputArguments,12887,Variable
-RequestServerStateChangeMethodType,12888,Method
-RequestServerStateChangeMethodType_InputArguments,12889,Variable
-DiscoveryConfiguration,12890,DataType
-MdnsDiscoveryConfiguration,12891,DataType
-DiscoveryConfiguration_Encoding_DefaultXml,12892,Object
-MdnsDiscoveryConfiguration_Encoding_DefaultXml,12893,Object
-OpcUa_XmlSchema_DiscoveryConfiguration,12894,Variable
-OpcUa_XmlSchema_DiscoveryConfiguration_DataTypeVersion,12895,Variable
-OpcUa_XmlSchema_DiscoveryConfiguration_DictionaryFragment,12896,Variable
-OpcUa_XmlSchema_MdnsDiscoveryConfiguration,12897,Variable
-OpcUa_XmlSchema_MdnsDiscoveryConfiguration_DataTypeVersion,12898,Variable
-OpcUa_XmlSchema_MdnsDiscoveryConfiguration_DictionaryFragment,12899,Variable
-DiscoveryConfiguration_Encoding_DefaultBinary,12900,Object
-MdnsDiscoveryConfiguration_Encoding_DefaultBinary,12901,Object
-OpcUa_BinarySchema_DiscoveryConfiguration,12902,Variable
-OpcUa_BinarySchema_DiscoveryConfiguration_DataTypeVersion,12903,Variable
-OpcUa_BinarySchema_DiscoveryConfiguration_DictionaryFragment,12904,Variable
-OpcUa_BinarySchema_MdnsDiscoveryConfiguration,12905,Variable
-OpcUa_BinarySchema_MdnsDiscoveryConfiguration_DataTypeVersion,12906,Variable
-OpcUa_BinarySchema_MdnsDiscoveryConfiguration_DictionaryFragment,12907,Variable
-MaxByteStringLength,12908,Variable
-ServerType_ServerCapabilities_MaxByteStringLength,12909,Variable
-ServerCapabilitiesType_MaxByteStringLength,12910,Variable
-Server_ServerCapabilities_MaxByteStringLength,12911,Variable
-ConditionType_ConditionRefresh2,12912,Method
-ConditionType_ConditionRefresh2_InputArguments,12913,Variable
-ConditionRefresh2MethodType,12914,Method
-ConditionRefresh2MethodType_InputArguments,12915,Variable
-DialogConditionType_ConditionRefresh2,12916,Method
-DialogConditionType_ConditionRefresh2_InputArguments,12917,Variable
-AcknowledgeableConditionType_ConditionRefresh2,12918,Method
-AcknowledgeableConditionType_ConditionRefresh2_InputArguments,12919,Variable
-AlarmConditionType_ConditionRefresh2,12984,Method
-AlarmConditionType_ConditionRefresh2_InputArguments,12985,Variable
-LimitAlarmType_ConditionRefresh2,12986,Method
-LimitAlarmType_ConditionRefresh2_InputArguments,12987,Variable
-ExclusiveLimitAlarmType_ConditionRefresh2,12988,Method
-ExclusiveLimitAlarmType_ConditionRefresh2_InputArguments,12989,Variable
-NonExclusiveLimitAlarmType_ConditionRefresh2,12990,Method
-NonExclusiveLimitAlarmType_ConditionRefresh2_InputArguments,12991,Variable
-NonExclusiveLevelAlarmType_ConditionRefresh2,12992,Method
-NonExclusiveLevelAlarmType_ConditionRefresh2_InputArguments,12993,Variable
-ExclusiveLevelAlarmType_ConditionRefresh2,12994,Method
-ExclusiveLevelAlarmType_ConditionRefresh2_InputArguments,12995,Variable
-NonExclusiveDeviationAlarmType_ConditionRefresh2,12996,Method
-NonExclusiveDeviationAlarmType_ConditionRefresh2_InputArguments,12997,Variable
-ExclusiveDeviationAlarmType_ConditionRefresh2,12998,Method
-ExclusiveDeviationAlarmType_ConditionRefresh2_InputArguments,12999,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionRefresh2,13000,Method
-NonExclusiveRateOfChangeAlarmType_ConditionRefresh2_InputArguments,13001,Variable
-ExclusiveRateOfChangeAlarmType_ConditionRefresh2,13002,Method
-ExclusiveRateOfChangeAlarmType_ConditionRefresh2_InputArguments,13003,Variable
-DiscreteAlarmType_ConditionRefresh2,13004,Method
-DiscreteAlarmType_ConditionRefresh2_InputArguments,13005,Variable
-OffNormalAlarmType_ConditionRefresh2,13006,Method
-OffNormalAlarmType_ConditionRefresh2_InputArguments,13007,Variable
-SystemOffNormalAlarmType_ConditionRefresh2,13008,Method
-SystemOffNormalAlarmType_ConditionRefresh2_InputArguments,13009,Variable
-TripAlarmType_ConditionRefresh2,13010,Method
-TripAlarmType_ConditionRefresh2_InputArguments,13011,Variable
-CertificateExpirationAlarmType,13225,ObjectType
-CertificateExpirationAlarmType_EventId,13226,Variable
-CertificateExpirationAlarmType_EventType,13227,Variable
-CertificateExpirationAlarmType_SourceNode,13228,Variable
-CertificateExpirationAlarmType_SourceName,13229,Variable
-CertificateExpirationAlarmType_Time,13230,Variable
-CertificateExpirationAlarmType_ReceiveTime,13231,Variable
-CertificateExpirationAlarmType_LocalTime,13232,Variable
-CertificateExpirationAlarmType_Message,13233,Variable
-CertificateExpirationAlarmType_Severity,13234,Variable
-CertificateExpirationAlarmType_ConditionClassId,13235,Variable
-CertificateExpirationAlarmType_ConditionClassName,13236,Variable
-CertificateExpirationAlarmType_ConditionName,13237,Variable
-CertificateExpirationAlarmType_BranchId,13238,Variable
-CertificateExpirationAlarmType_Retain,13239,Variable
-CertificateExpirationAlarmType_EnabledState,13240,Variable
-CertificateExpirationAlarmType_EnabledState_Id,13241,Variable
-CertificateExpirationAlarmType_EnabledState_Name,13242,Variable
-CertificateExpirationAlarmType_EnabledState_Number,13243,Variable
-CertificateExpirationAlarmType_EnabledState_EffectiveDisplayName,13244,Variable
-CertificateExpirationAlarmType_EnabledState_TransitionTime,13245,Variable
-CertificateExpirationAlarmType_EnabledState_EffectiveTransitionTime,13246,Variable
-CertificateExpirationAlarmType_EnabledState_TrueState,13247,Variable
-CertificateExpirationAlarmType_EnabledState_FalseState,13248,Variable
-CertificateExpirationAlarmType_Quality,13249,Variable
-CertificateExpirationAlarmType_Quality_SourceTimestamp,13250,Variable
-CertificateExpirationAlarmType_LastSeverity,13251,Variable
-CertificateExpirationAlarmType_LastSeverity_SourceTimestamp,13252,Variable
-CertificateExpirationAlarmType_Comment,13253,Variable
-CertificateExpirationAlarmType_Comment_SourceTimestamp,13254,Variable
-CertificateExpirationAlarmType_ClientUserId,13255,Variable
-CertificateExpirationAlarmType_Disable,13256,Method
-CertificateExpirationAlarmType_Enable,13257,Method
-CertificateExpirationAlarmType_AddComment,13258,Method
-CertificateExpirationAlarmType_AddComment_InputArguments,13259,Variable
-CertificateExpirationAlarmType_ConditionRefresh,13260,Method
-CertificateExpirationAlarmType_ConditionRefresh_InputArguments,13261,Variable
-CertificateExpirationAlarmType_ConditionRefresh2,13262,Method
-CertificateExpirationAlarmType_ConditionRefresh2_InputArguments,13263,Variable
-CertificateExpirationAlarmType_AckedState,13264,Variable
-CertificateExpirationAlarmType_AckedState_Id,13265,Variable
-CertificateExpirationAlarmType_AckedState_Name,13266,Variable
-CertificateExpirationAlarmType_AckedState_Number,13267,Variable
-CertificateExpirationAlarmType_AckedState_EffectiveDisplayName,13268,Variable
-CertificateExpirationAlarmType_AckedState_TransitionTime,13269,Variable
-CertificateExpirationAlarmType_AckedState_EffectiveTransitionTime,13270,Variable
-CertificateExpirationAlarmType_AckedState_TrueState,13271,Variable
-CertificateExpirationAlarmType_AckedState_FalseState,13272,Variable
-CertificateExpirationAlarmType_ConfirmedState,13273,Variable
-CertificateExpirationAlarmType_ConfirmedState_Id,13274,Variable
-CertificateExpirationAlarmType_ConfirmedState_Name,13275,Variable
-CertificateExpirationAlarmType_ConfirmedState_Number,13276,Variable
-CertificateExpirationAlarmType_ConfirmedState_EffectiveDisplayName,13277,Variable
-CertificateExpirationAlarmType_ConfirmedState_TransitionTime,13278,Variable
-CertificateExpirationAlarmType_ConfirmedState_EffectiveTransitionTime,13279,Variable
-CertificateExpirationAlarmType_ConfirmedState_TrueState,13280,Variable
-CertificateExpirationAlarmType_ConfirmedState_FalseState,13281,Variable
-CertificateExpirationAlarmType_Acknowledge,13282,Method
-CertificateExpirationAlarmType_Acknowledge_InputArguments,13283,Variable
-CertificateExpirationAlarmType_Confirm,13284,Method
-CertificateExpirationAlarmType_Confirm_InputArguments,13285,Variable
-CertificateExpirationAlarmType_ActiveState,13286,Variable
-CertificateExpirationAlarmType_ActiveState_Id,13287,Variable
-CertificateExpirationAlarmType_ActiveState_Name,13288,Variable
-CertificateExpirationAlarmType_ActiveState_Number,13289,Variable
-CertificateExpirationAlarmType_ActiveState_EffectiveDisplayName,13290,Variable
-CertificateExpirationAlarmType_ActiveState_TransitionTime,13291,Variable
-CertificateExpirationAlarmType_ActiveState_EffectiveTransitionTime,13292,Variable
-CertificateExpirationAlarmType_ActiveState_TrueState,13293,Variable
-CertificateExpirationAlarmType_ActiveState_FalseState,13294,Variable
-CertificateExpirationAlarmType_InputNode,13295,Variable
-CertificateExpirationAlarmType_SuppressedState,13296,Variable
-CertificateExpirationAlarmType_SuppressedState_Id,13297,Variable
-CertificateExpirationAlarmType_SuppressedState_Name,13298,Variable
-CertificateExpirationAlarmType_SuppressedState_Number,13299,Variable
-CertificateExpirationAlarmType_SuppressedState_EffectiveDisplayName,13300,Variable
-CertificateExpirationAlarmType_SuppressedState_TransitionTime,13301,Variable
-CertificateExpirationAlarmType_SuppressedState_EffectiveTransitionTime,13302,Variable
-CertificateExpirationAlarmType_SuppressedState_TrueState,13303,Variable
-CertificateExpirationAlarmType_SuppressedState_FalseState,13304,Variable
-CertificateExpirationAlarmType_ShelvingState,13305,Object
-CertificateExpirationAlarmType_ShelvingState_CurrentState,13306,Variable
-CertificateExpirationAlarmType_ShelvingState_CurrentState_Id,13307,Variable
-CertificateExpirationAlarmType_ShelvingState_CurrentState_Name,13308,Variable
-CertificateExpirationAlarmType_ShelvingState_CurrentState_Number,13309,Variable
-CertificateExpirationAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,13310,Variable
-CertificateExpirationAlarmType_ShelvingState_LastTransition,13311,Variable
-CertificateExpirationAlarmType_ShelvingState_LastTransition_Id,13312,Variable
-CertificateExpirationAlarmType_ShelvingState_LastTransition_Name,13313,Variable
-CertificateExpirationAlarmType_ShelvingState_LastTransition_Number,13314,Variable
-CertificateExpirationAlarmType_ShelvingState_LastTransition_TransitionTime,13315,Variable
-CertificateExpirationAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,13316,Variable
-CertificateExpirationAlarmType_ShelvingState_UnshelveTime,13317,Variable
-CertificateExpirationAlarmType_ShelvingState_Unshelve,13318,Method
-CertificateExpirationAlarmType_ShelvingState_OneShotShelve,13319,Method
-CertificateExpirationAlarmType_ShelvingState_TimedShelve,13320,Method
-CertificateExpirationAlarmType_ShelvingState_TimedShelve_InputArguments,13321,Variable
-CertificateExpirationAlarmType_SuppressedOrShelved,13322,Variable
-CertificateExpirationAlarmType_MaxTimeShelved,13323,Variable
-CertificateExpirationAlarmType_NormalState,13324,Variable
-CertificateExpirationAlarmType_ExpirationDate,13325,Variable
-CertificateExpirationAlarmType_CertificateType,13326,Variable
-CertificateExpirationAlarmType_Certificate,13327,Variable
-FileType_MimeType,13341,Variable
-CreateDirectoryMethodType,13342,Method
-CreateDirectoryMethodType_InputArguments,13343,Variable
-CreateDirectoryMethodType_OutputArguments,13344,Variable
-CreateFileMethodType,13345,Method
-CreateFileMethodType_InputArguments,13346,Variable
-CreateFileMethodType_OutputArguments,13347,Variable
-DeleteFileMethodType,13348,Method
-DeleteFileMethodType_InputArguments,13349,Variable
-MoveOrCopyMethodType,13350,Method
-MoveOrCopyMethodType_InputArguments,13351,Variable
-MoveOrCopyMethodType_OutputArguments,13352,Variable
-FileDirectoryType,13353,ObjectType
-FileDirectoryType_FileDirectoryName_Placeholder,13354,Object
-FileDirectoryType_FileDirectoryName_Placeholder_CreateDirectory,13355,Method
-FileDirectoryType_FileDirectoryName_Placeholder_CreateDirectory_InputArguments,13356,Variable
-FileDirectoryType_FileDirectoryName_Placeholder_CreateDirectory_OutputArguments,13357,Variable
-FileDirectoryType_FileDirectoryName_Placeholder_CreateFile,13358,Method
-FileDirectoryType_FileDirectoryName_Placeholder_CreateFile_InputArguments,13359,Variable
-FileDirectoryType_FileDirectoryName_Placeholder_CreateFile_OutputArguments,13360,Variable
-FileDirectoryType_FileDirectoryName_Placeholder_MoveOrCopy,13363,Method
-FileDirectoryType_FileDirectoryName_Placeholder_MoveOrCopy_InputArguments,13364,Variable
-FileDirectoryType_FileDirectoryName_Placeholder_MoveOrCopy_OutputArguments,13365,Variable
-FileDirectoryType_FileName_Placeholder,13366,Object
-FileDirectoryType_FileName_Placeholder_Size,13367,Variable
-FileDirectoryType_FileName_Placeholder_Writable,13368,Variable
-FileDirectoryType_FileName_Placeholder_UserWritable,13369,Variable
-FileDirectoryType_FileName_Placeholder_OpenCount,13370,Variable
-FileDirectoryType_FileName_Placeholder_MimeType,13371,Variable
-FileDirectoryType_FileName_Placeholder_Open,13372,Method
-FileDirectoryType_FileName_Placeholder_Open_InputArguments,13373,Variable
-FileDirectoryType_FileName_Placeholder_Open_OutputArguments,13374,Variable
-FileDirectoryType_FileName_Placeholder_Close,13375,Method
-FileDirectoryType_FileName_Placeholder_Close_InputArguments,13376,Variable
-FileDirectoryType_FileName_Placeholder_Read,13377,Method
-FileDirectoryType_FileName_Placeholder_Read_InputArguments,13378,Variable
-FileDirectoryType_FileName_Placeholder_Read_OutputArguments,13379,Variable
-FileDirectoryType_FileName_Placeholder_Write,13380,Method
-FileDirectoryType_FileName_Placeholder_Write_InputArguments,13381,Variable
-FileDirectoryType_FileName_Placeholder_GetPosition,13382,Method
-FileDirectoryType_FileName_Placeholder_GetPosition_InputArguments,13383,Variable
-FileDirectoryType_FileName_Placeholder_GetPosition_OutputArguments,13384,Variable
-FileDirectoryType_FileName_Placeholder_SetPosition,13385,Method
-FileDirectoryType_FileName_Placeholder_SetPosition_InputArguments,13386,Variable
-FileDirectoryType_CreateDirectory,13387,Method
-FileDirectoryType_CreateDirectory_InputArguments,13388,Variable
-FileDirectoryType_CreateDirectory_OutputArguments,13389,Variable
-FileDirectoryType_CreateFile,13390,Method
-FileDirectoryType_CreateFile_InputArguments,13391,Variable
-FileDirectoryType_CreateFile_OutputArguments,13392,Variable
-FileDirectoryType_DeleteFileSystemObject,13393,Method
-FileDirectoryType_DeleteFileSystemObject_InputArguments,13394,Variable
-FileDirectoryType_MoveOrCopy,13395,Method
-FileDirectoryType_MoveOrCopy_InputArguments,13396,Variable
-FileDirectoryType_MoveOrCopy_OutputArguments,13397,Variable
-AddressSpaceFileType_MimeType,13398,Variable
-NamespaceMetadataType_NamespaceFile_MimeType,13399,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_NamespaceFile_MimeType,13400,Variable
-TrustListType_MimeType,13403,Variable
-CertificateGroupType_TrustList,13599,Object
-CertificateGroupType_TrustList_Size,13600,Variable
-CertificateGroupType_TrustList_Writable,13601,Variable
-CertificateGroupType_TrustList_UserWritable,13602,Variable
-CertificateGroupType_TrustList_OpenCount,13603,Variable
-CertificateGroupType_TrustList_MimeType,13604,Variable
-CertificateGroupType_TrustList_Open,13605,Method
-CertificateGroupType_TrustList_Open_InputArguments,13606,Variable
-CertificateGroupType_TrustList_Open_OutputArguments,13607,Variable
-CertificateGroupType_TrustList_Close,13608,Method
-CertificateGroupType_TrustList_Close_InputArguments,13609,Variable
-CertificateGroupType_TrustList_Read,13610,Method
-CertificateGroupType_TrustList_Read_InputArguments,13611,Variable
-CertificateGroupType_TrustList_Read_OutputArguments,13612,Variable
-CertificateGroupType_TrustList_Write,13613,Method
-CertificateGroupType_TrustList_Write_InputArguments,13614,Variable
-CertificateGroupType_TrustList_GetPosition,13615,Method
-CertificateGroupType_TrustList_GetPosition_InputArguments,13616,Variable
-CertificateGroupType_TrustList_GetPosition_OutputArguments,13617,Variable
-CertificateGroupType_TrustList_SetPosition,13618,Method
-CertificateGroupType_TrustList_SetPosition_InputArguments,13619,Variable
-CertificateGroupType_TrustList_LastUpdateTime,13620,Variable
-CertificateGroupType_TrustList_OpenWithMasks,13621,Method
-CertificateGroupType_TrustList_OpenWithMasks_InputArguments,13622,Variable
-CertificateGroupType_TrustList_OpenWithMasks_OutputArguments,13623,Variable
-CertificateGroupType_TrustList_CloseAndUpdate,13624,Method
-CertificateGroupType_TrustList_CloseAndUpdate_InputArguments,13625,Variable
-CertificateGroupType_TrustList_CloseAndUpdate_OutputArguments,13626,Variable
-CertificateGroupType_TrustList_AddCertificate,13627,Method
-CertificateGroupType_TrustList_AddCertificate_InputArguments,13628,Variable
-CertificateGroupType_TrustList_RemoveCertificate,13629,Method
-CertificateGroupType_TrustList_RemoveCertificate_InputArguments,13630,Variable
-CertificateGroupType_CertificateTypes,13631,Variable
-CertificateUpdatedAuditEventType_CertificateGroup,13735,Variable
-CertificateUpdatedAuditEventType_CertificateType,13736,Variable
-ServerConfiguration_UpdateCertificate,13737,Method
-ServerConfiguration_UpdateCertificate_InputArguments,13738,Variable
-ServerConfiguration_UpdateCertificate_OutputArguments,13739,Variable
-CertificateGroupFolderType,13813,ObjectType
-CertificateGroupFolderType_DefaultApplicationGroup,13814,Object
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList,13815,Object
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Size,13816,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Writable,13817,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_UserWritable,13818,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_OpenCount,13819,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_MimeType,13820,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Open,13821,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Open_InputArguments,13822,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Open_OutputArguments,13823,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Close,13824,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Close_InputArguments,13825,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Read,13826,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Read_InputArguments,13827,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Read_OutputArguments,13828,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Write,13829,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_Write_InputArguments,13830,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_GetPosition,13831,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_GetPosition_InputArguments,13832,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_GetPosition_OutputArguments,13833,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_SetPosition,13834,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_SetPosition_InputArguments,13835,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_LastUpdateTime,13836,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_OpenWithMasks,13837,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_OpenWithMasks_InputArguments,13838,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_OpenWithMasks_OutputArguments,13839,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_CloseAndUpdate,13840,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_CloseAndUpdate_InputArguments,13841,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_CloseAndUpdate_OutputArguments,13842,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_AddCertificate,13843,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_AddCertificate_InputArguments,13844,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_RemoveCertificate,13845,Method
-CertificateGroupFolderType_DefaultApplicationGroup_TrustList_RemoveCertificate_InputArguments,13846,Variable
-CertificateGroupFolderType_DefaultApplicationGroup_CertificateTypes,13847,Variable
-CertificateGroupFolderType_DefaultHttpsGroup,13848,Object
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList,13849,Object
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Size,13850,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Writable,13851,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_UserWritable,13852,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_OpenCount,13853,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_MimeType,13854,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Open,13855,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Open_InputArguments,13856,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Open_OutputArguments,13857,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Close,13858,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Close_InputArguments,13859,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Read,13860,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Read_InputArguments,13861,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Read_OutputArguments,13862,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Write,13863,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_Write_InputArguments,13864,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_GetPosition,13865,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_GetPosition_InputArguments,13866,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_GetPosition_OutputArguments,13867,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_SetPosition,13868,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_SetPosition_InputArguments,13869,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_LastUpdateTime,13870,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_OpenWithMasks,13871,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_OpenWithMasks_InputArguments,13872,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_OpenWithMasks_OutputArguments,13873,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_CloseAndUpdate,13874,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_CloseAndUpdate_InputArguments,13875,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_CloseAndUpdate_OutputArguments,13876,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_AddCertificate,13877,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_AddCertificate_InputArguments,13878,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_RemoveCertificate,13879,Method
-CertificateGroupFolderType_DefaultHttpsGroup_TrustList_RemoveCertificate_InputArguments,13880,Variable
-CertificateGroupFolderType_DefaultHttpsGroup_CertificateTypes,13881,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup,13882,Object
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList,13883,Object
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Size,13884,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Writable,13885,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_UserWritable,13886,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_OpenCount,13887,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_MimeType,13888,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Open,13889,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Open_InputArguments,13890,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Open_OutputArguments,13891,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Close,13892,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Close_InputArguments,13893,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Read,13894,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Read_InputArguments,13895,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Read_OutputArguments,13896,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Write,13897,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_Write_InputArguments,13898,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_GetPosition,13899,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_GetPosition_InputArguments,13900,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_GetPosition_OutputArguments,13901,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_SetPosition,13902,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_SetPosition_InputArguments,13903,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_LastUpdateTime,13904,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_OpenWithMasks,13905,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_OpenWithMasks_InputArguments,13906,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_OpenWithMasks_OutputArguments,13907,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_CloseAndUpdate,13908,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_CloseAndUpdate_InputArguments,13909,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_CloseAndUpdate_OutputArguments,13910,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_AddCertificate,13911,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_AddCertificate_InputArguments,13912,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_RemoveCertificate,13913,Method
-CertificateGroupFolderType_DefaultUserTokenGroup_TrustList_RemoveCertificate_InputArguments,13914,Variable
-CertificateGroupFolderType_DefaultUserTokenGroup_CertificateTypes,13915,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder,13916,Object
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList,13917,Object
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Size,13918,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Writable,13919,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_UserWritable,13920,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_OpenCount,13921,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_MimeType,13922,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Open,13923,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Open_InputArguments,13924,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Open_OutputArguments,13925,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Close,13926,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Close_InputArguments,13927,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Read,13928,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Read_InputArguments,13929,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Read_OutputArguments,13930,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Write,13931,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_Write_InputArguments,13932,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_GetPosition,13933,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_GetPosition_InputArguments,13934,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_GetPosition_OutputArguments,13935,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_SetPosition,13936,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_SetPosition_InputArguments,13937,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_LastUpdateTime,13938,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_OpenWithMasks,13939,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_OpenWithMasks_InputArguments,13940,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_OpenWithMasks_OutputArguments,13941,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_CloseAndUpdate,13942,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_CloseAndUpdate_InputArguments,13943,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_CloseAndUpdate_OutputArguments,13944,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_AddCertificate,13945,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_AddCertificate_InputArguments,13946,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_RemoveCertificate,13947,Method
-CertificateGroupFolderType_AdditionalGroup_Placeholder_TrustList_RemoveCertificate_InputArguments,13948,Variable
-CertificateGroupFolderType_AdditionalGroup_Placeholder_CertificateTypes,13949,Variable
-ServerConfigurationType_CertificateGroups,13950,Object
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup,13951,Object
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList,13952,Object
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Size,13953,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Writable,13954,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_UserWritable,13955,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_OpenCount,13956,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_MimeType,13957,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Open,13958,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Open_InputArguments,13959,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Open_OutputArguments,13960,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Close,13961,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Close_InputArguments,13962,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Read,13963,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Read_InputArguments,13964,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Read_OutputArguments,13965,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Write,13966,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_Write_InputArguments,13967,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_GetPosition,13968,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_GetPosition_InputArguments,13969,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_GetPosition_OutputArguments,13970,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_SetPosition,13971,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_SetPosition_InputArguments,13972,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_LastUpdateTime,13973,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_OpenWithMasks,13974,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_OpenWithMasks_InputArguments,13975,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_OpenWithMasks_OutputArguments,13976,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_CloseAndUpdate,13977,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_CloseAndUpdate_InputArguments,13978,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_CloseAndUpdate_OutputArguments,13979,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_AddCertificate,13980,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_AddCertificate_InputArguments,13981,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_RemoveCertificate,13982,Method
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_TrustList_RemoveCertificate_InputArguments,13983,Variable
-ServerConfigurationType_CertificateGroups_DefaultApplicationGroup_CertificateTypes,13984,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup,13985,Object
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList,13986,Object
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Size,13987,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Writable,13988,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_UserWritable,13989,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_OpenCount,13990,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_MimeType,13991,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Open,13992,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Open_InputArguments,13993,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Open_OutputArguments,13994,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Close,13995,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Close_InputArguments,13996,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Read,13997,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Read_InputArguments,13998,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Read_OutputArguments,13999,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Write,14000,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_Write_InputArguments,14001,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_GetPosition,14002,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_GetPosition_InputArguments,14003,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_GetPosition_OutputArguments,14004,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_SetPosition,14005,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_SetPosition_InputArguments,14006,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_LastUpdateTime,14007,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_OpenWithMasks,14008,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_OpenWithMasks_InputArguments,14009,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_OpenWithMasks_OutputArguments,14010,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_CloseAndUpdate,14011,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_CloseAndUpdate_InputArguments,14012,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_CloseAndUpdate_OutputArguments,14013,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_AddCertificate,14014,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_AddCertificate_InputArguments,14015,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_RemoveCertificate,14016,Method
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_TrustList_RemoveCertificate_InputArguments,14017,Variable
-ServerConfigurationType_CertificateGroups_DefaultHttpsGroup_CertificateTypes,14018,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup,14019,Object
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList,14020,Object
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Size,14021,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Writable,14022,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_UserWritable,14023,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenCount,14024,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_MimeType,14025,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Open,14026,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Open_InputArguments,14027,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Open_OutputArguments,14028,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Close,14029,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Close_InputArguments,14030,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Read,14031,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Read_InputArguments,14032,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Read_OutputArguments,14033,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Write,14034,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_Write_InputArguments,14035,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_GetPosition,14036,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_GetPosition_InputArguments,14037,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_GetPosition_OutputArguments,14038,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_SetPosition,14039,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_SetPosition_InputArguments,14040,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_LastUpdateTime,14041,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenWithMasks,14042,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenWithMasks_InputArguments,14043,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenWithMasks_OutputArguments,14044,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_CloseAndUpdate,14045,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_CloseAndUpdate_InputArguments,14046,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_CloseAndUpdate_OutputArguments,14047,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_AddCertificate,14048,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_AddCertificate_InputArguments,14049,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_RemoveCertificate,14050,Method
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_TrustList_RemoveCertificate_InputArguments,14051,Variable
-ServerConfigurationType_CertificateGroups_DefaultUserTokenGroup_CertificateTypes,14052,Variable
-ServerConfiguration_CertificateGroups,14053,Object
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup,14088,Object
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList,14089,Object
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Size,14090,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Writable,14091,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_UserWritable,14092,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_OpenCount,14093,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_MimeType,14094,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Open,14095,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Open_InputArguments,14096,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Open_OutputArguments,14097,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Close,14098,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Close_InputArguments,14099,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Read,14100,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Read_InputArguments,14101,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Read_OutputArguments,14102,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Write,14103,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_Write_InputArguments,14104,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_GetPosition,14105,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_GetPosition_InputArguments,14106,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_GetPosition_OutputArguments,14107,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_SetPosition,14108,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_SetPosition_InputArguments,14109,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_LastUpdateTime,14110,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_OpenWithMasks,14111,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_OpenWithMasks_InputArguments,14112,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_OpenWithMasks_OutputArguments,14113,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_CloseAndUpdate,14114,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_CloseAndUpdate_InputArguments,14115,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_CloseAndUpdate_OutputArguments,14116,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_AddCertificate,14117,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_AddCertificate_InputArguments,14118,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_RemoveCertificate,14119,Method
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_TrustList_RemoveCertificate_InputArguments,14120,Variable
-ServerConfiguration_CertificateGroups_DefaultHttpsGroup_CertificateTypes,14121,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup,14122,Object
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList,14123,Object
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Size,14124,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Writable,14125,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_UserWritable,14126,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenCount,14127,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_MimeType,14128,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Open,14129,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Open_InputArguments,14130,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Open_OutputArguments,14131,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Close,14132,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Close_InputArguments,14133,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Read,14134,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Read_InputArguments,14135,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Read_OutputArguments,14136,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Write,14137,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_Write_InputArguments,14138,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_GetPosition,14139,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_GetPosition_InputArguments,14140,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_GetPosition_OutputArguments,14141,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_SetPosition,14142,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_SetPosition_InputArguments,14143,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_LastUpdateTime,14144,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenWithMasks,14145,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenWithMasks_InputArguments,14146,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_OpenWithMasks_OutputArguments,14147,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_CloseAndUpdate,14148,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_CloseAndUpdate_InputArguments,14149,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_CloseAndUpdate_OutputArguments,14150,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_AddCertificate,14151,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_AddCertificate_InputArguments,14152,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_RemoveCertificate,14153,Method
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_TrustList_RemoveCertificate_InputArguments,14154,Variable
-ServerConfiguration_CertificateGroups_DefaultUserTokenGroup_CertificateTypes,14155,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup,14156,Object
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_Writable,14157,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_UserWritable,14158,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_MimeType,14159,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_TrustList_CloseAndUpdate_InputArguments,14160,Variable
-ServerConfiguration_CertificateGroups_DefaultApplicationGroup_CertificateTypes,14161,Variable
-RemoveConnectionMethodType,14183,Method
-RemoveConnectionMethodType_InputArguments,14184,Variable
-PubSubConnectionType,14209,ObjectType
-PubSubConnectionType_Address,14221,Object
-PubSubConnectionType_RemoveGroup,14225,Method
-PubSubConnectionType_RemoveGroup_InputArguments,14226,Variable
-PubSubGroupType,14232,ObjectType
-PublishedVariableDataType,14273,DataType
-PublishedVariableDataType_Encoding_DefaultXml,14319,Object
-OpcUa_XmlSchema_PublishedVariableDataType,14320,Variable
-OpcUa_XmlSchema_PublishedVariableDataType_DataTypeVersion,14321,Variable
-OpcUa_XmlSchema_PublishedVariableDataType_DictionaryFragment,14322,Variable
-PublishedVariableDataType_Encoding_DefaultBinary,14323,Object
-OpcUa_BinarySchema_PublishedVariableDataType,14324,Variable
-OpcUa_BinarySchema_PublishedVariableDataType_DataTypeVersion,14325,Variable
-OpcUa_BinarySchema_PublishedVariableDataType_DictionaryFragment,14326,Variable
-AuditCreateSessionEventType_SessionId,14413,Variable
-AuditUrlMismatchEventType_SessionId,14414,Variable
-Server_ServerRedundancy_ServerNetworkGroups,14415,Variable
-PublishSubscribeType,14416,ObjectType
-PublishSubscribeType_ConnectionName_Placeholder,14417,Object
-PublishSubscribeType_ConnectionName_Placeholder_PublisherId,14418,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Status,14419,Object
-PublishSubscribeType_ConnectionName_Placeholder_Status_State,14420,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Status_Enable,14421,Method
-PublishSubscribeType_ConnectionName_Placeholder_Status_Disable,14422,Method
-PublishSubscribeType_ConnectionName_Placeholder_Address,14423,Object
-PublishSubscribeType_ConnectionName_Placeholder_RemoveGroup,14424,Method
-PublishSubscribeType_ConnectionName_Placeholder_RemoveGroup_InputArguments,14425,Variable
-PublishSubscribeType_RemoveConnection,14432,Method
-PublishSubscribeType_RemoveConnection_InputArguments,14433,Variable
-PublishSubscribeType_PublishedDataSets,14434,Object
-PublishSubscribeType_PublishedDataSets_AddPublishedDataItems,14435,Method
-PublishSubscribeType_PublishedDataSets_AddPublishedDataItems_InputArguments,14436,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedDataItems_OutputArguments,14437,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedEvents,14438,Method
-PublishSubscribeType_PublishedDataSets_AddPublishedEvents_InputArguments,14439,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedEvents_OutputArguments,14440,Variable
-PublishSubscribeType_PublishedDataSets_RemovePublishedDataSet,14441,Method
-PublishSubscribeType_PublishedDataSets_RemovePublishedDataSet_InputArguments,14442,Variable
-PublishSubscribe,14443,Object
-HasPubSubConnection,14476,ReferenceType
-DataSetFolderType,14477,ObjectType
-DataSetFolderType_DataSetFolderName_Placeholder,14478,Object
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedDataItems,14479,Method
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedDataItems_InputArguments,14480,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedDataItems_OutputArguments,14481,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedEvents,14482,Method
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedEvents_InputArguments,14483,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedEvents_OutputArguments,14484,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_RemovePublishedDataSet,14485,Method
-DataSetFolderType_DataSetFolderName_Placeholder_RemovePublishedDataSet_InputArguments,14486,Variable
-DataSetFolderType_PublishedDataSetName_Placeholder,14487,Object
-DataSetFolderType_PublishedDataSetName_Placeholder_ConfigurationVersion,14489,Variable
-DataSetFolderType_AddPublishedDataItems,14493,Method
-DataSetFolderType_AddPublishedDataItems_InputArguments,14494,Variable
-DataSetFolderType_AddPublishedDataItems_OutputArguments,14495,Variable
-DataSetFolderType_AddPublishedEvents,14496,Method
-DataSetFolderType_AddPublishedEvents_InputArguments,14497,Variable
-DataSetFolderType_AddPublishedEvents_OutputArguments,14498,Variable
-DataSetFolderType_RemovePublishedDataSet,14499,Method
-DataSetFolderType_RemovePublishedDataSet_InputArguments,14500,Variable
-AddPublishedDataItemsMethodType,14501,Method
-AddPublishedDataItemsMethodType_InputArguments,14502,Variable
-AddPublishedDataItemsMethodType_OutputArguments,14503,Variable
-AddPublishedEventsMethodType,14504,Method
-AddPublishedEventsMethodType_InputArguments,14505,Variable
-AddPublishedEventsMethodType_OutputArguments,14506,Variable
-RemovePublishedDataSetMethodType,14507,Method
-RemovePublishedDataSetMethodType_InputArguments,14508,Variable
-PublishedDataSetType,14509,ObjectType
-PublishedDataSetType_ConfigurationVersion,14519,Variable
-DataSetMetaDataType,14523,DataType
-FieldMetaData,14524,DataType
-DataTypeDescription,14525,DataType
-StructureType_EnumStrings,14528,Variable
-KeyValuePair,14533,DataType
-PublishedDataItemsType,14534,ObjectType
-PublishedDataItemsType_ConfigurationVersion,14544,Variable
-PublishedDataItemsType_PublishedData,14548,Variable
-PublishedDataItemsType_AddVariables,14555,Method
-PublishedDataItemsType_AddVariables_InputArguments,14556,Variable
-PublishedDataItemsType_AddVariables_OutputArguments,14557,Variable
-PublishedDataItemsType_RemoveVariables,14558,Method
-PublishedDataItemsType_RemoveVariables_InputArguments,14559,Variable
-PublishedDataItemsType_RemoveVariables_OutputArguments,14560,Variable
-PublishedDataItemsAddVariablesMethodType,14564,Method
-PublishedDataItemsAddVariablesMethodType_InputArguments,14565,Variable
-PublishedDataItemsAddVariablesMethodType_OutputArguments,14566,Variable
-PublishedDataItemsRemoveVariablesMethodType,14567,Method
-PublishedDataItemsRemoveVariablesMethodType_InputArguments,14568,Variable
-PublishedDataItemsRemoveVariablesMethodType_OutputArguments,14569,Variable
-PublishedEventsType,14572,ObjectType
-PublishedEventsType_ConfigurationVersion,14582,Variable
-PublishedEventsType_PubSubEventNotifier,14586,Variable
-PublishedEventsType_SelectedFields,14587,Variable
-PublishedEventsType_Filter,14588,Variable
-ConfigurationVersionDataType,14593,DataType
-PubSubConnectionType_PublisherId,14595,Variable
-PubSubConnectionType_Status,14600,Object
-PubSubConnectionType_Status_State,14601,Variable
-PubSubConnectionType_Status_Enable,14602,Method
-PubSubConnectionType_Status_Disable,14603,Method
-PubSubConnectionTypeRemoveGroupMethodType,14604,Method
-PubSubConnectionTypeRemoveGroupMethodType_InputArguments,14605,Variable
-PubSubGroupTypeRemoveWriterMethodType,14623,Method
-PubSubGroupTypeRemoveWriterMethodType_InputArguments,14624,Variable
-PubSubGroupTypeRemoveReaderMethodType,14625,Method
-PubSubGroupTypeRemoveReaderMethodType_InputArguments,14626,Variable
-PubSubStatusType,14643,ObjectType
-PubSubStatusType_State,14644,Variable
-PubSubStatusType_Enable,14645,Method
-PubSubStatusType_Disable,14646,Method
-PubSubState,14647,DataType
-PubSubState_EnumStrings,14648,Variable
-FieldTargetDataType,14744,DataType
-DataSetMetaDataType_Encoding_DefaultXml,14794,Object
-FieldMetaData_Encoding_DefaultXml,14795,Object
-DataTypeDescription_Encoding_DefaultXml,14796,Object
-DataTypeDefinition_Encoding_DefaultXml,14797,Object
-StructureDefinition_Encoding_DefaultXml,14798,Object
-EnumDefinition_Encoding_DefaultXml,14799,Object
-StructureField_Encoding_DefaultXml,14800,Object
-EnumField_Encoding_DefaultXml,14801,Object
-KeyValuePair_Encoding_DefaultXml,14802,Object
-ConfigurationVersionDataType_Encoding_DefaultXml,14803,Object
-FieldTargetDataType_Encoding_DefaultXml,14804,Object
-OpcUa_XmlSchema_DataSetMetaDataType,14805,Variable
-OpcUa_XmlSchema_DataSetMetaDataType_DataTypeVersion,14806,Variable
-OpcUa_XmlSchema_DataSetMetaDataType_DictionaryFragment,14807,Variable
-OpcUa_XmlSchema_FieldMetaData,14808,Variable
-OpcUa_XmlSchema_FieldMetaData_DataTypeVersion,14809,Variable
-OpcUa_XmlSchema_FieldMetaData_DictionaryFragment,14810,Variable
-OpcUa_XmlSchema_DataTypeDescription,14811,Variable
-OpcUa_XmlSchema_DataTypeDescription_DataTypeVersion,14812,Variable
-OpcUa_XmlSchema_DataTypeDescription_DictionaryFragment,14813,Variable
-OpcUa_XmlSchema_EnumField,14826,Variable
-OpcUa_XmlSchema_EnumField_DataTypeVersion,14827,Variable
-OpcUa_XmlSchema_EnumField_DictionaryFragment,14828,Variable
-OpcUa_XmlSchema_KeyValuePair,14829,Variable
-OpcUa_XmlSchema_KeyValuePair_DataTypeVersion,14830,Variable
-OpcUa_XmlSchema_KeyValuePair_DictionaryFragment,14831,Variable
-OpcUa_XmlSchema_ConfigurationVersionDataType,14832,Variable
-OpcUa_XmlSchema_ConfigurationVersionDataType_DataTypeVersion,14833,Variable
-OpcUa_XmlSchema_ConfigurationVersionDataType_DictionaryFragment,14834,Variable
-OpcUa_XmlSchema_FieldTargetDataType,14835,Variable
-OpcUa_XmlSchema_FieldTargetDataType_DataTypeVersion,14836,Variable
-OpcUa_XmlSchema_FieldTargetDataType_DictionaryFragment,14837,Variable
-FieldMetaData_Encoding_DefaultBinary,14839,Object
-StructureField_Encoding_DefaultBinary,14844,Object
-EnumField_Encoding_DefaultBinary,14845,Object
-KeyValuePair_Encoding_DefaultBinary,14846,Object
-ConfigurationVersionDataType_Encoding_DefaultBinary,14847,Object
-FieldTargetDataType_Encoding_DefaultBinary,14848,Object
-OpcUa_BinarySchema_DataSetMetaDataType,14849,Variable
-OpcUa_BinarySchema_DataSetMetaDataType_DataTypeVersion,14850,Variable
-OpcUa_BinarySchema_DataSetMetaDataType_DictionaryFragment,14851,Variable
-OpcUa_BinarySchema_FieldMetaData,14852,Variable
-OpcUa_BinarySchema_FieldMetaData_DataTypeVersion,14853,Variable
-OpcUa_BinarySchema_FieldMetaData_DictionaryFragment,14854,Variable
-OpcUa_BinarySchema_DataTypeDescription,14855,Variable
-OpcUa_BinarySchema_DataTypeDescription_DataTypeVersion,14856,Variable
-OpcUa_BinarySchema_DataTypeDescription_DictionaryFragment,14857,Variable
-OpcUa_BinarySchema_EnumField,14870,Variable
-OpcUa_BinarySchema_EnumField_DataTypeVersion,14871,Variable
-OpcUa_BinarySchema_EnumField_DictionaryFragment,14872,Variable
-OpcUa_BinarySchema_KeyValuePair,14873,Variable
-OpcUa_BinarySchema_KeyValuePair_DataTypeVersion,14874,Variable
-OpcUa_BinarySchema_KeyValuePair_DictionaryFragment,14875,Variable
-OpcUa_BinarySchema_ConfigurationVersionDataType,14876,Variable
-OpcUa_BinarySchema_ConfigurationVersionDataType_DataTypeVersion,14877,Variable
-OpcUa_BinarySchema_ConfigurationVersionDataType_DictionaryFragment,14878,Variable
-OpcUa_BinarySchema_FieldTargetDataType_DataTypeVersion,14880,Variable
-OpcUa_BinarySchema_FieldTargetDataType_DictionaryFragment,14881,Variable
-CertificateExpirationAlarmType_ExpirationLimit,14900,Variable
-DataSetToWriter,14936,ReferenceType
-DataTypeDictionaryType_Deprecated,15001,Variable
-MaxCharacters,15002,Variable
-ServerType_UrisVersion,15003,Variable
-Server_UrisVersion,15004,Variable
-SimpleTypeDescription,15005,DataType
-UABinaryFileDataType,15006,DataType
-BrokerConnectionTransportDataType,15007,DataType
-BrokerTransportQualityOfService,15008,DataType
-BrokerTransportQualityOfService_EnumStrings,15009,Variable
-SecurityGroupFolderType_SecurityGroupName_Placeholder_KeyLifetime,15010,Variable
-SecurityGroupFolderType_SecurityGroupName_Placeholder_SecurityPolicyUri,15011,Variable
-SecurityGroupFolderType_SecurityGroupName_Placeholder_MaxFutureKeyCount,15012,Variable
-AuditConditionResetEventType,15013,ObjectType
-AuditConditionResetEventType_EventId,15014,Variable
-AuditConditionResetEventType_EventType,15015,Variable
-AuditConditionResetEventType_SourceNode,15016,Variable
-AuditConditionResetEventType_SourceName,15017,Variable
-AuditConditionResetEventType_Time,15018,Variable
-AuditConditionResetEventType_ReceiveTime,15019,Variable
-AuditConditionResetEventType_LocalTime,15020,Variable
-AuditConditionResetEventType_Message,15021,Variable
-AuditConditionResetEventType_Severity,15022,Variable
-AuditConditionResetEventType_ActionTimeStamp,15023,Variable
-AuditConditionResetEventType_Status,15024,Variable
-AuditConditionResetEventType_ServerId,15025,Variable
-AuditConditionResetEventType_ClientAuditEntryId,15026,Variable
-AuditConditionResetEventType_ClientUserId,15027,Variable
-AuditConditionResetEventType_MethodId,15028,Variable
-AuditConditionResetEventType_InputArguments,15029,Variable
-PermissionType_OptionSetValues,15030,Variable
-AccessLevelType,15031,DataType
-AccessLevelType_OptionSetValues,15032,Variable
-EventNotifierType,15033,DataType
-EventNotifierType_OptionSetValues,15034,Variable
-AccessRestrictionType_OptionSetValues,15035,Variable
-AttributeWriteMask_OptionSetValues,15036,Variable
-OpcUa_BinarySchema_Deprecated,15037,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodInputValues,15038,Variable
-OpcUa_XmlSchema_Deprecated,15039,Variable
-ProgramStateMachineType_ProgramDiagnostic_LastMethodOutputValues,15040,Variable
-KeyValuePair_Encoding_DefaultJson,15041,Object
-IdentityMappingRuleType_Encoding_DefaultJson,15042,Object
-SecurityGroupFolderType_SecurityGroupName_Placeholder_MaxPastKeyCount,15043,Variable
-TrustListDataType_Encoding_DefaultJson,15044,Object
-DecimalDataType_Encoding_DefaultJson,15045,Object
-SecurityGroupType_KeyLifetime,15046,Variable
-SecurityGroupType_SecurityPolicyUri,15047,Variable
-SecurityGroupType_MaxFutureKeyCount,15048,Variable
-ConfigurationVersionDataType_Encoding_DefaultJson,15049,Object
-DataSetMetaDataType_Encoding_DefaultJson,15050,Object
-FieldMetaData_Encoding_DefaultJson,15051,Object
-PublishedEventsType_ModifyFieldSelection,15052,Method
-PublishedEventsType_ModifyFieldSelection_InputArguments,15053,Variable
-PublishedEventsTypeModifyFieldSelectionMethodType,15054,Method
-PublishedEventsTypeModifyFieldSelectionMethodType_InputArguments,15055,Variable
-SecurityGroupType_MaxPastKeyCount,15056,Variable
-DataTypeDescription_Encoding_DefaultJson,15057,Object
-StructureDescription_Encoding_DefaultJson,15058,Object
-EnumDescription_Encoding_DefaultJson,15059,Object
-PublishedVariableDataType_Encoding_DefaultJson,15060,Object
-FieldTargetDataType_Encoding_DefaultJson,15061,Object
-RolePermissionType_Encoding_DefaultJson,15062,Object
-DataTypeDefinition_Encoding_DefaultJson,15063,Object
-DatagramConnectionTransportType,15064,ObjectType
-StructureField_Encoding_DefaultJson,15065,Object
-StructureDefinition_Encoding_DefaultJson,15066,Object
-EnumDefinition_Encoding_DefaultJson,15067,Object
-Node_Encoding_DefaultJson,15068,Object
-InstanceNode_Encoding_DefaultJson,15069,Object
-TypeNode_Encoding_DefaultJson,15070,Object
-ObjectNode_Encoding_DefaultJson,15071,Object
-DatagramConnectionTransportType_DiscoveryAddress,15072,Object
-ObjectTypeNode_Encoding_DefaultJson,15073,Object
-VariableNode_Encoding_DefaultJson,15074,Object
-VariableTypeNode_Encoding_DefaultJson,15075,Object
-ReferenceTypeNode_Encoding_DefaultJson,15076,Object
-MethodNode_Encoding_DefaultJson,15077,Object
-ViewNode_Encoding_DefaultJson,15078,Object
-DataTypeNode_Encoding_DefaultJson,15079,Object
-ReferenceNode_Encoding_DefaultJson,15080,Object
-Argument_Encoding_DefaultJson,15081,Object
-EnumValueType_Encoding_DefaultJson,15082,Object
-EnumField_Encoding_DefaultJson,15083,Object
-OptionSet_Encoding_DefaultJson,15084,Object
-Union_Encoding_DefaultJson,15085,Object
-TimeZoneDataType_Encoding_DefaultJson,15086,Object
-ApplicationDescription_Encoding_DefaultJson,15087,Object
-RequestHeader_Encoding_DefaultJson,15088,Object
-ResponseHeader_Encoding_DefaultJson,15089,Object
-ServiceFault_Encoding_DefaultJson,15090,Object
-SessionlessInvokeRequestType_Encoding_DefaultJson,15091,Object
-SessionlessInvokeResponseType_Encoding_DefaultJson,15092,Object
-FindServersRequest_Encoding_DefaultJson,15093,Object
-FindServersResponse_Encoding_DefaultJson,15094,Object
-ServerOnNetwork_Encoding_DefaultJson,15095,Object
-FindServersOnNetworkRequest_Encoding_DefaultJson,15096,Object
-FindServersOnNetworkResponse_Encoding_DefaultJson,15097,Object
-UserTokenPolicy_Encoding_DefaultJson,15098,Object
-EndpointDescription_Encoding_DefaultJson,15099,Object
-GetEndpointsRequest_Encoding_DefaultJson,15100,Object
-GetEndpointsResponse_Encoding_DefaultJson,15101,Object
-RegisteredServer_Encoding_DefaultJson,15102,Object
-RegisterServerRequest_Encoding_DefaultJson,15103,Object
-RegisterServerResponse_Encoding_DefaultJson,15104,Object
-DiscoveryConfiguration_Encoding_DefaultJson,15105,Object
-MdnsDiscoveryConfiguration_Encoding_DefaultJson,15106,Object
-RegisterServer2Request_Encoding_DefaultJson,15107,Object
-SubscribedDataSetType,15108,ObjectType
-ChoiceStateType,15109,ObjectType
-ChoiceStateType_StateNumber,15110,Variable
-TargetVariablesType,15111,ObjectType
-HasGuard,15112,ReferenceType
-GuardVariableType,15113,VariableType
-TargetVariablesType_TargetVariables,15114,Variable
-TargetVariablesType_AddTargetVariables,15115,Method
-TargetVariablesType_AddTargetVariables_InputArguments,15116,Variable
-TargetVariablesType_AddTargetVariables_OutputArguments,15117,Variable
-TargetVariablesType_RemoveTargetVariables,15118,Method
-TargetVariablesType_RemoveTargetVariables_InputArguments,15119,Variable
-TargetVariablesType_RemoveTargetVariables_OutputArguments,15120,Variable
-TargetVariablesTypeAddTargetVariablesMethodType,15121,Method
-TargetVariablesTypeAddTargetVariablesMethodType_InputArguments,15122,Variable
-TargetVariablesTypeAddTargetVariablesMethodType_OutputArguments,15123,Variable
-TargetVariablesTypeRemoveTargetVariablesMethodType,15124,Method
-TargetVariablesTypeRemoveTargetVariablesMethodType_InputArguments,15125,Variable
-TargetVariablesTypeRemoveTargetVariablesMethodType_OutputArguments,15126,Variable
-SubscribedDataSetMirrorType,15127,ObjectType
-ExpressionGuardVariableType,15128,VariableType
-ExpressionGuardVariableType_Expression,15129,Variable
-RegisterServer2Response_Encoding_DefaultJson,15130,Object
-ChannelSecurityToken_Encoding_DefaultJson,15131,Object
-OpenSecureChannelRequest_Encoding_DefaultJson,15132,Object
-OpenSecureChannelResponse_Encoding_DefaultJson,15133,Object
-CloseSecureChannelRequest_Encoding_DefaultJson,15134,Object
-CloseSecureChannelResponse_Encoding_DefaultJson,15135,Object
-SignedSoftwareCertificate_Encoding_DefaultJson,15136,Object
-SignatureData_Encoding_DefaultJson,15137,Object
-CreateSessionRequest_Encoding_DefaultJson,15138,Object
-CreateSessionResponse_Encoding_DefaultJson,15139,Object
-UserIdentityToken_Encoding_DefaultJson,15140,Object
-AnonymousIdentityToken_Encoding_DefaultJson,15141,Object
-UserNameIdentityToken_Encoding_DefaultJson,15142,Object
-X509IdentityToken_Encoding_DefaultJson,15143,Object
-IssuedIdentityToken_Encoding_DefaultJson,15144,Object
-ActivateSessionRequest_Encoding_DefaultJson,15145,Object
-ActivateSessionResponse_Encoding_DefaultJson,15146,Object
-CloseSessionRequest_Encoding_DefaultJson,15147,Object
-CloseSessionResponse_Encoding_DefaultJson,15148,Object
-CancelRequest_Encoding_DefaultJson,15149,Object
-CancelResponse_Encoding_DefaultJson,15150,Object
-NodeAttributes_Encoding_DefaultJson,15151,Object
-ObjectAttributes_Encoding_DefaultJson,15152,Object
-VariableAttributes_Encoding_DefaultJson,15153,Object
-DatagramConnectionTransportType_DiscoveryAddress_NetworkInterface,15154,Variable
-BrokerConnectionTransportType,15155,ObjectType
-BrokerConnectionTransportType_ResourceUri,15156,Variable
-MethodAttributes_Encoding_DefaultJson,15157,Object
-ObjectTypeAttributes_Encoding_DefaultJson,15158,Object
-VariableTypeAttributes_Encoding_DefaultJson,15159,Object
-ReferenceTypeAttributes_Encoding_DefaultJson,15160,Object
-DataTypeAttributes_Encoding_DefaultJson,15161,Object
-ViewAttributes_Encoding_DefaultJson,15162,Object
-GenericAttributeValue_Encoding_DefaultJson,15163,Object
-GenericAttributes_Encoding_DefaultJson,15164,Object
-AddNodesItem_Encoding_DefaultJson,15165,Object
-AddNodesResult_Encoding_DefaultJson,15166,Object
-AddNodesRequest_Encoding_DefaultJson,15167,Object
-AddNodesResponse_Encoding_DefaultJson,15168,Object
-AddReferencesItem_Encoding_DefaultJson,15169,Object
-AddReferencesRequest_Encoding_DefaultJson,15170,Object
-AddReferencesResponse_Encoding_DefaultJson,15171,Object
-DeleteNodesItem_Encoding_DefaultJson,15172,Object
-DeleteNodesRequest_Encoding_DefaultJson,15173,Object
-DeleteNodesResponse_Encoding_DefaultJson,15174,Object
-DeleteReferencesItem_Encoding_DefaultJson,15175,Object
-DeleteReferencesRequest_Encoding_DefaultJson,15176,Object
-DeleteReferencesResponse_Encoding_DefaultJson,15177,Object
-BrokerConnectionTransportType_AuthenticationProfileUri,15178,Variable
-ViewDescription_Encoding_DefaultJson,15179,Object
-BrowseDescription_Encoding_DefaultJson,15180,Object
-UserCredentialCertificateType,15181,ObjectType
-ReferenceDescription_Encoding_DefaultJson,15182,Object
-BrowseResult_Encoding_DefaultJson,15183,Object
-BrowseRequest_Encoding_DefaultJson,15184,Object
-BrowseResponse_Encoding_DefaultJson,15185,Object
-BrowseNextRequest_Encoding_DefaultJson,15186,Object
-BrowseNextResponse_Encoding_DefaultJson,15187,Object
-RelativePathElement_Encoding_DefaultJson,15188,Object
-RelativePath_Encoding_DefaultJson,15189,Object
-BrowsePath_Encoding_DefaultJson,15190,Object
-BrowsePathTarget_Encoding_DefaultJson,15191,Object
-BrowsePathResult_Encoding_DefaultJson,15192,Object
-TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultJson,15193,Object
-TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultJson,15194,Object
-RegisterNodesRequest_Encoding_DefaultJson,15195,Object
-RegisterNodesResponse_Encoding_DefaultJson,15196,Object
-UnregisterNodesRequest_Encoding_DefaultJson,15197,Object
-UnregisterNodesResponse_Encoding_DefaultJson,15198,Object
-EndpointConfiguration_Encoding_DefaultJson,15199,Object
-QueryDataDescription_Encoding_DefaultJson,15200,Object
-NodeTypeDescription_Encoding_DefaultJson,15201,Object
-QueryDataSet_Encoding_DefaultJson,15202,Object
-NodeReference_Encoding_DefaultJson,15203,Object
-ContentFilterElement_Encoding_DefaultJson,15204,Object
-ContentFilter_Encoding_DefaultJson,15205,Object
-FilterOperand_Encoding_DefaultJson,15206,Object
-ElementOperand_Encoding_DefaultJson,15207,Object
-LiteralOperand_Encoding_DefaultJson,15208,Object
-AttributeOperand_Encoding_DefaultJson,15209,Object
-SimpleAttributeOperand_Encoding_DefaultJson,15210,Object
-ContentFilterElementResult_Encoding_DefaultJson,15211,Object
-PublishSubscribeType_GetSecurityKeys,15212,Method
-PublishSubscribeType_GetSecurityKeys_InputArguments,15213,Variable
-PublishSubscribeType_GetSecurityKeys_OutputArguments,15214,Variable
-PublishSubscribe_GetSecurityKeys,15215,Method
-PublishSubscribe_GetSecurityKeys_InputArguments,15216,Variable
-PublishSubscribe_GetSecurityKeys_OutputArguments,15217,Variable
-GetSecurityKeysMethodType,15218,Method
-GetSecurityKeysMethodType_InputArguments,15219,Variable
-GetSecurityKeysMethodType_OutputArguments,15220,Variable
-DataSetFolderType_PublishedDataSetName_Placeholder_DataSetMetaData,15221,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder,15222,Object
-PublishedDataSetType_DataSetWriterName_Placeholder_Status,15223,Object
-PublishedDataSetType_DataSetWriterName_Placeholder_Status_State,15224,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Status_Enable,15225,Method
-PublishedDataSetType_DataSetWriterName_Placeholder_Status_Disable,15226,Method
-PublishedDataSetType_DataSetWriterName_Placeholder_TransportSettings,15227,Object
-ContentFilterResult_Encoding_DefaultJson,15228,Object
-PublishedDataSetType_DataSetMetaData,15229,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder,15230,Object
-PublishedDataItemsType_DataSetWriterName_Placeholder_Status,15231,Object
-PublishedDataItemsType_DataSetWriterName_Placeholder_Status_State,15232,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Status_Enable,15233,Method
-PublishedDataItemsType_DataSetWriterName_Placeholder_Status_Disable,15234,Method
-PublishedDataItemsType_DataSetWriterName_Placeholder_TransportSettings,15235,Object
-ParsingResult_Encoding_DefaultJson,15236,Object
-PublishedDataItemsType_DataSetMetaData,15237,Variable
-PublishedEventsType_DataSetWriterName_Placeholder,15238,Object
-PublishedEventsType_DataSetWriterName_Placeholder_Status,15239,Object
-PublishedEventsType_DataSetWriterName_Placeholder_Status_State,15240,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Status_Enable,15241,Method
-PublishedEventsType_DataSetWriterName_Placeholder_Status_Disable,15242,Method
-PublishedEventsType_DataSetWriterName_Placeholder_TransportSettings,15243,Object
-QueryFirstRequest_Encoding_DefaultJson,15244,Object
-PublishedEventsType_DataSetMetaData,15245,Variable
-BrokerWriterGroupTransportType_ResourceUri,15246,Variable
-BrokerWriterGroupTransportType_AuthenticationProfileUri,15247,Variable
-CreateCredentialMethodType,15248,Method
-BrokerWriterGroupTransportType_RequestedDeliveryGuarantee,15249,Variable
-BrokerDataSetWriterTransportType_ResourceUri,15250,Variable
-BrokerDataSetWriterTransportType_AuthenticationProfileUri,15251,Variable
-QueryFirstResponse_Encoding_DefaultJson,15252,Object
-CreateCredentialMethodType_InputArguments,15253,Variable
-QueryNextRequest_Encoding_DefaultJson,15254,Object
-QueryNextResponse_Encoding_DefaultJson,15255,Object
-ReadValueId_Encoding_DefaultJson,15256,Object
-ReadRequest_Encoding_DefaultJson,15257,Object
-ReadResponse_Encoding_DefaultJson,15258,Object
-HistoryReadValueId_Encoding_DefaultJson,15259,Object
-HistoryReadResult_Encoding_DefaultJson,15260,Object
-HistoryReadDetails_Encoding_DefaultJson,15261,Object
-ReadEventDetails_Encoding_DefaultJson,15262,Object
-ReadRawModifiedDetails_Encoding_DefaultJson,15263,Object
-ReadProcessedDetails_Encoding_DefaultJson,15264,Object
-PubSubGroupType_Status,15265,Object
-PubSubGroupType_Status_State,15266,Variable
-PubSubGroupType_Status_Enable,15267,Method
-PubSubGroupType_Status_Disable,15268,Method
-ReadAtTimeDetails_Encoding_DefaultJson,15269,Object
-HistoryData_Encoding_DefaultJson,15270,Object
-ModificationInfo_Encoding_DefaultJson,15271,Object
-HistoryModifiedData_Encoding_DefaultJson,15272,Object
-HistoryEvent_Encoding_DefaultJson,15273,Object
-HistoryReadRequest_Encoding_DefaultJson,15274,Object
-HistoryReadResponse_Encoding_DefaultJson,15275,Object
-WriteValue_Encoding_DefaultJson,15276,Object
-WriteRequest_Encoding_DefaultJson,15277,Object
-WriteResponse_Encoding_DefaultJson,15278,Object
-HistoryUpdateDetails_Encoding_DefaultJson,15279,Object
-UpdateDataDetails_Encoding_DefaultJson,15280,Object
-UpdateStructureDataDetails_Encoding_DefaultJson,15281,Object
-UpdateEventDetails_Encoding_DefaultJson,15282,Object
-DeleteRawModifiedDetails_Encoding_DefaultJson,15283,Object
-DeleteAtTimeDetails_Encoding_DefaultJson,15284,Object
-DeleteEventDetails_Encoding_DefaultJson,15285,Object
-HistoryUpdateResult_Encoding_DefaultJson,15286,Object
-HistoryUpdateRequest_Encoding_DefaultJson,15287,Object
-HistoryUpdateResponse_Encoding_DefaultJson,15288,Object
-CallMethodRequest_Encoding_DefaultJson,15289,Object
-CallMethodResult_Encoding_DefaultJson,15290,Object
-CallRequest_Encoding_DefaultJson,15291,Object
-CallResponse_Encoding_DefaultJson,15292,Object
-MonitoringFilter_Encoding_DefaultJson,15293,Object
-DataChangeFilter_Encoding_DefaultJson,15294,Object
-EventFilter_Encoding_DefaultJson,15295,Object
-HasDataSetWriter,15296,ReferenceType
-HasDataSetReader,15297,ReferenceType
-DataSetWriterType,15298,ObjectType
-DataSetWriterType_Status,15299,Object
-DataSetWriterType_Status_State,15300,Variable
-DataSetWriterType_Status_Enable,15301,Method
-DataSetWriterType_Status_Disable,15302,Method
-DataSetWriterType_TransportSettings,15303,Object
-AggregateConfiguration_Encoding_DefaultJson,15304,Object
-DataSetWriterTransportType,15305,ObjectType
-DataSetReaderType,15306,ObjectType
-DataSetReaderType_Status,15307,Object
-DataSetReaderType_Status_State,15308,Variable
-DataSetReaderType_Status_Enable,15309,Method
-DataSetReaderType_Status_Disable,15310,Method
-DataSetReaderType_TransportSettings,15311,Object
-AggregateFilter_Encoding_DefaultJson,15312,Object
-MonitoringFilterResult_Encoding_DefaultJson,15313,Object
-EventFilterResult_Encoding_DefaultJson,15314,Object
-AggregateFilterResult_Encoding_DefaultJson,15315,Object
-DataSetReaderType_SubscribedDataSet,15316,Object
-ElseGuardVariableType,15317,VariableType
-BaseAnalogType,15318,VariableType
-DataSetReaderTransportType,15319,ObjectType
-MonitoringParameters_Encoding_DefaultJson,15320,Object
-MonitoredItemCreateRequest_Encoding_DefaultJson,15321,Object
-MonitoredItemCreateResult_Encoding_DefaultJson,15322,Object
-CreateMonitoredItemsRequest_Encoding_DefaultJson,15323,Object
-CreateMonitoredItemsResponse_Encoding_DefaultJson,15324,Object
-MonitoredItemModifyRequest_Encoding_DefaultJson,15325,Object
-MonitoredItemModifyResult_Encoding_DefaultJson,15326,Object
-ModifyMonitoredItemsRequest_Encoding_DefaultJson,15327,Object
-ModifyMonitoredItemsResponse_Encoding_DefaultJson,15328,Object
-SetMonitoringModeRequest_Encoding_DefaultJson,15329,Object
-BrokerDataSetWriterTransportType_RequestedDeliveryGuarantee,15330,Variable
-SetMonitoringModeResponse_Encoding_DefaultJson,15331,Object
-SetTriggeringRequest_Encoding_DefaultJson,15332,Object
-SetTriggeringResponse_Encoding_DefaultJson,15333,Object
-BrokerDataSetReaderTransportType_ResourceUri,15334,Variable
-DeleteMonitoredItemsRequest_Encoding_DefaultJson,15335,Object
-DeleteMonitoredItemsResponse_Encoding_DefaultJson,15336,Object
-CreateSubscriptionRequest_Encoding_DefaultJson,15337,Object
-CreateSubscriptionResponse_Encoding_DefaultJson,15338,Object
-ModifySubscriptionRequest_Encoding_DefaultJson,15339,Object
-ModifySubscriptionResponse_Encoding_DefaultJson,15340,Object
-SetPublishingModeRequest_Encoding_DefaultJson,15341,Object
-SetPublishingModeResponse_Encoding_DefaultJson,15342,Object
-NotificationMessage_Encoding_DefaultJson,15343,Object
-NotificationData_Encoding_DefaultJson,15344,Object
-DataChangeNotification_Encoding_DefaultJson,15345,Object
-MonitoredItemNotification_Encoding_DefaultJson,15346,Object
-EventNotificationList_Encoding_DefaultJson,15347,Object
-EventFieldList_Encoding_DefaultJson,15348,Object
-HistoryEventFieldList_Encoding_DefaultJson,15349,Object
-StatusChangeNotification_Encoding_DefaultJson,15350,Object
-SubscriptionAcknowledgement_Encoding_DefaultJson,15351,Object
-PublishRequest_Encoding_DefaultJson,15352,Object
-PublishResponse_Encoding_DefaultJson,15353,Object
-RepublishRequest_Encoding_DefaultJson,15354,Object
-RepublishResponse_Encoding_DefaultJson,15355,Object
-TransferResult_Encoding_DefaultJson,15356,Object
-TransferSubscriptionsRequest_Encoding_DefaultJson,15357,Object
-TransferSubscriptionsResponse_Encoding_DefaultJson,15358,Object
-DeleteSubscriptionsRequest_Encoding_DefaultJson,15359,Object
-DeleteSubscriptionsResponse_Encoding_DefaultJson,15360,Object
-BuildInfo_Encoding_DefaultJson,15361,Object
-RedundantServerDataType_Encoding_DefaultJson,15362,Object
-EndpointUrlListDataType_Encoding_DefaultJson,15363,Object
-NetworkGroupDataType_Encoding_DefaultJson,15364,Object
-SamplingIntervalDiagnosticsDataType_Encoding_DefaultJson,15365,Object
-ServerDiagnosticsSummaryDataType_Encoding_DefaultJson,15366,Object
-ServerStatusDataType_Encoding_DefaultJson,15367,Object
-SessionDiagnosticsDataType_Encoding_DefaultJson,15368,Object
-SessionSecurityDiagnosticsDataType_Encoding_DefaultJson,15369,Object
-ServiceCounterDataType_Encoding_DefaultJson,15370,Object
-StatusResult_Encoding_DefaultJson,15371,Object
-SubscriptionDiagnosticsDataType_Encoding_DefaultJson,15372,Object
-ModelChangeStructureDataType_Encoding_DefaultJson,15373,Object
-SemanticChangeStructureDataType_Encoding_DefaultJson,15374,Object
-Range_Encoding_DefaultJson,15375,Object
-EUInformation_Encoding_DefaultJson,15376,Object
-ComplexNumberType_Encoding_DefaultJson,15377,Object
-DoubleComplexNumberType_Encoding_DefaultJson,15378,Object
-AxisInformation_Encoding_DefaultJson,15379,Object
-XVType_Encoding_DefaultJson,15380,Object
-ProgramDiagnosticDataType_Encoding_DefaultJson,15381,Object
-Annotation_Encoding_DefaultJson,15382,Object
-ProgramDiagnostic2Type,15383,VariableType
-ProgramDiagnostic2Type_CreateSessionId,15384,Variable
-ProgramDiagnostic2Type_CreateClientName,15385,Variable
-ProgramDiagnostic2Type_InvocationCreationTime,15386,Variable
-ProgramDiagnostic2Type_LastTransitionTime,15387,Variable
-ProgramDiagnostic2Type_LastMethodCall,15388,Variable
-ProgramDiagnostic2Type_LastMethodSessionId,15389,Variable
-ProgramDiagnostic2Type_LastMethodInputArguments,15390,Variable
-ProgramDiagnostic2Type_LastMethodOutputArguments,15391,Variable
-ProgramDiagnostic2Type_LastMethodInputValues,15392,Variable
-ProgramDiagnostic2Type_LastMethodOutputValues,15393,Variable
-ProgramDiagnostic2Type_LastMethodCallTime,15394,Variable
-ProgramDiagnostic2Type_LastMethodReturnStatus,15395,Variable
-ProgramDiagnostic2DataType,15396,DataType
-ProgramDiagnostic2DataType_Encoding_DefaultBinary,15397,Object
-OpcUa_BinarySchema_ProgramDiagnostic2DataType,15398,Variable
-OpcUa_BinarySchema_ProgramDiagnostic2DataType_DataTypeVersion,15399,Variable
-OpcUa_BinarySchema_ProgramDiagnostic2DataType_DictionaryFragment,15400,Variable
-ProgramDiagnostic2DataType_Encoding_DefaultXml,15401,Object
-OpcUa_XmlSchema_ProgramDiagnostic2DataType,15402,Variable
-OpcUa_XmlSchema_ProgramDiagnostic2DataType_DataTypeVersion,15403,Variable
-OpcUa_XmlSchema_ProgramDiagnostic2DataType_DictionaryFragment,15404,Variable
-ProgramDiagnostic2DataType_Encoding_DefaultJson,15405,Object
-AccessLevelExType,15406,DataType
-AccessLevelExType_OptionSetValues,15407,Variable
-RoleSetType_RoleName_Placeholder_ApplicationsExclude,15408,Variable
-RoleSetType_RoleName_Placeholder_EndpointsExclude,15409,Variable
-RoleType_ApplicationsExclude,15410,Variable
-RoleType_EndpointsExclude,15411,Variable
-WellKnownRole_Anonymous_ApplicationsExclude,15412,Variable
-WellKnownRole_Anonymous_EndpointsExclude,15413,Variable
-WellKnownRole_AuthenticatedUser_ApplicationsExclude,15414,Variable
-WellKnownRole_AuthenticatedUser_EndpointsExclude,15415,Variable
-WellKnownRole_Observer_ApplicationsExclude,15416,Variable
-WellKnownRole_Observer_EndpointsExclude,15417,Variable
-WellKnownRole_Operator_ApplicationsExclude,15418,Variable
-BrokerDataSetReaderTransportType_AuthenticationProfileUri,15419,Variable
-BrokerDataSetReaderTransportType_RequestedDeliveryGuarantee,15420,Variable
-SimpleTypeDescription_Encoding_DefaultBinary,15421,Object
-UABinaryFileDataType_Encoding_DefaultBinary,15422,Object
-WellKnownRole_Operator_EndpointsExclude,15423,Variable
-WellKnownRole_Engineer_ApplicationsExclude,15424,Variable
-WellKnownRole_Engineer_EndpointsExclude,15425,Variable
-WellKnownRole_Supervisor_ApplicationsExclude,15426,Variable
-WellKnownRole_Supervisor_EndpointsExclude,15427,Variable
-WellKnownRole_ConfigureAdmin_ApplicationsExclude,15428,Variable
-WellKnownRole_ConfigureAdmin_EndpointsExclude,15429,Variable
-WellKnownRole_SecurityAdmin_ApplicationsExclude,15430,Variable
-PublishSubscribeType_GetSecurityGroup,15431,Method
-PublishSubscribeType_GetSecurityGroup_InputArguments,15432,Variable
-PublishSubscribeType_GetSecurityGroup_OutputArguments,15433,Variable
-PublishSubscribeType_SecurityGroups,15434,Object
-PublishSubscribeType_SecurityGroups_AddSecurityGroup,15435,Method
-PublishSubscribeType_SecurityGroups_AddSecurityGroup_InputArguments,15436,Variable
-PublishSubscribeType_SecurityGroups_AddSecurityGroup_OutputArguments,15437,Variable
-PublishSubscribeType_SecurityGroups_RemoveSecurityGroup,15438,Method
-PublishSubscribeType_SecurityGroups_RemoveSecurityGroup_InputArguments,15439,Variable
-PublishSubscribe_GetSecurityGroup,15440,Method
-PublishSubscribe_GetSecurityGroup_InputArguments,15441,Variable
-PublishSubscribe_GetSecurityGroup_OutputArguments,15442,Variable
-PublishSubscribe_SecurityGroups,15443,Object
-PublishSubscribe_SecurityGroups_AddSecurityGroup,15444,Method
-PublishSubscribe_SecurityGroups_AddSecurityGroup_InputArguments,15445,Variable
-PublishSubscribe_SecurityGroups_AddSecurityGroup_OutputArguments,15446,Variable
-PublishSubscribe_SecurityGroups_RemoveSecurityGroup,15447,Method
-PublishSubscribe_SecurityGroups_RemoveSecurityGroup_InputArguments,15448,Variable
-GetSecurityGroupMethodType,15449,Method
-GetSecurityGroupMethodType_InputArguments,15450,Variable
-GetSecurityGroupMethodType_OutputArguments,15451,Variable
-SecurityGroupFolderType,15452,ObjectType
-SecurityGroupFolderType_SecurityGroupFolderName_Placeholder,15453,Object
-SecurityGroupFolderType_SecurityGroupFolderName_Placeholder_AddSecurityGroup,15454,Method
-SecurityGroupFolderType_SecurityGroupFolderName_Placeholder_AddSecurityGroup_InputArguments,15455,Variable
-SecurityGroupFolderType_SecurityGroupFolderName_Placeholder_AddSecurityGroup_OutputArguments,15456,Variable
-SecurityGroupFolderType_SecurityGroupFolderName_Placeholder_RemoveSecurityGroup,15457,Method
-SecurityGroupFolderType_SecurityGroupFolderName_Placeholder_RemoveSecurityGroup_InputArguments,15458,Variable
-SecurityGroupFolderType_SecurityGroupName_Placeholder,15459,Object
-SecurityGroupFolderType_SecurityGroupName_Placeholder_SecurityGroupId,15460,Variable
-SecurityGroupFolderType_AddSecurityGroup,15461,Method
-SecurityGroupFolderType_AddSecurityGroup_InputArguments,15462,Variable
-SecurityGroupFolderType_AddSecurityGroup_OutputArguments,15463,Variable
-SecurityGroupFolderType_RemoveSecurityGroup,15464,Method
-SecurityGroupFolderType_RemoveSecurityGroup_InputArguments,15465,Variable
-AddSecurityGroupMethodType,15466,Method
-AddSecurityGroupMethodType_InputArguments,15467,Variable
-AddSecurityGroupMethodType_OutputArguments,15468,Variable
-RemoveSecurityGroupMethodType,15469,Method
-RemoveSecurityGroupMethodType_InputArguments,15470,Variable
-SecurityGroupType,15471,ObjectType
-SecurityGroupType_SecurityGroupId,15472,Variable
-DataSetFolderType_PublishedDataSetName_Placeholder_ExtensionFields,15473,Object
-DataSetFolderType_PublishedDataSetName_Placeholder_ExtensionFields_AddExtensionField,15474,Method
-DataSetFolderType_PublishedDataSetName_Placeholder_ExtensionFields_AddExtensionField_InputArguments,15475,Variable
-DataSetFolderType_PublishedDataSetName_Placeholder_ExtensionFields_AddExtensionField_OutputArguments,15476,Variable
-DataSetFolderType_PublishedDataSetName_Placeholder_ExtensionFields_RemoveExtensionField,15477,Method
-DataSetFolderType_PublishedDataSetName_Placeholder_ExtensionFields_RemoveExtensionField_InputArguments,15478,Variable
-BrokerConnectionTransportDataType_Encoding_DefaultBinary,15479,Object
-WriterGroupDataType,15480,DataType
-PublishedDataSetType_ExtensionFields,15481,Object
-PublishedDataSetType_ExtensionFields_AddExtensionField,15482,Method
-PublishedDataSetType_ExtensionFields_AddExtensionField_InputArguments,15483,Variable
-PublishedDataSetType_ExtensionFields_AddExtensionField_OutputArguments,15484,Variable
-PublishedDataSetType_ExtensionFields_RemoveExtensionField,15485,Method
-PublishedDataSetType_ExtensionFields_RemoveExtensionField_InputArguments,15486,Variable
-StructureDescription,15487,DataType
-EnumDescription,15488,DataType
-ExtensionFieldsType,15489,ObjectType
-ExtensionFieldsType_ExtensionFieldName_Placeholder,15490,Variable
-ExtensionFieldsType_AddExtensionField,15491,Method
-ExtensionFieldsType_AddExtensionField_InputArguments,15492,Variable
-ExtensionFieldsType_AddExtensionField_OutputArguments,15493,Variable
-ExtensionFieldsType_RemoveExtensionField,15494,Method
-ExtensionFieldsType_RemoveExtensionField_InputArguments,15495,Variable
-AddExtensionFieldMethodType,15496,Method
-AddExtensionFieldMethodType_InputArguments,15497,Variable
-AddExtensionFieldMethodType_OutputArguments,15498,Variable
-RemoveExtensionFieldMethodType,15499,Method
-RemoveExtensionFieldMethodType_InputArguments,15500,Variable
-OpcUa_BinarySchema_SimpleTypeDescription,15501,Variable
-NetworkAddressDataType,15502,DataType
-PublishedDataItemsType_ExtensionFields,15503,Object
-PublishedDataItemsType_ExtensionFields_AddExtensionField,15504,Method
-PublishedDataItemsType_ExtensionFields_AddExtensionField_InputArguments,15505,Variable
-PublishedDataItemsType_ExtensionFields_AddExtensionField_OutputArguments,15506,Variable
-PublishedDataItemsType_ExtensionFields_RemoveExtensionField,15507,Method
-PublishedDataItemsType_ExtensionFields_RemoveExtensionField_InputArguments,15508,Variable
-OpcUa_BinarySchema_SimpleTypeDescription_DataTypeVersion,15509,Variable
-NetworkAddressUrlDataType,15510,DataType
-PublishedEventsType_ExtensionFields,15511,Object
-PublishedEventsType_ExtensionFields_AddExtensionField,15512,Method
-PublishedEventsType_ExtensionFields_AddExtensionField_InputArguments,15513,Variable
-PublishedEventsType_ExtensionFields_AddExtensionField_OutputArguments,15514,Variable
-PublishedEventsType_ExtensionFields_RemoveExtensionField,15515,Method
-PublishedEventsType_ExtensionFields_RemoveExtensionField_InputArguments,15516,Variable
-PublishedEventsType_ModifyFieldSelection_OutputArguments,15517,Variable
-PublishedEventsTypeModifyFieldSelectionMethodType_OutputArguments,15518,Variable
-OpcUa_BinarySchema_SimpleTypeDescription_DictionaryFragment,15519,Variable
-ReaderGroupDataType,15520,DataType
-OpcUa_BinarySchema_UABinaryFileDataType,15521,Variable
-OpcUa_BinarySchema_UABinaryFileDataType_DataTypeVersion,15522,Variable
-OpcUa_BinarySchema_UABinaryFileDataType_DictionaryFragment,15523,Variable
-OpcUa_BinarySchema_BrokerConnectionTransportDataType,15524,Variable
-OpcUa_BinarySchema_BrokerConnectionTransportDataType_DataTypeVersion,15525,Variable
-OpcUa_BinarySchema_BrokerConnectionTransportDataType_DictionaryFragment,15526,Variable
-WellKnownRole_SecurityAdmin_EndpointsExclude,15527,Variable
-EndpointType,15528,DataType
-SimpleTypeDescription_Encoding_DefaultXml,15529,Object
-PubSubConfigurationDataType,15530,DataType
-UABinaryFileDataType_Encoding_DefaultXml,15531,Object
-DatagramWriterGroupTransportDataType,15532,DataType
-PublishSubscribeType_ConnectionName_Placeholder_Address_NetworkInterface,15533,Variable
-DataTypeSchemaHeader,15534,DataType
-PubSubStatusEventType,15535,ObjectType
-PubSubStatusEventType_EventId,15536,Variable
-PubSubStatusEventType_EventType,15537,Variable
-PubSubStatusEventType_SourceNode,15538,Variable
-PubSubStatusEventType_SourceName,15539,Variable
-PubSubStatusEventType_Time,15540,Variable
-PubSubStatusEventType_ReceiveTime,15541,Variable
-PubSubStatusEventType_LocalTime,15542,Variable
-PubSubStatusEventType_Message,15543,Variable
-PubSubStatusEventType_Severity,15544,Variable
-PubSubStatusEventType_ConnectionId,15545,Variable
-PubSubStatusEventType_GroupId,15546,Variable
-PubSubStatusEventType_State,15547,Variable
-PubSubTransportLimitsExceedEventType,15548,ObjectType
-PubSubTransportLimitsExceedEventType_EventId,15549,Variable
-PubSubTransportLimitsExceedEventType_EventType,15550,Variable
-PubSubTransportLimitsExceedEventType_SourceNode,15551,Variable
-PubSubTransportLimitsExceedEventType_SourceName,15552,Variable
-PubSubTransportLimitsExceedEventType_Time,15553,Variable
-PubSubTransportLimitsExceedEventType_ReceiveTime,15554,Variable
-PubSubTransportLimitsExceedEventType_LocalTime,15555,Variable
-PubSubTransportLimitsExceedEventType_Message,15556,Variable
-PubSubTransportLimitsExceedEventType_Severity,15557,Variable
-PubSubTransportLimitsExceedEventType_ConnectionId,15558,Variable
-PubSubTransportLimitsExceedEventType_GroupId,15559,Variable
-PubSubTransportLimitsExceedEventType_State,15560,Variable
-PubSubTransportLimitsExceedEventType_Actual,15561,Variable
-PubSubTransportLimitsExceedEventType_Maximum,15562,Variable
-PubSubCommunicationFailureEventType,15563,ObjectType
-PubSubCommunicationFailureEventType_EventId,15564,Variable
-PubSubCommunicationFailureEventType_EventType,15565,Variable
-PubSubCommunicationFailureEventType_SourceNode,15566,Variable
-PubSubCommunicationFailureEventType_SourceName,15567,Variable
-PubSubCommunicationFailureEventType_Time,15568,Variable
-PubSubCommunicationFailureEventType_ReceiveTime,15569,Variable
-PubSubCommunicationFailureEventType_LocalTime,15570,Variable
-PubSubCommunicationFailureEventType_Message,15571,Variable
-PubSubCommunicationFailureEventType_Severity,15572,Variable
-PubSubCommunicationFailureEventType_ConnectionId,15573,Variable
-PubSubCommunicationFailureEventType_GroupId,15574,Variable
-PubSubCommunicationFailureEventType_State,15575,Variable
-PubSubCommunicationFailureEventType_Error,15576,Variable
-DataSetFieldFlags_OptionSetValues,15577,Variable
-PublishedDataSetDataType,15578,DataType
-BrokerConnectionTransportDataType_Encoding_DefaultXml,15579,Object
-PublishedDataSetSourceDataType,15580,DataType
-PublishedDataItemsDataType,15581,DataType
-PublishedEventsDataType,15582,DataType
-DataSetFieldContentMask,15583,DataType
-DataSetFieldContentMask_OptionSetValues,15584,Variable
-OpcUa_XmlSchema_SimpleTypeDescription,15585,Variable
-OpcUa_XmlSchema_SimpleTypeDescription_DataTypeVersion,15586,Variable
-OpcUa_XmlSchema_SimpleTypeDescription_DictionaryFragment,15587,Variable
-OpcUa_XmlSchema_UABinaryFileDataType,15588,Variable
-StructureDescription_Encoding_DefaultXml,15589,Object
-EnumDescription_Encoding_DefaultXml,15590,Object
-OpcUa_XmlSchema_StructureDescription,15591,Variable
-OpcUa_XmlSchema_StructureDescription_DataTypeVersion,15592,Variable
-OpcUa_XmlSchema_StructureDescription_DictionaryFragment,15593,Variable
-OpcUa_XmlSchema_EnumDescription,15594,Variable
-OpcUa_XmlSchema_EnumDescription_DataTypeVersion,15595,Variable
-OpcUa_XmlSchema_EnumDescription_DictionaryFragment,15596,Variable
-DataSetWriterDataType,15597,DataType
-DataSetWriterTransportDataType,15598,DataType
-OpcUa_BinarySchema_StructureDescription,15599,Variable
-OpcUa_BinarySchema_StructureDescription_DataTypeVersion,15600,Variable
-OpcUa_BinarySchema_StructureDescription_DictionaryFragment,15601,Variable
-OpcUa_BinarySchema_EnumDescription,15602,Variable
-OpcUa_BinarySchema_EnumDescription_DataTypeVersion,15603,Variable
-OpcUa_BinarySchema_EnumDescription_DictionaryFragment,15604,Variable
-DataSetWriterMessageDataType,15605,DataType
-Server_ServerCapabilities_RoleSet,15606,Object
-RoleSetType,15607,ObjectType
-RoleSetType_RoleName_Placeholder,15608,Object
-PubSubGroupDataType,15609,DataType
-OpcUa_XmlSchema_UABinaryFileDataType_DataTypeVersion,15610,Variable
-WriterGroupTransportDataType,15611,DataType
-RoleSetType_RoleName_Placeholder_AddIdentity,15612,Method
-RoleSetType_RoleName_Placeholder_AddIdentity_InputArguments,15613,Variable
-RoleSetType_RoleName_Placeholder_RemoveIdentity,15614,Method
-RoleSetType_RoleName_Placeholder_RemoveIdentity_InputArguments,15615,Variable
-WriterGroupMessageDataType,15616,DataType
-PubSubConnectionDataType,15617,DataType
-ConnectionTransportDataType,15618,DataType
-OpcUa_XmlSchema_UABinaryFileDataType_DictionaryFragment,15619,Variable
-RoleType,15620,ObjectType
-ReaderGroupTransportDataType,15621,DataType
-ReaderGroupMessageDataType,15622,DataType
-DataSetReaderDataType,15623,DataType
-RoleType_AddIdentity,15624,Method
-RoleType_AddIdentity_InputArguments,15625,Variable
-RoleType_RemoveIdentity,15626,Method
-RoleType_RemoveIdentity_InputArguments,15627,Variable
-DataSetReaderTransportDataType,15628,DataType
-DataSetReaderMessageDataType,15629,DataType
-SubscribedDataSetDataType,15630,DataType
-TargetVariablesDataType,15631,DataType
-IdentityCriteriaType,15632,DataType
-IdentityCriteriaType_EnumValues,15633,Variable
-IdentityMappingRuleType,15634,DataType
-SubscribedDataSetMirrorDataType,15635,DataType
-AddIdentityMethodType,15636,Method
-AddIdentityMethodType_InputArguments,15637,Variable
-RemoveIdentityMethodType,15638,Method
-RemoveIdentityMethodType_InputArguments,15639,Variable
-OpcUa_XmlSchema_BrokerConnectionTransportDataType,15640,Variable
-DataSetOrderingType_EnumStrings,15641,Variable
-UadpNetworkMessageContentMask,15642,DataType
-UadpNetworkMessageContentMask_OptionSetValues,15643,Variable
-WellKnownRole_Anonymous,15644,Object
-UadpWriterGroupMessageDataType,15645,DataType
-UadpDataSetMessageContentMask,15646,DataType
-UadpDataSetMessageContentMask_OptionSetValues,15647,Variable
-WellKnownRole_Anonymous_AddIdentity,15648,Method
-WellKnownRole_Anonymous_AddIdentity_InputArguments,15649,Variable
-WellKnownRole_Anonymous_RemoveIdentity,15650,Method
-WellKnownRole_Anonymous_RemoveIdentity_InputArguments,15651,Variable
-UadpDataSetWriterMessageDataType,15652,DataType
-UadpDataSetReaderMessageDataType,15653,DataType
-JsonNetworkMessageContentMask,15654,DataType
-JsonNetworkMessageContentMask_OptionSetValues,15655,Variable
-WellKnownRole_AuthenticatedUser,15656,Object
-JsonWriterGroupMessageDataType,15657,DataType
-JsonDataSetMessageContentMask,15658,DataType
-JsonDataSetMessageContentMask_OptionSetValues,15659,Variable
-WellKnownRole_AuthenticatedUser_AddIdentity,15660,Method
-WellKnownRole_AuthenticatedUser_AddIdentity_InputArguments,15661,Variable
-WellKnownRole_AuthenticatedUser_RemoveIdentity,15662,Method
-WellKnownRole_AuthenticatedUser_RemoveIdentity_InputArguments,15663,Variable
-JsonDataSetWriterMessageDataType,15664,DataType
-JsonDataSetReaderMessageDataType,15665,DataType
-OpcUa_XmlSchema_BrokerConnectionTransportDataType_DataTypeVersion,15666,Variable
-BrokerWriterGroupTransportDataType,15667,DataType
-WellKnownRole_Observer,15668,Object
-BrokerDataSetWriterTransportDataType,15669,DataType
-BrokerDataSetReaderTransportDataType,15670,DataType
-EndpointType_Encoding_DefaultBinary,15671,Object
-WellKnownRole_Observer_AddIdentity,15672,Method
-WellKnownRole_Observer_AddIdentity_InputArguments,15673,Variable
-WellKnownRole_Observer_RemoveIdentity,15674,Method
-WellKnownRole_Observer_RemoveIdentity_InputArguments,15675,Variable
-DataTypeSchemaHeader_Encoding_DefaultBinary,15676,Object
-PublishedDataSetDataType_Encoding_DefaultBinary,15677,Object
-PublishedDataSetSourceDataType_Encoding_DefaultBinary,15678,Object
-PublishedDataItemsDataType_Encoding_DefaultBinary,15679,Object
-WellKnownRole_Operator,15680,Object
-PublishedEventsDataType_Encoding_DefaultBinary,15681,Object
-DataSetWriterDataType_Encoding_DefaultBinary,15682,Object
-DataSetWriterTransportDataType_Encoding_DefaultBinary,15683,Object
-WellKnownRole_Operator_AddIdentity,15684,Method
-WellKnownRole_Operator_AddIdentity_InputArguments,15685,Variable
-WellKnownRole_Operator_RemoveIdentity,15686,Method
-WellKnownRole_Operator_RemoveIdentity_InputArguments,15687,Variable
-DataSetWriterMessageDataType_Encoding_DefaultBinary,15688,Object
-PubSubGroupDataType_Encoding_DefaultBinary,15689,Object
-OpcUa_XmlSchema_BrokerConnectionTransportDataType_DictionaryFragment,15690,Variable
-WriterGroupTransportDataType_Encoding_DefaultBinary,15691,Object
-WellKnownRole_Supervisor,15692,Object
-WriterGroupMessageDataType_Encoding_DefaultBinary,15693,Object
-PubSubConnectionDataType_Encoding_DefaultBinary,15694,Object
-ConnectionTransportDataType_Encoding_DefaultBinary,15695,Object
-WellKnownRole_Supervisor_AddIdentity,15696,Method
-WellKnownRole_Supervisor_AddIdentity_InputArguments,15697,Variable
-WellKnownRole_Supervisor_RemoveIdentity,15698,Method
-WellKnownRole_Supervisor_RemoveIdentity_InputArguments,15699,Variable
-SimpleTypeDescription_Encoding_DefaultJson,15700,Object
-ReaderGroupTransportDataType_Encoding_DefaultBinary,15701,Object
-ReaderGroupMessageDataType_Encoding_DefaultBinary,15702,Object
-DataSetReaderDataType_Encoding_DefaultBinary,15703,Object
-WellKnownRole_SecurityAdmin,15704,Object
-DataSetReaderTransportDataType_Encoding_DefaultBinary,15705,Object
-DataSetReaderMessageDataType_Encoding_DefaultBinary,15706,Object
-SubscribedDataSetDataType_Encoding_DefaultBinary,15707,Object
-WellKnownRole_SecurityAdmin_AddIdentity,15708,Method
-WellKnownRole_SecurityAdmin_AddIdentity_InputArguments,15709,Variable
-WellKnownRole_SecurityAdmin_RemoveIdentity,15710,Method
-WellKnownRole_SecurityAdmin_RemoveIdentity_InputArguments,15711,Variable
-TargetVariablesDataType_Encoding_DefaultBinary,15712,Object
-SubscribedDataSetMirrorDataType_Encoding_DefaultBinary,15713,Object
-UABinaryFileDataType_Encoding_DefaultJson,15714,Object
-UadpWriterGroupMessageDataType_Encoding_DefaultBinary,15715,Object
-WellKnownRole_ConfigureAdmin,15716,Object
-UadpDataSetWriterMessageDataType_Encoding_DefaultBinary,15717,Object
-UadpDataSetReaderMessageDataType_Encoding_DefaultBinary,15718,Object
-JsonWriterGroupMessageDataType_Encoding_DefaultBinary,15719,Object
-WellKnownRole_ConfigureAdmin_AddIdentity,15720,Method
-WellKnownRole_ConfigureAdmin_AddIdentity_InputArguments,15721,Variable
-WellKnownRole_ConfigureAdmin_RemoveIdentity,15722,Method
-WellKnownRole_ConfigureAdmin_RemoveIdentity_InputArguments,15723,Variable
-JsonDataSetWriterMessageDataType_Encoding_DefaultBinary,15724,Object
-JsonDataSetReaderMessageDataType_Encoding_DefaultBinary,15725,Object
-BrokerConnectionTransportDataType_Encoding_DefaultJson,15726,Object
-BrokerWriterGroupTransportDataType_Encoding_DefaultBinary,15727,Object
-IdentityMappingRuleType_Encoding_DefaultXml,15728,Object
-BrokerDataSetWriterTransportDataType_Encoding_DefaultBinary,15729,Object
-OpcUa_XmlSchema_IdentityMappingRuleType,15730,Variable
-OpcUa_XmlSchema_IdentityMappingRuleType_DataTypeVersion,15731,Variable
-OpcUa_XmlSchema_IdentityMappingRuleType_DictionaryFragment,15732,Variable
-BrokerDataSetReaderTransportDataType_Encoding_DefaultBinary,15733,Object
-OpcUa_BinarySchema_EndpointType,15734,Variable
-OpcUa_BinarySchema_EndpointType_DataTypeVersion,15735,Variable
-IdentityMappingRuleType_Encoding_DefaultBinary,15736,Object
-OpcUa_BinarySchema_EndpointType_DictionaryFragment,15737,Variable
-OpcUa_BinarySchema_IdentityMappingRuleType,15738,Variable
-OpcUa_BinarySchema_IdentityMappingRuleType_DataTypeVersion,15739,Variable
-OpcUa_BinarySchema_IdentityMappingRuleType_DictionaryFragment,15740,Variable
-OpcUa_BinarySchema_DataTypeSchemaHeader,15741,Variable
-OpcUa_BinarySchema_DataTypeSchemaHeader_DataTypeVersion,15742,Variable
-OpcUa_BinarySchema_DataTypeSchemaHeader_DictionaryFragment,15743,Variable
-TemporaryFileTransferType,15744,ObjectType
-TemporaryFileTransferType_ClientProcessingTimeout,15745,Variable
-TemporaryFileTransferType_GenerateFileForRead,15746,Method
-TemporaryFileTransferType_GenerateFileForRead_InputArguments,15747,Variable
-TemporaryFileTransferType_GenerateFileForRead_OutputArguments,15748,Variable
-TemporaryFileTransferType_GenerateFileForWrite,15749,Method
-TemporaryFileTransferType_GenerateFileForWrite_OutputArguments,15750,Variable
-TemporaryFileTransferType_CloseAndCommit,15751,Method
-TemporaryFileTransferType_CloseAndCommit_InputArguments,15752,Variable
-TemporaryFileTransferType_CloseAndCommit_OutputArguments,15753,Variable
-TemporaryFileTransferType_TransferState_Placeholder,15754,Object
-TemporaryFileTransferType_TransferState_Placeholder_CurrentState,15755,Variable
-TemporaryFileTransferType_TransferState_Placeholder_CurrentState_Id,15756,Variable
-TemporaryFileTransferType_TransferState_Placeholder_CurrentState_Name,15757,Variable
-TemporaryFileTransferType_TransferState_Placeholder_CurrentState_Number,15758,Variable
-TemporaryFileTransferType_TransferState_Placeholder_CurrentState_EffectiveDisplayName,15759,Variable
-TemporaryFileTransferType_TransferState_Placeholder_LastTransition,15760,Variable
-TemporaryFileTransferType_TransferState_Placeholder_LastTransition_Id,15761,Variable
-TemporaryFileTransferType_TransferState_Placeholder_LastTransition_Name,15762,Variable
-TemporaryFileTransferType_TransferState_Placeholder_LastTransition_Number,15763,Variable
-TemporaryFileTransferType_TransferState_Placeholder_LastTransition_TransitionTime,15764,Variable
-TemporaryFileTransferType_TransferState_Placeholder_LastTransition_EffectiveTransitionTime,15765,Variable
-OpcUa_BinarySchema_PublishedDataSetDataType,15766,Variable
-OpcUa_BinarySchema_PublishedDataSetDataType_DataTypeVersion,15767,Variable
-OpcUa_BinarySchema_PublishedDataSetDataType_DictionaryFragment,15768,Variable
-OpcUa_BinarySchema_PublishedDataSetSourceDataType,15769,Variable
-OpcUa_BinarySchema_PublishedDataSetSourceDataType_DataTypeVersion,15770,Variable
-OpcUa_BinarySchema_PublishedDataSetSourceDataType_DictionaryFragment,15771,Variable
-OpcUa_BinarySchema_PublishedDataItemsDataType,15772,Variable
-OpcUa_BinarySchema_PublishedDataItemsDataType_DataTypeVersion,15773,Variable
-OpcUa_BinarySchema_PublishedDataItemsDataType_DictionaryFragment,15774,Variable
-OpcUa_BinarySchema_PublishedEventsDataType,15775,Variable
-OpcUa_BinarySchema_PublishedEventsDataType_DataTypeVersion,15776,Variable
-OpcUa_BinarySchema_PublishedEventsDataType_DictionaryFragment,15777,Variable
-OpcUa_BinarySchema_DataSetWriterDataType,15778,Variable
-OpcUa_BinarySchema_DataSetWriterDataType_DataTypeVersion,15779,Variable
-OpcUa_BinarySchema_DataSetWriterDataType_DictionaryFragment,15780,Variable
-OpcUa_BinarySchema_DataSetWriterTransportDataType,15781,Variable
-OpcUa_BinarySchema_DataSetWriterTransportDataType_DataTypeVersion,15782,Variable
-OpcUa_BinarySchema_DataSetWriterTransportDataType_DictionaryFragment,15783,Variable
-OpcUa_BinarySchema_DataSetWriterMessageDataType,15784,Variable
-OpcUa_BinarySchema_DataSetWriterMessageDataType_DataTypeVersion,15785,Variable
-OpcUa_BinarySchema_DataSetWriterMessageDataType_DictionaryFragment,15786,Variable
-OpcUa_BinarySchema_PubSubGroupDataType,15787,Variable
-OpcUa_BinarySchema_PubSubGroupDataType_DataTypeVersion,15788,Variable
-OpcUa_BinarySchema_PubSubGroupDataType_DictionaryFragment,15789,Variable
-PublishSubscribe_ConnectionName_Placeholder,15790,Object
-PublishSubscribe_ConnectionName_Placeholder_PublisherId,15791,Variable
-PublishSubscribe_ConnectionName_Placeholder_TransportProfileUri,15792,Variable
-OpcUa_BinarySchema_WriterGroupTransportDataType,15793,Variable
-TemporaryFileTransferType_TransferState_Placeholder_Reset,15794,Method
-GenerateFileForReadMethodType,15795,Method
-GenerateFileForReadMethodType_InputArguments,15796,Variable
-GenerateFileForReadMethodType_OutputArguments,15797,Variable
-GenerateFileForWriteMethodType,15798,Method
-GenerateFileForWriteMethodType_OutputArguments,15799,Variable
-CloseAndCommitMethodType,15800,Method
-CloseAndCommitMethodType_InputArguments,15801,Variable
-CloseAndCommitMethodType_OutputArguments,15802,Variable
-FileTransferStateMachineType,15803,ObjectType
-FileTransferStateMachineType_CurrentState,15804,Variable
-FileTransferStateMachineType_CurrentState_Id,15805,Variable
-FileTransferStateMachineType_CurrentState_Name,15806,Variable
-FileTransferStateMachineType_CurrentState_Number,15807,Variable
-FileTransferStateMachineType_CurrentState_EffectiveDisplayName,15808,Variable
-FileTransferStateMachineType_LastTransition,15809,Variable
-FileTransferStateMachineType_LastTransition_Id,15810,Variable
-FileTransferStateMachineType_LastTransition_Name,15811,Variable
-FileTransferStateMachineType_LastTransition_Number,15812,Variable
-FileTransferStateMachineType_LastTransition_TransitionTime,15813,Variable
-FileTransferStateMachineType_LastTransition_EffectiveTransitionTime,15814,Variable
-FileTransferStateMachineType_Idle,15815,Object
-FileTransferStateMachineType_Idle_StateNumber,15816,Variable
-FileTransferStateMachineType_ReadPrepare,15817,Object
-FileTransferStateMachineType_ReadPrepare_StateNumber,15818,Variable
-FileTransferStateMachineType_ReadTransfer,15819,Object
-FileTransferStateMachineType_ReadTransfer_StateNumber,15820,Variable
-FileTransferStateMachineType_ApplyWrite,15821,Object
-FileTransferStateMachineType_ApplyWrite_StateNumber,15822,Variable
-FileTransferStateMachineType_Error,15823,Object
-FileTransferStateMachineType_Error_StateNumber,15824,Variable
-FileTransferStateMachineType_IdleToReadPrepare,15825,Object
-FileTransferStateMachineType_IdleToReadPrepare_TransitionNumber,15826,Variable
-FileTransferStateMachineType_ReadPrepareToReadTransfer,15827,Object
-FileTransferStateMachineType_ReadPrepareToReadTransfer_TransitionNumber,15828,Variable
-FileTransferStateMachineType_ReadTransferToIdle,15829,Object
-FileTransferStateMachineType_ReadTransferToIdle_TransitionNumber,15830,Variable
-FileTransferStateMachineType_IdleToApplyWrite,15831,Object
-FileTransferStateMachineType_IdleToApplyWrite_TransitionNumber,15832,Variable
-FileTransferStateMachineType_ApplyWriteToIdle,15833,Object
-FileTransferStateMachineType_ApplyWriteToIdle_TransitionNumber,15834,Variable
-FileTransferStateMachineType_ReadPrepareToError,15835,Object
-FileTransferStateMachineType_ReadPrepareToError_TransitionNumber,15836,Variable
-FileTransferStateMachineType_ReadTransferToError,15837,Object
-FileTransferStateMachineType_ReadTransferToError_TransitionNumber,15838,Variable
-FileTransferStateMachineType_ApplyWriteToError,15839,Object
-FileTransferStateMachineType_ApplyWriteToError_TransitionNumber,15840,Variable
-FileTransferStateMachineType_ErrorToIdle,15841,Object
-FileTransferStateMachineType_ErrorToIdle_TransitionNumber,15842,Variable
-FileTransferStateMachineType_Reset,15843,Method
-PublishSubscribeType_Status,15844,Object
-PublishSubscribeType_Status_State,15845,Variable
-PublishSubscribeType_Status_Enable,15846,Method
-PublishSubscribeType_Status_Disable,15847,Method
-PublishSubscribe_ConnectionName_Placeholder_TransportProfileUri_Selections,15848,Variable
-PublishSubscribe_ConnectionName_Placeholder_TransportProfileUri_SelectionDescriptions,15849,Variable
-PublishSubscribe_ConnectionName_Placeholder_TransportProfileUri_RestrictToList,15850,Variable
-PublishSubscribe_ConnectionName_Placeholder_Address,15851,Object
-OpcUa_BinarySchema_WriterGroupTransportDataType_DataTypeVersion,15852,Variable
-OpcUa_BinarySchema_WriterGroupTransportDataType_DictionaryFragment,15853,Variable
-OpcUa_BinarySchema_WriterGroupMessageDataType,15854,Variable
-OpcUa_BinarySchema_WriterGroupMessageDataType_DataTypeVersion,15855,Variable
-OpcUa_BinarySchema_WriterGroupMessageDataType_DictionaryFragment,15856,Variable
-OpcUa_BinarySchema_PubSubConnectionDataType,15857,Variable
-OpcUa_BinarySchema_PubSubConnectionDataType_DataTypeVersion,15858,Variable
-OpcUa_BinarySchema_PubSubConnectionDataType_DictionaryFragment,15859,Variable
-OpcUa_BinarySchema_ConnectionTransportDataType,15860,Variable
-OpcUa_BinarySchema_ConnectionTransportDataType_DataTypeVersion,15861,Variable
-OpcUa_BinarySchema_ConnectionTransportDataType_DictionaryFragment,15862,Variable
-PublishSubscribe_ConnectionName_Placeholder_Address_NetworkInterface,15863,Variable
-PublishSubscribe_ConnectionName_Placeholder_TransportSettings,15864,Object
-PublishSubscribe_ConnectionName_Placeholder_Status,15865,Object
-OpcUa_BinarySchema_ReaderGroupTransportDataType,15866,Variable
-OpcUa_BinarySchema_ReaderGroupTransportDataType_DataTypeVersion,15867,Variable
-OpcUa_BinarySchema_ReaderGroupTransportDataType_DictionaryFragment,15868,Variable
-OpcUa_BinarySchema_ReaderGroupMessageDataType,15869,Variable
-OpcUa_BinarySchema_ReaderGroupMessageDataType_DataTypeVersion,15870,Variable
-OpcUa_BinarySchema_ReaderGroupMessageDataType_DictionaryFragment,15871,Variable
-OpcUa_BinarySchema_DataSetReaderDataType,15872,Variable
-OpcUa_BinarySchema_DataSetReaderDataType_DataTypeVersion,15873,Variable
-OverrideValueHandling,15874,DataType
-OverrideValueHandling_EnumStrings,15875,Variable
-OpcUa_BinarySchema_DataSetReaderDataType_DictionaryFragment,15876,Variable
-OpcUa_BinarySchema_DataSetReaderTransportDataType,15877,Variable
-OpcUa_BinarySchema_DataSetReaderTransportDataType_DataTypeVersion,15878,Variable
-OpcUa_BinarySchema_DataSetReaderTransportDataType_DictionaryFragment,15879,Variable
-OpcUa_BinarySchema_DataSetReaderMessageDataType,15880,Variable
-OpcUa_BinarySchema_DataSetReaderMessageDataType_DataTypeVersion,15881,Variable
-OpcUa_BinarySchema_DataSetReaderMessageDataType_DictionaryFragment,15882,Variable
-OpcUa_BinarySchema_SubscribedDataSetDataType,15883,Variable
-OpcUa_BinarySchema_SubscribedDataSetDataType_DataTypeVersion,15884,Variable
-OpcUa_BinarySchema_SubscribedDataSetDataType_DictionaryFragment,15885,Variable
-OpcUa_BinarySchema_TargetVariablesDataType,15886,Variable
-OpcUa_BinarySchema_TargetVariablesDataType_DataTypeVersion,15887,Variable
-OpcUa_BinarySchema_TargetVariablesDataType_DictionaryFragment,15888,Variable
-OpcUa_BinarySchema_SubscribedDataSetMirrorDataType,15889,Variable
-OpcUa_BinarySchema_SubscribedDataSetMirrorDataType_DataTypeVersion,15890,Variable
-OpcUa_BinarySchema_SubscribedDataSetMirrorDataType_DictionaryFragment,15891,Variable
-PublishSubscribe_ConnectionName_Placeholder_Status_State,15892,Variable
-PublishSubscribe_ConnectionName_Placeholder_Status_Enable,15893,Method
-PublishSubscribe_ConnectionName_Placeholder_Status_Disable,15894,Method
-OpcUa_BinarySchema_UadpWriterGroupMessageDataType,15895,Variable
-OpcUa_BinarySchema_UadpWriterGroupMessageDataType_DataTypeVersion,15896,Variable
-OpcUa_BinarySchema_UadpWriterGroupMessageDataType_DictionaryFragment,15897,Variable
-OpcUa_BinarySchema_UadpDataSetWriterMessageDataType,15898,Variable
-OpcUa_BinarySchema_UadpDataSetWriterMessageDataType_DataTypeVersion,15899,Variable
-OpcUa_BinarySchema_UadpDataSetWriterMessageDataType_DictionaryFragment,15900,Variable
-SessionlessInvokeRequestType,15901,DataType
-SessionlessInvokeRequestType_Encoding_DefaultXml,15902,Object
-SessionlessInvokeRequestType_Encoding_DefaultBinary,15903,Object
-DataSetFieldFlags,15904,DataType
-PublishSubscribeType_ConnectionName_Placeholder_TransportSettings,15905,Object
-PubSubKeyServiceType,15906,ObjectType
-PubSubKeyServiceType_GetSecurityKeys,15907,Method
-PubSubKeyServiceType_GetSecurityKeys_InputArguments,15908,Variable
-PubSubKeyServiceType_GetSecurityKeys_OutputArguments,15909,Variable
-PubSubKeyServiceType_GetSecurityGroup,15910,Method
-PubSubKeyServiceType_GetSecurityGroup_InputArguments,15911,Variable
-PubSubKeyServiceType_GetSecurityGroup_OutputArguments,15912,Variable
-PubSubKeyServiceType_SecurityGroups,15913,Object
-PubSubKeyServiceType_SecurityGroups_AddSecurityGroup,15914,Method
-PubSubKeyServiceType_SecurityGroups_AddSecurityGroup_InputArguments,15915,Variable
-PubSubKeyServiceType_SecurityGroups_AddSecurityGroup_OutputArguments,15916,Variable
-PubSubKeyServiceType_SecurityGroups_RemoveSecurityGroup,15917,Method
-PubSubKeyServiceType_SecurityGroups_RemoveSecurityGroup_InputArguments,15918,Variable
-OpcUa_BinarySchema_UadpDataSetReaderMessageDataType,15919,Variable
-OpcUa_BinarySchema_UadpDataSetReaderMessageDataType_DataTypeVersion,15920,Variable
-OpcUa_BinarySchema_UadpDataSetReaderMessageDataType_DictionaryFragment,15921,Variable
-OpcUa_BinarySchema_JsonWriterGroupMessageDataType,15922,Variable
-OpcUa_BinarySchema_JsonWriterGroupMessageDataType_DataTypeVersion,15923,Variable
-OpcUa_BinarySchema_JsonWriterGroupMessageDataType_DictionaryFragment,15924,Variable
-OpcUa_BinarySchema_JsonDataSetWriterMessageDataType,15925,Variable
-PubSubGroupType_SecurityMode,15926,Variable
-PubSubGroupType_SecurityGroupId,15927,Variable
-PubSubGroupType_SecurityKeyServices,15928,Variable
-OpcUa_BinarySchema_JsonDataSetWriterMessageDataType_DataTypeVersion,15929,Variable
-OpcUa_BinarySchema_JsonDataSetWriterMessageDataType_DictionaryFragment,15930,Variable
-OpcUa_BinarySchema_JsonDataSetReaderMessageDataType,15931,Variable
-DataSetReaderType_SecurityMode,15932,Variable
-DataSetReaderType_SecurityGroupId,15933,Variable
-DataSetReaderType_SecurityKeyServices,15934,Variable
-OpcUa_BinarySchema_JsonDataSetReaderMessageDataType_DataTypeVersion,15935,Variable
-OpcUa_BinarySchema_JsonDataSetReaderMessageDataType_DictionaryFragment,15936,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics,15937,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_DiagnosticsLevel,15938,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalInformation,15939,Variable
-OpcUa_BinarySchema_BrokerWriterGroupTransportDataType,15940,Variable
-OpcUa_BinarySchema_BrokerWriterGroupTransportDataType_DataTypeVersion,15941,Variable
-OpcUa_BinarySchema_BrokerWriterGroupTransportDataType_DictionaryFragment,15942,Variable
-OpcUa_BinarySchema_BrokerDataSetWriterTransportDataType,15943,Variable
-OpcUa_BinarySchema_BrokerDataSetWriterTransportDataType_DataTypeVersion,15944,Variable
-OpcUa_BinarySchema_BrokerDataSetWriterTransportDataType_DictionaryFragment,15945,Variable
-OpcUa_BinarySchema_BrokerDataSetReaderTransportDataType,15946,Variable
-OpcUa_BinarySchema_BrokerDataSetReaderTransportDataType_DataTypeVersion,15947,Variable
-OpcUa_BinarySchema_BrokerDataSetReaderTransportDataType_DictionaryFragment,15948,Variable
-EndpointType_Encoding_DefaultXml,15949,Object
-DataTypeSchemaHeader_Encoding_DefaultXml,15950,Object
-PublishedDataSetDataType_Encoding_DefaultXml,15951,Object
-PublishedDataSetSourceDataType_Encoding_DefaultXml,15952,Object
-PublishedDataItemsDataType_Encoding_DefaultXml,15953,Object
-PublishedEventsDataType_Encoding_DefaultXml,15954,Object
-DataSetWriterDataType_Encoding_DefaultXml,15955,Object
-DataSetWriterTransportDataType_Encoding_DefaultXml,15956,Object
-OPCUANamespaceMetadata,15957,Object
-OPCUANamespaceMetadata_NamespaceUri,15958,Variable
-OPCUANamespaceMetadata_NamespaceVersion,15959,Variable
-OPCUANamespaceMetadata_NamespacePublicationDate,15960,Variable
-OPCUANamespaceMetadata_IsNamespaceSubset,15961,Variable
-OPCUANamespaceMetadata_StaticNodeIdTypes,15962,Variable
-OPCUANamespaceMetadata_StaticNumericNodeIdRange,15963,Variable
-OPCUANamespaceMetadata_StaticStringNodeIdPattern,15964,Variable
-OPCUANamespaceMetadata_NamespaceFile,15965,Object
-OPCUANamespaceMetadata_NamespaceFile_Size,15966,Variable
-OPCUANamespaceMetadata_NamespaceFile_Writable,15967,Variable
-OPCUANamespaceMetadata_NamespaceFile_UserWritable,15968,Variable
-OPCUANamespaceMetadata_NamespaceFile_OpenCount,15969,Variable
-OPCUANamespaceMetadata_NamespaceFile_MimeType,15970,Variable
-OPCUANamespaceMetadata_NamespaceFile_Open,15971,Method
-OPCUANamespaceMetadata_NamespaceFile_Open_InputArguments,15972,Variable
-OPCUANamespaceMetadata_NamespaceFile_Open_OutputArguments,15973,Variable
-OPCUANamespaceMetadata_NamespaceFile_Close,15974,Method
-OPCUANamespaceMetadata_NamespaceFile_Close_InputArguments,15975,Variable
-OPCUANamespaceMetadata_NamespaceFile_Read,15976,Method
-OPCUANamespaceMetadata_NamespaceFile_Read_InputArguments,15977,Variable
-OPCUANamespaceMetadata_NamespaceFile_Read_OutputArguments,15978,Variable
-OPCUANamespaceMetadata_NamespaceFile_Write,15979,Method
-OPCUANamespaceMetadata_NamespaceFile_Write_InputArguments,15980,Variable
-OPCUANamespaceMetadata_NamespaceFile_GetPosition,15981,Method
-OPCUANamespaceMetadata_NamespaceFile_GetPosition_InputArguments,15982,Variable
-OPCUANamespaceMetadata_NamespaceFile_GetPosition_OutputArguments,15983,Variable
-OPCUANamespaceMetadata_NamespaceFile_SetPosition,15984,Method
-OPCUANamespaceMetadata_NamespaceFile_SetPosition_InputArguments,15985,Variable
-OPCUANamespaceMetadata_NamespaceFile_ExportNamespace,15986,Method
-DataSetWriterMessageDataType_Encoding_DefaultXml,15987,Object
-PubSubGroupDataType_Encoding_DefaultXml,15988,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalInformation_Active,15989,Variable
-WriterGroupTransportDataType_Encoding_DefaultXml,15990,Object
-WriterGroupMessageDataType_Encoding_DefaultXml,15991,Object
-PubSubConnectionDataType_Encoding_DefaultXml,15992,Object
-ConnectionTransportDataType_Encoding_DefaultXml,15993,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalInformation_Classification,15994,Variable
-ReaderGroupTransportDataType_Encoding_DefaultXml,15995,Object
-ReaderGroupMessageDataType_Encoding_DefaultXml,15996,Object
-RoleSetType_AddRole,15997,Method
-RoleSetType_AddRole_InputArguments,15998,Variable
-RoleSetType_AddRole_OutputArguments,15999,Variable
-RoleSetType_RemoveRole,16000,Method
-RoleSetType_RemoveRole_InputArguments,16001,Variable
-AddRoleMethodType,16002,Method
-AddRoleMethodType_InputArguments,16003,Variable
-AddRoleMethodType_OutputArguments,16004,Variable
-RemoveRoleMethodType,16005,Method
-RemoveRoleMethodType_InputArguments,16006,Variable
-DataSetReaderDataType_Encoding_DefaultXml,16007,Object
-DataSetReaderTransportDataType_Encoding_DefaultXml,16008,Object
-DataSetReaderMessageDataType_Encoding_DefaultXml,16009,Object
-SubscribedDataSetDataType_Encoding_DefaultXml,16010,Object
-TargetVariablesDataType_Encoding_DefaultXml,16011,Object
-SubscribedDataSetMirrorDataType_Encoding_DefaultXml,16012,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,16013,Variable
-UadpWriterGroupMessageDataType_Encoding_DefaultXml,16014,Object
-UadpDataSetWriterMessageDataType_Encoding_DefaultXml,16015,Object
-UadpDataSetReaderMessageDataType_Encoding_DefaultXml,16016,Object
-JsonWriterGroupMessageDataType_Encoding_DefaultXml,16017,Object
-JsonDataSetWriterMessageDataType_Encoding_DefaultXml,16018,Object
-JsonDataSetReaderMessageDataType_Encoding_DefaultXml,16019,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,16020,Variable
-BrokerWriterGroupTransportDataType_Encoding_DefaultXml,16021,Object
-BrokerDataSetWriterTransportDataType_Encoding_DefaultXml,16022,Object
-BrokerDataSetReaderTransportDataType_Encoding_DefaultXml,16023,Object
-OpcUa_XmlSchema_EndpointType,16024,Variable
-OpcUa_XmlSchema_EndpointType_DataTypeVersion,16025,Variable
-OpcUa_XmlSchema_EndpointType_DictionaryFragment,16026,Variable
-OpcUa_XmlSchema_DataTypeSchemaHeader,16027,Variable
-OpcUa_XmlSchema_DataTypeSchemaHeader_DataTypeVersion,16028,Variable
-OpcUa_XmlSchema_DataTypeSchemaHeader_DictionaryFragment,16029,Variable
-OpcUa_XmlSchema_PublishedDataSetDataType,16030,Variable
-OpcUa_XmlSchema_PublishedDataSetDataType_DataTypeVersion,16031,Variable
-OpcUa_XmlSchema_PublishedDataSetDataType_DictionaryFragment,16032,Variable
-OpcUa_XmlSchema_PublishedDataSetSourceDataType,16033,Variable
-OpcUa_XmlSchema_PublishedDataSetSourceDataType_DataTypeVersion,16034,Variable
-OpcUa_XmlSchema_PublishedDataSetSourceDataType_DictionaryFragment,16035,Variable
-WellKnownRole_Engineer,16036,Object
-OpcUa_XmlSchema_PublishedDataItemsDataType,16037,Variable
-OpcUa_XmlSchema_PublishedDataItemsDataType_DataTypeVersion,16038,Variable
-OpcUa_XmlSchema_PublishedDataItemsDataType_DictionaryFragment,16039,Variable
-OpcUa_XmlSchema_PublishedEventsDataType,16040,Variable
-WellKnownRole_Engineer_AddIdentity,16041,Method
-WellKnownRole_Engineer_AddIdentity_InputArguments,16042,Variable
-WellKnownRole_Engineer_RemoveIdentity,16043,Method
-WellKnownRole_Engineer_RemoveIdentity_InputArguments,16044,Variable
-OpcUa_XmlSchema_PublishedEventsDataType_DataTypeVersion,16045,Variable
-OpcUa_XmlSchema_PublishedEventsDataType_DictionaryFragment,16046,Variable
-OpcUa_XmlSchema_DataSetWriterDataType,16047,Variable
-OpcUa_XmlSchema_DataSetWriterDataType_DataTypeVersion,16048,Variable
-OpcUa_XmlSchema_DataSetWriterDataType_DictionaryFragment,16049,Variable
-OpcUa_XmlSchema_DataSetWriterTransportDataType,16050,Variable
-OpcUa_XmlSchema_DataSetWriterTransportDataType_DataTypeVersion,16051,Variable
-OpcUa_XmlSchema_DataSetWriterTransportDataType_DictionaryFragment,16052,Variable
-OpcUa_XmlSchema_DataSetWriterMessageDataType,16053,Variable
-OpcUa_XmlSchema_DataSetWriterMessageDataType_DataTypeVersion,16054,Variable
-OpcUa_XmlSchema_DataSetWriterMessageDataType_DictionaryFragment,16055,Variable
-OpcUa_XmlSchema_PubSubGroupDataType,16056,Variable
-OpcUa_XmlSchema_PubSubGroupDataType_DataTypeVersion,16057,Variable
-OpcUa_XmlSchema_PubSubGroupDataType_DictionaryFragment,16058,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalError,16059,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalError_Active,16060,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalError_Classification,16061,Variable
-OpcUa_XmlSchema_WriterGroupTransportDataType,16062,Variable
-OpcUa_XmlSchema_WriterGroupTransportDataType_DataTypeVersion,16063,Variable
-OpcUa_XmlSchema_WriterGroupTransportDataType_DictionaryFragment,16064,Variable
-OpcUa_XmlSchema_WriterGroupMessageDataType,16065,Variable
-OpcUa_XmlSchema_WriterGroupMessageDataType_DataTypeVersion,16066,Variable
-OpcUa_XmlSchema_WriterGroupMessageDataType_DictionaryFragment,16067,Variable
-OpcUa_XmlSchema_PubSubConnectionDataType,16068,Variable
-OpcUa_XmlSchema_PubSubConnectionDataType_DataTypeVersion,16069,Variable
-OpcUa_XmlSchema_PubSubConnectionDataType_DictionaryFragment,16070,Variable
-OpcUa_XmlSchema_ConnectionTransportDataType,16071,Variable
-OpcUa_XmlSchema_ConnectionTransportDataType_DataTypeVersion,16072,Variable
-OpcUa_XmlSchema_ConnectionTransportDataType_DictionaryFragment,16073,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,16074,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_TotalError_TimeFirstChange,16075,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Reset,16076,Method
-OpcUa_XmlSchema_ReaderGroupTransportDataType,16077,Variable
-OpcUa_XmlSchema_ReaderGroupTransportDataType_DataTypeVersion,16078,Variable
-OpcUa_XmlSchema_ReaderGroupTransportDataType_DictionaryFragment,16079,Variable
-OpcUa_XmlSchema_ReaderGroupMessageDataType,16080,Variable
-OpcUa_XmlSchema_ReaderGroupMessageDataType_DataTypeVersion,16081,Variable
-OpcUa_XmlSchema_ReaderGroupMessageDataType_DictionaryFragment,16082,Variable
-OpcUa_XmlSchema_DataSetReaderDataType,16083,Variable
-OpcUa_XmlSchema_DataSetReaderDataType_DataTypeVersion,16084,Variable
-OpcUa_XmlSchema_DataSetReaderDataType_DictionaryFragment,16085,Variable
-OpcUa_XmlSchema_DataSetReaderTransportDataType,16086,Variable
-OpcUa_XmlSchema_DataSetReaderTransportDataType_DataTypeVersion,16087,Variable
-OpcUa_XmlSchema_DataSetReaderTransportDataType_DictionaryFragment,16088,Variable
-OpcUa_XmlSchema_DataSetReaderMessageDataType,16089,Variable
-OpcUa_XmlSchema_DataSetReaderMessageDataType_DataTypeVersion,16090,Variable
-OpcUa_XmlSchema_DataSetReaderMessageDataType_DictionaryFragment,16091,Variable
-OpcUa_XmlSchema_SubscribedDataSetDataType,16092,Variable
-OpcUa_XmlSchema_SubscribedDataSetDataType_DataTypeVersion,16093,Variable
-OpcUa_XmlSchema_SubscribedDataSetDataType_DictionaryFragment,16094,Variable
-OpcUa_XmlSchema_TargetVariablesDataType,16095,Variable
-OpcUa_XmlSchema_TargetVariablesDataType_DataTypeVersion,16096,Variable
-OpcUa_XmlSchema_TargetVariablesDataType_DictionaryFragment,16097,Variable
-OpcUa_XmlSchema_SubscribedDataSetMirrorDataType,16098,Variable
-OpcUa_XmlSchema_SubscribedDataSetMirrorDataType_DataTypeVersion,16099,Variable
-OpcUa_XmlSchema_SubscribedDataSetMirrorDataType_DictionaryFragment,16100,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_SubError,16101,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters,16102,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateError,16103,Variable
-OpcUa_XmlSchema_UadpWriterGroupMessageDataType,16104,Variable
-OpcUa_XmlSchema_UadpWriterGroupMessageDataType_DataTypeVersion,16105,Variable
-OpcUa_XmlSchema_UadpWriterGroupMessageDataType_DictionaryFragment,16106,Variable
-OpcUa_XmlSchema_UadpDataSetWriterMessageDataType,16107,Variable
-OpcUa_XmlSchema_UadpDataSetWriterMessageDataType_DataTypeVersion,16108,Variable
-OpcUa_XmlSchema_UadpDataSetWriterMessageDataType_DictionaryFragment,16109,Variable
-OpcUa_XmlSchema_UadpDataSetReaderMessageDataType,16110,Variable
-OpcUa_XmlSchema_UadpDataSetReaderMessageDataType_DataTypeVersion,16111,Variable
-OpcUa_XmlSchema_UadpDataSetReaderMessageDataType_DictionaryFragment,16112,Variable
-OpcUa_XmlSchema_JsonWriterGroupMessageDataType,16113,Variable
-OpcUa_XmlSchema_JsonWriterGroupMessageDataType_DataTypeVersion,16114,Variable
-OpcUa_XmlSchema_JsonWriterGroupMessageDataType_DictionaryFragment,16115,Variable
-OpcUa_XmlSchema_JsonDataSetWriterMessageDataType,16116,Variable
-OpcUa_XmlSchema_JsonDataSetWriterMessageDataType_DataTypeVersion,16117,Variable
-OpcUa_XmlSchema_JsonDataSetWriterMessageDataType_DictionaryFragment,16118,Variable
-OpcUa_XmlSchema_JsonDataSetReaderMessageDataType,16119,Variable
-OpcUa_XmlSchema_JsonDataSetReaderMessageDataType_DataTypeVersion,16120,Variable
-OpcUa_XmlSchema_JsonDataSetReaderMessageDataType_DictionaryFragment,16121,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateError_Active,16122,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateError_Classification,16123,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,16124,Variable
-OpcUa_XmlSchema_BrokerWriterGroupTransportDataType,16125,Variable
-RolePermissionType_Encoding_DefaultXml,16126,Object
-OpcUa_XmlSchema_RolePermissionType,16127,Variable
-OpcUa_XmlSchema_RolePermissionType_DataTypeVersion,16128,Variable
-OpcUa_XmlSchema_RolePermissionType_DictionaryFragment,16129,Variable
-OpcUa_XmlSchema_BrokerWriterGroupTransportDataType_DataTypeVersion,16130,Variable
-OpcUa_BinarySchema_RolePermissionType,16131,Variable
-OpcUa_BinarySchema_RolePermissionType_DataTypeVersion,16132,Variable
-OpcUa_BinarySchema_RolePermissionType_DictionaryFragment,16133,Variable
-OPCUANamespaceMetadata_DefaultRolePermissions,16134,Variable
-OPCUANamespaceMetadata_DefaultUserRolePermissions,16135,Variable
-OPCUANamespaceMetadata_DefaultAccessRestrictions,16136,Variable
-NamespaceMetadataType_DefaultRolePermissions,16137,Variable
-NamespaceMetadataType_DefaultUserRolePermissions,16138,Variable
-NamespaceMetadataType_DefaultAccessRestrictions,16139,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_DefaultRolePermissions,16140,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_DefaultUserRolePermissions,16141,Variable
-NamespacesType_NamespaceIdentifier_Placeholder_DefaultAccessRestrictions,16142,Variable
-OpcUa_XmlSchema_BrokerWriterGroupTransportDataType_DictionaryFragment,16143,Variable
-OpcUa_XmlSchema_BrokerDataSetWriterTransportDataType,16144,Variable
-OpcUa_XmlSchema_BrokerDataSetWriterTransportDataType_DataTypeVersion,16145,Variable
-OpcUa_XmlSchema_BrokerDataSetWriterTransportDataType_DictionaryFragment,16146,Variable
-OpcUa_XmlSchema_BrokerDataSetReaderTransportDataType,16147,Variable
-OpcUa_XmlSchema_BrokerDataSetReaderTransportDataType_DataTypeVersion,16148,Variable
-OpcUa_XmlSchema_BrokerDataSetReaderTransportDataType_DictionaryFragment,16149,Variable
-EndpointType_Encoding_DefaultJson,16150,Object
-DataTypeSchemaHeader_Encoding_DefaultJson,16151,Object
-PublishedDataSetDataType_Encoding_DefaultJson,16152,Object
-PublishedDataSetSourceDataType_Encoding_DefaultJson,16153,Object
-PublishedDataItemsDataType_Encoding_DefaultJson,16154,Object
-PublishedEventsDataType_Encoding_DefaultJson,16155,Object
-DataSetWriterDataType_Encoding_DefaultJson,16156,Object
-DataSetWriterTransportDataType_Encoding_DefaultJson,16157,Object
-DataSetWriterMessageDataType_Encoding_DefaultJson,16158,Object
-PubSubGroupDataType_Encoding_DefaultJson,16159,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,16160,Variable
-WriterGroupTransportDataType_Encoding_DefaultJson,16161,Object
-RoleSetType_RoleName_Placeholder_Identities,16162,Variable
-RoleSetType_RoleName_Placeholder_Applications,16163,Variable
-RoleSetType_RoleName_Placeholder_Endpoints,16164,Variable
-RoleSetType_RoleName_Placeholder_AddApplication,16165,Method
-RoleSetType_RoleName_Placeholder_AddApplication_InputArguments,16166,Variable
-RoleSetType_RoleName_Placeholder_RemoveApplication,16167,Method
-RoleSetType_RoleName_Placeholder_RemoveApplication_InputArguments,16168,Variable
-RoleSetType_RoleName_Placeholder_AddEndpoint,16169,Method
-RoleSetType_RoleName_Placeholder_AddEndpoint_InputArguments,16170,Variable
-RoleSetType_RoleName_Placeholder_RemoveEndpoint,16171,Method
-RoleSetType_RoleName_Placeholder_RemoveEndpoint_InputArguments,16172,Variable
-RoleType_Identities,16173,Variable
-RoleType_Applications,16174,Variable
-RoleType_Endpoints,16175,Variable
-RoleType_AddApplication,16176,Method
-RoleType_AddApplication_InputArguments,16177,Variable
-RoleType_RemoveApplication,16178,Method
-RoleType_RemoveApplication_InputArguments,16179,Variable
-RoleType_AddEndpoint,16180,Method
-RoleType_AddEndpoint_InputArguments,16181,Variable
-RoleType_RemoveEndpoint,16182,Method
-RoleType_RemoveEndpoint_InputArguments,16183,Variable
-AddApplicationMethodType,16184,Method
-AddApplicationMethodType_InputArguments,16185,Variable
-RemoveApplicationMethodType,16186,Method
-RemoveApplicationMethodType_InputArguments,16187,Variable
-AddEndpointMethodType,16188,Method
-AddEndpointMethodType_InputArguments,16189,Variable
-RemoveEndpointMethodType,16190,Method
-RemoveEndpointMethodType_InputArguments,16191,Variable
-WellKnownRole_Anonymous_Identities,16192,Variable
-WellKnownRole_Anonymous_Applications,16193,Variable
-WellKnownRole_Anonymous_Endpoints,16194,Variable
-WellKnownRole_Anonymous_AddApplication,16195,Method
-WellKnownRole_Anonymous_AddApplication_InputArguments,16196,Variable
-WellKnownRole_Anonymous_RemoveApplication,16197,Method
-WellKnownRole_Anonymous_RemoveApplication_InputArguments,16198,Variable
-WellKnownRole_Anonymous_AddEndpoint,16199,Method
-WellKnownRole_Anonymous_AddEndpoint_InputArguments,16200,Variable
-WellKnownRole_Anonymous_RemoveEndpoint,16201,Method
-WellKnownRole_Anonymous_RemoveEndpoint_InputArguments,16202,Variable
-WellKnownRole_AuthenticatedUser_Identities,16203,Variable
-WellKnownRole_AuthenticatedUser_Applications,16204,Variable
-WellKnownRole_AuthenticatedUser_Endpoints,16205,Variable
-WellKnownRole_AuthenticatedUser_AddApplication,16206,Method
-WellKnownRole_AuthenticatedUser_AddApplication_InputArguments,16207,Variable
-WellKnownRole_AuthenticatedUser_RemoveApplication,16208,Method
-WellKnownRole_AuthenticatedUser_RemoveApplication_InputArguments,16209,Variable
-WellKnownRole_AuthenticatedUser_AddEndpoint,16210,Method
-WellKnownRole_AuthenticatedUser_AddEndpoint_InputArguments,16211,Variable
-WellKnownRole_AuthenticatedUser_RemoveEndpoint,16212,Method
-WellKnownRole_AuthenticatedUser_RemoveEndpoint_InputArguments,16213,Variable
-WellKnownRole_Observer_Identities,16214,Variable
-WellKnownRole_Observer_Applications,16215,Variable
-WellKnownRole_Observer_Endpoints,16216,Variable
-WellKnownRole_Observer_AddApplication,16217,Method
-WellKnownRole_Observer_AddApplication_InputArguments,16218,Variable
-WellKnownRole_Observer_RemoveApplication,16219,Method
-WellKnownRole_Observer_RemoveApplication_InputArguments,16220,Variable
-WellKnownRole_Observer_AddEndpoint,16221,Method
-WellKnownRole_Observer_AddEndpoint_InputArguments,16222,Variable
-WellKnownRole_Observer_RemoveEndpoint,16223,Method
-WellKnownRole_Observer_RemoveEndpoint_InputArguments,16224,Variable
-WellKnownRole_Operator_Identities,16225,Variable
-WellKnownRole_Operator_Applications,16226,Variable
-WellKnownRole_Operator_Endpoints,16227,Variable
-WellKnownRole_Operator_AddApplication,16228,Method
-WellKnownRole_Operator_AddApplication_InputArguments,16229,Variable
-WellKnownRole_Operator_RemoveApplication,16230,Method
-WellKnownRole_Operator_RemoveApplication_InputArguments,16231,Variable
-WellKnownRole_Operator_AddEndpoint,16232,Method
-WellKnownRole_Operator_AddEndpoint_InputArguments,16233,Variable
-WellKnownRole_Operator_RemoveEndpoint,16234,Method
-WellKnownRole_Operator_RemoveEndpoint_InputArguments,16235,Variable
-WellKnownRole_Engineer_Identities,16236,Variable
-WellKnownRole_Engineer_Applications,16237,Variable
-WellKnownRole_Engineer_Endpoints,16238,Variable
-WellKnownRole_Engineer_AddApplication,16239,Method
-WellKnownRole_Engineer_AddApplication_InputArguments,16240,Variable
-WellKnownRole_Engineer_RemoveApplication,16241,Method
-WellKnownRole_Engineer_RemoveApplication_InputArguments,16242,Variable
-WellKnownRole_Engineer_AddEndpoint,16243,Method
-WellKnownRole_Engineer_AddEndpoint_InputArguments,16244,Variable
-WellKnownRole_Engineer_RemoveEndpoint,16245,Method
-WellKnownRole_Engineer_RemoveEndpoint_InputArguments,16246,Variable
-WellKnownRole_Supervisor_Identities,16247,Variable
-WellKnownRole_Supervisor_Applications,16248,Variable
-WellKnownRole_Supervisor_Endpoints,16249,Variable
-WellKnownRole_Supervisor_AddApplication,16250,Method
-WellKnownRole_Supervisor_AddApplication_InputArguments,16251,Variable
-WellKnownRole_Supervisor_RemoveApplication,16252,Method
-WellKnownRole_Supervisor_RemoveApplication_InputArguments,16253,Variable
-WellKnownRole_Supervisor_AddEndpoint,16254,Method
-WellKnownRole_Supervisor_AddEndpoint_InputArguments,16255,Variable
-WellKnownRole_Supervisor_RemoveEndpoint,16256,Method
-WellKnownRole_Supervisor_RemoveEndpoint_InputArguments,16257,Variable
-WellKnownRole_SecurityAdmin_Identities,16258,Variable
-WellKnownRole_SecurityAdmin_Applications,16259,Variable
-WellKnownRole_SecurityAdmin_Endpoints,16260,Variable
-WellKnownRole_SecurityAdmin_AddApplication,16261,Method
-WellKnownRole_SecurityAdmin_AddApplication_InputArguments,16262,Variable
-WellKnownRole_SecurityAdmin_RemoveApplication,16263,Method
-WellKnownRole_SecurityAdmin_RemoveApplication_InputArguments,16264,Variable
-WellKnownRole_SecurityAdmin_AddEndpoint,16265,Method
-WellKnownRole_SecurityAdmin_AddEndpoint_InputArguments,16266,Variable
-WellKnownRole_SecurityAdmin_RemoveEndpoint,16267,Method
-WellKnownRole_SecurityAdmin_RemoveEndpoint_InputArguments,16268,Variable
-WellKnownRole_ConfigureAdmin_Identities,16269,Variable
-WellKnownRole_ConfigureAdmin_Applications,16270,Variable
-WellKnownRole_ConfigureAdmin_Endpoints,16271,Variable
-WellKnownRole_ConfigureAdmin_AddApplication,16272,Method
-WellKnownRole_ConfigureAdmin_AddApplication_InputArguments,16273,Variable
-WellKnownRole_ConfigureAdmin_RemoveApplication,16274,Method
-WellKnownRole_ConfigureAdmin_RemoveApplication_InputArguments,16275,Variable
-WellKnownRole_ConfigureAdmin_AddEndpoint,16276,Method
-WellKnownRole_ConfigureAdmin_AddEndpoint_InputArguments,16277,Variable
-WellKnownRole_ConfigureAdmin_RemoveEndpoint,16278,Method
-WellKnownRole_ConfigureAdmin_RemoveEndpoint_InputArguments,16279,Variable
-WriterGroupMessageDataType_Encoding_DefaultJson,16280,Object
-PubSubConnectionDataType_Encoding_DefaultJson,16281,Object
-ConnectionTransportDataType_Encoding_DefaultJson,16282,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,16283,Variable
-ReaderGroupTransportDataType_Encoding_DefaultJson,16284,Object
-ReaderGroupMessageDataType_Encoding_DefaultJson,16285,Object
-DataSetReaderDataType_Encoding_DefaultJson,16286,Object
-DataSetReaderTransportDataType_Encoding_DefaultJson,16287,Object
-DataSetReaderMessageDataType_Encoding_DefaultJson,16288,Object
-ServerType_ServerCapabilities_RoleSet,16289,Object
-ServerType_ServerCapabilities_RoleSet_AddRole,16290,Method
-ServerType_ServerCapabilities_RoleSet_AddRole_InputArguments,16291,Variable
-ServerType_ServerCapabilities_RoleSet_AddRole_OutputArguments,16292,Variable
-ServerType_ServerCapabilities_RoleSet_RemoveRole,16293,Method
-ServerType_ServerCapabilities_RoleSet_RemoveRole_InputArguments,16294,Variable
-ServerCapabilitiesType_RoleSet,16295,Object
-ServerCapabilitiesType_RoleSet_AddRole,16296,Method
-ServerCapabilitiesType_RoleSet_AddRole_InputArguments,16297,Variable
-ServerCapabilitiesType_RoleSet_AddRole_OutputArguments,16298,Variable
-ServerCapabilitiesType_RoleSet_RemoveRole,16299,Method
-ServerCapabilitiesType_RoleSet_RemoveRole_InputArguments,16300,Variable
-Server_ServerCapabilities_RoleSet_AddRole,16301,Method
-Server_ServerCapabilities_RoleSet_AddRole_InputArguments,16302,Variable
-Server_ServerCapabilities_RoleSet_AddRole_OutputArguments,16303,Variable
-Server_ServerCapabilities_RoleSet_RemoveRole,16304,Method
-Server_ServerCapabilities_RoleSet_RemoveRole_InputArguments,16305,Variable
-DefaultInputValues,16306,Variable
-AudioDataType,16307,DataType
-SubscribedDataSetDataType_Encoding_DefaultJson,16308,Object
-SelectionListType,16309,VariableType
-TargetVariablesDataType_Encoding_DefaultJson,16310,Object
-SubscribedDataSetMirrorDataType_Encoding_DefaultJson,16311,Object
-SelectionListType_RestrictToList,16312,Variable
-AdditionalParametersType,16313,DataType
-FileSystem,16314,Object
-FileSystem_FileDirectoryName_Placeholder,16315,Object
-FileSystem_FileDirectoryName_Placeholder_CreateDirectory,16316,Method
-FileSystem_FileDirectoryName_Placeholder_CreateDirectory_InputArguments,16317,Variable
-FileSystem_FileDirectoryName_Placeholder_CreateDirectory_OutputArguments,16318,Variable
-FileSystem_FileDirectoryName_Placeholder_CreateFile,16319,Method
-FileSystem_FileDirectoryName_Placeholder_CreateFile_InputArguments,16320,Variable
-FileSystem_FileDirectoryName_Placeholder_CreateFile_OutputArguments,16321,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,16322,Variable
-UadpWriterGroupMessageDataType_Encoding_DefaultJson,16323,Object
-FileSystem_FileDirectoryName_Placeholder_MoveOrCopy,16324,Method
-FileSystem_FileDirectoryName_Placeholder_MoveOrCopy_InputArguments,16325,Variable
-FileSystem_FileDirectoryName_Placeholder_MoveOrCopy_OutputArguments,16326,Variable
-FileSystem_FileName_Placeholder,16327,Object
-FileSystem_FileName_Placeholder_Size,16328,Variable
-FileSystem_FileName_Placeholder_Writable,16329,Variable
-FileSystem_FileName_Placeholder_UserWritable,16330,Variable
-FileSystem_FileName_Placeholder_OpenCount,16331,Variable
-FileSystem_FileName_Placeholder_MimeType,16332,Variable
-FileSystem_FileName_Placeholder_Open,16333,Method
-FileSystem_FileName_Placeholder_Open_InputArguments,16334,Variable
-FileSystem_FileName_Placeholder_Open_OutputArguments,16335,Variable
-FileSystem_FileName_Placeholder_Close,16336,Method
-FileSystem_FileName_Placeholder_Close_InputArguments,16337,Variable
-FileSystem_FileName_Placeholder_Read,16338,Method
-FileSystem_FileName_Placeholder_Read_InputArguments,16339,Variable
-FileSystem_FileName_Placeholder_Read_OutputArguments,16340,Variable
-FileSystem_FileName_Placeholder_Write,16341,Method
-FileSystem_FileName_Placeholder_Write_InputArguments,16342,Variable
-FileSystem_FileName_Placeholder_GetPosition,16343,Method
-FileSystem_FileName_Placeholder_GetPosition_InputArguments,16344,Variable
-FileSystem_FileName_Placeholder_GetPosition_OutputArguments,16345,Variable
-FileSystem_FileName_Placeholder_SetPosition,16346,Method
-FileSystem_FileName_Placeholder_SetPosition_InputArguments,16347,Variable
-FileSystem_CreateDirectory,16348,Method
-FileSystem_CreateDirectory_InputArguments,16349,Variable
-FileSystem_CreateDirectory_OutputArguments,16350,Variable
-FileSystem_CreateFile,16351,Method
-FileSystem_CreateFile_InputArguments,16352,Variable
-FileSystem_CreateFile_OutputArguments,16353,Variable
-FileSystem_DeleteFileSystemObject,16354,Method
-FileSystem_DeleteFileSystemObject_InputArguments,16355,Variable
-FileSystem_MoveOrCopy,16356,Method
-FileSystem_MoveOrCopy_InputArguments,16357,Variable
-FileSystem_MoveOrCopy_OutputArguments,16358,Variable
-TemporaryFileTransferType_GenerateFileForWrite_InputArguments,16359,Variable
-GenerateFileForWriteMethodType_InputArguments,16360,Variable
-HasAlarmSuppressionGroup,16361,ReferenceType
-AlarmGroupMember,16362,ReferenceType
-ConditionType_ConditionSubClassId,16363,Variable
-ConditionType_ConditionSubClassName,16364,Variable
-DialogConditionType_ConditionSubClassId,16365,Variable
-DialogConditionType_ConditionSubClassName,16366,Variable
-AcknowledgeableConditionType_ConditionSubClassId,16367,Variable
-AcknowledgeableConditionType_ConditionSubClassName,16368,Variable
-AlarmConditionType_ConditionSubClassId,16369,Variable
-AlarmConditionType_ConditionSubClassName,16370,Variable
-AlarmConditionType_OutOfServiceState,16371,Variable
-AlarmConditionType_OutOfServiceState_Id,16372,Variable
-AlarmConditionType_OutOfServiceState_Name,16373,Variable
-AlarmConditionType_OutOfServiceState_Number,16374,Variable
-AlarmConditionType_OutOfServiceState_EffectiveDisplayName,16375,Variable
-AlarmConditionType_OutOfServiceState_TransitionTime,16376,Variable
-AlarmConditionType_OutOfServiceState_EffectiveTransitionTime,16377,Variable
-AlarmConditionType_OutOfServiceState_TrueState,16378,Variable
-AlarmConditionType_OutOfServiceState_FalseState,16379,Variable
-AlarmConditionType_SilenceState,16380,Variable
-AlarmConditionType_SilenceState_Id,16381,Variable
-AlarmConditionType_SilenceState_Name,16382,Variable
-AlarmConditionType_SilenceState_Number,16383,Variable
-AlarmConditionType_SilenceState_EffectiveDisplayName,16384,Variable
-AlarmConditionType_SilenceState_TransitionTime,16385,Variable
-AlarmConditionType_SilenceState_EffectiveTransitionTime,16386,Variable
-AlarmConditionType_SilenceState_TrueState,16387,Variable
-AlarmConditionType_SilenceState_FalseState,16388,Variable
-AlarmConditionType_AudibleEnabled,16389,Variable
-AlarmConditionType_AudibleSound,16390,Variable
-UadpDataSetWriterMessageDataType_Encoding_DefaultJson,16391,Object
-UadpDataSetReaderMessageDataType_Encoding_DefaultJson,16392,Object
-JsonWriterGroupMessageDataType_Encoding_DefaultJson,16393,Object
-JsonDataSetWriterMessageDataType_Encoding_DefaultJson,16394,Object
-AlarmConditionType_OnDelay,16395,Variable
-AlarmConditionType_OffDelay,16396,Variable
-AlarmConditionType_FirstInGroupFlag,16397,Variable
-AlarmConditionType_FirstInGroup,16398,Object
-AlarmConditionType_AlarmGroup_Placeholder,16399,Object
-AlarmConditionType_ReAlarmTime,16400,Variable
-AlarmConditionType_ReAlarmRepeatCount,16401,Variable
-AlarmConditionType_Silence,16402,Method
-AlarmConditionType_Suppress,16403,Method
-JsonDataSetReaderMessageDataType_Encoding_DefaultJson,16404,Object
-AlarmGroupType,16405,ObjectType
-AlarmGroupType_AlarmConditionInstance_Placeholder,16406,Object
-AlarmGroupType_AlarmConditionInstance_Placeholder_EventId,16407,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EventType,16408,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SourceNode,16409,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SourceName,16410,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Time,16411,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ReceiveTime,16412,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LocalTime,16413,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Message,16414,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Severity,16415,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConditionClassId,16416,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConditionClassName,16417,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConditionSubClassId,16418,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConditionSubClassName,16419,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConditionName,16420,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_BranchId,16421,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Retain,16422,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState,16423,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_Id,16424,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_Name,16425,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_Number,16426,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_EffectiveDisplayName,16427,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_TransitionTime,16428,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_EffectiveTransitionTime,16429,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_TrueState,16430,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_EnabledState_FalseState,16431,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Quality,16432,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Quality_SourceTimestamp,16433,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LastSeverity,16434,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LastSeverity_SourceTimestamp,16435,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Comment,16436,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Comment_SourceTimestamp,16437,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ClientUserId,16438,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Disable,16439,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_Enable,16440,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_AddComment,16441,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_AddComment_InputArguments,16442,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState,16443,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_Id,16444,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_Name,16445,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_Number,16446,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_EffectiveDisplayName,16447,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_TransitionTime,16448,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_EffectiveTransitionTime,16449,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_TrueState,16450,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AckedState_FalseState,16451,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState,16452,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_Id,16453,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_Name,16454,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_Number,16455,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_EffectiveDisplayName,16456,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_TransitionTime,16457,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_EffectiveTransitionTime,16458,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_TrueState,16459,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ConfirmedState_FalseState,16460,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Acknowledge,16461,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_Acknowledge_InputArguments,16462,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Confirm,16463,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_Confirm_InputArguments,16464,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState,16465,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_Id,16466,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_Name,16467,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_Number,16468,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_EffectiveDisplayName,16469,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_TransitionTime,16470,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_EffectiveTransitionTime,16471,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_TrueState,16472,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ActiveState_FalseState,16473,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_InputNode,16474,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState,16475,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_Id,16476,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_Name,16477,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_Number,16478,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_EffectiveDisplayName,16479,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_TransitionTime,16480,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_EffectiveTransitionTime,16481,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_TrueState,16482,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedState_FalseState,16483,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState,16484,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_Id,16485,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_Name,16486,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_Number,16487,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_EffectiveDisplayName,16488,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_TransitionTime,16489,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_EffectiveTransitionTime,16490,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_TrueState,16491,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OutOfServiceState_FalseState,16492,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState,16493,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_Id,16494,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_Name,16495,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_Number,16496,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_EffectiveDisplayName,16497,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_TransitionTime,16498,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_EffectiveTransitionTime,16499,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_TrueState,16500,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SilenceState_FalseState,16501,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState,16502,Object
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_CurrentState,16503,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_CurrentState_Id,16504,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_CurrentState_Name,16505,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_CurrentState_Number,16506,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_CurrentState_EffectiveDisplayName,16507,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_LastTransition,16508,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_LastTransition_Id,16509,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_LastTransition_Name,16510,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_LastTransition_Number,16511,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_LastTransition_TransitionTime,16512,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_LastTransition_EffectiveTransitionTime,16513,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_UnshelveTime,16514,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_Unshelve,16515,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_OneShotShelve,16516,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_TimedShelve,16517,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_TimedShelve_InputArguments,16518,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_SuppressedOrShelved,16519,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_MaxTimeShelved,16520,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AudibleEnabled,16521,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AudibleSound,16522,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,16523,Variable
-BrokerWriterGroupTransportDataType_Encoding_DefaultJson,16524,Object
-BrokerDataSetWriterTransportDataType_Encoding_DefaultJson,16525,Object
-BrokerDataSetReaderTransportDataType_Encoding_DefaultJson,16526,Object
-AlarmGroupType_AlarmConditionInstance_Placeholder_OnDelay,16527,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_OffDelay,16528,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_FirstInGroupFlag,16529,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_FirstInGroup,16530,Object
-AlarmGroupType_AlarmConditionInstance_Placeholder_ReAlarmTime,16531,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ReAlarmRepeatCount,16532,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Silence,16533,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_Suppress,16534,Method
-PublishSubscribeType_ConnectionName_Placeholder_AddWriterGroup,16535,Method
-LimitAlarmType_ConditionSubClassId,16536,Variable
-LimitAlarmType_ConditionSubClassName,16537,Variable
-LimitAlarmType_OutOfServiceState,16538,Variable
-LimitAlarmType_OutOfServiceState_Id,16539,Variable
-LimitAlarmType_OutOfServiceState_Name,16540,Variable
-LimitAlarmType_OutOfServiceState_Number,16541,Variable
-LimitAlarmType_OutOfServiceState_EffectiveDisplayName,16542,Variable
-LimitAlarmType_OutOfServiceState_TransitionTime,16543,Variable
-LimitAlarmType_OutOfServiceState_EffectiveTransitionTime,16544,Variable
-LimitAlarmType_OutOfServiceState_TrueState,16545,Variable
-LimitAlarmType_OutOfServiceState_FalseState,16546,Variable
-LimitAlarmType_SilenceState,16547,Variable
-LimitAlarmType_SilenceState_Id,16548,Variable
-LimitAlarmType_SilenceState_Name,16549,Variable
-LimitAlarmType_SilenceState_Number,16550,Variable
-LimitAlarmType_SilenceState_EffectiveDisplayName,16551,Variable
-LimitAlarmType_SilenceState_TransitionTime,16552,Variable
-LimitAlarmType_SilenceState_EffectiveTransitionTime,16553,Variable
-LimitAlarmType_SilenceState_TrueState,16554,Variable
-LimitAlarmType_SilenceState_FalseState,16555,Variable
-LimitAlarmType_AudibleEnabled,16556,Variable
-LimitAlarmType_AudibleSound,16557,Variable
-PublishSubscribeType_ConnectionName_Placeholder_AddWriterGroup_InputArguments,16558,Variable
-PublishSubscribeType_ConnectionName_Placeholder_AddWriterGroup_OutputArguments,16559,Variable
-PublishSubscribeType_ConnectionName_Placeholder_AddReaderGroup,16560,Method
-PublishSubscribeType_ConnectionName_Placeholder_AddReaderGroup_InputArguments,16561,Variable
-LimitAlarmType_OnDelay,16562,Variable
-LimitAlarmType_OffDelay,16563,Variable
-LimitAlarmType_FirstInGroupFlag,16564,Variable
-LimitAlarmType_FirstInGroup,16565,Object
-LimitAlarmType_AlarmGroup_Placeholder,16566,Object
-LimitAlarmType_ReAlarmTime,16567,Variable
-LimitAlarmType_ReAlarmRepeatCount,16568,Variable
-LimitAlarmType_Silence,16569,Method
-LimitAlarmType_Suppress,16570,Method
-PublishSubscribeType_ConnectionName_Placeholder_AddReaderGroup_OutputArguments,16571,Variable
-LimitAlarmType_BaseHighHighLimit,16572,Variable
-LimitAlarmType_BaseHighLimit,16573,Variable
-LimitAlarmType_BaseLowLimit,16574,Variable
-LimitAlarmType_BaseLowLowLimit,16575,Variable
-ExclusiveLimitAlarmType_ConditionSubClassId,16576,Variable
-ExclusiveLimitAlarmType_ConditionSubClassName,16577,Variable
-ExclusiveLimitAlarmType_OutOfServiceState,16578,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_Id,16579,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_Name,16580,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_Number,16581,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_EffectiveDisplayName,16582,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_TransitionTime,16583,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_EffectiveTransitionTime,16584,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_TrueState,16585,Variable
-ExclusiveLimitAlarmType_OutOfServiceState_FalseState,16586,Variable
-ExclusiveLimitAlarmType_SilenceState,16587,Variable
-ExclusiveLimitAlarmType_SilenceState_Id,16588,Variable
-ExclusiveLimitAlarmType_SilenceState_Name,16589,Variable
-ExclusiveLimitAlarmType_SilenceState_Number,16590,Variable
-ExclusiveLimitAlarmType_SilenceState_EffectiveDisplayName,16591,Variable
-ExclusiveLimitAlarmType_SilenceState_TransitionTime,16592,Variable
-ExclusiveLimitAlarmType_SilenceState_EffectiveTransitionTime,16593,Variable
-ExclusiveLimitAlarmType_SilenceState_TrueState,16594,Variable
-ExclusiveLimitAlarmType_SilenceState_FalseState,16595,Variable
-ExclusiveLimitAlarmType_AudibleEnabled,16596,Variable
-ExclusiveLimitAlarmType_AudibleSound,16597,Variable
-PublishSubscribeType_AddConnection,16598,Method
-PublishSubscribeType_AddConnection_InputArguments,16599,Variable
-PublishSubscribeType_AddConnection_OutputArguments,16600,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedDataItemsTemplate,16601,Method
-ExclusiveLimitAlarmType_OnDelay,16602,Variable
-ExclusiveLimitAlarmType_OffDelay,16603,Variable
-ExclusiveLimitAlarmType_FirstInGroupFlag,16604,Variable
-ExclusiveLimitAlarmType_FirstInGroup,16605,Object
-ExclusiveLimitAlarmType_AlarmGroup_Placeholder,16606,Object
-ExclusiveLimitAlarmType_ReAlarmTime,16607,Variable
-ExclusiveLimitAlarmType_ReAlarmRepeatCount,16608,Variable
-ExclusiveLimitAlarmType_Silence,16609,Method
-ExclusiveLimitAlarmType_Suppress,16610,Method
-PublishSubscribeType_PublishedDataSets_AddPublishedDataItemsTemplate_InputArguments,16611,Variable
-ExclusiveLimitAlarmType_BaseHighHighLimit,16612,Variable
-ExclusiveLimitAlarmType_BaseHighLimit,16613,Variable
-ExclusiveLimitAlarmType_BaseLowLimit,16614,Variable
-ExclusiveLimitAlarmType_BaseLowLowLimit,16615,Variable
-NonExclusiveLimitAlarmType_ConditionSubClassId,16616,Variable
-NonExclusiveLimitAlarmType_ConditionSubClassName,16617,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState,16618,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_Id,16619,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_Name,16620,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_Number,16621,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_EffectiveDisplayName,16622,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_TransitionTime,16623,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_EffectiveTransitionTime,16624,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_TrueState,16625,Variable
-NonExclusiveLimitAlarmType_OutOfServiceState_FalseState,16626,Variable
-NonExclusiveLimitAlarmType_SilenceState,16627,Variable
-NonExclusiveLimitAlarmType_SilenceState_Id,16628,Variable
-NonExclusiveLimitAlarmType_SilenceState_Name,16629,Variable
-NonExclusiveLimitAlarmType_SilenceState_Number,16630,Variable
-NonExclusiveLimitAlarmType_SilenceState_EffectiveDisplayName,16631,Variable
-NonExclusiveLimitAlarmType_SilenceState_TransitionTime,16632,Variable
-NonExclusiveLimitAlarmType_SilenceState_EffectiveTransitionTime,16633,Variable
-NonExclusiveLimitAlarmType_SilenceState_TrueState,16634,Variable
-NonExclusiveLimitAlarmType_SilenceState_FalseState,16635,Variable
-NonExclusiveLimitAlarmType_AudibleEnabled,16636,Variable
-NonExclusiveLimitAlarmType_AudibleSound,16637,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedDataItemsTemplate_OutputArguments,16638,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedEventsTemplate,16639,Method
-PublishSubscribeType_PublishedDataSets_AddPublishedEventsTemplate_InputArguments,16640,Variable
-PublishSubscribeType_PublishedDataSets_AddPublishedEventsTemplate_OutputArguments,16641,Variable
-NonExclusiveLimitAlarmType_OnDelay,16642,Variable
-NonExclusiveLimitAlarmType_OffDelay,16643,Variable
-NonExclusiveLimitAlarmType_FirstInGroupFlag,16644,Variable
-NonExclusiveLimitAlarmType_FirstInGroup,16645,Object
-NonExclusiveLimitAlarmType_AlarmGroup_Placeholder,16646,Object
-NonExclusiveLimitAlarmType_ReAlarmTime,16647,Variable
-NonExclusiveLimitAlarmType_ReAlarmRepeatCount,16648,Variable
-NonExclusiveLimitAlarmType_Silence,16649,Method
-NonExclusiveLimitAlarmType_Suppress,16650,Method
-PublishSubscribeType_PublishedDataSets_AddDataSetFolder,16651,Method
-NonExclusiveLimitAlarmType_BaseHighHighLimit,16652,Variable
-NonExclusiveLimitAlarmType_BaseHighLimit,16653,Variable
-NonExclusiveLimitAlarmType_BaseLowLimit,16654,Variable
-NonExclusiveLimitAlarmType_BaseLowLowLimit,16655,Variable
-NonExclusiveLevelAlarmType_ConditionSubClassId,16656,Variable
-NonExclusiveLevelAlarmType_ConditionSubClassName,16657,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState,16658,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_Id,16659,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_Name,16660,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_Number,16661,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_EffectiveDisplayName,16662,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_TransitionTime,16663,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_EffectiveTransitionTime,16664,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_TrueState,16665,Variable
-NonExclusiveLevelAlarmType_OutOfServiceState_FalseState,16666,Variable
-NonExclusiveLevelAlarmType_SilenceState,16667,Variable
-NonExclusiveLevelAlarmType_SilenceState_Id,16668,Variable
-NonExclusiveLevelAlarmType_SilenceState_Name,16669,Variable
-NonExclusiveLevelAlarmType_SilenceState_Number,16670,Variable
-NonExclusiveLevelAlarmType_SilenceState_EffectiveDisplayName,16671,Variable
-NonExclusiveLevelAlarmType_SilenceState_TransitionTime,16672,Variable
-NonExclusiveLevelAlarmType_SilenceState_EffectiveTransitionTime,16673,Variable
-NonExclusiveLevelAlarmType_SilenceState_TrueState,16674,Variable
-NonExclusiveLevelAlarmType_SilenceState_FalseState,16675,Variable
-NonExclusiveLevelAlarmType_AudibleEnabled,16676,Variable
-NonExclusiveLevelAlarmType_AudibleSound,16677,Variable
-PublishSubscribeType_PublishedDataSets_AddDataSetFolder_InputArguments,16678,Variable
-PublishSubscribeType_PublishedDataSets_AddDataSetFolder_OutputArguments,16679,Variable
-PublishSubscribeType_PublishedDataSets_RemoveDataSetFolder,16680,Method
-PublishSubscribeType_PublishedDataSets_RemoveDataSetFolder_InputArguments,16681,Variable
-NonExclusiveLevelAlarmType_OnDelay,16682,Variable
-NonExclusiveLevelAlarmType_OffDelay,16683,Variable
-NonExclusiveLevelAlarmType_FirstInGroupFlag,16684,Variable
-NonExclusiveLevelAlarmType_FirstInGroup,16685,Object
-NonExclusiveLevelAlarmType_AlarmGroup_Placeholder,16686,Object
-NonExclusiveLevelAlarmType_ReAlarmTime,16687,Variable
-NonExclusiveLevelAlarmType_ReAlarmRepeatCount,16688,Variable
-NonExclusiveLevelAlarmType_Silence,16689,Method
-NonExclusiveLevelAlarmType_Suppress,16690,Method
-AddConnectionMethodType,16691,Method
-NonExclusiveLevelAlarmType_BaseHighHighLimit,16692,Variable
-NonExclusiveLevelAlarmType_BaseHighLimit,16693,Variable
-NonExclusiveLevelAlarmType_BaseLowLimit,16694,Variable
-NonExclusiveLevelAlarmType_BaseLowLowLimit,16695,Variable
-ExclusiveLevelAlarmType_ConditionSubClassId,16696,Variable
-ExclusiveLevelAlarmType_ConditionSubClassName,16697,Variable
-ExclusiveLevelAlarmType_OutOfServiceState,16698,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_Id,16699,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_Name,16700,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_Number,16701,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_EffectiveDisplayName,16702,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_TransitionTime,16703,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_EffectiveTransitionTime,16704,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_TrueState,16705,Variable
-ExclusiveLevelAlarmType_OutOfServiceState_FalseState,16706,Variable
-ExclusiveLevelAlarmType_SilenceState,16707,Variable
-ExclusiveLevelAlarmType_SilenceState_Id,16708,Variable
-ExclusiveLevelAlarmType_SilenceState_Name,16709,Variable
-ExclusiveLevelAlarmType_SilenceState_Number,16710,Variable
-ExclusiveLevelAlarmType_SilenceState_EffectiveDisplayName,16711,Variable
-ExclusiveLevelAlarmType_SilenceState_TransitionTime,16712,Variable
-ExclusiveLevelAlarmType_SilenceState_EffectiveTransitionTime,16713,Variable
-ExclusiveLevelAlarmType_SilenceState_TrueState,16714,Variable
-ExclusiveLevelAlarmType_SilenceState_FalseState,16715,Variable
-ExclusiveLevelAlarmType_AudibleEnabled,16716,Variable
-ExclusiveLevelAlarmType_AudibleSound,16717,Variable
-AddConnectionMethodType_InputArguments,16718,Variable
-AddConnectionMethodType_OutputArguments,16719,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_DataSetWriterId,16720,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_DataSetFieldContentMask,16721,Variable
-ExclusiveLevelAlarmType_OnDelay,16722,Variable
-ExclusiveLevelAlarmType_OffDelay,16723,Variable
-ExclusiveLevelAlarmType_FirstInGroupFlag,16724,Variable
-ExclusiveLevelAlarmType_FirstInGroup,16725,Object
-ExclusiveLevelAlarmType_AlarmGroup_Placeholder,16726,Object
-ExclusiveLevelAlarmType_ReAlarmTime,16727,Variable
-ExclusiveLevelAlarmType_ReAlarmRepeatCount,16728,Variable
-ExclusiveLevelAlarmType_Silence,16729,Method
-ExclusiveLevelAlarmType_Suppress,16730,Method
-PublishedDataSetType_DataSetWriterName_Placeholder_KeyFrameCount,16731,Variable
-ExclusiveLevelAlarmType_BaseHighHighLimit,16732,Variable
-ExclusiveLevelAlarmType_BaseHighLimit,16733,Variable
-ExclusiveLevelAlarmType_BaseLowLimit,16734,Variable
-ExclusiveLevelAlarmType_BaseLowLowLimit,16735,Variable
-NonExclusiveDeviationAlarmType_ConditionSubClassId,16736,Variable
-NonExclusiveDeviationAlarmType_ConditionSubClassName,16737,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState,16738,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_Id,16739,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_Name,16740,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_Number,16741,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_EffectiveDisplayName,16742,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_TransitionTime,16743,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_EffectiveTransitionTime,16744,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_TrueState,16745,Variable
-NonExclusiveDeviationAlarmType_OutOfServiceState_FalseState,16746,Variable
-NonExclusiveDeviationAlarmType_SilenceState,16747,Variable
-NonExclusiveDeviationAlarmType_SilenceState_Id,16748,Variable
-NonExclusiveDeviationAlarmType_SilenceState_Name,16749,Variable
-NonExclusiveDeviationAlarmType_SilenceState_Number,16750,Variable
-NonExclusiveDeviationAlarmType_SilenceState_EffectiveDisplayName,16751,Variable
-NonExclusiveDeviationAlarmType_SilenceState_TransitionTime,16752,Variable
-NonExclusiveDeviationAlarmType_SilenceState_EffectiveTransitionTime,16753,Variable
-NonExclusiveDeviationAlarmType_SilenceState_TrueState,16754,Variable
-NonExclusiveDeviationAlarmType_SilenceState_FalseState,16755,Variable
-NonExclusiveDeviationAlarmType_AudibleEnabled,16756,Variable
-NonExclusiveDeviationAlarmType_AudibleSound,16757,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_MessageSettings,16758,Object
-PublishedDataSetType_DataSetClassId,16759,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_DataSetWriterId,16760,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_DataSetFieldContentMask,16761,Variable
-NonExclusiveDeviationAlarmType_OnDelay,16762,Variable
-NonExclusiveDeviationAlarmType_OffDelay,16763,Variable
-NonExclusiveDeviationAlarmType_FirstInGroupFlag,16764,Variable
-NonExclusiveDeviationAlarmType_FirstInGroup,16765,Object
-NonExclusiveDeviationAlarmType_AlarmGroup_Placeholder,16766,Object
-NonExclusiveDeviationAlarmType_ReAlarmTime,16767,Variable
-NonExclusiveDeviationAlarmType_ReAlarmRepeatCount,16768,Variable
-NonExclusiveDeviationAlarmType_Silence,16769,Method
-NonExclusiveDeviationAlarmType_Suppress,16770,Method
-PublishedDataItemsType_DataSetWriterName_Placeholder_KeyFrameCount,16771,Variable
-NonExclusiveDeviationAlarmType_BaseHighHighLimit,16772,Variable
-NonExclusiveDeviationAlarmType_BaseHighLimit,16773,Variable
-NonExclusiveDeviationAlarmType_BaseLowLimit,16774,Variable
-NonExclusiveDeviationAlarmType_BaseLowLowLimit,16775,Variable
-NonExclusiveDeviationAlarmType_BaseSetpointNode,16776,Variable
-ExclusiveDeviationAlarmType_ConditionSubClassId,16777,Variable
-ExclusiveDeviationAlarmType_ConditionSubClassName,16778,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState,16779,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_Id,16780,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_Name,16781,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_Number,16782,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_EffectiveDisplayName,16783,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_TransitionTime,16784,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_EffectiveTransitionTime,16785,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_TrueState,16786,Variable
-ExclusiveDeviationAlarmType_OutOfServiceState_FalseState,16787,Variable
-ExclusiveDeviationAlarmType_SilenceState,16788,Variable
-ExclusiveDeviationAlarmType_SilenceState_Id,16789,Variable
-ExclusiveDeviationAlarmType_SilenceState_Name,16790,Variable
-ExclusiveDeviationAlarmType_SilenceState_Number,16791,Variable
-ExclusiveDeviationAlarmType_SilenceState_EffectiveDisplayName,16792,Variable
-ExclusiveDeviationAlarmType_SilenceState_TransitionTime,16793,Variable
-ExclusiveDeviationAlarmType_SilenceState_EffectiveTransitionTime,16794,Variable
-ExclusiveDeviationAlarmType_SilenceState_TrueState,16795,Variable
-ExclusiveDeviationAlarmType_SilenceState_FalseState,16796,Variable
-ExclusiveDeviationAlarmType_AudibleEnabled,16797,Variable
-ExclusiveDeviationAlarmType_AudibleSound,16798,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_MessageSettings,16799,Object
-PublishedDataItemsType_DataSetClassId,16800,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_DataSetWriterId,16801,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_DataSetFieldContentMask,16802,Variable
-ExclusiveDeviationAlarmType_OnDelay,16803,Variable
-ExclusiveDeviationAlarmType_OffDelay,16804,Variable
-ExclusiveDeviationAlarmType_FirstInGroupFlag,16805,Variable
-ExclusiveDeviationAlarmType_FirstInGroup,16806,Object
-ExclusiveDeviationAlarmType_AlarmGroup_Placeholder,16807,Object
-ExclusiveDeviationAlarmType_ReAlarmTime,16808,Variable
-ExclusiveDeviationAlarmType_ReAlarmRepeatCount,16809,Variable
-ExclusiveDeviationAlarmType_Silence,16810,Method
-ExclusiveDeviationAlarmType_Suppress,16811,Method
-PublishedEventsType_DataSetWriterName_Placeholder_KeyFrameCount,16812,Variable
-ExclusiveDeviationAlarmType_BaseHighHighLimit,16813,Variable
-ExclusiveDeviationAlarmType_BaseHighLimit,16814,Variable
-ExclusiveDeviationAlarmType_BaseLowLimit,16815,Variable
-ExclusiveDeviationAlarmType_BaseLowLowLimit,16816,Variable
-ExclusiveDeviationAlarmType_BaseSetpointNode,16817,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionSubClassId,16818,Variable
-NonExclusiveRateOfChangeAlarmType_ConditionSubClassName,16819,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState,16820,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_Id,16821,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_Name,16822,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_Number,16823,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_EffectiveDisplayName,16824,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_TransitionTime,16825,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_EffectiveTransitionTime,16826,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_TrueState,16827,Variable
-NonExclusiveRateOfChangeAlarmType_OutOfServiceState_FalseState,16828,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState,16829,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_Id,16830,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_Name,16831,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_Number,16832,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_EffectiveDisplayName,16833,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_TransitionTime,16834,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_EffectiveTransitionTime,16835,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_TrueState,16836,Variable
-NonExclusiveRateOfChangeAlarmType_SilenceState_FalseState,16837,Variable
-NonExclusiveRateOfChangeAlarmType_AudibleEnabled,16838,Variable
-NonExclusiveRateOfChangeAlarmType_AudibleSound,16839,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_MessageSettings,16840,Object
-PublishedEventsType_DataSetClassId,16841,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedDataItemsTemplate,16842,Method
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedDataItemsTemplate_InputArguments,16843,Variable
-NonExclusiveRateOfChangeAlarmType_OnDelay,16844,Variable
-NonExclusiveRateOfChangeAlarmType_OffDelay,16845,Variable
-NonExclusiveRateOfChangeAlarmType_FirstInGroupFlag,16846,Variable
-NonExclusiveRateOfChangeAlarmType_FirstInGroup,16847,Object
-NonExclusiveRateOfChangeAlarmType_AlarmGroup_Placeholder,16848,Object
-NonExclusiveRateOfChangeAlarmType_ReAlarmTime,16849,Variable
-NonExclusiveRateOfChangeAlarmType_ReAlarmRepeatCount,16850,Variable
-NonExclusiveRateOfChangeAlarmType_Silence,16851,Method
-NonExclusiveRateOfChangeAlarmType_Suppress,16852,Method
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedDataItemsTemplate_OutputArguments,16853,Variable
-NonExclusiveRateOfChangeAlarmType_BaseHighHighLimit,16854,Variable
-NonExclusiveRateOfChangeAlarmType_BaseHighLimit,16855,Variable
-NonExclusiveRateOfChangeAlarmType_BaseLowLimit,16856,Variable
-NonExclusiveRateOfChangeAlarmType_BaseLowLowLimit,16857,Variable
-NonExclusiveRateOfChangeAlarmType_EngineeringUnits,16858,Variable
-ExclusiveRateOfChangeAlarmType_ConditionSubClassId,16859,Variable
-ExclusiveRateOfChangeAlarmType_ConditionSubClassName,16860,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState,16861,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_Id,16862,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_Name,16863,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_Number,16864,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_EffectiveDisplayName,16865,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_TransitionTime,16866,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_EffectiveTransitionTime,16867,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_TrueState,16868,Variable
-ExclusiveRateOfChangeAlarmType_OutOfServiceState_FalseState,16869,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState,16870,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_Id,16871,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_Name,16872,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_Number,16873,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_EffectiveDisplayName,16874,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_TransitionTime,16875,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_EffectiveTransitionTime,16876,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_TrueState,16877,Variable
-ExclusiveRateOfChangeAlarmType_SilenceState_FalseState,16878,Variable
-ExclusiveRateOfChangeAlarmType_AudibleEnabled,16879,Variable
-ExclusiveRateOfChangeAlarmType_AudibleSound,16880,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedEventsTemplate,16881,Method
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedEventsTemplate_InputArguments,16882,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddPublishedEventsTemplate_OutputArguments,16883,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddDataSetFolder,16884,Method
-ExclusiveRateOfChangeAlarmType_OnDelay,16885,Variable
-ExclusiveRateOfChangeAlarmType_OffDelay,16886,Variable
-ExclusiveRateOfChangeAlarmType_FirstInGroupFlag,16887,Variable
-ExclusiveRateOfChangeAlarmType_FirstInGroup,16888,Object
-ExclusiveRateOfChangeAlarmType_AlarmGroup_Placeholder,16889,Object
-ExclusiveRateOfChangeAlarmType_ReAlarmTime,16890,Variable
-ExclusiveRateOfChangeAlarmType_ReAlarmRepeatCount,16891,Variable
-ExclusiveRateOfChangeAlarmType_Silence,16892,Method
-ExclusiveRateOfChangeAlarmType_Suppress,16893,Method
-DataSetFolderType_DataSetFolderName_Placeholder_AddDataSetFolder_InputArguments,16894,Variable
-ExclusiveRateOfChangeAlarmType_BaseHighHighLimit,16895,Variable
-ExclusiveRateOfChangeAlarmType_BaseHighLimit,16896,Variable
-ExclusiveRateOfChangeAlarmType_BaseLowLimit,16897,Variable
-ExclusiveRateOfChangeAlarmType_BaseLowLowLimit,16898,Variable
-ExclusiveRateOfChangeAlarmType_EngineeringUnits,16899,Variable
-DiscreteAlarmType_ConditionSubClassId,16900,Variable
-DiscreteAlarmType_ConditionSubClassName,16901,Variable
-DiscreteAlarmType_OutOfServiceState,16902,Variable
-DiscreteAlarmType_OutOfServiceState_Id,16903,Variable
-DiscreteAlarmType_OutOfServiceState_Name,16904,Variable
-DiscreteAlarmType_OutOfServiceState_Number,16905,Variable
-DiscreteAlarmType_OutOfServiceState_EffectiveDisplayName,16906,Variable
-DiscreteAlarmType_OutOfServiceState_TransitionTime,16907,Variable
-DiscreteAlarmType_OutOfServiceState_EffectiveTransitionTime,16908,Variable
-DiscreteAlarmType_OutOfServiceState_TrueState,16909,Variable
-DiscreteAlarmType_OutOfServiceState_FalseState,16910,Variable
-DiscreteAlarmType_SilenceState,16911,Variable
-DiscreteAlarmType_SilenceState_Id,16912,Variable
-DiscreteAlarmType_SilenceState_Name,16913,Variable
-DiscreteAlarmType_SilenceState_Number,16914,Variable
-DiscreteAlarmType_SilenceState_EffectiveDisplayName,16915,Variable
-DiscreteAlarmType_SilenceState_TransitionTime,16916,Variable
-DiscreteAlarmType_SilenceState_EffectiveTransitionTime,16917,Variable
-DiscreteAlarmType_SilenceState_TrueState,16918,Variable
-DiscreteAlarmType_SilenceState_FalseState,16919,Variable
-DiscreteAlarmType_AudibleEnabled,16920,Variable
-DiscreteAlarmType_AudibleSound,16921,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_AddDataSetFolder_OutputArguments,16922,Variable
-DataSetFolderType_DataSetFolderName_Placeholder_RemoveDataSetFolder,16923,Method
-DataSetFolderType_DataSetFolderName_Placeholder_RemoveDataSetFolder_InputArguments,16924,Variable
-DataSetFolderType_PublishedDataSetName_Placeholder_DataSetClassId,16925,Variable
-DiscreteAlarmType_OnDelay,16926,Variable
-DiscreteAlarmType_OffDelay,16927,Variable
-DiscreteAlarmType_FirstInGroupFlag,16928,Variable
-DiscreteAlarmType_FirstInGroup,16929,Object
-DiscreteAlarmType_AlarmGroup_Placeholder,16930,Object
-DiscreteAlarmType_ReAlarmTime,16931,Variable
-DiscreteAlarmType_ReAlarmRepeatCount,16932,Variable
-DiscreteAlarmType_Silence,16933,Method
-DiscreteAlarmType_Suppress,16934,Method
-DataSetFolderType_AddPublishedDataItemsTemplate,16935,Method
-OffNormalAlarmType_ConditionSubClassId,16936,Variable
-OffNormalAlarmType_ConditionSubClassName,16937,Variable
-OffNormalAlarmType_OutOfServiceState,16938,Variable
-OffNormalAlarmType_OutOfServiceState_Id,16939,Variable
-OffNormalAlarmType_OutOfServiceState_Name,16940,Variable
-OffNormalAlarmType_OutOfServiceState_Number,16941,Variable
-OffNormalAlarmType_OutOfServiceState_EffectiveDisplayName,16942,Variable
-OffNormalAlarmType_OutOfServiceState_TransitionTime,16943,Variable
-OffNormalAlarmType_OutOfServiceState_EffectiveTransitionTime,16944,Variable
-OffNormalAlarmType_OutOfServiceState_TrueState,16945,Variable
-OffNormalAlarmType_OutOfServiceState_FalseState,16946,Variable
-OffNormalAlarmType_SilenceState,16947,Variable
-OffNormalAlarmType_SilenceState_Id,16948,Variable
-OffNormalAlarmType_SilenceState_Name,16949,Variable
-OffNormalAlarmType_SilenceState_Number,16950,Variable
-OffNormalAlarmType_SilenceState_EffectiveDisplayName,16951,Variable
-OffNormalAlarmType_SilenceState_TransitionTime,16952,Variable
-OffNormalAlarmType_SilenceState_EffectiveTransitionTime,16953,Variable
-OffNormalAlarmType_SilenceState_TrueState,16954,Variable
-OffNormalAlarmType_SilenceState_FalseState,16955,Variable
-OffNormalAlarmType_AudibleEnabled,16956,Variable
-OffNormalAlarmType_AudibleSound,16957,Variable
-DataSetFolderType_AddPublishedDataItemsTemplate_InputArguments,16958,Variable
-DataSetFolderType_AddPublishedDataItemsTemplate_OutputArguments,16959,Variable
-DataSetFolderType_AddPublishedEventsTemplate,16960,Method
-DataSetFolderType_AddPublishedEventsTemplate_InputArguments,16961,Variable
-OffNormalAlarmType_OnDelay,16962,Variable
-OffNormalAlarmType_OffDelay,16963,Variable
-OffNormalAlarmType_FirstInGroupFlag,16964,Variable
-OffNormalAlarmType_FirstInGroup,16965,Object
-OffNormalAlarmType_AlarmGroup_Placeholder,16966,Object
-OffNormalAlarmType_ReAlarmTime,16967,Variable
-OffNormalAlarmType_ReAlarmRepeatCount,16968,Variable
-OffNormalAlarmType_Silence,16969,Method
-OffNormalAlarmType_Suppress,16970,Method
-DataSetFolderType_AddPublishedEventsTemplate_OutputArguments,16971,Variable
-SystemOffNormalAlarmType_ConditionSubClassId,16972,Variable
-SystemOffNormalAlarmType_ConditionSubClassName,16973,Variable
-SystemOffNormalAlarmType_OutOfServiceState,16974,Variable
-SystemOffNormalAlarmType_OutOfServiceState_Id,16975,Variable
-SystemOffNormalAlarmType_OutOfServiceState_Name,16976,Variable
-SystemOffNormalAlarmType_OutOfServiceState_Number,16977,Variable
-SystemOffNormalAlarmType_OutOfServiceState_EffectiveDisplayName,16978,Variable
-SystemOffNormalAlarmType_OutOfServiceState_TransitionTime,16979,Variable
-SystemOffNormalAlarmType_OutOfServiceState_EffectiveTransitionTime,16980,Variable
-SystemOffNormalAlarmType_OutOfServiceState_TrueState,16981,Variable
-SystemOffNormalAlarmType_OutOfServiceState_FalseState,16982,Variable
-SystemOffNormalAlarmType_SilenceState,16983,Variable
-SystemOffNormalAlarmType_SilenceState_Id,16984,Variable
-SystemOffNormalAlarmType_SilenceState_Name,16985,Variable
-SystemOffNormalAlarmType_SilenceState_Number,16986,Variable
-SystemOffNormalAlarmType_SilenceState_EffectiveDisplayName,16987,Variable
-SystemOffNormalAlarmType_SilenceState_TransitionTime,16988,Variable
-SystemOffNormalAlarmType_SilenceState_EffectiveTransitionTime,16989,Variable
-SystemOffNormalAlarmType_SilenceState_TrueState,16990,Variable
-SystemOffNormalAlarmType_SilenceState_FalseState,16991,Variable
-SystemOffNormalAlarmType_AudibleEnabled,16992,Variable
-SystemOffNormalAlarmType_AudibleSound,16993,Variable
-DataSetFolderType_AddDataSetFolder,16994,Method
-DataSetFolderType_AddDataSetFolder_InputArguments,16995,Variable
-DataSetFolderType_AddDataSetFolder_OutputArguments,16996,Variable
-DataSetFolderType_RemoveDataSetFolder,16997,Method
-SystemOffNormalAlarmType_OnDelay,16998,Variable
-SystemOffNormalAlarmType_OffDelay,16999,Variable
-SystemOffNormalAlarmType_FirstInGroupFlag,17000,Variable
-SystemOffNormalAlarmType_FirstInGroup,17001,Object
-SystemOffNormalAlarmType_AlarmGroup_Placeholder,17002,Object
-SystemOffNormalAlarmType_ReAlarmTime,17003,Variable
-SystemOffNormalAlarmType_ReAlarmRepeatCount,17004,Variable
-SystemOffNormalAlarmType_Silence,17005,Method
-SystemOffNormalAlarmType_Suppress,17006,Method
-DataSetFolderType_RemoveDataSetFolder_InputArguments,17007,Variable
-TripAlarmType_ConditionSubClassId,17008,Variable
-TripAlarmType_ConditionSubClassName,17009,Variable
-TripAlarmType_OutOfServiceState,17010,Variable
-TripAlarmType_OutOfServiceState_Id,17011,Variable
-TripAlarmType_OutOfServiceState_Name,17012,Variable
-TripAlarmType_OutOfServiceState_Number,17013,Variable
-TripAlarmType_OutOfServiceState_EffectiveDisplayName,17014,Variable
-TripAlarmType_OutOfServiceState_TransitionTime,17015,Variable
-TripAlarmType_OutOfServiceState_EffectiveTransitionTime,17016,Variable
-TripAlarmType_OutOfServiceState_TrueState,17017,Variable
-TripAlarmType_OutOfServiceState_FalseState,17018,Variable
-TripAlarmType_SilenceState,17019,Variable
-TripAlarmType_SilenceState_Id,17020,Variable
-TripAlarmType_SilenceState_Name,17021,Variable
-TripAlarmType_SilenceState_Number,17022,Variable
-TripAlarmType_SilenceState_EffectiveDisplayName,17023,Variable
-TripAlarmType_SilenceState_TransitionTime,17024,Variable
-TripAlarmType_SilenceState_EffectiveTransitionTime,17025,Variable
-TripAlarmType_SilenceState_TrueState,17026,Variable
-TripAlarmType_SilenceState_FalseState,17027,Variable
-TripAlarmType_AudibleEnabled,17028,Variable
-TripAlarmType_AudibleSound,17029,Variable
-AddPublishedDataItemsTemplateMethodType,17030,Method
-AddPublishedDataItemsTemplateMethodType_InputArguments,17031,Variable
-AddPublishedDataItemsTemplateMethodType_OutputArguments,17032,Variable
-AddPublishedEventsTemplateMethodType,17033,Method
-TripAlarmType_OnDelay,17034,Variable
-TripAlarmType_OffDelay,17035,Variable
-TripAlarmType_FirstInGroupFlag,17036,Variable
-TripAlarmType_FirstInGroup,17037,Object
-TripAlarmType_AlarmGroup_Placeholder,17038,Object
-TripAlarmType_ReAlarmTime,17039,Variable
-TripAlarmType_ReAlarmRepeatCount,17040,Variable
-TripAlarmType_Silence,17041,Method
-TripAlarmType_Suppress,17042,Method
-AddPublishedEventsTemplateMethodType_InputArguments,17043,Variable
-CertificateExpirationAlarmType_ConditionSubClassId,17044,Variable
-CertificateExpirationAlarmType_ConditionSubClassName,17045,Variable
-CertificateExpirationAlarmType_OutOfServiceState,17046,Variable
-CertificateExpirationAlarmType_OutOfServiceState_Id,17047,Variable
-CertificateExpirationAlarmType_OutOfServiceState_Name,17048,Variable
-CertificateExpirationAlarmType_OutOfServiceState_Number,17049,Variable
-CertificateExpirationAlarmType_OutOfServiceState_EffectiveDisplayName,17050,Variable
-CertificateExpirationAlarmType_OutOfServiceState_TransitionTime,17051,Variable
-CertificateExpirationAlarmType_OutOfServiceState_EffectiveTransitionTime,17052,Variable
-CertificateExpirationAlarmType_OutOfServiceState_TrueState,17053,Variable
-CertificateExpirationAlarmType_OutOfServiceState_FalseState,17054,Variable
-CertificateExpirationAlarmType_SilenceState,17055,Variable
-CertificateExpirationAlarmType_SilenceState_Id,17056,Variable
-CertificateExpirationAlarmType_SilenceState_Name,17057,Variable
-CertificateExpirationAlarmType_SilenceState_Number,17058,Variable
-CertificateExpirationAlarmType_SilenceState_EffectiveDisplayName,17059,Variable
-CertificateExpirationAlarmType_SilenceState_TransitionTime,17060,Variable
-CertificateExpirationAlarmType_SilenceState_EffectiveTransitionTime,17061,Variable
-CertificateExpirationAlarmType_SilenceState_TrueState,17062,Variable
-CertificateExpirationAlarmType_SilenceState_FalseState,17063,Variable
-CertificateExpirationAlarmType_AudibleEnabled,17064,Variable
-CertificateExpirationAlarmType_AudibleSound,17065,Variable
-AddPublishedEventsTemplateMethodType_OutputArguments,17066,Variable
-AddDataSetFolderMethodType,17067,Method
-AddDataSetFolderMethodType_InputArguments,17068,Variable
-AddDataSetFolderMethodType_OutputArguments,17069,Variable
-CertificateExpirationAlarmType_OnDelay,17070,Variable
-CertificateExpirationAlarmType_OffDelay,17071,Variable
-CertificateExpirationAlarmType_FirstInGroupFlag,17072,Variable
-CertificateExpirationAlarmType_FirstInGroup,17073,Object
-CertificateExpirationAlarmType_AlarmGroup_Placeholder,17074,Object
-CertificateExpirationAlarmType_ReAlarmTime,17075,Variable
-CertificateExpirationAlarmType_ReAlarmRepeatCount,17076,Variable
-CertificateExpirationAlarmType_Silence,17077,Method
-CertificateExpirationAlarmType_Suppress,17078,Method
-RemoveDataSetFolderMethodType,17079,Method
-DiscrepancyAlarmType,17080,ObjectType
-DiscrepancyAlarmType_EventId,17081,Variable
-DiscrepancyAlarmType_EventType,17082,Variable
-DiscrepancyAlarmType_SourceNode,17083,Variable
-DiscrepancyAlarmType_SourceName,17084,Variable
-DiscrepancyAlarmType_Time,17085,Variable
-DiscrepancyAlarmType_ReceiveTime,17086,Variable
-DiscrepancyAlarmType_LocalTime,17087,Variable
-DiscrepancyAlarmType_Message,17088,Variable
-DiscrepancyAlarmType_Severity,17089,Variable
-DiscrepancyAlarmType_ConditionClassId,17090,Variable
-DiscrepancyAlarmType_ConditionClassName,17091,Variable
-DiscrepancyAlarmType_ConditionSubClassId,17092,Variable
-DiscrepancyAlarmType_ConditionSubClassName,17093,Variable
-DiscrepancyAlarmType_ConditionName,17094,Variable
-DiscrepancyAlarmType_BranchId,17095,Variable
-DiscrepancyAlarmType_Retain,17096,Variable
-DiscrepancyAlarmType_EnabledState,17097,Variable
-DiscrepancyAlarmType_EnabledState_Id,17098,Variable
-DiscrepancyAlarmType_EnabledState_Name,17099,Variable
-DiscrepancyAlarmType_EnabledState_Number,17100,Variable
-DiscrepancyAlarmType_EnabledState_EffectiveDisplayName,17101,Variable
-DiscrepancyAlarmType_EnabledState_TransitionTime,17102,Variable
-DiscrepancyAlarmType_EnabledState_EffectiveTransitionTime,17103,Variable
-DiscrepancyAlarmType_EnabledState_TrueState,17104,Variable
-DiscrepancyAlarmType_EnabledState_FalseState,17105,Variable
-DiscrepancyAlarmType_Quality,17106,Variable
-DiscrepancyAlarmType_Quality_SourceTimestamp,17107,Variable
-DiscrepancyAlarmType_LastSeverity,17108,Variable
-DiscrepancyAlarmType_LastSeverity_SourceTimestamp,17109,Variable
-DiscrepancyAlarmType_Comment,17110,Variable
-DiscrepancyAlarmType_Comment_SourceTimestamp,17111,Variable
-DiscrepancyAlarmType_ClientUserId,17112,Variable
-DiscrepancyAlarmType_Disable,17113,Method
-DiscrepancyAlarmType_Enable,17114,Method
-DiscrepancyAlarmType_AddComment,17115,Method
-DiscrepancyAlarmType_AddComment_InputArguments,17116,Variable
-DiscrepancyAlarmType_ConditionRefresh,17117,Method
-DiscrepancyAlarmType_ConditionRefresh_InputArguments,17118,Variable
-DiscrepancyAlarmType_ConditionRefresh2,17119,Method
-DiscrepancyAlarmType_ConditionRefresh2_InputArguments,17120,Variable
-DiscrepancyAlarmType_AckedState,17121,Variable
-DiscrepancyAlarmType_AckedState_Id,17122,Variable
-DiscrepancyAlarmType_AckedState_Name,17123,Variable
-DiscrepancyAlarmType_AckedState_Number,17124,Variable
-DiscrepancyAlarmType_AckedState_EffectiveDisplayName,17125,Variable
-DiscrepancyAlarmType_AckedState_TransitionTime,17126,Variable
-DiscrepancyAlarmType_AckedState_EffectiveTransitionTime,17127,Variable
-DiscrepancyAlarmType_AckedState_TrueState,17128,Variable
-DiscrepancyAlarmType_AckedState_FalseState,17129,Variable
-DiscrepancyAlarmType_ConfirmedState,17130,Variable
-DiscrepancyAlarmType_ConfirmedState_Id,17131,Variable
-DiscrepancyAlarmType_ConfirmedState_Name,17132,Variable
-DiscrepancyAlarmType_ConfirmedState_Number,17133,Variable
-DiscrepancyAlarmType_ConfirmedState_EffectiveDisplayName,17134,Variable
-DiscrepancyAlarmType_ConfirmedState_TransitionTime,17135,Variable
-DiscrepancyAlarmType_ConfirmedState_EffectiveTransitionTime,17136,Variable
-DiscrepancyAlarmType_ConfirmedState_TrueState,17137,Variable
-DiscrepancyAlarmType_ConfirmedState_FalseState,17138,Variable
-DiscrepancyAlarmType_Acknowledge,17139,Method
-DiscrepancyAlarmType_Acknowledge_InputArguments,17140,Variable
-DiscrepancyAlarmType_Confirm,17141,Method
-DiscrepancyAlarmType_Confirm_InputArguments,17142,Variable
-DiscrepancyAlarmType_ActiveState,17143,Variable
-DiscrepancyAlarmType_ActiveState_Id,17144,Variable
-DiscrepancyAlarmType_ActiveState_Name,17145,Variable
-DiscrepancyAlarmType_ActiveState_Number,17146,Variable
-DiscrepancyAlarmType_ActiveState_EffectiveDisplayName,17147,Variable
-DiscrepancyAlarmType_ActiveState_TransitionTime,17148,Variable
-DiscrepancyAlarmType_ActiveState_EffectiveTransitionTime,17149,Variable
-DiscrepancyAlarmType_ActiveState_TrueState,17150,Variable
-DiscrepancyAlarmType_ActiveState_FalseState,17151,Variable
-DiscrepancyAlarmType_InputNode,17152,Variable
-DiscrepancyAlarmType_SuppressedState,17153,Variable
-DiscrepancyAlarmType_SuppressedState_Id,17154,Variable
-DiscrepancyAlarmType_SuppressedState_Name,17155,Variable
-DiscrepancyAlarmType_SuppressedState_Number,17156,Variable
-DiscrepancyAlarmType_SuppressedState_EffectiveDisplayName,17157,Variable
-DiscrepancyAlarmType_SuppressedState_TransitionTime,17158,Variable
-DiscrepancyAlarmType_SuppressedState_EffectiveTransitionTime,17159,Variable
-DiscrepancyAlarmType_SuppressedState_TrueState,17160,Variable
-DiscrepancyAlarmType_SuppressedState_FalseState,17161,Variable
-DiscrepancyAlarmType_OutOfServiceState,17162,Variable
-DiscrepancyAlarmType_OutOfServiceState_Id,17163,Variable
-DiscrepancyAlarmType_OutOfServiceState_Name,17164,Variable
-DiscrepancyAlarmType_OutOfServiceState_Number,17165,Variable
-DiscrepancyAlarmType_OutOfServiceState_EffectiveDisplayName,17166,Variable
-DiscrepancyAlarmType_OutOfServiceState_TransitionTime,17167,Variable
-DiscrepancyAlarmType_OutOfServiceState_EffectiveTransitionTime,17168,Variable
-DiscrepancyAlarmType_OutOfServiceState_TrueState,17169,Variable
-DiscrepancyAlarmType_OutOfServiceState_FalseState,17170,Variable
-DiscrepancyAlarmType_SilenceState,17171,Variable
-DiscrepancyAlarmType_SilenceState_Id,17172,Variable
-DiscrepancyAlarmType_SilenceState_Name,17173,Variable
-DiscrepancyAlarmType_SilenceState_Number,17174,Variable
-DiscrepancyAlarmType_SilenceState_EffectiveDisplayName,17175,Variable
-DiscrepancyAlarmType_SilenceState_TransitionTime,17176,Variable
-DiscrepancyAlarmType_SilenceState_EffectiveTransitionTime,17177,Variable
-DiscrepancyAlarmType_SilenceState_TrueState,17178,Variable
-DiscrepancyAlarmType_SilenceState_FalseState,17179,Variable
-DiscrepancyAlarmType_ShelvingState,17180,Object
-DiscrepancyAlarmType_ShelvingState_CurrentState,17181,Variable
-DiscrepancyAlarmType_ShelvingState_CurrentState_Id,17182,Variable
-DiscrepancyAlarmType_ShelvingState_CurrentState_Name,17183,Variable
-DiscrepancyAlarmType_ShelvingState_CurrentState_Number,17184,Variable
-DiscrepancyAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,17185,Variable
-DiscrepancyAlarmType_ShelvingState_LastTransition,17186,Variable
-DiscrepancyAlarmType_ShelvingState_LastTransition_Id,17187,Variable
-DiscrepancyAlarmType_ShelvingState_LastTransition_Name,17188,Variable
-DiscrepancyAlarmType_ShelvingState_LastTransition_Number,17189,Variable
-DiscrepancyAlarmType_ShelvingState_LastTransition_TransitionTime,17190,Variable
-DiscrepancyAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,17191,Variable
-DiscrepancyAlarmType_ShelvingState_UnshelveTime,17192,Variable
-DiscrepancyAlarmType_ShelvingState_Unshelve,17193,Method
-DiscrepancyAlarmType_ShelvingState_OneShotShelve,17194,Method
-DiscrepancyAlarmType_ShelvingState_TimedShelve,17195,Method
-DiscrepancyAlarmType_ShelvingState_TimedShelve_InputArguments,17196,Variable
-DiscrepancyAlarmType_SuppressedOrShelved,17197,Variable
-DiscrepancyAlarmType_MaxTimeShelved,17198,Variable
-DiscrepancyAlarmType_AudibleEnabled,17199,Variable
-DiscrepancyAlarmType_AudibleSound,17200,Variable
-RemoveDataSetFolderMethodType_InputArguments,17201,Variable
-PubSubConnectionType_Address_NetworkInterface,17202,Variable
-PubSubConnectionType_TransportSettings,17203,Object
-PubSubConnectionType_WriterGroupName_Placeholder_MaxNetworkMessageSize,17204,Variable
-DiscrepancyAlarmType_OnDelay,17205,Variable
-DiscrepancyAlarmType_OffDelay,17206,Variable
-DiscrepancyAlarmType_FirstInGroupFlag,17207,Variable
-DiscrepancyAlarmType_FirstInGroup,17208,Object
-DiscrepancyAlarmType_AlarmGroup_Placeholder,17209,Object
-DiscrepancyAlarmType_ReAlarmTime,17210,Variable
-DiscrepancyAlarmType_ReAlarmRepeatCount,17211,Variable
-DiscrepancyAlarmType_Silence,17212,Method
-DiscrepancyAlarmType_Suppress,17213,Method
-PubSubConnectionType_WriterGroupName_Placeholder_WriterGroupId,17214,Variable
-DiscrepancyAlarmType_TargetValueNode,17215,Variable
-DiscrepancyAlarmType_ExpectedTime,17216,Variable
-DiscrepancyAlarmType_Tolerance,17217,Variable
-SafetyConditionClassType,17218,ObjectType
-HighlyManagedAlarmConditionClassType,17219,ObjectType
-TrainingConditionClassType,17220,ObjectType
-TestingConditionSubClassType,17221,ObjectType
-AuditConditionCommentEventType_ConditionEventId,17222,Variable
-AuditConditionAcknowledgeEventType_ConditionEventId,17223,Variable
-AuditConditionConfirmEventType_ConditionEventId,17224,Variable
-AuditConditionSuppressionEventType,17225,ObjectType
-AuditConditionSuppressionEventType_EventId,17226,Variable
-AuditConditionSuppressionEventType_EventType,17227,Variable
-AuditConditionSuppressionEventType_SourceNode,17228,Variable
-AuditConditionSuppressionEventType_SourceName,17229,Variable
-AuditConditionSuppressionEventType_Time,17230,Variable
-AuditConditionSuppressionEventType_ReceiveTime,17231,Variable
-AuditConditionSuppressionEventType_LocalTime,17232,Variable
-AuditConditionSuppressionEventType_Message,17233,Variable
-AuditConditionSuppressionEventType_Severity,17234,Variable
-AuditConditionSuppressionEventType_ActionTimeStamp,17235,Variable
-AuditConditionSuppressionEventType_Status,17236,Variable
-AuditConditionSuppressionEventType_ServerId,17237,Variable
-AuditConditionSuppressionEventType_ClientAuditEntryId,17238,Variable
-AuditConditionSuppressionEventType_ClientUserId,17239,Variable
-AuditConditionSuppressionEventType_MethodId,17240,Variable
-AuditConditionSuppressionEventType_InputArguments,17241,Variable
-AuditConditionSilenceEventType,17242,ObjectType
-AuditConditionSilenceEventType_EventId,17243,Variable
-AuditConditionSilenceEventType_EventType,17244,Variable
-AuditConditionSilenceEventType_SourceNode,17245,Variable
-AuditConditionSilenceEventType_SourceName,17246,Variable
-AuditConditionSilenceEventType_Time,17247,Variable
-AuditConditionSilenceEventType_ReceiveTime,17248,Variable
-AuditConditionSilenceEventType_LocalTime,17249,Variable
-AuditConditionSilenceEventType_Message,17250,Variable
-AuditConditionSilenceEventType_Severity,17251,Variable
-AuditConditionSilenceEventType_ActionTimeStamp,17252,Variable
-AuditConditionSilenceEventType_Status,17253,Variable
-AuditConditionSilenceEventType_ServerId,17254,Variable
-AuditConditionSilenceEventType_ClientAuditEntryId,17255,Variable
-AuditConditionSilenceEventType_ClientUserId,17256,Variable
-AuditConditionSilenceEventType_MethodId,17257,Variable
-AuditConditionSilenceEventType_InputArguments,17258,Variable
-AuditConditionOutOfServiceEventType,17259,ObjectType
-AuditConditionOutOfServiceEventType_EventId,17260,Variable
-AuditConditionOutOfServiceEventType_EventType,17261,Variable
-AuditConditionOutOfServiceEventType_SourceNode,17262,Variable
-AuditConditionOutOfServiceEventType_SourceName,17263,Variable
-AuditConditionOutOfServiceEventType_Time,17264,Variable
-AuditConditionOutOfServiceEventType_ReceiveTime,17265,Variable
-AuditConditionOutOfServiceEventType_LocalTime,17266,Variable
-AuditConditionOutOfServiceEventType_Message,17267,Variable
-AuditConditionOutOfServiceEventType_Severity,17268,Variable
-AuditConditionOutOfServiceEventType_ActionTimeStamp,17269,Variable
-AuditConditionOutOfServiceEventType_Status,17270,Variable
-AuditConditionOutOfServiceEventType_ServerId,17271,Variable
-AuditConditionOutOfServiceEventType_ClientAuditEntryId,17272,Variable
-AuditConditionOutOfServiceEventType_ClientUserId,17273,Variable
-AuditConditionOutOfServiceEventType_MethodId,17274,Variable
-AuditConditionOutOfServiceEventType_InputArguments,17275,Variable
-HasEffectDisable,17276,ReferenceType
-AlarmRateVariableType,17277,VariableType
-AlarmRateVariableType_Rate,17278,Variable
-AlarmMetricsType,17279,ObjectType
-AlarmMetricsType_AlarmCount,17280,Variable
-AlarmMetricsType_MaximumActiveState,17281,Variable
-AlarmMetricsType_MaximumUnAck,17282,Variable
-AlarmMetricsType_MaximumReAlarmCount,17283,Variable
-AlarmMetricsType_CurrentAlarmRate,17284,Variable
-AlarmMetricsType_CurrentAlarmRate_Rate,17285,Variable
-AlarmMetricsType_MaximumAlarmRate,17286,Variable
-AlarmMetricsType_MaximumAlarmRate_Rate,17287,Variable
-AlarmMetricsType_AverageAlarmRate,17288,Variable
-AlarmMetricsType_AverageAlarmRate_Rate,17289,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_TransportSettings,17290,Object
-PubSubConnectionType_WriterGroupName_Placeholder_MessageSettings,17291,Object
-PublishSubscribeType_ConnectionName_Placeholder_TransportProfileUri,17292,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_AddDataSetWriter,17293,Method
-PubSubConnectionType_WriterGroupName_Placeholder_AddDataSetWriter_InputArguments,17294,Variable
-PublishSubscribeType_ConnectionName_Placeholder_TransportProfileUri_RestrictToList,17295,Variable
-PublishSubscribeType_SetSecurityKeys,17296,Method
-PublishSubscribeType_SetSecurityKeys_InputArguments,17297,Variable
-SetSecurityKeysMethodType,17298,Method
-SetSecurityKeysMethodType_InputArguments,17299,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,17300,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_AddDataSetWriter_OutputArguments,17301,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_MaxNetworkMessageSize,17302,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,17303,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent,17304,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,17305,Variable
-PubSubConnectionType_TransportProfileUri,17306,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_TransportSettings,17307,Object
-PubSubConnectionType_ReaderGroupName_Placeholder_MessageSettings,17308,Object
-PubSubConnectionType_TransportProfileUri_RestrictToList,17309,Variable
-PubSubConnectionType_WriterGroupName_Placeholder,17310,Object
-PubSubConnectionType_WriterGroupName_Placeholder_SecurityMode,17311,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_SecurityGroupId,17312,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_SecurityKeyServices,17313,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Status,17314,Object
-PubSubConnectionType_WriterGroupName_Placeholder_Status_State,17315,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Status_Enable,17316,Method
-PubSubConnectionType_WriterGroupName_Placeholder_Status_Disable,17317,Method
-PubSubConnectionType_WriterGroupName_Placeholder_PublishingInterval,17318,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_KeepAliveTime,17319,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,17320,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Priority,17321,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_LocaleIds,17322,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_RemoveDataSetWriter,17323,Method
-PubSubConnectionType_WriterGroupName_Placeholder_RemoveDataSetWriter_InputArguments,17324,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder,17325,Object
-PubSubConnectionType_ReaderGroupName_Placeholder_SecurityMode,17326,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_SecurityGroupId,17327,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_SecurityKeyServices,17328,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Status,17329,Object
-PubSubConnectionType_ReaderGroupName_Placeholder_Status_State,17330,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Status_Enable,17331,Method
-PubSubConnectionType_ReaderGroupName_Placeholder_Status_Disable,17332,Method
-PubSubConnectionType_ReaderGroupName_Placeholder_RemoveDataSetReader,17333,Method
-PubSubConnectionType_ReaderGroupName_Placeholder_RemoveDataSetReader_InputArguments,17334,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,17335,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,17336,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError,17337,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,17338,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,17339,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,17340,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,17341,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent,17342,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,17343,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,17344,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,17345,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,17346,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,17347,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,17348,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,17349,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,17350,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,17351,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_LiveValues,17352,Object
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_LiveValues_ResolvedAddress,17353,Variable
-PublishSubscribe_ConnectionName_Placeholder_Diagnostics_LiveValues_ResolvedAddress_DiagnosticsLevel,17354,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_AddDataSetReader,17355,Method
-PublishSubscribe_ConnectionName_Placeholder_AddWriterGroup,17356,Method
-PublishSubscribe_ConnectionName_Placeholder_AddWriterGroup_InputArguments,17357,Variable
-PublishSubscribe_ConnectionName_Placeholder_AddWriterGroup_OutputArguments,17358,Variable
-PublishSubscribe_ConnectionName_Placeholder_AddReaderGroup,17359,Method
-PublishSubscribe_ConnectionName_Placeholder_AddReaderGroup_InputArguments,17360,Variable
-PublishSubscribe_ConnectionName_Placeholder_AddReaderGroup_OutputArguments,17361,Variable
-PublishSubscribe_ConnectionName_Placeholder_RemoveGroup,17362,Method
-PublishSubscribe_ConnectionName_Placeholder_RemoveGroup_InputArguments,17363,Variable
-PublishSubscribe_SetSecurityKeys,17364,Method
-PublishSubscribe_SetSecurityKeys_InputArguments,17365,Variable
-PublishSubscribe_AddConnection,17366,Method
-PublishSubscribe_AddConnection_InputArguments,17367,Variable
-PublishSubscribe_AddConnection_OutputArguments,17368,Variable
-PublishSubscribe_RemoveConnection,17369,Method
-PublishSubscribe_RemoveConnection_InputArguments,17370,Variable
-PublishSubscribe_PublishedDataSets,17371,Object
-PublishSubscribe_PublishedDataSets_AddPublishedDataItems,17372,Method
-PublishSubscribe_PublishedDataSets_AddPublishedDataItems_InputArguments,17373,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedDataItems_OutputArguments,17374,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedEvents,17375,Method
-PublishSubscribe_PublishedDataSets_AddPublishedEvents_InputArguments,17376,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedEvents_OutputArguments,17377,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedDataItemsTemplate,17378,Method
-PublishSubscribe_PublishedDataSets_AddPublishedDataItemsTemplate_InputArguments,17379,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedDataItemsTemplate_OutputArguments,17380,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedEventsTemplate,17381,Method
-PublishSubscribe_PublishedDataSets_AddPublishedEventsTemplate_InputArguments,17382,Variable
-PublishSubscribe_PublishedDataSets_AddPublishedEventsTemplate_OutputArguments,17383,Variable
-PublishSubscribe_PublishedDataSets_RemovePublishedDataSet,17384,Method
-PublishSubscribe_PublishedDataSets_RemovePublishedDataSet_InputArguments,17385,Variable
-DataSetReaderType_CreateTargetVariables,17386,Method
-DataSetReaderType_CreateTargetVariables_InputArguments,17387,Variable
-DataSetReaderType_CreateTargetVariables_OutputArguments,17388,Variable
-DataSetReaderType_CreateDataSetMirror,17389,Method
-DataSetReaderType_CreateDataSetMirror_InputArguments,17390,Variable
-DataSetReaderType_CreateDataSetMirror_OutputArguments,17391,Variable
-DataSetReaderTypeCreateTargetVariablesMethodType,17392,Method
-DataSetReaderTypeCreateTargetVariablesMethodType_InputArguments,17393,Variable
-DataSetReaderTypeCreateTargetVariablesMethodType_OutputArguments,17394,Variable
-DataSetReaderTypeCreateDataSetMirrorMethodType,17395,Method
-DataSetReaderTypeCreateDataSetMirrorMethodType_InputArguments,17396,Variable
-DataSetReaderTypeCreateDataSetMirrorMethodType_OutputArguments,17397,Variable
-PublishSubscribe_PublishedDataSets_AddDataSetFolder,17398,Method
-PubSubConnectionType_ReaderGroupName_Placeholder_AddDataSetReader_InputArguments,17399,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_AddDataSetReader_OutputArguments,17400,Variable
-PublishSubscribe_PublishedDataSets_AddDataSetFolder_InputArguments,17401,Variable
-PublishSubscribe_PublishedDataSets_AddDataSetFolder_OutputArguments,17402,Variable
-PublishSubscribe_PublishedDataSets_RemoveDataSetFolder,17403,Method
-PublishSubscribe_PublishedDataSets_RemoveDataSetFolder_InputArguments,17404,Variable
-PublishSubscribe_Status,17405,Object
-PublishSubscribe_Status_State,17406,Variable
-PublishSubscribe_Status_Enable,17407,Method
-PublishSubscribe_Status_Disable,17408,Method
-PublishSubscribe_Diagnostics,17409,Object
-PublishSubscribe_Diagnostics_DiagnosticsLevel,17410,Variable
-PublishSubscribe_Diagnostics_TotalInformation,17411,Variable
-PublishSubscribe_Diagnostics_TotalInformation_Active,17412,Variable
-PublishSubscribe_Diagnostics_TotalInformation_Classification,17413,Variable
-PublishSubscribe_Diagnostics_TotalInformation_DiagnosticsLevel,17414,Variable
-PublishSubscribe_Diagnostics_TotalInformation_TimeFirstChange,17415,Variable
-PublishSubscribe_Diagnostics_TotalError,17416,Variable
-PublishSubscribe_Diagnostics_TotalError_Active,17417,Variable
-PublishSubscribe_Diagnostics_TotalError_Classification,17418,Variable
-PublishSubscribe_Diagnostics_TotalError_DiagnosticsLevel,17419,Variable
-PublishSubscribe_Diagnostics_TotalError_TimeFirstChange,17420,Variable
-PublishSubscribe_Diagnostics_Reset,17421,Method
-PublishSubscribe_Diagnostics_SubError,17422,Variable
-PublishSubscribe_Diagnostics_Counters,17423,Object
-PublishSubscribe_Diagnostics_Counters_StateError,17424,Variable
-PublishSubscribe_Diagnostics_Counters_StateError_Active,17425,Variable
-PublishSubscribe_Diagnostics_Counters_StateError_Classification,17426,Variable
-PubSubConnectionType_AddWriterGroup,17427,Method
-PubSubConnectionType_AddWriterGroup_InputArguments,17428,Variable
-PublishSubscribe_Diagnostics_Counters_StateError_DiagnosticsLevel,17429,Variable
-PublishSubscribe_Diagnostics_Counters_StateError_TimeFirstChange,17430,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByMethod,17431,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByMethod_Active,17432,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByMethod_Classification,17433,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,17434,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,17435,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByParent,17436,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByParent_Active,17437,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByParent_Classification,17438,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,17439,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,17440,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalFromError,17441,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalFromError_Active,17442,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalFromError_Classification,17443,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,17444,Variable
-PublishSubscribe_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,17445,Variable
-PublishSubscribe_Diagnostics_Counters_StatePausedByParent,17446,Variable
-PublishSubscribe_Diagnostics_Counters_StatePausedByParent_Active,17447,Variable
-PublishSubscribe_Diagnostics_Counters_StatePausedByParent_Classification,17448,Variable
-PublishSubscribe_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,17449,Variable
-PublishSubscribe_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,17450,Variable
-PublishSubscribe_Diagnostics_Counters_StateDisabledByMethod,17451,Variable
-PublishSubscribe_Diagnostics_Counters_StateDisabledByMethod_Active,17452,Variable
-PublishSubscribe_Diagnostics_Counters_StateDisabledByMethod_Classification,17453,Variable
-PublishSubscribe_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,17454,Variable
-PublishSubscribe_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,17455,Variable
-PubSubConnectionType_AddWriterGroup_OutputArguments,17456,Variable
-PublishSubscribe_Diagnostics_LiveValues,17457,Object
-PublishSubscribe_Diagnostics_LiveValues_ConfiguredDataSetWriters,17458,Variable
-PublishSubscribe_Diagnostics_LiveValues_ConfiguredDataSetWriters_DiagnosticsLevel,17459,Variable
-PublishSubscribe_Diagnostics_LiveValues_ConfiguredDataSetReaders,17460,Variable
-PublishSubscribe_Diagnostics_LiveValues_ConfiguredDataSetReaders_DiagnosticsLevel,17461,Variable
-PublishSubscribe_Diagnostics_LiveValues_OperationalDataSetWriters,17462,Variable
-PublishSubscribe_Diagnostics_LiveValues_OperationalDataSetWriters_DiagnosticsLevel,17463,Variable
-PublishSubscribe_Diagnostics_LiveValues_OperationalDataSetReaders,17464,Variable
-PubSubConnectionType_AddReaderGroup,17465,Method
-PublishSubscribe_Diagnostics_LiveValues_OperationalDataSetReaders_DiagnosticsLevel,17466,Variable
-DatagramConnectionTransportDataType,17467,DataType
-DatagramConnectionTransportDataType_Encoding_DefaultBinary,17468,Object
-OpcUa_BinarySchema_DatagramConnectionTransportDataType,17469,Variable
-OpcUa_BinarySchema_DatagramConnectionTransportDataType_DataTypeVersion,17470,Variable
-OpcUa_BinarySchema_DatagramConnectionTransportDataType_DictionaryFragment,17471,Variable
-DatagramConnectionTransportDataType_Encoding_DefaultXml,17472,Object
-OpcUa_XmlSchema_DatagramConnectionTransportDataType,17473,Variable
-OpcUa_XmlSchema_DatagramConnectionTransportDataType_DataTypeVersion,17474,Variable
-OpcUa_XmlSchema_DatagramConnectionTransportDataType_DictionaryFragment,17475,Variable
-DatagramConnectionTransportDataType_Encoding_DefaultJson,17476,Object
-UadpDataSetReaderMessageType_DataSetOffset,17477,Variable
-PublishSubscribeType_ConnectionName_Placeholder_ConnectionProperties,17478,Variable
-PublishSubscribeType_SupportedTransportProfiles,17479,Variable
-PublishSubscribe_ConnectionName_Placeholder_ConnectionProperties,17480,Variable
-PublishSubscribe_SupportedTransportProfiles,17481,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_DataSetWriterProperties,17482,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_DataSetWriterProperties,17483,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_DataSetWriterProperties,17484,Variable
-PubSubConnectionType_ConnectionProperties,17485,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_GroupProperties,17486,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_GroupProperties,17487,Variable
-PubSubGroupType_GroupProperties,17488,Variable
-WriterGroupType_GroupProperties,17489,Variable
-WriterGroupType_DataSetWriterName_Placeholder_DataSetWriterProperties,17490,Variable
-ReaderGroupType_GroupProperties,17491,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_DataSetReaderProperties,17492,Variable
-DataSetWriterType_DataSetWriterProperties,17493,Variable
-DataSetReaderType_DataSetReaderProperties,17494,Variable
-CreateCredentialMethodType_OutputArguments,17495,Variable
-KeyCredentialConfigurationFolderType,17496,ObjectType
-AnalogUnitType,17497,VariableType
-AnalogUnitType_Definition,17498,Variable
-AnalogUnitType_ValuePrecision,17499,Variable
-AnalogUnitType_InstrumentRange,17500,Variable
-AnalogUnitType_EURange,17501,Variable
-AnalogUnitType_EngineeringUnits,17502,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Address_NetworkInterface_Selections,17503,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Address_NetworkInterface_SelectionDescriptions,17504,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Address_NetworkInterface_RestrictToList,17505,Variable
-PublishSubscribe_ConnectionName_Placeholder_Address_NetworkInterface_Selections,17506,Variable
-PubSubConnectionType_AddReaderGroup_InputArguments,17507,Variable
-PubSubConnectionType_AddReaderGroup_OutputArguments,17508,Variable
-PublishSubscribe_ConnectionName_Placeholder_Address_NetworkInterface_SelectionDescriptions,17509,Variable
-PublishSubscribe_ConnectionName_Placeholder_Address_NetworkInterface_RestrictToList,17510,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder,17511,Object
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_ResourceUri,17512,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_ProfileUri,17513,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_EndpointUrls,17514,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_ServiceStatus,17515,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_GetEncryptingKey,17516,Method
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_GetEncryptingKey_InputArguments,17517,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_GetEncryptingKey_OutputArguments,17518,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_UpdateCredential,17519,Method
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_UpdateCredential_InputArguments,17520,Variable
-KeyCredentialConfigurationFolderType_ServiceName_Placeholder_DeleteCredential,17521,Method
-KeyCredentialConfigurationFolderType_CreateCredential,17522,Method
-KeyCredentialConfigurationFolderType_CreateCredential_InputArguments,17523,Variable
-KeyCredentialConfigurationFolderType_CreateCredential_OutputArguments,17524,Variable
-KeyCredentialConfiguration_ServiceName_Placeholder_GetEncryptingKey,17525,Method
-KeyCredentialConfiguration_ServiceName_Placeholder_GetEncryptingKey_InputArguments,17526,Variable
-KeyCredentialConfiguration_ServiceName_Placeholder_GetEncryptingKey_OutputArguments,17527,Variable
-KeyCredentialConfiguration_CreateCredential,17528,Method
-KeyCredentialConfiguration_CreateCredential_InputArguments,17529,Variable
-KeyCredentialConfiguration_CreateCredential_OutputArguments,17530,Variable
-GetEncryptingKeyMethodType,17531,Method
-GetEncryptingKeyMethodType_InputArguments,17532,Variable
-GetEncryptingKeyMethodType_OutputArguments,17533,Variable
-KeyCredentialConfigurationType_GetEncryptingKey,17534,Method
-KeyCredentialConfigurationType_GetEncryptingKey_InputArguments,17535,Variable
-KeyCredentialConfigurationType_GetEncryptingKey_OutputArguments,17536,Variable
-AdditionalParametersType_Encoding_DefaultBinary,17537,Object
-OpcUa_BinarySchema_AdditionalParametersType,17538,Variable
-OpcUa_BinarySchema_AdditionalParametersType_DataTypeVersion,17539,Variable
-OpcUa_BinarySchema_AdditionalParametersType_DictionaryFragment,17540,Variable
-AdditionalParametersType_Encoding_DefaultXml,17541,Object
-OpcUa_XmlSchema_AdditionalParametersType,17542,Variable
-OpcUa_XmlSchema_AdditionalParametersType_DataTypeVersion,17543,Variable
-OpcUa_XmlSchema_AdditionalParametersType_DictionaryFragment,17544,Variable
-RsaEncryptedSecret,17545,DataType
-EccEncryptedSecret,17546,DataType
-AdditionalParametersType_Encoding_DefaultJson,17547,Object
-EphemeralKeyType,17548,DataType
-EphemeralKeyType_Encoding_DefaultBinary,17549,Object
-OpcUa_BinarySchema_EphemeralKeyType,17550,Variable
-OpcUa_BinarySchema_EphemeralKeyType_DataTypeVersion,17551,Variable
-OpcUa_BinarySchema_EphemeralKeyType_DictionaryFragment,17552,Variable
-EphemeralKeyType_Encoding_DefaultXml,17553,Object
-OpcUa_XmlSchema_EphemeralKeyType,17554,Variable
-OpcUa_XmlSchema_EphemeralKeyType_DataTypeVersion,17555,Variable
-OpcUa_XmlSchema_EphemeralKeyType_DictionaryFragment,17556,Variable
-EphemeralKeyType_Encoding_DefaultJson,17557,Object
-PubSubConnectionType_WriterGroupName_Placeholder_HeaderLayoutUri,17558,Variable
-WriterGroupType_HeaderLayoutUri,17559,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_KeyFrameCount,17560,Variable
-PubSubConnectionTypeAddWriterGroupMethodType,17561,Method
-ReaderGroupType_DataSetReaderName_Placeholder_HeaderLayoutUri,17562,Variable
-DataSetReaderType_KeyFrameCount,17563,Variable
-DataSetReaderType_HeaderLayoutUri,17564,Variable
-BaseAnalogType_Definition,17565,Variable
-BaseAnalogType_ValuePrecision,17566,Variable
-BaseAnalogType_InstrumentRange,17567,Variable
-BaseAnalogType_EURange,17568,Variable
-BaseAnalogType_EngineeringUnits,17569,Variable
-AnalogUnitRangeType,17570,VariableType
-AnalogUnitRangeType_Definition,17571,Variable
-AnalogUnitRangeType_ValuePrecision,17572,Variable
-AnalogUnitRangeType_InstrumentRange,17573,Variable
-AnalogUnitRangeType_EURange,17574,Variable
-AnalogUnitRangeType_EngineeringUnits,17575,Variable
-PubSubConnectionType_Address_NetworkInterface_Selections,17576,Variable
-PubSubConnectionType_Address_NetworkInterface_SelectionDescriptions,17577,Variable
-PubSubConnectionType_Address_NetworkInterface_RestrictToList,17578,Variable
-DatagramConnectionTransportType_DiscoveryAddress_NetworkInterface_Selections,17579,Variable
-DatagramConnectionTransportType_DiscoveryAddress_NetworkInterface_SelectionDescriptions,17580,Variable
-DatagramConnectionTransportType_DiscoveryAddress_NetworkInterface_RestrictToList,17581,Variable
-NetworkAddressType_NetworkInterface_Selections,17582,Variable
-NetworkAddressType_NetworkInterface_SelectionDescriptions,17583,Variable
-NetworkAddressType_NetworkInterface_RestrictToList,17584,Variable
-NetworkAddressUrlType_NetworkInterface_Selections,17585,Variable
-NetworkAddressUrlType_NetworkInterface_SelectionDescriptions,17586,Variable
-NetworkAddressUrlType_NetworkInterface_RestrictToList,17587,Variable
-Index,17588,DataType
-DictionaryEntryType,17589,ObjectType
-DictionaryEntryType_DictionaryEntryName_Placeholder,17590,Object
-DictionaryFolderType,17591,ObjectType
-DictionaryFolderType_DictionaryFolderName_Placeholder,17592,Object
-DictionaryFolderType_DictionaryEntryName_Placeholder,17593,Object
-Dictionaries,17594,Object
-Dictionaries_DictionaryFolderName_Placeholder,17595,Object
-Dictionaries_DictionaryEntryName_Placeholder,17596,Object
-HasDictionaryEntry,17597,ReferenceType
-IrdiDictionaryEntryType,17598,ObjectType
-IrdiDictionaryEntryType_DictionaryEntryName_Placeholder,17599,Object
-UriDictionaryEntryType,17600,ObjectType
-UriDictionaryEntryType_DictionaryEntryName_Placeholder,17601,Object
-BaseInterfaceType,17602,ObjectType
-HasInterface,17603,ReferenceType
-HasAddIn,17604,ReferenceType
-DefaultInstanceBrowseName,17605,Variable
-GenericAttributeValue,17606,DataType
-GenericAttributes,17607,DataType
-GenericAttributeValue_Encoding_DefaultXml,17608,Object
-GenericAttributes_Encoding_DefaultXml,17609,Object
-GenericAttributeValue_Encoding_DefaultBinary,17610,Object
-GenericAttributes_Encoding_DefaultBinary,17611,Object
-ServerType_LocalTime,17612,Variable
-PubSubConnectionTypeAddWriterGroupMethodType_InputArguments,17613,Variable
-PubSubConnectionTypeAddWriterGroupMethodType_OutputArguments,17614,Variable
-AuditSecurityEventType_StatusCodeId,17615,Variable
-AuditChannelEventType_StatusCodeId,17616,Variable
-AuditOpenSecureChannelEventType_StatusCodeId,17617,Variable
-AuditSessionEventType_StatusCodeId,17618,Variable
-AuditCreateSessionEventType_StatusCodeId,17619,Variable
-AuditUrlMismatchEventType_StatusCodeId,17620,Variable
-AuditActivateSessionEventType_StatusCodeId,17621,Variable
-AuditCancelEventType_StatusCodeId,17622,Variable
-AuditCertificateEventType_StatusCodeId,17623,Variable
-AuditCertificateDataMismatchEventType_StatusCodeId,17624,Variable
-AuditCertificateExpiredEventType_StatusCodeId,17625,Variable
-AuditCertificateInvalidEventType_StatusCodeId,17626,Variable
-AuditCertificateUntrustedEventType_StatusCodeId,17627,Variable
-AuditCertificateRevokedEventType_StatusCodeId,17628,Variable
-AuditCertificateMismatchEventType_StatusCodeId,17629,Variable
-PubSubConnectionAddReaderGroupGroupMethodType,17630,Method
-PubSubConnectionAddReaderGroupGroupMethodType_InputArguments,17631,Variable
-SelectionListType_Selections,17632,Variable
-SelectionListType_SelectionDescriptions,17633,Variable
-Server_LocalTime,17634,Variable
-FiniteStateMachineType_AvailableStates,17635,Variable
-FiniteStateMachineType_AvailableTransitions,17636,Variable
-TemporaryFileTransferType_TransferState_Placeholder_AvailableStates,17637,Variable
-TemporaryFileTransferType_TransferState_Placeholder_AvailableTransitions,17638,Variable
-FileTransferStateMachineType_AvailableStates,17639,Variable
-FileTransferStateMachineType_AvailableTransitions,17640,Variable
-RoleMappingRuleChangedAuditEventType,17641,ObjectType
-RoleMappingRuleChangedAuditEventType_EventId,17642,Variable
-RoleMappingRuleChangedAuditEventType_EventType,17643,Variable
-RoleMappingRuleChangedAuditEventType_SourceNode,17644,Variable
-RoleMappingRuleChangedAuditEventType_SourceName,17645,Variable
-RoleMappingRuleChangedAuditEventType_Time,17646,Variable
-RoleMappingRuleChangedAuditEventType_ReceiveTime,17647,Variable
-RoleMappingRuleChangedAuditEventType_LocalTime,17648,Variable
-RoleMappingRuleChangedAuditEventType_Message,17649,Variable
-RoleMappingRuleChangedAuditEventType_Severity,17650,Variable
-RoleMappingRuleChangedAuditEventType_ActionTimeStamp,17651,Variable
-RoleMappingRuleChangedAuditEventType_Status,17652,Variable
-RoleMappingRuleChangedAuditEventType_ServerId,17653,Variable
-RoleMappingRuleChangedAuditEventType_ClientAuditEntryId,17654,Variable
-RoleMappingRuleChangedAuditEventType_ClientUserId,17655,Variable
-RoleMappingRuleChangedAuditEventType_MethodId,17656,Variable
-RoleMappingRuleChangedAuditEventType_InputArguments,17657,Variable
-AlarmConditionType_ShelvingState_AvailableStates,17658,Variable
-AlarmConditionType_ShelvingState_AvailableTransitions,17659,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_AvailableStates,17660,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_ShelvingState_AvailableTransitions,17661,Variable
-ShelvedStateMachineType_AvailableStates,17662,Variable
-ShelvedStateMachineType_AvailableTransitions,17663,Variable
-LimitAlarmType_ShelvingState_AvailableStates,17664,Variable
-LimitAlarmType_ShelvingState_AvailableTransitions,17665,Variable
-ExclusiveLimitStateMachineType_AvailableStates,17666,Variable
-ExclusiveLimitStateMachineType_AvailableTransitions,17667,Variable
-ExclusiveLimitAlarmType_ShelvingState_AvailableStates,17668,Variable
-ExclusiveLimitAlarmType_ShelvingState_AvailableTransitions,17669,Variable
-ExclusiveLimitAlarmType_LimitState_AvailableStates,17670,Variable
-ExclusiveLimitAlarmType_LimitState_AvailableTransitions,17671,Variable
-NonExclusiveLimitAlarmType_ShelvingState_AvailableStates,17672,Variable
-NonExclusiveLimitAlarmType_ShelvingState_AvailableTransitions,17673,Variable
-NonExclusiveLevelAlarmType_ShelvingState_AvailableStates,17674,Variable
-NonExclusiveLevelAlarmType_ShelvingState_AvailableTransitions,17675,Variable
-ExclusiveLevelAlarmType_ShelvingState_AvailableStates,17676,Variable
-ExclusiveLevelAlarmType_ShelvingState_AvailableTransitions,17677,Variable
-ExclusiveLevelAlarmType_LimitState_AvailableStates,17678,Variable
-ExclusiveLevelAlarmType_LimitState_AvailableTransitions,17679,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_AvailableStates,17680,Variable
-NonExclusiveDeviationAlarmType_ShelvingState_AvailableTransitions,17681,Variable
-ExclusiveDeviationAlarmType_ShelvingState_AvailableStates,17682,Variable
-ExclusiveDeviationAlarmType_ShelvingState_AvailableTransitions,17683,Variable
-ExclusiveDeviationAlarmType_LimitState_AvailableStates,17684,Variable
-ExclusiveDeviationAlarmType_LimitState_AvailableTransitions,17685,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_AvailableStates,17686,Variable
-NonExclusiveRateOfChangeAlarmType_ShelvingState_AvailableTransitions,17687,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_AvailableStates,17688,Variable
-ExclusiveRateOfChangeAlarmType_ShelvingState_AvailableTransitions,17689,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_AvailableStates,17690,Variable
-ExclusiveRateOfChangeAlarmType_LimitState_AvailableTransitions,17691,Variable
-DiscreteAlarmType_ShelvingState_AvailableStates,17692,Variable
-DiscreteAlarmType_ShelvingState_AvailableTransitions,17693,Variable
-OffNormalAlarmType_ShelvingState_AvailableStates,17694,Variable
-OffNormalAlarmType_ShelvingState_AvailableTransitions,17695,Variable
-SystemOffNormalAlarmType_ShelvingState_AvailableStates,17696,Variable
-SystemOffNormalAlarmType_ShelvingState_AvailableTransitions,17697,Variable
-TripAlarmType_ShelvingState_AvailableStates,17698,Variable
-TripAlarmType_ShelvingState_AvailableTransitions,17699,Variable
-CertificateExpirationAlarmType_ShelvingState_AvailableStates,17700,Variable
-CertificateExpirationAlarmType_ShelvingState_AvailableTransitions,17701,Variable
-DiscrepancyAlarmType_ShelvingState_AvailableStates,17702,Variable
-DiscrepancyAlarmType_ShelvingState_AvailableTransitions,17703,Variable
-ProgramStateMachineType_AvailableStates,17704,Variable
-ProgramStateMachineType_AvailableTransitions,17705,Variable
-PublishSubscribeType_ConnectionName_Placeholder_TransportProfileUri_Selections,17706,Variable
-PublishSubscribeType_ConnectionName_Placeholder_TransportProfileUri_SelectionDescriptions,17707,Variable
-PubSubConnectionType_TransportProfileUri_Selections,17710,Variable
-PubSubConnectionType_TransportProfileUri_SelectionDescriptions,17711,Variable
-FileDirectoryType_FileDirectoryName_Placeholder_DeleteFileSystemObject,17718,Method
-FileDirectoryType_FileDirectoryName_Placeholder_DeleteFileSystemObject_InputArguments,17719,Variable
-PubSubConnectionAddReaderGroupGroupMethodType_OutputArguments,17720,Variable
-ConnectionTransportType,17721,ObjectType
-FileSystem_FileDirectoryName_Placeholder_DeleteFileSystemObject,17722,Method
-FileSystem_FileDirectoryName_Placeholder_DeleteFileSystemObject_InputArguments,17723,Variable
-PubSubGroupType_MaxNetworkMessageSize,17724,Variable
-WriterGroupType,17725,ObjectType
-WriterGroupType_SecurityMode,17726,Variable
-WriterGroupType_SecurityGroupId,17727,Variable
-WriterGroupType_SecurityKeyServices,17728,Variable
-WriterGroupType_MaxNetworkMessageSize,17729,Variable
-WriterGroupType_Status,17730,Object
-WriterGroupType_Status_State,17731,Variable
-AuthorizationServices,17732,Object
-AuthorizationServices_ServiceName_Placeholder,17733,Object
-WriterGroupType_Status_Enable,17734,Method
-WriterGroupType_Status_Disable,17735,Method
-WriterGroupType_WriterGroupId,17736,Variable
-WriterGroupType_PublishingInterval,17737,Variable
-WriterGroupType_KeepAliveTime,17738,Variable
-WriterGroupType_Priority,17739,Variable
-WriterGroupType_LocaleIds,17740,Variable
-WriterGroupType_TransportSettings,17741,Object
-WriterGroupType_MessageSettings,17742,Object
-WriterGroupType_DataSetWriterName_Placeholder,17743,Object
-WriterGroupType_DataSetWriterName_Placeholder_DataSetWriterId,17744,Variable
-WriterGroupType_DataSetWriterName_Placeholder_DataSetFieldContentMask,17745,Variable
-WriterGroupType_DataSetWriterName_Placeholder_KeyFrameCount,17746,Variable
-WriterGroupType_DataSetWriterName_Placeholder_TransportSettings,17747,Object
-WriterGroupType_DataSetWriterName_Placeholder_MessageSettings,17748,Object
-WriterGroupType_DataSetWriterName_Placeholder_Status,17749,Object
-WriterGroupType_DataSetWriterName_Placeholder_Status_State,17750,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Status_Enable,17751,Method
-WriterGroupType_DataSetWriterName_Placeholder_Status_Disable,17752,Method
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics,17753,Object
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_DiagnosticsLevel,17754,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation,17755,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Active,17756,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Classification,17757,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,17758,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,17759,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalError,17760,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Active,17761,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Classification,17762,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,17763,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_TotalError_TimeFirstChange,17764,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Reset,17765,Method
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_SubError,17766,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters,17767,Object
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError,17768,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Active,17769,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Classification,17770,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,17771,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,17772,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,17773,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,17774,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,17775,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,17776,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,17777,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent,17778,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,17779,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,17780,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,17781,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,17782,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError,17783,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,17784,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,17785,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,17786,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,17787,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent,17788,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,17789,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,17790,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,17791,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,17792,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,17793,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,17794,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,17795,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,17796,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,17797,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues,17798,Object
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages,17799,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Active,17800,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Classification,17801,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,17802,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,17803,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber,17804,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,17805,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode,17806,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,17807,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion,17808,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,17809,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion,17810,Variable
-WriterGroupType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,17811,Variable
-WriterGroupType_Diagnostics,17812,Object
-WriterGroupType_Diagnostics_DiagnosticsLevel,17813,Variable
-WriterGroupType_Diagnostics_TotalInformation,17814,Variable
-WriterGroupType_Diagnostics_TotalInformation_Active,17815,Variable
-WriterGroupType_Diagnostics_TotalInformation_Classification,17816,Variable
-WriterGroupType_Diagnostics_TotalInformation_DiagnosticsLevel,17817,Variable
-WriterGroupType_Diagnostics_TotalInformation_TimeFirstChange,17818,Variable
-WriterGroupType_Diagnostics_TotalError,17819,Variable
-WriterGroupType_Diagnostics_TotalError_Active,17820,Variable
-WriterGroupType_Diagnostics_TotalError_Classification,17821,Variable
-WriterGroupType_Diagnostics_TotalError_DiagnosticsLevel,17822,Variable
-WriterGroupType_Diagnostics_TotalError_TimeFirstChange,17823,Variable
-WriterGroupType_Diagnostics_Reset,17824,Method
-WriterGroupType_Diagnostics_SubError,17825,Variable
-WriterGroupType_Diagnostics_Counters,17826,Object
-WriterGroupType_Diagnostics_Counters_StateError,17827,Variable
-WriterGroupType_Diagnostics_Counters_StateError_Active,17828,Variable
-WriterGroupType_Diagnostics_Counters_StateError_Classification,17829,Variable
-WriterGroupType_Diagnostics_Counters_StateError_DiagnosticsLevel,17830,Variable
-WriterGroupType_Diagnostics_Counters_StateError_TimeFirstChange,17831,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByMethod,17832,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByMethod_Active,17833,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByMethod_Classification,17834,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,17835,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,17836,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByParent,17837,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByParent_Active,17838,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByParent_Classification,17839,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,17840,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,17841,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalFromError,17842,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalFromError_Active,17843,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalFromError_Classification,17844,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,17845,Variable
-WriterGroupType_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,17846,Variable
-WriterGroupType_Diagnostics_Counters_StatePausedByParent,17847,Variable
-WriterGroupType_Diagnostics_Counters_StatePausedByParent_Active,17848,Variable
-WriterGroupType_Diagnostics_Counters_StatePausedByParent_Classification,17849,Variable
-WriterGroupType_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,17850,Variable
-WriterGroupType_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,17851,Variable
-AuthorizationServiceConfigurationType,17852,ObjectType
-WriterGroupType_Diagnostics_Counters_StateDisabledByMethod,17853,Variable
-WriterGroupType_Diagnostics_Counters_StateDisabledByMethod_Active,17854,Variable
-WriterGroupType_Diagnostics_Counters_StateDisabledByMethod_Classification,17855,Variable
-WriterGroupType_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,17856,Variable
-WriterGroupType_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,17857,Variable
-WriterGroupType_Diagnostics_LiveValues,17858,Object
-WriterGroupType_Diagnostics_Counters_SentNetworkMessages,17859,Variable
-AuthorizationServiceConfigurationType_ServiceCertificate,17860,Variable
-DecimalDataType,17861,DataType
-DecimalDataType_Encoding_DefaultXml,17862,Object
-DecimalDataType_Encoding_DefaultBinary,17863,Object
-WriterGroupType_Diagnostics_Counters_SentNetworkMessages_Active,17864,Variable
-AlarmConditionType_AudibleSound_ListId,17865,Variable
-AlarmConditionType_AudibleSound_AgencyId,17866,Variable
-AlarmConditionType_AudibleSound_VersionId,17867,Variable
-AlarmConditionType_Unsuppress,17868,Method
-AlarmConditionType_RemoveFromService,17869,Method
-AlarmConditionType_PlaceInService,17870,Method
-WriterGroupType_Diagnostics_Counters_SentNetworkMessages_Classification,17871,Variable
-WriterGroupType_Diagnostics_Counters_SentNetworkMessages_DiagnosticsLevel,17872,Variable
-WriterGroupType_Diagnostics_Counters_SentNetworkMessages_TimeFirstChange,17873,Variable
-WriterGroupType_Diagnostics_Counters_FailedTransmissions,17874,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Unsuppress,17875,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_RemoveFromService,17876,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_PlaceInService,17877,Method
-WriterGroupType_Diagnostics_Counters_FailedTransmissions_Active,17878,Variable
-LimitAlarmType_AudibleSound_ListId,17879,Variable
-LimitAlarmType_AudibleSound_AgencyId,17880,Variable
-LimitAlarmType_AudibleSound_VersionId,17881,Variable
-LimitAlarmType_Unsuppress,17882,Method
-LimitAlarmType_RemoveFromService,17883,Method
-LimitAlarmType_PlaceInService,17884,Method
-WriterGroupType_Diagnostics_Counters_FailedTransmissions_Classification,17885,Variable
-ExclusiveLimitAlarmType_AudibleSound_ListId,17886,Variable
-ExclusiveLimitAlarmType_AudibleSound_AgencyId,17887,Variable
-ExclusiveLimitAlarmType_AudibleSound_VersionId,17888,Variable
-ExclusiveLimitAlarmType_Unsuppress,17889,Method
-ExclusiveLimitAlarmType_RemoveFromService,17890,Method
-ExclusiveLimitAlarmType_PlaceInService,17891,Method
-WriterGroupType_Diagnostics_Counters_FailedTransmissions_DiagnosticsLevel,17892,Variable
-NonExclusiveLimitAlarmType_AudibleSound_ListId,17893,Variable
-NonExclusiveLimitAlarmType_AudibleSound_AgencyId,17894,Variable
-NonExclusiveLimitAlarmType_AudibleSound_VersionId,17895,Variable
-NonExclusiveLimitAlarmType_Unsuppress,17896,Method
-NonExclusiveLimitAlarmType_RemoveFromService,17897,Method
-NonExclusiveLimitAlarmType_PlaceInService,17898,Method
-WriterGroupType_Diagnostics_Counters_FailedTransmissions_TimeFirstChange,17899,Variable
-WriterGroupType_Diagnostics_Counters_EncryptionErrors,17900,Variable
-WriterGroupType_Diagnostics_Counters_EncryptionErrors_Active,17901,Variable
-WriterGroupType_Diagnostics_Counters_EncryptionErrors_Classification,17902,Variable
-WriterGroupType_Diagnostics_Counters_EncryptionErrors_DiagnosticsLevel,17903,Variable
-NonExclusiveLevelAlarmType_RemoveFromService,17904,Method
-NonExclusiveLevelAlarmType_PlaceInService,17905,Method
-WriterGroupType_Diagnostics_Counters_EncryptionErrors_TimeFirstChange,17906,Variable
-ExclusiveLevelAlarmType_AudibleSound_ListId,17907,Variable
-ExclusiveLevelAlarmType_AudibleSound_AgencyId,17908,Variable
-ExclusiveLevelAlarmType_AudibleSound_VersionId,17909,Variable
-ExclusiveLevelAlarmType_Unsuppress,17910,Method
-ExclusiveLevelAlarmType_RemoveFromService,17911,Method
-ExclusiveLevelAlarmType_PlaceInService,17912,Method
-WriterGroupType_Diagnostics_LiveValues_ConfiguredDataSetWriters,17913,Variable
-NonExclusiveDeviationAlarmType_AudibleSound_ListId,17914,Variable
-NonExclusiveDeviationAlarmType_AudibleSound_AgencyId,17915,Variable
-NonExclusiveDeviationAlarmType_AudibleSound_VersionId,17916,Variable
-NonExclusiveDeviationAlarmType_Unsuppress,17917,Method
-NonExclusiveDeviationAlarmType_RemoveFromService,17918,Method
-NonExclusiveDeviationAlarmType_PlaceInService,17919,Method
-WriterGroupType_Diagnostics_LiveValues_ConfiguredDataSetWriters_DiagnosticsLevel,17920,Variable
-NonExclusiveRateOfChangeAlarmType_AudibleSound_ListId,17921,Variable
-NonExclusiveRateOfChangeAlarmType_AudibleSound_AgencyId,17922,Variable
-NonExclusiveRateOfChangeAlarmType_AudibleSound_VersionId,17923,Variable
-NonExclusiveRateOfChangeAlarmType_Unsuppress,17924,Method
-NonExclusiveRateOfChangeAlarmType_RemoveFromService,17925,Method
-NonExclusiveRateOfChangeAlarmType_PlaceInService,17926,Method
-WriterGroupType_Diagnostics_LiveValues_OperationalDataSetWriters,17927,Variable
-ExclusiveDeviationAlarmType_AudibleSound_ListId,17928,Variable
-ExclusiveDeviationAlarmType_AudibleSound_AgencyId,17929,Variable
-ExclusiveDeviationAlarmType_AudibleSound_VersionId,17930,Variable
-ExclusiveDeviationAlarmType_Unsuppress,17931,Method
-ExclusiveDeviationAlarmType_RemoveFromService,17932,Method
-ExclusiveDeviationAlarmType_PlaceInService,17933,Method
-WriterGroupType_Diagnostics_LiveValues_OperationalDataSetWriters_DiagnosticsLevel,17934,Variable
-ExclusiveRateOfChangeAlarmType_AudibleSound_ListId,17935,Variable
-ExclusiveRateOfChangeAlarmType_AudibleSound_AgencyId,17936,Variable
-ExclusiveRateOfChangeAlarmType_AudibleSound_VersionId,17937,Variable
-ExclusiveRateOfChangeAlarmType_Unsuppress,17938,Method
-ExclusiveRateOfChangeAlarmType_RemoveFromService,17939,Method
-ExclusiveRateOfChangeAlarmType_PlaceInService,17940,Method
-WriterGroupType_Diagnostics_LiveValues_SecurityTokenID,17941,Variable
-DiscreteAlarmType_AudibleSound_ListId,17942,Variable
-DiscreteAlarmType_AudibleSound_AgencyId,17943,Variable
-DiscreteAlarmType_AudibleSound_VersionId,17944,Variable
-DiscreteAlarmType_Unsuppress,17945,Method
-DiscreteAlarmType_RemoveFromService,17946,Method
-DiscreteAlarmType_PlaceInService,17947,Method
-WriterGroupType_Diagnostics_LiveValues_SecurityTokenID_DiagnosticsLevel,17948,Variable
-OffNormalAlarmType_AudibleSound_ListId,17949,Variable
-OffNormalAlarmType_AudibleSound_AgencyId,17950,Variable
-OffNormalAlarmType_AudibleSound_VersionId,17951,Variable
-OffNormalAlarmType_Unsuppress,17952,Method
-OffNormalAlarmType_RemoveFromService,17953,Method
-OffNormalAlarmType_PlaceInService,17954,Method
-WriterGroupType_Diagnostics_LiveValues_TimeToNextTokenID,17955,Variable
-SystemOffNormalAlarmType_AudibleSound_ListId,17956,Variable
-SystemOffNormalAlarmType_AudibleSound_AgencyId,17957,Variable
-SystemOffNormalAlarmType_AudibleSound_VersionId,17958,Variable
-SystemOffNormalAlarmType_Unsuppress,17959,Method
-SystemOffNormalAlarmType_RemoveFromService,17960,Method
-SystemOffNormalAlarmType_PlaceInService,17961,Method
-WriterGroupType_Diagnostics_LiveValues_TimeToNextTokenID_DiagnosticsLevel,17962,Variable
-TripAlarmType_AudibleSound_ListId,17963,Variable
-TripAlarmType_AudibleSound_AgencyId,17964,Variable
-TripAlarmType_AudibleSound_VersionId,17965,Variable
-TripAlarmType_Unsuppress,17966,Method
-TripAlarmType_RemoveFromService,17967,Method
-TripAlarmType_PlaceInService,17968,Method
-WriterGroupType_AddDataSetWriter,17969,Method
-CertificateExpirationAlarmType_AudibleSound_ListId,17970,Variable
-CertificateExpirationAlarmType_AudibleSound_AgencyId,17971,Variable
-CertificateExpirationAlarmType_AudibleSound_VersionId,17972,Variable
-CertificateExpirationAlarmType_Unsuppress,17973,Method
-CertificateExpirationAlarmType_RemoveFromService,17974,Method
-CertificateExpirationAlarmType_PlaceInService,17975,Method
-WriterGroupType_AddDataSetWriter_InputArguments,17976,Variable
-DiscrepancyAlarmType_AudibleSound_ListId,17977,Variable
-DiscrepancyAlarmType_AudibleSound_AgencyId,17978,Variable
-DiscrepancyAlarmType_AudibleSound_VersionId,17979,Variable
-DiscrepancyAlarmType_Unsuppress,17980,Method
-DiscrepancyAlarmType_RemoveFromService,17981,Method
-DiscrepancyAlarmType_PlaceInService,17982,Method
-HasEffectEnable,17983,ReferenceType
-HasEffectSuppressed,17984,ReferenceType
-HasEffectUnsuppressed,17985,ReferenceType
-AudioVariableType,17986,VariableType
-WriterGroupType_AddDataSetWriter_OutputArguments,17987,Variable
-AudioVariableType_ListId,17988,Variable
-AudioVariableType_AgencyId,17989,Variable
-AudioVariableType_VersionId,17990,Variable
-AlarmMetricsType_StartTime,17991,Variable
-WriterGroupType_RemoveDataSetWriter,17992,Method
-WriterGroupType_RemoveDataSetWriter_InputArguments,17993,Variable
-PubSubGroupTypeAddWriterrMethodType,17994,Method
-PubSubGroupTypeAddWriterrMethodType_InputArguments,17995,Variable
-PubSubGroupTypeAddWriterrMethodType_OutputArguments,17996,Variable
-WriterGroupTransportType,17997,ObjectType
-WriterGroupMessageType,17998,ObjectType
-ReaderGroupType,17999,ObjectType
-ReaderGroupType_SecurityMode,18000,Variable
-KeyCredentialConfigurationType,18001,ObjectType
-ReaderGroupType_SecurityGroupId,18002,Variable
-ReaderGroupType_SecurityKeyServices,18003,Variable
-KeyCredentialConfigurationType_EndpointUrls,18004,Variable
-KeyCredentialConfigurationType_ServiceStatus,18005,Variable
-KeyCredentialConfigurationType_UpdateCredential,18006,Method
-KeyCredentialConfigurationType_UpdateCredential_InputArguments,18007,Variable
-KeyCredentialConfigurationType_DeleteCredential,18008,Method
-KeyCredentialUpdateMethodType,18009,Method
-KeyCredentialUpdateMethodType_InputArguments,18010,Variable
-KeyCredentialAuditEventType,18011,ObjectType
-KeyCredentialAuditEventType_EventId,18012,Variable
-KeyCredentialAuditEventType_EventType,18013,Variable
-KeyCredentialAuditEventType_SourceNode,18014,Variable
-KeyCredentialAuditEventType_SourceName,18015,Variable
-KeyCredentialAuditEventType_Time,18016,Variable
-KeyCredentialAuditEventType_ReceiveTime,18017,Variable
-KeyCredentialAuditEventType_LocalTime,18018,Variable
-KeyCredentialAuditEventType_Message,18019,Variable
-KeyCredentialAuditEventType_Severity,18020,Variable
-KeyCredentialAuditEventType_ActionTimeStamp,18021,Variable
-KeyCredentialAuditEventType_Status,18022,Variable
-KeyCredentialAuditEventType_ServerId,18023,Variable
-KeyCredentialAuditEventType_ClientAuditEntryId,18024,Variable
-KeyCredentialAuditEventType_ClientUserId,18025,Variable
-KeyCredentialAuditEventType_MethodId,18026,Variable
-KeyCredentialAuditEventType_InputArguments,18027,Variable
-KeyCredentialAuditEventType_ResourceUri,18028,Variable
-KeyCredentialUpdatedAuditEventType,18029,ObjectType
-KeyCredentialUpdatedAuditEventType_EventId,18030,Variable
-KeyCredentialUpdatedAuditEventType_EventType,18031,Variable
-KeyCredentialUpdatedAuditEventType_SourceNode,18032,Variable
-KeyCredentialUpdatedAuditEventType_SourceName,18033,Variable
-KeyCredentialUpdatedAuditEventType_Time,18034,Variable
-KeyCredentialUpdatedAuditEventType_ReceiveTime,18035,Variable
-KeyCredentialUpdatedAuditEventType_LocalTime,18036,Variable
-KeyCredentialUpdatedAuditEventType_Message,18037,Variable
-KeyCredentialUpdatedAuditEventType_Severity,18038,Variable
-KeyCredentialUpdatedAuditEventType_ActionTimeStamp,18039,Variable
-KeyCredentialUpdatedAuditEventType_Status,18040,Variable
-KeyCredentialUpdatedAuditEventType_ServerId,18041,Variable
-KeyCredentialUpdatedAuditEventType_ClientAuditEntryId,18042,Variable
-KeyCredentialUpdatedAuditEventType_ClientUserId,18043,Variable
-KeyCredentialUpdatedAuditEventType_MethodId,18044,Variable
-KeyCredentialUpdatedAuditEventType_InputArguments,18045,Variable
-KeyCredentialUpdatedAuditEventType_ResourceUri,18046,Variable
-KeyCredentialDeletedAuditEventType,18047,ObjectType
-KeyCredentialDeletedAuditEventType_EventId,18048,Variable
-KeyCredentialDeletedAuditEventType_EventType,18049,Variable
-KeyCredentialDeletedAuditEventType_SourceNode,18050,Variable
-KeyCredentialDeletedAuditEventType_SourceName,18051,Variable
-KeyCredentialDeletedAuditEventType_Time,18052,Variable
-KeyCredentialDeletedAuditEventType_ReceiveTime,18053,Variable
-KeyCredentialDeletedAuditEventType_LocalTime,18054,Variable
-KeyCredentialDeletedAuditEventType_Message,18055,Variable
-KeyCredentialDeletedAuditEventType_Severity,18056,Variable
-KeyCredentialDeletedAuditEventType_ActionTimeStamp,18057,Variable
-KeyCredentialDeletedAuditEventType_Status,18058,Variable
-KeyCredentialDeletedAuditEventType_ServerId,18059,Variable
-KeyCredentialDeletedAuditEventType_ClientAuditEntryId,18060,Variable
-KeyCredentialDeletedAuditEventType_ClientUserId,18061,Variable
-KeyCredentialDeletedAuditEventType_MethodId,18062,Variable
-KeyCredentialDeletedAuditEventType_InputArguments,18063,Variable
-KeyCredentialDeletedAuditEventType_ResourceUri,18064,Variable
-ReaderGroupType_MaxNetworkMessageSize,18065,Variable
-AuthorizationServices_ServiceName_Placeholder_ServiceCertificate,18066,Variable
-ReaderGroupType_Status,18067,Object
-ReaderGroupType_Status_State,18068,Variable
-KeyCredentialConfigurationType_ResourceUri,18069,Variable
-AuthorizationServices_ServiceName_Placeholder_ServiceUri,18070,Variable
-AuthorizationServices_ServiceName_Placeholder_IssuerEndpointUrl,18071,Variable
-AuthorizationServiceConfigurationType_ServiceUri,18072,Variable
-AuthorizationServiceConfigurationType_IssuerEndpointUrl,18073,Variable
-ReaderGroupType_Status_Enable,18074,Method
-ReaderGroupType_Status_Disable,18075,Method
-ReaderGroupType_DataSetReaderName_Placeholder,18076,Object
-ReaderGroupType_DataSetReaderName_Placeholder_PublisherId,18077,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_WriterGroupId,18078,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_DataSetWriterId,18079,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_DataSetMetaData,18080,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_DataSetFieldContentMask,18081,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_MessageReceiveTimeout,18082,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_SecurityMode,18083,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_SecurityGroupId,18084,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_SecurityKeyServices,18085,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_TransportSettings,18086,Object
-ReaderGroupType_DataSetReaderName_Placeholder_MessageSettings,18087,Object
-ReaderGroupType_DataSetReaderName_Placeholder_Status,18088,Object
-ReaderGroupType_DataSetReaderName_Placeholder_Status_State,18089,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Status_Enable,18090,Method
-ReaderGroupType_DataSetReaderName_Placeholder_Status_Disable,18091,Method
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics,18092,Object
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_DiagnosticsLevel,18093,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalInformation,18094,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalInformation_Active,18095,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalInformation_Classification,18096,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,18097,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,18098,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalError,18099,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalError_Active,18100,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalError_Classification,18101,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,18102,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_TotalError_TimeFirstChange,18103,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Reset,18104,Method
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_SubError,18105,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters,18106,Object
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateError,18107,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateError_Active,18108,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateError_Classification,18109,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,18110,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,18111,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,18112,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,18113,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,18114,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,18115,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,18116,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByParent,18117,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,18118,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,18119,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,18120,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,18121,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalFromError,18122,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,18123,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,18124,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,18125,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,18126,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StatePausedByParent,18127,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,18128,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,18129,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,18130,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,18131,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,18132,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,18133,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,18134,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,18135,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,18136,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues,18137,Object
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_FailedDataSetMessages,18138,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Active,18139,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Classification,18140,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,18141,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,18142,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_DecryptionErrors,18143,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_DecryptionErrors_Active,18144,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_DecryptionErrors_Classification,18145,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_DecryptionErrors_DiagnosticsLevel,18146,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_Counters_DecryptionErrors_TimeFirstChange,18147,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber,18148,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,18149,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_StatusCode,18150,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,18151,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_MajorVersion,18152,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,18153,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_MinorVersion,18154,Variable
-KeyCredentialConfiguration,18155,Object
-KeyCredentialConfiguration_ServiceName_Placeholder,18156,Object
-KeyCredentialConfiguration_ServiceName_Placeholder_ResourceUri,18157,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,18158,Variable
-KeyCredentialConfiguration_ServiceName_Placeholder_EndpointUrls,18159,Variable
-KeyCredentialConfiguration_ServiceName_Placeholder_ServiceStatus,18160,Variable
-KeyCredentialConfiguration_ServiceName_Placeholder_UpdateCredential,18161,Method
-KeyCredentialConfiguration_ServiceName_Placeholder_UpdateCredential_InputArguments,18162,Variable
-KeyCredentialConfiguration_ServiceName_Placeholder_DeleteCredential,18163,Method
-KeyCredentialConfiguration_ServiceName_Placeholder_ProfileUri,18164,Variable
-KeyCredentialConfigurationType_ProfileUri,18165,Variable
-OpcUa_XmlSchema_DataTypeDefinition,18166,Variable
-OpcUa_XmlSchema_DataTypeDefinition_DataTypeVersion,18167,Variable
-OpcUa_XmlSchema_DataTypeDefinition_DictionaryFragment,18168,Variable
-OpcUa_XmlSchema_StructureField,18169,Variable
-OpcUa_XmlSchema_StructureField_DataTypeVersion,18170,Variable
-OpcUa_XmlSchema_StructureField_DictionaryFragment,18171,Variable
-OpcUa_XmlSchema_StructureDefinition,18172,Variable
-OpcUa_XmlSchema_StructureDefinition_DataTypeVersion,18173,Variable
-OpcUa_XmlSchema_StructureDefinition_DictionaryFragment,18174,Variable
-OpcUa_XmlSchema_EnumDefinition,18175,Variable
-OpcUa_XmlSchema_EnumDefinition_DataTypeVersion,18176,Variable
-OpcUa_XmlSchema_EnumDefinition_DictionaryFragment,18177,Variable
-OpcUa_BinarySchema_DataTypeDefinition,18178,Variable
-OpcUa_BinarySchema_DataTypeDefinition_DataTypeVersion,18179,Variable
-OpcUa_BinarySchema_DataTypeDefinition_DictionaryFragment,18180,Variable
-OpcUa_BinarySchema_StructureField,18181,Variable
-OpcUa_BinarySchema_StructureField_DataTypeVersion,18182,Variable
-OpcUa_BinarySchema_StructureField_DictionaryFragment,18183,Variable
-OpcUa_BinarySchema_StructureDefinition,18184,Variable
-OpcUa_BinarySchema_StructureDefinition_DataTypeVersion,18185,Variable
-OpcUa_BinarySchema_StructureDefinition_DictionaryFragment,18186,Variable
-OpcUa_BinarySchema_EnumDefinition,18187,Variable
-OpcUa_BinarySchema_EnumDefinition_DataTypeVersion,18188,Variable
-OpcUa_BinarySchema_EnumDefinition_DictionaryFragment,18189,Variable
-AlarmConditionType_LatchedState,18190,Variable
-AlarmConditionType_LatchedState_Id,18191,Variable
-AlarmConditionType_LatchedState_Name,18192,Variable
-AlarmConditionType_LatchedState_Number,18193,Variable
-AlarmConditionType_LatchedState_EffectiveDisplayName,18194,Variable
-AlarmConditionType_LatchedState_TransitionTime,18195,Variable
-AlarmConditionType_LatchedState_EffectiveTransitionTime,18196,Variable
-AlarmConditionType_LatchedState_TrueState,18197,Variable
-AlarmConditionType_LatchedState_FalseState,18198,Variable
-AlarmConditionType_Reset,18199,Method
-AlarmGroupType_AlarmConditionInstance_Placeholder_AudibleSound_ListId,18200,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AudibleSound_AgencyId,18201,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_AudibleSound_VersionId,18202,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState,18203,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_Id,18204,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_Name,18205,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_Number,18206,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_EffectiveDisplayName,18207,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_TransitionTime,18208,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_EffectiveTransitionTime,18209,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_TrueState,18210,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_LatchedState_FalseState,18211,Variable
-AlarmGroupType_AlarmConditionInstance_Placeholder_Reset,18212,Method
-LimitAlarmType_LatchedState,18213,Variable
-LimitAlarmType_LatchedState_Id,18214,Variable
-LimitAlarmType_LatchedState_Name,18215,Variable
-LimitAlarmType_LatchedState_Number,18216,Variable
-LimitAlarmType_LatchedState_EffectiveDisplayName,18217,Variable
-LimitAlarmType_LatchedState_TransitionTime,18218,Variable
-LimitAlarmType_LatchedState_EffectiveTransitionTime,18219,Variable
-LimitAlarmType_LatchedState_TrueState,18220,Variable
-LimitAlarmType_LatchedState_FalseState,18221,Variable
-LimitAlarmType_Reset,18222,Method
-ExclusiveLimitAlarmType_LatchedState,18223,Variable
-ExclusiveLimitAlarmType_LatchedState_Id,18224,Variable
-ExclusiveLimitAlarmType_LatchedState_Name,18225,Variable
-ExclusiveLimitAlarmType_LatchedState_Number,18226,Variable
-ExclusiveLimitAlarmType_LatchedState_EffectiveDisplayName,18227,Variable
-ExclusiveLimitAlarmType_LatchedState_TransitionTime,18228,Variable
-ExclusiveLimitAlarmType_LatchedState_EffectiveTransitionTime,18229,Variable
-ExclusiveLimitAlarmType_LatchedState_TrueState,18230,Variable
-ExclusiveLimitAlarmType_LatchedState_FalseState,18231,Variable
-ExclusiveLimitAlarmType_Reset,18232,Method
-NonExclusiveLimitAlarmType_LatchedState,18233,Variable
-NonExclusiveLimitAlarmType_LatchedState_Id,18234,Variable
-NonExclusiveLimitAlarmType_LatchedState_Name,18235,Variable
-NonExclusiveLimitAlarmType_LatchedState_Number,18236,Variable
-NonExclusiveLimitAlarmType_LatchedState_EffectiveDisplayName,18237,Variable
-NonExclusiveLimitAlarmType_LatchedState_TransitionTime,18238,Variable
-NonExclusiveLimitAlarmType_LatchedState_EffectiveTransitionTime,18239,Variable
-NonExclusiveLimitAlarmType_LatchedState_TrueState,18240,Variable
-NonExclusiveLimitAlarmType_LatchedState_FalseState,18241,Variable
-NonExclusiveLimitAlarmType_Reset,18242,Method
-NonExclusiveLevelAlarmType_AudibleSound_ListId,18243,Variable
-NonExclusiveLevelAlarmType_AudibleSound_AgencyId,18244,Variable
-NonExclusiveLevelAlarmType_AudibleSound_VersionId,18245,Variable
-NonExclusiveLevelAlarmType_LatchedState,18246,Variable
-NonExclusiveLevelAlarmType_LatchedState_Id,18247,Variable
-NonExclusiveLevelAlarmType_LatchedState_Name,18248,Variable
-NonExclusiveLevelAlarmType_LatchedState_Number,18249,Variable
-NonExclusiveLevelAlarmType_LatchedState_EffectiveDisplayName,18250,Variable
-NonExclusiveLevelAlarmType_LatchedState_TransitionTime,18251,Variable
-NonExclusiveLevelAlarmType_LatchedState_EffectiveTransitionTime,18252,Variable
-NonExclusiveLevelAlarmType_LatchedState_TrueState,18253,Variable
-NonExclusiveLevelAlarmType_LatchedState_FalseState,18254,Variable
-NonExclusiveLevelAlarmType_Unsuppress,18255,Method
-NonExclusiveLevelAlarmType_Reset,18256,Method
-ExclusiveLevelAlarmType_LatchedState,18257,Variable
-ExclusiveLevelAlarmType_LatchedState_Id,18258,Variable
-ExclusiveLevelAlarmType_LatchedState_Name,18259,Variable
-ExclusiveLevelAlarmType_LatchedState_Number,18260,Variable
-ExclusiveLevelAlarmType_LatchedState_EffectiveDisplayName,18261,Variable
-ExclusiveLevelAlarmType_LatchedState_TransitionTime,18262,Variable
-ExclusiveLevelAlarmType_LatchedState_EffectiveTransitionTime,18263,Variable
-ExclusiveLevelAlarmType_LatchedState_TrueState,18264,Variable
-ExclusiveLevelAlarmType_LatchedState_FalseState,18265,Variable
-ExclusiveLevelAlarmType_Reset,18266,Method
-NonExclusiveDeviationAlarmType_LatchedState,18267,Variable
-NonExclusiveDeviationAlarmType_LatchedState_Id,18268,Variable
-NonExclusiveDeviationAlarmType_LatchedState_Name,18269,Variable
-NonExclusiveDeviationAlarmType_LatchedState_Number,18270,Variable
-NonExclusiveDeviationAlarmType_LatchedState_EffectiveDisplayName,18271,Variable
-NonExclusiveDeviationAlarmType_LatchedState_TransitionTime,18272,Variable
-NonExclusiveDeviationAlarmType_LatchedState_EffectiveTransitionTime,18273,Variable
-NonExclusiveDeviationAlarmType_LatchedState_TrueState,18274,Variable
-NonExclusiveDeviationAlarmType_LatchedState_FalseState,18275,Variable
-NonExclusiveDeviationAlarmType_Reset,18276,Method
-NonExclusiveRateOfChangeAlarmType_LatchedState,18277,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_Id,18278,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_Name,18279,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_Number,18280,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_EffectiveDisplayName,18281,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_TransitionTime,18282,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_EffectiveTransitionTime,18283,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_TrueState,18284,Variable
-NonExclusiveRateOfChangeAlarmType_LatchedState_FalseState,18285,Variable
-NonExclusiveRateOfChangeAlarmType_Reset,18286,Method
-ExclusiveDeviationAlarmType_LatchedState,18287,Variable
-ExclusiveDeviationAlarmType_LatchedState_Id,18288,Variable
-ExclusiveDeviationAlarmType_LatchedState_Name,18289,Variable
-ExclusiveDeviationAlarmType_LatchedState_Number,18290,Variable
-ExclusiveDeviationAlarmType_LatchedState_EffectiveDisplayName,18291,Variable
-ExclusiveDeviationAlarmType_LatchedState_TransitionTime,18292,Variable
-ExclusiveDeviationAlarmType_LatchedState_EffectiveTransitionTime,18293,Variable
-ExclusiveDeviationAlarmType_LatchedState_TrueState,18294,Variable
-ExclusiveDeviationAlarmType_LatchedState_FalseState,18295,Variable
-ExclusiveDeviationAlarmType_Reset,18296,Method
-ExclusiveRateOfChangeAlarmType_LatchedState,18297,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_Id,18298,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_Name,18299,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_Number,18300,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_EffectiveDisplayName,18301,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_TransitionTime,18302,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_EffectiveTransitionTime,18303,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_TrueState,18304,Variable
-ExclusiveRateOfChangeAlarmType_LatchedState_FalseState,18305,Variable
-ExclusiveRateOfChangeAlarmType_Reset,18306,Method
-DiscreteAlarmType_LatchedState,18307,Variable
-DiscreteAlarmType_LatchedState_Id,18308,Variable
-DiscreteAlarmType_LatchedState_Name,18309,Variable
-DiscreteAlarmType_LatchedState_Number,18310,Variable
-DiscreteAlarmType_LatchedState_EffectiveDisplayName,18311,Variable
-DiscreteAlarmType_LatchedState_TransitionTime,18312,Variable
-DiscreteAlarmType_LatchedState_EffectiveTransitionTime,18313,Variable
-DiscreteAlarmType_LatchedState_TrueState,18314,Variable
-DiscreteAlarmType_LatchedState_FalseState,18315,Variable
-DiscreteAlarmType_Reset,18316,Method
-OffNormalAlarmType_LatchedState,18317,Variable
-OffNormalAlarmType_LatchedState_Id,18318,Variable
-OffNormalAlarmType_LatchedState_Name,18319,Variable
-OffNormalAlarmType_LatchedState_Number,18320,Variable
-OffNormalAlarmType_LatchedState_EffectiveDisplayName,18321,Variable
-OffNormalAlarmType_LatchedState_TransitionTime,18322,Variable
-OffNormalAlarmType_LatchedState_EffectiveTransitionTime,18323,Variable
-OffNormalAlarmType_LatchedState_TrueState,18324,Variable
-OffNormalAlarmType_LatchedState_FalseState,18325,Variable
-OffNormalAlarmType_Reset,18326,Method
-SystemOffNormalAlarmType_LatchedState,18327,Variable
-SystemOffNormalAlarmType_LatchedState_Id,18328,Variable
-SystemOffNormalAlarmType_LatchedState_Name,18329,Variable
-SystemOffNormalAlarmType_LatchedState_Number,18330,Variable
-SystemOffNormalAlarmType_LatchedState_EffectiveDisplayName,18331,Variable
-SystemOffNormalAlarmType_LatchedState_TransitionTime,18332,Variable
-SystemOffNormalAlarmType_LatchedState_EffectiveTransitionTime,18333,Variable
-SystemOffNormalAlarmType_LatchedState_TrueState,18334,Variable
-SystemOffNormalAlarmType_LatchedState_FalseState,18335,Variable
-SystemOffNormalAlarmType_Reset,18336,Method
-TripAlarmType_LatchedState,18337,Variable
-TripAlarmType_LatchedState_Id,18338,Variable
-TripAlarmType_LatchedState_Name,18339,Variable
-TripAlarmType_LatchedState_Number,18340,Variable
-TripAlarmType_LatchedState_EffectiveDisplayName,18341,Variable
-TripAlarmType_LatchedState_TransitionTime,18342,Variable
-TripAlarmType_LatchedState_EffectiveTransitionTime,18343,Variable
-TripAlarmType_LatchedState_TrueState,18344,Variable
-TripAlarmType_LatchedState_FalseState,18345,Variable
-TripAlarmType_Reset,18346,Method
-InstrumentDiagnosticAlarmType,18347,ObjectType
-InstrumentDiagnosticAlarmType_EventId,18348,Variable
-InstrumentDiagnosticAlarmType_EventType,18349,Variable
-InstrumentDiagnosticAlarmType_SourceNode,18350,Variable
-InstrumentDiagnosticAlarmType_SourceName,18351,Variable
-InstrumentDiagnosticAlarmType_Time,18352,Variable
-InstrumentDiagnosticAlarmType_ReceiveTime,18353,Variable
-InstrumentDiagnosticAlarmType_LocalTime,18354,Variable
-InstrumentDiagnosticAlarmType_Message,18355,Variable
-InstrumentDiagnosticAlarmType_Severity,18356,Variable
-InstrumentDiagnosticAlarmType_ConditionClassId,18357,Variable
-InstrumentDiagnosticAlarmType_ConditionClassName,18358,Variable
-InstrumentDiagnosticAlarmType_ConditionSubClassId,18359,Variable
-InstrumentDiagnosticAlarmType_ConditionSubClassName,18360,Variable
-InstrumentDiagnosticAlarmType_ConditionName,18361,Variable
-InstrumentDiagnosticAlarmType_BranchId,18362,Variable
-InstrumentDiagnosticAlarmType_Retain,18363,Variable
-InstrumentDiagnosticAlarmType_EnabledState,18364,Variable
-InstrumentDiagnosticAlarmType_EnabledState_Id,18365,Variable
-InstrumentDiagnosticAlarmType_EnabledState_Name,18366,Variable
-InstrumentDiagnosticAlarmType_EnabledState_Number,18367,Variable
-InstrumentDiagnosticAlarmType_EnabledState_EffectiveDisplayName,18368,Variable
-InstrumentDiagnosticAlarmType_EnabledState_TransitionTime,18369,Variable
-InstrumentDiagnosticAlarmType_EnabledState_EffectiveTransitionTime,18370,Variable
-InstrumentDiagnosticAlarmType_EnabledState_TrueState,18371,Variable
-InstrumentDiagnosticAlarmType_EnabledState_FalseState,18372,Variable
-InstrumentDiagnosticAlarmType_Quality,18373,Variable
-InstrumentDiagnosticAlarmType_Quality_SourceTimestamp,18374,Variable
-InstrumentDiagnosticAlarmType_LastSeverity,18375,Variable
-InstrumentDiagnosticAlarmType_LastSeverity_SourceTimestamp,18376,Variable
-InstrumentDiagnosticAlarmType_Comment,18377,Variable
-InstrumentDiagnosticAlarmType_Comment_SourceTimestamp,18378,Variable
-InstrumentDiagnosticAlarmType_ClientUserId,18379,Variable
-InstrumentDiagnosticAlarmType_Disable,18380,Method
-InstrumentDiagnosticAlarmType_Enable,18381,Method
-InstrumentDiagnosticAlarmType_AddComment,18382,Method
-InstrumentDiagnosticAlarmType_AddComment_InputArguments,18383,Variable
-InstrumentDiagnosticAlarmType_ConditionRefresh,18384,Method
-InstrumentDiagnosticAlarmType_ConditionRefresh_InputArguments,18385,Variable
-InstrumentDiagnosticAlarmType_ConditionRefresh2,18386,Method
-InstrumentDiagnosticAlarmType_ConditionRefresh2_InputArguments,18387,Variable
-InstrumentDiagnosticAlarmType_AckedState,18388,Variable
-InstrumentDiagnosticAlarmType_AckedState_Id,18389,Variable
-InstrumentDiagnosticAlarmType_AckedState_Name,18390,Variable
-InstrumentDiagnosticAlarmType_AckedState_Number,18391,Variable
-InstrumentDiagnosticAlarmType_AckedState_EffectiveDisplayName,18392,Variable
-InstrumentDiagnosticAlarmType_AckedState_TransitionTime,18393,Variable
-InstrumentDiagnosticAlarmType_AckedState_EffectiveTransitionTime,18394,Variable
-InstrumentDiagnosticAlarmType_AckedState_TrueState,18395,Variable
-InstrumentDiagnosticAlarmType_AckedState_FalseState,18396,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState,18397,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_Id,18398,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_Name,18399,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_Number,18400,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_EffectiveDisplayName,18401,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_TransitionTime,18402,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_EffectiveTransitionTime,18403,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_TrueState,18404,Variable
-InstrumentDiagnosticAlarmType_ConfirmedState_FalseState,18405,Variable
-InstrumentDiagnosticAlarmType_Acknowledge,18406,Method
-InstrumentDiagnosticAlarmType_Acknowledge_InputArguments,18407,Variable
-InstrumentDiagnosticAlarmType_Confirm,18408,Method
-InstrumentDiagnosticAlarmType_Confirm_InputArguments,18409,Variable
-InstrumentDiagnosticAlarmType_ActiveState,18410,Variable
-InstrumentDiagnosticAlarmType_ActiveState_Id,18411,Variable
-InstrumentDiagnosticAlarmType_ActiveState_Name,18412,Variable
-InstrumentDiagnosticAlarmType_ActiveState_Number,18413,Variable
-InstrumentDiagnosticAlarmType_ActiveState_EffectiveDisplayName,18414,Variable
-InstrumentDiagnosticAlarmType_ActiveState_TransitionTime,18415,Variable
-InstrumentDiagnosticAlarmType_ActiveState_EffectiveTransitionTime,18416,Variable
-InstrumentDiagnosticAlarmType_ActiveState_TrueState,18417,Variable
-InstrumentDiagnosticAlarmType_ActiveState_FalseState,18418,Variable
-InstrumentDiagnosticAlarmType_InputNode,18419,Variable
-InstrumentDiagnosticAlarmType_SuppressedState,18420,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_Id,18421,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_Name,18422,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_Number,18423,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_EffectiveDisplayName,18424,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_TransitionTime,18425,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_EffectiveTransitionTime,18426,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_TrueState,18427,Variable
-InstrumentDiagnosticAlarmType_SuppressedState_FalseState,18428,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState,18429,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_Id,18430,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_Name,18431,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_Number,18432,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_EffectiveDisplayName,18433,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_TransitionTime,18434,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_EffectiveTransitionTime,18435,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_TrueState,18436,Variable
-InstrumentDiagnosticAlarmType_OutOfServiceState_FalseState,18437,Variable
-InstrumentDiagnosticAlarmType_ShelvingState,18438,Object
-InstrumentDiagnosticAlarmType_ShelvingState_CurrentState,18439,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_Id,18440,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_Name,18441,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_Number,18442,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,18443,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_LastTransition,18444,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_Id,18445,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_Name,18446,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_Number,18447,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_TransitionTime,18448,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,18449,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_AvailableStates,18450,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_AvailableTransitions,18451,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_UnshelveTime,18452,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_TimedShelve,18453,Method
-InstrumentDiagnosticAlarmType_ShelvingState_TimedShelve_InputArguments,18454,Variable
-InstrumentDiagnosticAlarmType_ShelvingState_Unshelve,18455,Method
-InstrumentDiagnosticAlarmType_ShelvingState_OneShotShelve,18456,Method
-InstrumentDiagnosticAlarmType_SuppressedOrShelved,18457,Variable
-InstrumentDiagnosticAlarmType_MaxTimeShelved,18458,Variable
-InstrumentDiagnosticAlarmType_AudibleEnabled,18459,Variable
-InstrumentDiagnosticAlarmType_AudibleSound,18460,Variable
-InstrumentDiagnosticAlarmType_AudibleSound_ListId,18461,Variable
-InstrumentDiagnosticAlarmType_AudibleSound_AgencyId,18462,Variable
-InstrumentDiagnosticAlarmType_AudibleSound_VersionId,18463,Variable
-InstrumentDiagnosticAlarmType_SilenceState,18464,Variable
-InstrumentDiagnosticAlarmType_SilenceState_Id,18465,Variable
-InstrumentDiagnosticAlarmType_SilenceState_Name,18466,Variable
-InstrumentDiagnosticAlarmType_SilenceState_Number,18467,Variable
-InstrumentDiagnosticAlarmType_SilenceState_EffectiveDisplayName,18468,Variable
-InstrumentDiagnosticAlarmType_SilenceState_TransitionTime,18469,Variable
-InstrumentDiagnosticAlarmType_SilenceState_EffectiveTransitionTime,18470,Variable
-InstrumentDiagnosticAlarmType_SilenceState_TrueState,18471,Variable
-InstrumentDiagnosticAlarmType_SilenceState_FalseState,18472,Variable
-InstrumentDiagnosticAlarmType_OnDelay,18473,Variable
-InstrumentDiagnosticAlarmType_OffDelay,18474,Variable
-InstrumentDiagnosticAlarmType_FirstInGroupFlag,18475,Variable
-InstrumentDiagnosticAlarmType_FirstInGroup,18476,Object
-InstrumentDiagnosticAlarmType_LatchedState,18477,Variable
-InstrumentDiagnosticAlarmType_LatchedState_Id,18478,Variable
-InstrumentDiagnosticAlarmType_LatchedState_Name,18479,Variable
-InstrumentDiagnosticAlarmType_LatchedState_Number,18480,Variable
-InstrumentDiagnosticAlarmType_LatchedState_EffectiveDisplayName,18481,Variable
-InstrumentDiagnosticAlarmType_LatchedState_TransitionTime,18482,Variable
-InstrumentDiagnosticAlarmType_LatchedState_EffectiveTransitionTime,18483,Variable
-InstrumentDiagnosticAlarmType_LatchedState_TrueState,18484,Variable
-InstrumentDiagnosticAlarmType_LatchedState_FalseState,18485,Variable
-InstrumentDiagnosticAlarmType_AlarmGroup_Placeholder,18486,Object
-InstrumentDiagnosticAlarmType_ReAlarmTime,18487,Variable
-InstrumentDiagnosticAlarmType_ReAlarmRepeatCount,18488,Variable
-InstrumentDiagnosticAlarmType_Silence,18489,Method
-InstrumentDiagnosticAlarmType_Suppress,18490,Method
-InstrumentDiagnosticAlarmType_Unsuppress,18491,Method
-InstrumentDiagnosticAlarmType_RemoveFromService,18492,Method
-InstrumentDiagnosticAlarmType_PlaceInService,18493,Method
-InstrumentDiagnosticAlarmType_Reset,18494,Method
-InstrumentDiagnosticAlarmType_NormalState,18495,Variable
-SystemDiagnosticAlarmType,18496,ObjectType
-SystemDiagnosticAlarmType_EventId,18497,Variable
-SystemDiagnosticAlarmType_EventType,18498,Variable
-SystemDiagnosticAlarmType_SourceNode,18499,Variable
-SystemDiagnosticAlarmType_SourceName,18500,Variable
-SystemDiagnosticAlarmType_Time,18501,Variable
-SystemDiagnosticAlarmType_ReceiveTime,18502,Variable
-SystemDiagnosticAlarmType_LocalTime,18503,Variable
-SystemDiagnosticAlarmType_Message,18504,Variable
-SystemDiagnosticAlarmType_Severity,18505,Variable
-SystemDiagnosticAlarmType_ConditionClassId,18506,Variable
-SystemDiagnosticAlarmType_ConditionClassName,18507,Variable
-SystemDiagnosticAlarmType_ConditionSubClassId,18508,Variable
-SystemDiagnosticAlarmType_ConditionSubClassName,18509,Variable
-SystemDiagnosticAlarmType_ConditionName,18510,Variable
-SystemDiagnosticAlarmType_BranchId,18511,Variable
-SystemDiagnosticAlarmType_Retain,18512,Variable
-SystemDiagnosticAlarmType_EnabledState,18513,Variable
-SystemDiagnosticAlarmType_EnabledState_Id,18514,Variable
-SystemDiagnosticAlarmType_EnabledState_Name,18515,Variable
-SystemDiagnosticAlarmType_EnabledState_Number,18516,Variable
-SystemDiagnosticAlarmType_EnabledState_EffectiveDisplayName,18517,Variable
-SystemDiagnosticAlarmType_EnabledState_TransitionTime,18518,Variable
-SystemDiagnosticAlarmType_EnabledState_EffectiveTransitionTime,18519,Variable
-SystemDiagnosticAlarmType_EnabledState_TrueState,18520,Variable
-SystemDiagnosticAlarmType_EnabledState_FalseState,18521,Variable
-SystemDiagnosticAlarmType_Quality,18522,Variable
-SystemDiagnosticAlarmType_Quality_SourceTimestamp,18523,Variable
-SystemDiagnosticAlarmType_LastSeverity,18524,Variable
-SystemDiagnosticAlarmType_LastSeverity_SourceTimestamp,18525,Variable
-SystemDiagnosticAlarmType_Comment,18526,Variable
-SystemDiagnosticAlarmType_Comment_SourceTimestamp,18527,Variable
-SystemDiagnosticAlarmType_ClientUserId,18528,Variable
-SystemDiagnosticAlarmType_Disable,18529,Method
-SystemDiagnosticAlarmType_Enable,18530,Method
-SystemDiagnosticAlarmType_AddComment,18531,Method
-SystemDiagnosticAlarmType_AddComment_InputArguments,18532,Variable
-SystemDiagnosticAlarmType_ConditionRefresh,18533,Method
-SystemDiagnosticAlarmType_ConditionRefresh_InputArguments,18534,Variable
-SystemDiagnosticAlarmType_ConditionRefresh2,18535,Method
-SystemDiagnosticAlarmType_ConditionRefresh2_InputArguments,18536,Variable
-SystemDiagnosticAlarmType_AckedState,18537,Variable
-SystemDiagnosticAlarmType_AckedState_Id,18538,Variable
-SystemDiagnosticAlarmType_AckedState_Name,18539,Variable
-SystemDiagnosticAlarmType_AckedState_Number,18540,Variable
-SystemDiagnosticAlarmType_AckedState_EffectiveDisplayName,18541,Variable
-SystemDiagnosticAlarmType_AckedState_TransitionTime,18542,Variable
-SystemDiagnosticAlarmType_AckedState_EffectiveTransitionTime,18543,Variable
-SystemDiagnosticAlarmType_AckedState_TrueState,18544,Variable
-SystemDiagnosticAlarmType_AckedState_FalseState,18545,Variable
-SystemDiagnosticAlarmType_ConfirmedState,18546,Variable
-SystemDiagnosticAlarmType_ConfirmedState_Id,18547,Variable
-SystemDiagnosticAlarmType_ConfirmedState_Name,18548,Variable
-SystemDiagnosticAlarmType_ConfirmedState_Number,18549,Variable
-SystemDiagnosticAlarmType_ConfirmedState_EffectiveDisplayName,18550,Variable
-SystemDiagnosticAlarmType_ConfirmedState_TransitionTime,18551,Variable
-SystemDiagnosticAlarmType_ConfirmedState_EffectiveTransitionTime,18552,Variable
-SystemDiagnosticAlarmType_ConfirmedState_TrueState,18553,Variable
-SystemDiagnosticAlarmType_ConfirmedState_FalseState,18554,Variable
-SystemDiagnosticAlarmType_Acknowledge,18555,Method
-SystemDiagnosticAlarmType_Acknowledge_InputArguments,18556,Variable
-SystemDiagnosticAlarmType_Confirm,18557,Method
-SystemDiagnosticAlarmType_Confirm_InputArguments,18558,Variable
-SystemDiagnosticAlarmType_ActiveState,18559,Variable
-SystemDiagnosticAlarmType_ActiveState_Id,18560,Variable
-SystemDiagnosticAlarmType_ActiveState_Name,18561,Variable
-SystemDiagnosticAlarmType_ActiveState_Number,18562,Variable
-SystemDiagnosticAlarmType_ActiveState_EffectiveDisplayName,18563,Variable
-SystemDiagnosticAlarmType_ActiveState_TransitionTime,18564,Variable
-SystemDiagnosticAlarmType_ActiveState_EffectiveTransitionTime,18565,Variable
-SystemDiagnosticAlarmType_ActiveState_TrueState,18566,Variable
-SystemDiagnosticAlarmType_ActiveState_FalseState,18567,Variable
-SystemDiagnosticAlarmType_InputNode,18568,Variable
-SystemDiagnosticAlarmType_SuppressedState,18569,Variable
-SystemDiagnosticAlarmType_SuppressedState_Id,18570,Variable
-SystemDiagnosticAlarmType_SuppressedState_Name,18571,Variable
-SystemDiagnosticAlarmType_SuppressedState_Number,18572,Variable
-SystemDiagnosticAlarmType_SuppressedState_EffectiveDisplayName,18573,Variable
-SystemDiagnosticAlarmType_SuppressedState_TransitionTime,18574,Variable
-SystemDiagnosticAlarmType_SuppressedState_EffectiveTransitionTime,18575,Variable
-SystemDiagnosticAlarmType_SuppressedState_TrueState,18576,Variable
-SystemDiagnosticAlarmType_SuppressedState_FalseState,18577,Variable
-SystemDiagnosticAlarmType_OutOfServiceState,18578,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_Id,18579,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_Name,18580,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_Number,18581,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_EffectiveDisplayName,18582,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_TransitionTime,18583,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_EffectiveTransitionTime,18584,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_TrueState,18585,Variable
-SystemDiagnosticAlarmType_OutOfServiceState_FalseState,18586,Variable
-SystemDiagnosticAlarmType_ShelvingState,18587,Object
-SystemDiagnosticAlarmType_ShelvingState_CurrentState,18588,Variable
-SystemDiagnosticAlarmType_ShelvingState_CurrentState_Id,18589,Variable
-SystemDiagnosticAlarmType_ShelvingState_CurrentState_Name,18590,Variable
-SystemDiagnosticAlarmType_ShelvingState_CurrentState_Number,18591,Variable
-SystemDiagnosticAlarmType_ShelvingState_CurrentState_EffectiveDisplayName,18592,Variable
-SystemDiagnosticAlarmType_ShelvingState_LastTransition,18593,Variable
-SystemDiagnosticAlarmType_ShelvingState_LastTransition_Id,18594,Variable
-SystemDiagnosticAlarmType_ShelvingState_LastTransition_Name,18595,Variable
-SystemDiagnosticAlarmType_ShelvingState_LastTransition_Number,18596,Variable
-SystemDiagnosticAlarmType_ShelvingState_LastTransition_TransitionTime,18597,Variable
-SystemDiagnosticAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime,18598,Variable
-SystemDiagnosticAlarmType_ShelvingState_AvailableStates,18599,Variable
-SystemDiagnosticAlarmType_ShelvingState_AvailableTransitions,18600,Variable
-SystemDiagnosticAlarmType_ShelvingState_UnshelveTime,18601,Variable
-SystemDiagnosticAlarmType_ShelvingState_TimedShelve,18602,Method
-SystemDiagnosticAlarmType_ShelvingState_TimedShelve_InputArguments,18603,Variable
-SystemDiagnosticAlarmType_ShelvingState_Unshelve,18604,Method
-SystemDiagnosticAlarmType_ShelvingState_OneShotShelve,18605,Method
-SystemDiagnosticAlarmType_SuppressedOrShelved,18606,Variable
-SystemDiagnosticAlarmType_MaxTimeShelved,18607,Variable
-SystemDiagnosticAlarmType_AudibleEnabled,18608,Variable
-SystemDiagnosticAlarmType_AudibleSound,18609,Variable
-SystemDiagnosticAlarmType_AudibleSound_ListId,18610,Variable
-SystemDiagnosticAlarmType_AudibleSound_AgencyId,18611,Variable
-SystemDiagnosticAlarmType_AudibleSound_VersionId,18612,Variable
-SystemDiagnosticAlarmType_SilenceState,18613,Variable
-SystemDiagnosticAlarmType_SilenceState_Id,18614,Variable
-SystemDiagnosticAlarmType_SilenceState_Name,18615,Variable
-SystemDiagnosticAlarmType_SilenceState_Number,18616,Variable
-SystemDiagnosticAlarmType_SilenceState_EffectiveDisplayName,18617,Variable
-SystemDiagnosticAlarmType_SilenceState_TransitionTime,18618,Variable
-SystemDiagnosticAlarmType_SilenceState_EffectiveTransitionTime,18619,Variable
-SystemDiagnosticAlarmType_SilenceState_TrueState,18620,Variable
-SystemDiagnosticAlarmType_SilenceState_FalseState,18621,Variable
-SystemDiagnosticAlarmType_OnDelay,18622,Variable
-SystemDiagnosticAlarmType_OffDelay,18623,Variable
-SystemDiagnosticAlarmType_FirstInGroupFlag,18624,Variable
-SystemDiagnosticAlarmType_FirstInGroup,18625,Object
-SystemDiagnosticAlarmType_LatchedState,18626,Variable
-SystemDiagnosticAlarmType_LatchedState_Id,18627,Variable
-SystemDiagnosticAlarmType_LatchedState_Name,18628,Variable
-SystemDiagnosticAlarmType_LatchedState_Number,18629,Variable
-SystemDiagnosticAlarmType_LatchedState_EffectiveDisplayName,18630,Variable
-SystemDiagnosticAlarmType_LatchedState_TransitionTime,18631,Variable
-SystemDiagnosticAlarmType_LatchedState_EffectiveTransitionTime,18632,Variable
-SystemDiagnosticAlarmType_LatchedState_TrueState,18633,Variable
-SystemDiagnosticAlarmType_LatchedState_FalseState,18634,Variable
-SystemDiagnosticAlarmType_AlarmGroup_Placeholder,18635,Object
-SystemDiagnosticAlarmType_ReAlarmTime,18636,Variable
-SystemDiagnosticAlarmType_ReAlarmRepeatCount,18637,Variable
-SystemDiagnosticAlarmType_Silence,18638,Method
-SystemDiagnosticAlarmType_Suppress,18639,Method
-SystemDiagnosticAlarmType_Unsuppress,18640,Method
-SystemDiagnosticAlarmType_RemoveFromService,18641,Method
-SystemDiagnosticAlarmType_PlaceInService,18642,Method
-SystemDiagnosticAlarmType_Reset,18643,Method
-SystemDiagnosticAlarmType_NormalState,18644,Variable
-CertificateExpirationAlarmType_LatchedState,18645,Variable
-CertificateExpirationAlarmType_LatchedState_Id,18646,Variable
-CertificateExpirationAlarmType_LatchedState_Name,18647,Variable
-CertificateExpirationAlarmType_LatchedState_Number,18648,Variable
-CertificateExpirationAlarmType_LatchedState_EffectiveDisplayName,18649,Variable
-CertificateExpirationAlarmType_LatchedState_TransitionTime,18650,Variable
-CertificateExpirationAlarmType_LatchedState_EffectiveTransitionTime,18651,Variable
-CertificateExpirationAlarmType_LatchedState_TrueState,18652,Variable
-CertificateExpirationAlarmType_LatchedState_FalseState,18653,Variable
-CertificateExpirationAlarmType_Reset,18654,Method
-DiscrepancyAlarmType_LatchedState,18655,Variable
-DiscrepancyAlarmType_LatchedState_Id,18656,Variable
-DiscrepancyAlarmType_LatchedState_Name,18657,Variable
-DiscrepancyAlarmType_LatchedState_Number,18658,Variable
-DiscrepancyAlarmType_LatchedState_EffectiveDisplayName,18659,Variable
-DiscrepancyAlarmType_LatchedState_TransitionTime,18660,Variable
-DiscrepancyAlarmType_LatchedState_EffectiveTransitionTime,18661,Variable
-DiscrepancyAlarmType_LatchedState_TrueState,18662,Variable
-DiscrepancyAlarmType_LatchedState_FalseState,18663,Variable
-DiscrepancyAlarmType_Reset,18664,Method
-StatisticalConditionClassType,18665,ObjectType
-AlarmMetricsType_Reset,18666,Method
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics,18667,Object
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_DiagnosticsLevel,18668,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalInformation,18669,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalInformation_Active,18670,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalInformation_Classification,18671,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,18672,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,18673,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalError,18674,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalError_Active,18675,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalError_Classification,18676,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,18677,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_TotalError_TimeFirstChange,18678,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Reset,18679,Method
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_SubError,18680,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters,18681,Object
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateError,18682,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateError_Active,18683,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateError_Classification,18684,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,18685,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,18686,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,18687,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,18688,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,18689,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,18690,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,18691,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent,18692,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,18693,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,18694,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,18695,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,18696,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError,18697,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,18698,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,18699,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,18700,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,18701,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent,18702,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,18703,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,18704,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,18705,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,18706,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,18707,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,18708,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,18709,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,18710,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,18711,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_LiveValues,18712,Object
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_LiveValues_ResolvedAddress,18713,Variable
-PublishSubscribeType_ConnectionName_Placeholder_Diagnostics_LiveValues_ResolvedAddress_DiagnosticsLevel,18714,Variable
-PublishSubscribeType_Diagnostics,18715,Object
-PublishSubscribeType_Diagnostics_DiagnosticsLevel,18716,Variable
-PublishSubscribeType_Diagnostics_TotalInformation,18717,Variable
-PublishSubscribeType_Diagnostics_TotalInformation_Active,18718,Variable
-PublishSubscribeType_Diagnostics_TotalInformation_Classification,18719,Variable
-PublishSubscribeType_Diagnostics_TotalInformation_DiagnosticsLevel,18720,Variable
-PublishSubscribeType_Diagnostics_TotalInformation_TimeFirstChange,18721,Variable
-PublishSubscribeType_Diagnostics_TotalError,18722,Variable
-PublishSubscribeType_Diagnostics_TotalError_Active,18723,Variable
-PublishSubscribeType_Diagnostics_TotalError_Classification,18724,Variable
-PublishSubscribeType_Diagnostics_TotalError_DiagnosticsLevel,18725,Variable
-PublishSubscribeType_Diagnostics_TotalError_TimeFirstChange,18726,Variable
-PublishSubscribeType_Diagnostics_Reset,18727,Method
-PublishSubscribeType_Diagnostics_SubError,18728,Variable
-PublishSubscribeType_Diagnostics_Counters,18729,Object
-PublishSubscribeType_Diagnostics_Counters_StateError,18730,Variable
-PublishSubscribeType_Diagnostics_Counters_StateError_Active,18731,Variable
-PublishSubscribeType_Diagnostics_Counters_StateError_Classification,18732,Variable
-PublishSubscribeType_Diagnostics_Counters_StateError_DiagnosticsLevel,18733,Variable
-PublishSubscribeType_Diagnostics_Counters_StateError_TimeFirstChange,18734,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByMethod,18735,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByMethod_Active,18736,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByMethod_Classification,18737,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,18738,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,18739,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByParent,18740,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByParent_Active,18741,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByParent_Classification,18742,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,18743,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,18744,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalFromError,18745,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalFromError_Active,18746,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalFromError_Classification,18747,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,18748,Variable
-PublishSubscribeType_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,18749,Variable
-PublishSubscribeType_Diagnostics_Counters_StatePausedByParent,18750,Variable
-PublishSubscribeType_Diagnostics_Counters_StatePausedByParent_Active,18751,Variable
-PublishSubscribeType_Diagnostics_Counters_StatePausedByParent_Classification,18752,Variable
-PublishSubscribeType_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,18753,Variable
-PublishSubscribeType_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,18754,Variable
-PublishSubscribeType_Diagnostics_Counters_StateDisabledByMethod,18755,Variable
-PublishSubscribeType_Diagnostics_Counters_StateDisabledByMethod_Active,18756,Variable
-PublishSubscribeType_Diagnostics_Counters_StateDisabledByMethod_Classification,18757,Variable
-PublishSubscribeType_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,18758,Variable
-PublishSubscribeType_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,18759,Variable
-PublishSubscribeType_Diagnostics_LiveValues,18760,Object
-PublishSubscribeType_Diagnostics_LiveValues_ConfiguredDataSetWriters,18761,Variable
-PublishSubscribeType_Diagnostics_LiveValues_ConfiguredDataSetWriters_DiagnosticsLevel,18762,Variable
-PublishSubscribeType_Diagnostics_LiveValues_ConfiguredDataSetReaders,18763,Variable
-PublishSubscribeType_Diagnostics_LiveValues_ConfiguredDataSetReaders_DiagnosticsLevel,18764,Variable
-PublishSubscribeType_Diagnostics_LiveValues_OperationalDataSetWriters,18765,Variable
-PublishSubscribeType_Diagnostics_LiveValues_OperationalDataSetWriters_DiagnosticsLevel,18766,Variable
-PublishSubscribeType_Diagnostics_LiveValues_OperationalDataSetReaders,18767,Variable
-PublishSubscribeType_Diagnostics_LiveValues_OperationalDataSetReaders_DiagnosticsLevel,18768,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics,18871,Object
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_DiagnosticsLevel,18872,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation,18873,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Active,18874,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Classification,18875,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,18876,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,18877,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalError,18878,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Active,18879,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Classification,18880,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,18881,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_TotalError_TimeFirstChange,18882,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Reset,18883,Method
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_SubError,18884,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters,18885,Object
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError,18886,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Active,18887,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Classification,18888,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,18889,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,18890,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,18891,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,18892,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,18893,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,18894,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,18895,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent,18896,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,18897,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,18898,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,18899,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,18900,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError,18901,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,18902,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,18903,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,18904,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,18905,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent,18906,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,18907,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,18908,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,18909,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,18910,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,18911,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,18912,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,18913,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,18914,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,18915,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues,18916,Object
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages,18917,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Active,18918,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Classification,18919,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,18920,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,18921,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber,18922,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,18923,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode,18924,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,18925,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion,18926,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,18927,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion,18928,Variable
-PublishedDataSetType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,18929,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics,18930,Object
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_DiagnosticsLevel,18931,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation,18932,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Active,18933,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Classification,18934,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,18935,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,18936,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalError,18937,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Active,18938,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Classification,18939,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,18940,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_TimeFirstChange,18941,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Reset,18942,Method
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_SubError,18943,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters,18944,Object
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError,18945,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Active,18946,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Classification,18947,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,18948,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,18949,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,18950,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,18951,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,18952,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,18953,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,18954,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent,18955,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,18956,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,18957,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,18958,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,18959,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError,18960,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,18961,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,18962,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,18963,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,18964,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent,18965,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,18966,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,18967,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,18968,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,18969,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,18970,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,18971,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,18972,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,18973,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,18974,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues,18975,Object
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages,18976,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Active,18977,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Classification,18978,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,18979,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,18980,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber,18981,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,18982,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode,18983,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,18984,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion,18985,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,18986,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion,18987,Variable
-PublishedDataItemsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,18988,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics,18989,Object
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_DiagnosticsLevel,18990,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation,18991,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Active,18992,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_Classification,18993,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,18994,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,18995,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalError,18996,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Active,18997,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_Classification,18998,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,18999,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_TotalError_TimeFirstChange,19000,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Reset,19001,Method
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_SubError,19002,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters,19003,Object
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError,19004,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Active,19005,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_Classification,19006,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,19007,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,19008,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,19009,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,19010,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,19011,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,19012,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,19013,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent,19014,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,19015,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,19016,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,19017,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,19018,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError,19019,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,19020,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,19021,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,19022,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,19023,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent,19024,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,19025,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,19026,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,19027,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,19028,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,19029,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,19030,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,19031,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,19032,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,19033,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues,19034,Object
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages,19035,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Active,19036,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_Classification,19037,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,19038,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,19039,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber,19040,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,19041,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode,19042,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,19043,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion,19044,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,19045,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion,19046,Variable
-PublishedEventsType_DataSetWriterName_Placeholder_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,19047,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics,19107,Object
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_DiagnosticsLevel,19108,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalInformation,19109,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalInformation_Active,19110,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalInformation_Classification,19111,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,19112,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,19113,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalError,19114,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalError_Active,19115,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalError_Classification,19116,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,19117,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_TotalError_TimeFirstChange,19118,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Reset,19119,Method
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_SubError,19120,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters,19121,Object
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateError,19122,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateError_Active,19123,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateError_Classification,19124,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,19125,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,19126,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,19127,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,19128,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,19129,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,19130,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,19131,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent,19132,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,19133,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,19134,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,19135,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,19136,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError,19137,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,19138,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,19139,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,19140,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,19141,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent,19142,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,19143,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,19144,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,19145,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,19146,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,19147,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,19148,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,19149,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,19150,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,19151,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues,19152,Object
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_SentNetworkMessages,19153,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_SentNetworkMessages_Active,19154,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_SentNetworkMessages_Classification,19155,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_SentNetworkMessages_DiagnosticsLevel,19156,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_SentNetworkMessages_TimeFirstChange,19157,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_FailedTransmissions,19158,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_FailedTransmissions_Active,19159,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_FailedTransmissions_Classification,19160,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_FailedTransmissions_DiagnosticsLevel,19161,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_FailedTransmissions_TimeFirstChange,19162,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_EncryptionErrors,19163,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_EncryptionErrors_Active,19164,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_EncryptionErrors_Classification,19165,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_EncryptionErrors_DiagnosticsLevel,19166,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_Counters_EncryptionErrors_TimeFirstChange,19167,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_ConfiguredDataSetWriters,19168,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_ConfiguredDataSetWriters_DiagnosticsLevel,19169,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_OperationalDataSetWriters,19170,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_OperationalDataSetWriters_DiagnosticsLevel,19171,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_SecurityTokenID,19172,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_SecurityTokenID_DiagnosticsLevel,19173,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_TimeToNextTokenID,19174,Variable
-PubSubConnectionType_WriterGroupName_Placeholder_Diagnostics_LiveValues_TimeToNextTokenID_DiagnosticsLevel,19175,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics,19176,Object
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_DiagnosticsLevel,19177,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalInformation,19178,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalInformation_Active,19179,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalInformation_Classification,19180,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalInformation_DiagnosticsLevel,19181,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalInformation_TimeFirstChange,19182,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalError,19183,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalError_Active,19184,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalError_Classification,19185,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalError_DiagnosticsLevel,19186,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_TotalError_TimeFirstChange,19187,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Reset,19188,Method
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_SubError,19189,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters,19190,Object
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateError,19191,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateError_Active,19192,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateError_Classification,19193,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateError_DiagnosticsLevel,19194,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateError_TimeFirstChange,19195,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod,19196,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Active,19197,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_Classification,19198,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,19199,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,19200,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent,19201,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Active,19202,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_Classification,19203,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,19204,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,19205,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError,19206,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Active,19207,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_Classification,19208,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,19209,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,19210,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent,19211,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_Active,19212,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_Classification,19213,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,19214,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,19215,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod,19216,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Active,19217,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_Classification,19218,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,19219,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,19220,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_LiveValues,19221,Object
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedNetworkMessages,19222,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedNetworkMessages_Active,19223,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedNetworkMessages_Classification,19224,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedNetworkMessages_DiagnosticsLevel,19225,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedNetworkMessages_TimeFirstChange,19226,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedInvalidNetworkMessages,19227,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedInvalidNetworkMessages_Active,19228,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedInvalidNetworkMessages_Classification,19229,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedInvalidNetworkMessages_DiagnosticsLevel,19230,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_ReceivedInvalidNetworkMessages_TimeFirstChange,19231,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_DecryptionErrors,19232,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_DecryptionErrors_Active,19233,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_DecryptionErrors_Classification,19234,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_DecryptionErrors_DiagnosticsLevel,19235,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_Counters_DecryptionErrors_TimeFirstChange,19236,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_LiveValues_ConfiguredDataSetReaders,19237,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_LiveValues_ConfiguredDataSetReaders_DiagnosticsLevel,19238,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_LiveValues_OperationalDataSetReaders,19239,Variable
-PubSubConnectionType_ReaderGroupName_Placeholder_Diagnostics_LiveValues_OperationalDataSetReaders_DiagnosticsLevel,19240,Variable
-PubSubConnectionType_Diagnostics,19241,Object
-PubSubConnectionType_Diagnostics_DiagnosticsLevel,19242,Variable
-PubSubConnectionType_Diagnostics_TotalInformation,19243,Variable
-PubSubConnectionType_Diagnostics_TotalInformation_Active,19244,Variable
-PubSubConnectionType_Diagnostics_TotalInformation_Classification,19245,Variable
-PubSubConnectionType_Diagnostics_TotalInformation_DiagnosticsLevel,19246,Variable
-PubSubConnectionType_Diagnostics_TotalInformation_TimeFirstChange,19247,Variable
-PubSubConnectionType_Diagnostics_TotalError,19248,Variable
-PubSubConnectionType_Diagnostics_TotalError_Active,19249,Variable
-PubSubConnectionType_Diagnostics_TotalError_Classification,19250,Variable
-PubSubConnectionType_Diagnostics_TotalError_DiagnosticsLevel,19251,Variable
-PubSubConnectionType_Diagnostics_TotalError_TimeFirstChange,19252,Variable
-PubSubConnectionType_Diagnostics_Reset,19253,Method
-PubSubConnectionType_Diagnostics_SubError,19254,Variable
-PubSubConnectionType_Diagnostics_Counters,19255,Object
-PubSubConnectionType_Diagnostics_Counters_StateError,19256,Variable
-PubSubConnectionType_Diagnostics_Counters_StateError_Active,19257,Variable
-PubSubConnectionType_Diagnostics_Counters_StateError_Classification,19258,Variable
-PubSubConnectionType_Diagnostics_Counters_StateError_DiagnosticsLevel,19259,Variable
-PubSubConnectionType_Diagnostics_Counters_StateError_TimeFirstChange,19260,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByMethod,19261,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByMethod_Active,19262,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByMethod_Classification,19263,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,19264,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,19265,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByParent,19266,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByParent_Active,19267,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByParent_Classification,19268,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,19269,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,19270,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalFromError,19271,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalFromError_Active,19272,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalFromError_Classification,19273,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,19274,Variable
-PubSubConnectionType_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,19275,Variable
-PubSubConnectionType_Diagnostics_Counters_StatePausedByParent,19276,Variable
-PubSubConnectionType_Diagnostics_Counters_StatePausedByParent_Active,19277,Variable
-PubSubConnectionType_Diagnostics_Counters_StatePausedByParent_Classification,19278,Variable
-PubSubConnectionType_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,19279,Variable
-PubSubConnectionType_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,19280,Variable
-PubSubConnectionType_Diagnostics_Counters_StateDisabledByMethod,19281,Variable
-PubSubConnectionType_Diagnostics_Counters_StateDisabledByMethod_Active,19282,Variable
-PubSubConnectionType_Diagnostics_Counters_StateDisabledByMethod_Classification,19283,Variable
-PubSubConnectionType_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,19284,Variable
-PubSubConnectionType_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,19285,Variable
-PubSubConnectionType_Diagnostics_LiveValues,19286,Object
-PubSubConnectionType_Diagnostics_LiveValues_ResolvedAddress,19287,Variable
-PubSubConnectionType_Diagnostics_LiveValues_ResolvedAddress_DiagnosticsLevel,19288,Variable
-DataSetWriterType_Diagnostics,19550,Object
-DataSetWriterType_Diagnostics_DiagnosticsLevel,19551,Variable
-DataSetWriterType_Diagnostics_TotalInformation,19552,Variable
-DataSetWriterType_Diagnostics_TotalInformation_Active,19553,Variable
-DataSetWriterType_Diagnostics_TotalInformation_Classification,19554,Variable
-DataSetWriterType_Diagnostics_TotalInformation_DiagnosticsLevel,19555,Variable
-DataSetWriterType_Diagnostics_TotalInformation_TimeFirstChange,19556,Variable
-DataSetWriterType_Diagnostics_TotalError,19557,Variable
-DataSetWriterType_Diagnostics_TotalError_Active,19558,Variable
-DataSetWriterType_Diagnostics_TotalError_Classification,19559,Variable
-DataSetWriterType_Diagnostics_TotalError_DiagnosticsLevel,19560,Variable
-DataSetWriterType_Diagnostics_TotalError_TimeFirstChange,19561,Variable
-DataSetWriterType_Diagnostics_Reset,19562,Method
-DataSetWriterType_Diagnostics_SubError,19563,Variable
-DataSetWriterType_Diagnostics_Counters,19564,Object
-DataSetWriterType_Diagnostics_Counters_StateError,19565,Variable
-DataSetWriterType_Diagnostics_Counters_StateError_Active,19566,Variable
-DataSetWriterType_Diagnostics_Counters_StateError_Classification,19567,Variable
-DataSetWriterType_Diagnostics_Counters_StateError_DiagnosticsLevel,19568,Variable
-DataSetWriterType_Diagnostics_Counters_StateError_TimeFirstChange,19569,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByMethod,19570,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByMethod_Active,19571,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByMethod_Classification,19572,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,19573,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,19574,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByParent,19575,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByParent_Active,19576,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByParent_Classification,19577,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,19578,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,19579,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalFromError,19580,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalFromError_Active,19581,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalFromError_Classification,19582,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,19583,Variable
-DataSetWriterType_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,19584,Variable
-DataSetWriterType_Diagnostics_Counters_StatePausedByParent,19585,Variable
-DataSetWriterType_Diagnostics_Counters_StatePausedByParent_Active,19586,Variable
-DataSetWriterType_Diagnostics_Counters_StatePausedByParent_Classification,19587,Variable
-DataSetWriterType_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,19588,Variable
-DataSetWriterType_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,19589,Variable
-DataSetWriterType_Diagnostics_Counters_StateDisabledByMethod,19590,Variable
-DataSetWriterType_Diagnostics_Counters_StateDisabledByMethod_Active,19591,Variable
-DataSetWriterType_Diagnostics_Counters_StateDisabledByMethod_Classification,19592,Variable
-DataSetWriterType_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,19593,Variable
-DataSetWriterType_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,19594,Variable
-DataSetWriterType_Diagnostics_LiveValues,19595,Object
-DataSetWriterType_Diagnostics_Counters_FailedDataSetMessages,19596,Variable
-DataSetWriterType_Diagnostics_Counters_FailedDataSetMessages_Active,19597,Variable
-DataSetWriterType_Diagnostics_Counters_FailedDataSetMessages_Classification,19598,Variable
-DataSetWriterType_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,19599,Variable
-DataSetWriterType_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,19600,Variable
-DataSetWriterType_Diagnostics_LiveValues_MessageSequenceNumber,19601,Variable
-DataSetWriterType_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,19602,Variable
-DataSetWriterType_Diagnostics_LiveValues_StatusCode,19603,Variable
-DataSetWriterType_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,19604,Variable
-DataSetWriterType_Diagnostics_LiveValues_MajorVersion,19605,Variable
-DataSetWriterType_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,19606,Variable
-DataSetWriterType_Diagnostics_LiveValues_MinorVersion,19607,Variable
-DataSetWriterType_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,19608,Variable
-DataSetReaderType_Diagnostics,19609,Object
-DataSetReaderType_Diagnostics_DiagnosticsLevel,19610,Variable
-DataSetReaderType_Diagnostics_TotalInformation,19611,Variable
-DataSetReaderType_Diagnostics_TotalInformation_Active,19612,Variable
-DataSetReaderType_Diagnostics_TotalInformation_Classification,19613,Variable
-DataSetReaderType_Diagnostics_TotalInformation_DiagnosticsLevel,19614,Variable
-DataSetReaderType_Diagnostics_TotalInformation_TimeFirstChange,19615,Variable
-DataSetReaderType_Diagnostics_TotalError,19616,Variable
-DataSetReaderType_Diagnostics_TotalError_Active,19617,Variable
-DataSetReaderType_Diagnostics_TotalError_Classification,19618,Variable
-DataSetReaderType_Diagnostics_TotalError_DiagnosticsLevel,19619,Variable
-DataSetReaderType_Diagnostics_TotalError_TimeFirstChange,19620,Variable
-DataSetReaderType_Diagnostics_Reset,19621,Method
-DataSetReaderType_Diagnostics_SubError,19622,Variable
-DataSetReaderType_Diagnostics_Counters,19623,Object
-DataSetReaderType_Diagnostics_Counters_StateError,19624,Variable
-DataSetReaderType_Diagnostics_Counters_StateError_Active,19625,Variable
-DataSetReaderType_Diagnostics_Counters_StateError_Classification,19626,Variable
-DataSetReaderType_Diagnostics_Counters_StateError_DiagnosticsLevel,19627,Variable
-DataSetReaderType_Diagnostics_Counters_StateError_TimeFirstChange,19628,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByMethod,19629,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByMethod_Active,19630,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByMethod_Classification,19631,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,19632,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,19633,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByParent,19634,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByParent_Active,19635,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByParent_Classification,19636,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,19637,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,19638,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalFromError,19639,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalFromError_Active,19640,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalFromError_Classification,19641,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,19642,Variable
-DataSetReaderType_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,19643,Variable
-DataSetReaderType_Diagnostics_Counters_StatePausedByParent,19644,Variable
-DataSetReaderType_Diagnostics_Counters_StatePausedByParent_Active,19645,Variable
-DataSetReaderType_Diagnostics_Counters_StatePausedByParent_Classification,19646,Variable
-DataSetReaderType_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,19647,Variable
-DataSetReaderType_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,19648,Variable
-DataSetReaderType_Diagnostics_Counters_StateDisabledByMethod,19649,Variable
-DataSetReaderType_Diagnostics_Counters_StateDisabledByMethod_Active,19650,Variable
-DataSetReaderType_Diagnostics_Counters_StateDisabledByMethod_Classification,19651,Variable
-DataSetReaderType_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,19652,Variable
-DataSetReaderType_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,19653,Variable
-DataSetReaderType_Diagnostics_LiveValues,19654,Object
-DataSetReaderType_Diagnostics_Counters_FailedDataSetMessages,19655,Variable
-DataSetReaderType_Diagnostics_Counters_FailedDataSetMessages_Active,19656,Variable
-DataSetReaderType_Diagnostics_Counters_FailedDataSetMessages_Classification,19657,Variable
-DataSetReaderType_Diagnostics_Counters_FailedDataSetMessages_DiagnosticsLevel,19658,Variable
-DataSetReaderType_Diagnostics_Counters_FailedDataSetMessages_TimeFirstChange,19659,Variable
-DataSetReaderType_Diagnostics_Counters_DecryptionErrors,19660,Variable
-DataSetReaderType_Diagnostics_Counters_DecryptionErrors_Active,19661,Variable
-DataSetReaderType_Diagnostics_Counters_DecryptionErrors_Classification,19662,Variable
-DataSetReaderType_Diagnostics_Counters_DecryptionErrors_DiagnosticsLevel,19663,Variable
-DataSetReaderType_Diagnostics_Counters_DecryptionErrors_TimeFirstChange,19664,Variable
-DataSetReaderType_Diagnostics_LiveValues_MessageSequenceNumber,19665,Variable
-DataSetReaderType_Diagnostics_LiveValues_MessageSequenceNumber_DiagnosticsLevel,19666,Variable
-DataSetReaderType_Diagnostics_LiveValues_StatusCode,19667,Variable
-DataSetReaderType_Diagnostics_LiveValues_StatusCode_DiagnosticsLevel,19668,Variable
-DataSetReaderType_Diagnostics_LiveValues_MajorVersion,19669,Variable
-DataSetReaderType_Diagnostics_LiveValues_MajorVersion_DiagnosticsLevel,19670,Variable
-DataSetReaderType_Diagnostics_LiveValues_MinorVersion,19671,Variable
-DataSetReaderType_Diagnostics_LiveValues_MinorVersion_DiagnosticsLevel,19672,Variable
-DataSetReaderType_Diagnostics_LiveValues_SecurityTokenID,19673,Variable
-DataSetReaderType_Diagnostics_LiveValues_SecurityTokenID_DiagnosticsLevel,19674,Variable
-DataSetReaderType_Diagnostics_LiveValues_TimeToNextTokenID,19675,Variable
-DataSetReaderType_Diagnostics_LiveValues_TimeToNextTokenID_DiagnosticsLevel,19676,Variable
-PubSubDiagnosticsType,19677,ObjectType
-PubSubDiagnosticsType_DiagnosticsLevel,19678,Variable
-PubSubDiagnosticsType_TotalInformation,19679,Variable
-PubSubDiagnosticsType_TotalInformation_Active,19680,Variable
-PubSubDiagnosticsType_TotalInformation_Classification,19681,Variable
-PubSubDiagnosticsType_TotalInformation_DiagnosticsLevel,19682,Variable
-PubSubDiagnosticsType_TotalInformation_TimeFirstChange,19683,Variable
-PubSubDiagnosticsType_TotalError,19684,Variable
-PubSubDiagnosticsType_TotalError_Active,19685,Variable
-PubSubDiagnosticsType_TotalError_Classification,19686,Variable
-PubSubDiagnosticsType_TotalError_DiagnosticsLevel,19687,Variable
-PubSubDiagnosticsType_TotalError_TimeFirstChange,19688,Variable
-PubSubDiagnosticsType_Reset,19689,Method
-PubSubDiagnosticsType_SubError,19690,Variable
-PubSubDiagnosticsType_Counters,19691,Object
-PubSubDiagnosticsType_Counters_StateError,19692,Variable
-PubSubDiagnosticsType_Counters_StateError_Active,19693,Variable
-PubSubDiagnosticsType_Counters_StateError_Classification,19694,Variable
-PubSubDiagnosticsType_Counters_StateError_DiagnosticsLevel,19695,Variable
-PubSubDiagnosticsType_Counters_StateError_TimeFirstChange,19696,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByMethod,19697,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByMethod_Active,19698,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByMethod_Classification,19699,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByMethod_DiagnosticsLevel,19700,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByMethod_TimeFirstChange,19701,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByParent,19702,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByParent_Active,19703,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByParent_Classification,19704,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByParent_DiagnosticsLevel,19705,Variable
-PubSubDiagnosticsType_Counters_StateOperationalByParent_TimeFirstChange,19706,Variable
-PubSubDiagnosticsType_Counters_StateOperationalFromError,19707,Variable
-PubSubDiagnosticsType_Counters_StateOperationalFromError_Active,19708,Variable
-PubSubDiagnosticsType_Counters_StateOperationalFromError_Classification,19709,Variable
-PubSubDiagnosticsType_Counters_StateOperationalFromError_DiagnosticsLevel,19710,Variable
-PubSubDiagnosticsType_Counters_StateOperationalFromError_TimeFirstChange,19711,Variable
-PubSubDiagnosticsType_Counters_StatePausedByParent,19712,Variable
-PubSubDiagnosticsType_Counters_StatePausedByParent_Active,19713,Variable
-PubSubDiagnosticsType_Counters_StatePausedByParent_Classification,19714,Variable
-PubSubDiagnosticsType_Counters_StatePausedByParent_DiagnosticsLevel,19715,Variable
-PubSubDiagnosticsType_Counters_StatePausedByParent_TimeFirstChange,19716,Variable
-PubSubDiagnosticsType_Counters_StateDisabledByMethod,19717,Variable
-PubSubDiagnosticsType_Counters_StateDisabledByMethod_Active,19718,Variable
-PubSubDiagnosticsType_Counters_StateDisabledByMethod_Classification,19719,Variable
-PubSubDiagnosticsType_Counters_StateDisabledByMethod_DiagnosticsLevel,19720,Variable
-PubSubDiagnosticsType_Counters_StateDisabledByMethod_TimeFirstChange,19721,Variable
-PubSubDiagnosticsType_LiveValues,19722,Object
-DiagnosticsLevel,19723,DataType
-DiagnosticsLevel_EnumStrings,19724,Variable
-PubSubDiagnosticsCounterType,19725,VariableType
-PubSubDiagnosticsCounterType_Active,19726,Variable
-PubSubDiagnosticsCounterType_Classification,19727,Variable
-PubSubDiagnosticsCounterType_DiagnosticsLevel,19728,Variable
-PubSubDiagnosticsCounterType_TimeFirstChange,19729,Variable
-PubSubDiagnosticsCounterClassification,19730,DataType
-PubSubDiagnosticsCounterClassification_EnumStrings,19731,Variable
-PubSubDiagnosticsRootType,19732,ObjectType
-PubSubDiagnosticsRootType_DiagnosticsLevel,19733,Variable
-PubSubDiagnosticsRootType_TotalInformation,19734,Variable
-PubSubDiagnosticsRootType_TotalInformation_Active,19735,Variable
-PubSubDiagnosticsRootType_TotalInformation_Classification,19736,Variable
-PubSubDiagnosticsRootType_TotalInformation_DiagnosticsLevel,19737,Variable
-PubSubDiagnosticsRootType_TotalInformation_TimeFirstChange,19738,Variable
-PubSubDiagnosticsRootType_TotalError,19739,Variable
-PubSubDiagnosticsRootType_TotalError_Active,19740,Variable
-PubSubDiagnosticsRootType_TotalError_Classification,19741,Variable
-PubSubDiagnosticsRootType_TotalError_DiagnosticsLevel,19742,Variable
-PubSubDiagnosticsRootType_TotalError_TimeFirstChange,19743,Variable
-PubSubDiagnosticsRootType_Reset,19744,Method
-PubSubDiagnosticsRootType_SubError,19745,Variable
-PubSubDiagnosticsRootType_Counters,19746,Object
-PubSubDiagnosticsRootType_Counters_StateError,19747,Variable
-PubSubDiagnosticsRootType_Counters_StateError_Active,19748,Variable
-PubSubDiagnosticsRootType_Counters_StateError_Classification,19749,Variable
-PubSubDiagnosticsRootType_Counters_StateError_DiagnosticsLevel,19750,Variable
-PubSubDiagnosticsRootType_Counters_StateError_TimeFirstChange,19751,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByMethod,19752,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByMethod_Active,19753,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByMethod_Classification,19754,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByMethod_DiagnosticsLevel,19755,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByMethod_TimeFirstChange,19756,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByParent,19757,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByParent_Active,19758,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByParent_Classification,19759,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByParent_DiagnosticsLevel,19760,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalByParent_TimeFirstChange,19761,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalFromError,19762,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalFromError_Active,19763,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalFromError_Classification,19764,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalFromError_DiagnosticsLevel,19765,Variable
-PubSubDiagnosticsRootType_Counters_StateOperationalFromError_TimeFirstChange,19766,Variable
-PubSubDiagnosticsRootType_Counters_StatePausedByParent,19767,Variable
-PubSubDiagnosticsRootType_Counters_StatePausedByParent_Active,19768,Variable
-PubSubDiagnosticsRootType_Counters_StatePausedByParent_Classification,19769,Variable
-PubSubDiagnosticsRootType_Counters_StatePausedByParent_DiagnosticsLevel,19770,Variable
-PubSubDiagnosticsRootType_Counters_StatePausedByParent_TimeFirstChange,19771,Variable
-PubSubDiagnosticsRootType_Counters_StateDisabledByMethod,19772,Variable
-PubSubDiagnosticsRootType_Counters_StateDisabledByMethod_Active,19773,Variable
-PubSubDiagnosticsRootType_Counters_StateDisabledByMethod_Classification,19774,Variable
-PubSubDiagnosticsRootType_Counters_StateDisabledByMethod_DiagnosticsLevel,19775,Variable
-PubSubDiagnosticsRootType_Counters_StateDisabledByMethod_TimeFirstChange,19776,Variable
-PubSubDiagnosticsRootType_LiveValues,19777,Object
-PubSubDiagnosticsRootType_LiveValues_ConfiguredDataSetWriters,19778,Variable
-PubSubDiagnosticsRootType_LiveValues_ConfiguredDataSetWriters_DiagnosticsLevel,19779,Variable
-PubSubDiagnosticsRootType_LiveValues_ConfiguredDataSetReaders,19780,Variable
-PubSubDiagnosticsRootType_LiveValues_ConfiguredDataSetReaders_DiagnosticsLevel,19781,Variable
-PubSubDiagnosticsRootType_LiveValues_OperationalDataSetWriters,19782,Variable
-PubSubDiagnosticsRootType_LiveValues_OperationalDataSetWriters_DiagnosticsLevel,19783,Variable
-PubSubDiagnosticsRootType_LiveValues_OperationalDataSetReaders,19784,Variable
-PubSubDiagnosticsRootType_LiveValues_OperationalDataSetReaders_DiagnosticsLevel,19785,Variable
-PubSubDiagnosticsConnectionType,19786,ObjectType
-PubSubDiagnosticsConnectionType_DiagnosticsLevel,19787,Variable
-PubSubDiagnosticsConnectionType_TotalInformation,19788,Variable
-PubSubDiagnosticsConnectionType_TotalInformation_Active,19789,Variable
-PubSubDiagnosticsConnectionType_TotalInformation_Classification,19790,Variable
-PubSubDiagnosticsConnectionType_TotalInformation_DiagnosticsLevel,19791,Variable
-PubSubDiagnosticsConnectionType_TotalInformation_TimeFirstChange,19792,Variable
-PubSubDiagnosticsConnectionType_TotalError,19793,Variable
-PubSubDiagnosticsConnectionType_TotalError_Active,19794,Variable
-PubSubDiagnosticsConnectionType_TotalError_Classification,19795,Variable
-PubSubDiagnosticsConnectionType_TotalError_DiagnosticsLevel,19796,Variable
-PubSubDiagnosticsConnectionType_TotalError_TimeFirstChange,19797,Variable
-PubSubDiagnosticsConnectionType_Reset,19798,Method
-PubSubDiagnosticsConnectionType_SubError,19799,Variable
-PubSubDiagnosticsConnectionType_Counters,19800,Object
-PubSubDiagnosticsConnectionType_Counters_StateError,19801,Variable
-PubSubDiagnosticsConnectionType_Counters_StateError_Active,19802,Variable
-PubSubDiagnosticsConnectionType_Counters_StateError_Classification,19803,Variable
-PubSubDiagnosticsConnectionType_Counters_StateError_DiagnosticsLevel,19804,Variable
-PubSubDiagnosticsConnectionType_Counters_StateError_TimeFirstChange,19805,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByMethod,19806,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByMethod_Active,19807,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByMethod_Classification,19808,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByMethod_DiagnosticsLevel,19809,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByMethod_TimeFirstChange,19810,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByParent,19811,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByParent_Active,19812,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByParent_Classification,19813,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByParent_DiagnosticsLevel,19814,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalByParent_TimeFirstChange,19815,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalFromError,19816,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalFromError_Active,19817,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalFromError_Classification,19818,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalFromError_DiagnosticsLevel,19819,Variable
-PubSubDiagnosticsConnectionType_Counters_StateOperationalFromError_TimeFirstChange,19820,Variable
-PubSubDiagnosticsConnectionType_Counters_StatePausedByParent,19821,Variable
-PubSubDiagnosticsConnectionType_Counters_StatePausedByParent_Active,19822,Variable
-PubSubDiagnosticsConnectionType_Counters_StatePausedByParent_Classification,19823,Variable
-PubSubDiagnosticsConnectionType_Counters_StatePausedByParent_DiagnosticsLevel,19824,Variable
-PubSubDiagnosticsConnectionType_Counters_StatePausedByParent_TimeFirstChange,19825,Variable
-PubSubDiagnosticsConnectionType_Counters_StateDisabledByMethod,19826,Variable
-PubSubDiagnosticsConnectionType_Counters_StateDisabledByMethod_Active,19827,Variable
-PubSubDiagnosticsConnectionType_Counters_StateDisabledByMethod_Classification,19828,Variable
-PubSubDiagnosticsConnectionType_Counters_StateDisabledByMethod_DiagnosticsLevel,19829,Variable
-PubSubDiagnosticsConnectionType_Counters_StateDisabledByMethod_TimeFirstChange,19830,Variable
-PubSubDiagnosticsConnectionType_LiveValues,19831,Object
-PubSubDiagnosticsConnectionType_LiveValues_ResolvedAddress,19832,Variable
-PubSubDiagnosticsConnectionType_LiveValues_ResolvedAddress_DiagnosticsLevel,19833,Variable
-PubSubDiagnosticsWriterGroupType,19834,ObjectType
-PubSubDiagnosticsWriterGroupType_DiagnosticsLevel,19835,Variable
-PubSubDiagnosticsWriterGroupType_TotalInformation,19836,Variable
-PubSubDiagnosticsWriterGroupType_TotalInformation_Active,19837,Variable
-PubSubDiagnosticsWriterGroupType_TotalInformation_Classification,19838,Variable
-PubSubDiagnosticsWriterGroupType_TotalInformation_DiagnosticsLevel,19839,Variable
-PubSubDiagnosticsWriterGroupType_TotalInformation_TimeFirstChange,19840,Variable
-PubSubDiagnosticsWriterGroupType_TotalError,19841,Variable
-PubSubDiagnosticsWriterGroupType_TotalError_Active,19842,Variable
-PubSubDiagnosticsWriterGroupType_TotalError_Classification,19843,Variable
-PubSubDiagnosticsWriterGroupType_TotalError_DiagnosticsLevel,19844,Variable
-PubSubDiagnosticsWriterGroupType_TotalError_TimeFirstChange,19845,Variable
-PubSubDiagnosticsWriterGroupType_Reset,19846,Method
-PubSubDiagnosticsWriterGroupType_SubError,19847,Variable
-PubSubDiagnosticsWriterGroupType_Counters,19848,Object
-PubSubDiagnosticsWriterGroupType_Counters_StateError,19849,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateError_Active,19850,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateError_Classification,19851,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateError_DiagnosticsLevel,19852,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateError_TimeFirstChange,19853,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByMethod,19854,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByMethod_Active,19855,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByMethod_Classification,19856,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByMethod_DiagnosticsLevel,19857,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByMethod_TimeFirstChange,19858,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByParent,19859,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByParent_Active,19860,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByParent_Classification,19861,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByParent_DiagnosticsLevel,19862,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalByParent_TimeFirstChange,19863,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalFromError,19864,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalFromError_Active,19865,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalFromError_Classification,19866,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalFromError_DiagnosticsLevel,19867,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateOperationalFromError_TimeFirstChange,19868,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StatePausedByParent,19869,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StatePausedByParent_Active,19870,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StatePausedByParent_Classification,19871,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StatePausedByParent_DiagnosticsLevel,19872,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StatePausedByParent_TimeFirstChange,19873,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateDisabledByMethod,19874,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateDisabledByMethod_Active,19875,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateDisabledByMethod_Classification,19876,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateDisabledByMethod_DiagnosticsLevel,19877,Variable
-PubSubDiagnosticsWriterGroupType_Counters_StateDisabledByMethod_TimeFirstChange,19878,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues,19879,Object
-PubSubDiagnosticsWriterGroupType_Counters_SentNetworkMessages,19880,Variable
-PubSubDiagnosticsWriterGroupType_Counters_SentNetworkMessages_Active,19881,Variable
-PubSubDiagnosticsWriterGroupType_Counters_SentNetworkMessages_Classification,19882,Variable
-PubSubDiagnosticsWriterGroupType_Counters_SentNetworkMessages_DiagnosticsLevel,19883,Variable
-PubSubDiagnosticsWriterGroupType_Counters_SentNetworkMessages_TimeFirstChange,19884,Variable
-PubSubDiagnosticsWriterGroupType_Counters_FailedTransmissions,19885,Variable
-PubSubDiagnosticsWriterGroupType_Counters_FailedTransmissions_Active,19886,Variable
-PubSubDiagnosticsWriterGroupType_Counters_FailedTransmissions_Classification,19887,Variable
-PubSubDiagnosticsWriterGroupType_Counters_FailedTransmissions_DiagnosticsLevel,19888,Variable
-PubSubDiagnosticsWriterGroupType_Counters_FailedTransmissions_TimeFirstChange,19889,Variable
-PubSubDiagnosticsWriterGroupType_Counters_EncryptionErrors,19890,Variable
-PubSubDiagnosticsWriterGroupType_Counters_EncryptionErrors_Active,19891,Variable
-PubSubDiagnosticsWriterGroupType_Counters_EncryptionErrors_Classification,19892,Variable
-PubSubDiagnosticsWriterGroupType_Counters_EncryptionErrors_DiagnosticsLevel,19893,Variable
-PubSubDiagnosticsWriterGroupType_Counters_EncryptionErrors_TimeFirstChange,19894,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_ConfiguredDataSetWriters,19895,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_ConfiguredDataSetWriters_DiagnosticsLevel,19896,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_OperationalDataSetWriters,19897,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_OperationalDataSetWriters_DiagnosticsLevel,19898,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_SecurityTokenID,19899,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_SecurityTokenID_DiagnosticsLevel,19900,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_TimeToNextTokenID,19901,Variable
-PubSubDiagnosticsWriterGroupType_LiveValues_TimeToNextTokenID_DiagnosticsLevel,19902,Variable
-PubSubDiagnosticsReaderGroupType,19903,ObjectType
-PubSubDiagnosticsReaderGroupType_DiagnosticsLevel,19904,Variable
-PubSubDiagnosticsReaderGroupType_TotalInformation,19905,Variable
-PubSubDiagnosticsReaderGroupType_TotalInformation_Active,19906,Variable
-PubSubDiagnosticsReaderGroupType_TotalInformation_Classification,19907,Variable
-PubSubDiagnosticsReaderGroupType_TotalInformation_DiagnosticsLevel,19908,Variable
-PubSubDiagnosticsReaderGroupType_TotalInformation_TimeFirstChange,19909,Variable
-PubSubDiagnosticsReaderGroupType_TotalError,19910,Variable
-PubSubDiagnosticsReaderGroupType_TotalError_Active,19911,Variable
-PubSubDiagnosticsReaderGroupType_TotalError_Classification,19912,Variable
-PubSubDiagnosticsReaderGroupType_TotalError_DiagnosticsLevel,19913,Variable
-PubSubDiagnosticsReaderGroupType_TotalError_TimeFirstChange,19914,Variable
-PubSubDiagnosticsReaderGroupType_Reset,19915,Method
-PubSubDiagnosticsReaderGroupType_SubError,19916,Variable
-PubSubDiagnosticsReaderGroupType_Counters,19917,Object
-PubSubDiagnosticsReaderGroupType_Counters_StateError,19918,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateError_Active,19919,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateError_Classification,19920,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateError_DiagnosticsLevel,19921,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateError_TimeFirstChange,19922,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByMethod,19923,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByMethod_Active,19924,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByMethod_Classification,19925,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByMethod_DiagnosticsLevel,19926,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByMethod_TimeFirstChange,19927,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByParent,19928,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByParent_Active,19929,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByParent_Classification,19930,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByParent_DiagnosticsLevel,19931,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalByParent_TimeFirstChange,19932,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalFromError,19933,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalFromError_Active,19934,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalFromError_Classification,19935,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalFromError_DiagnosticsLevel,19936,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateOperationalFromError_TimeFirstChange,19937,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StatePausedByParent,19938,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StatePausedByParent_Active,19939,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StatePausedByParent_Classification,19940,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StatePausedByParent_DiagnosticsLevel,19941,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StatePausedByParent_TimeFirstChange,19942,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateDisabledByMethod,19943,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateDisabledByMethod_Active,19944,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateDisabledByMethod_Classification,19945,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateDisabledByMethod_DiagnosticsLevel,19946,Variable
-PubSubDiagnosticsReaderGroupType_Counters_StateDisabledByMethod_TimeFirstChange,19947,Variable
-PubSubDiagnosticsReaderGroupType_LiveValues,19948,Object
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedNetworkMessages,19949,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedNetworkMessages_Active,19950,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedNetworkMessages_Classification,19951,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedNetworkMessages_DiagnosticsLevel,19952,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedNetworkMessages_TimeFirstChange,19953,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedInvalidNetworkMessages,19954,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedInvalidNetworkMessages_Active,19955,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedInvalidNetworkMessages_Classification,19956,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedInvalidNetworkMessages_DiagnosticsLevel,19957,Variable
-PubSubDiagnosticsReaderGroupType_Counters_ReceivedInvalidNetworkMessages_TimeFirstChange,19958,Variable
-PubSubDiagnosticsReaderGroupType_Counters_DecryptionErrors,19959,Variable
-PubSubDiagnosticsReaderGroupType_Counters_DecryptionErrors_Active,19960,Variable
-PubSubDiagnosticsReaderGroupType_Counters_DecryptionErrors_Classification,19961,Variable
-PubSubDiagnosticsReaderGroupType_Counters_DecryptionErrors_DiagnosticsLevel,19962,Variable
-PubSubDiagnosticsReaderGroupType_Counters_DecryptionErrors_TimeFirstChange,19963,Variable
-PubSubDiagnosticsReaderGroupType_LiveValues_ConfiguredDataSetReaders,19964,Variable
-PubSubDiagnosticsReaderGroupType_LiveValues_ConfiguredDataSetReaders_DiagnosticsLevel,19965,Variable
-PubSubDiagnosticsReaderGroupType_LiveValues_OperationalDataSetReaders,19966,Variable
-PubSubDiagnosticsReaderGroupType_LiveValues_OperationalDataSetReaders_DiagnosticsLevel,19967,Variable
-PubSubDiagnosticsDataSetWriterType,19968,ObjectType
-PubSubDiagnosticsDataSetWriterType_DiagnosticsLevel,19969,Variable
-PubSubDiagnosticsDataSetWriterType_TotalInformation,19970,Variable
-PubSubDiagnosticsDataSetWriterType_TotalInformation_Active,19971,Variable
-PubSubDiagnosticsDataSetWriterType_TotalInformation_Classification,19972,Variable
-PubSubDiagnosticsDataSetWriterType_TotalInformation_DiagnosticsLevel,19973,Variable
-PubSubDiagnosticsDataSetWriterType_TotalInformation_TimeFirstChange,19974,Variable
-PubSubDiagnosticsDataSetWriterType_TotalError,19975,Variable
-PubSubDiagnosticsDataSetWriterType_TotalError_Active,19976,Variable
-PubSubDiagnosticsDataSetWriterType_TotalError_Classification,19977,Variable
-PubSubDiagnosticsDataSetWriterType_TotalError_DiagnosticsLevel,19978,Variable
-PubSubDiagnosticsDataSetWriterType_TotalError_TimeFirstChange,19979,Variable
-PubSubDiagnosticsDataSetWriterType_Reset,19980,Method
-PubSubDiagnosticsDataSetWriterType_SubError,19981,Variable
-PubSubDiagnosticsDataSetWriterType_Counters,19982,Object
-PubSubDiagnosticsDataSetWriterType_Counters_StateError,19983,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateError_Active,19984,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateError_Classification,19985,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateError_DiagnosticsLevel,19986,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateError_TimeFirstChange,19987,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByMethod,19988,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByMethod_Active,19989,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByMethod_Classification,19990,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByMethod_DiagnosticsLevel,19991,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByMethod_TimeFirstChange,19992,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByParent,19993,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByParent_Active,19994,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByParent_Classification,19995,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByParent_DiagnosticsLevel,19996,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalByParent_TimeFirstChange,19997,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalFromError,19998,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalFromError_Active,19999,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalFromError_Classification,20000,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalFromError_DiagnosticsLevel,20001,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateOperationalFromError_TimeFirstChange,20002,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StatePausedByParent,20003,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StatePausedByParent_Active,20004,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StatePausedByParent_Classification,20005,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StatePausedByParent_DiagnosticsLevel,20006,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StatePausedByParent_TimeFirstChange,20007,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateDisabledByMethod,20008,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateDisabledByMethod_Active,20009,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateDisabledByMethod_Classification,20010,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateDisabledByMethod_DiagnosticsLevel,20011,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_StateDisabledByMethod_TimeFirstChange,20012,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues,20013,Object
-PubSubDiagnosticsDataSetWriterType_Counters_FailedDataSetMessages,20014,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_FailedDataSetMessages_Active,20015,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_FailedDataSetMessages_Classification,20016,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_FailedDataSetMessages_DiagnosticsLevel,20017,Variable
-PubSubDiagnosticsDataSetWriterType_Counters_FailedDataSetMessages_TimeFirstChange,20018,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_MessageSequenceNumber,20019,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_MessageSequenceNumber_DiagnosticsLevel,20020,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_StatusCode,20021,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_StatusCode_DiagnosticsLevel,20022,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_MajorVersion,20023,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_MajorVersion_DiagnosticsLevel,20024,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_MinorVersion,20025,Variable
-PubSubDiagnosticsDataSetWriterType_LiveValues_MinorVersion_DiagnosticsLevel,20026,Variable
-PubSubDiagnosticsDataSetReaderType,20027,ObjectType
-PubSubDiagnosticsDataSetReaderType_DiagnosticsLevel,20028,Variable
-PubSubDiagnosticsDataSetReaderType_TotalInformation,20029,Variable
-PubSubDiagnosticsDataSetReaderType_TotalInformation_Active,20030,Variable
-PubSubDiagnosticsDataSetReaderType_TotalInformation_Classification,20031,Variable
-PubSubDiagnosticsDataSetReaderType_TotalInformation_DiagnosticsLevel,20032,Variable
-PubSubDiagnosticsDataSetReaderType_TotalInformation_TimeFirstChange,20033,Variable
-PubSubDiagnosticsDataSetReaderType_TotalError,20034,Variable
-PubSubDiagnosticsDataSetReaderType_TotalError_Active,20035,Variable
-PubSubDiagnosticsDataSetReaderType_TotalError_Classification,20036,Variable
-PubSubDiagnosticsDataSetReaderType_TotalError_DiagnosticsLevel,20037,Variable
-PubSubDiagnosticsDataSetReaderType_TotalError_TimeFirstChange,20038,Variable
-PubSubDiagnosticsDataSetReaderType_Reset,20039,Method
-PubSubDiagnosticsDataSetReaderType_SubError,20040,Variable
-PubSubDiagnosticsDataSetReaderType_Counters,20041,Object
-PubSubDiagnosticsDataSetReaderType_Counters_StateError,20042,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateError_Active,20043,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateError_Classification,20044,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateError_DiagnosticsLevel,20045,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateError_TimeFirstChange,20046,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByMethod,20047,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByMethod_Active,20048,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByMethod_Classification,20049,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByMethod_DiagnosticsLevel,20050,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByMethod_TimeFirstChange,20051,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByParent,20052,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByParent_Active,20053,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByParent_Classification,20054,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByParent_DiagnosticsLevel,20055,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalByParent_TimeFirstChange,20056,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalFromError,20057,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalFromError_Active,20058,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalFromError_Classification,20059,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalFromError_DiagnosticsLevel,20060,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateOperationalFromError_TimeFirstChange,20061,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StatePausedByParent,20062,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StatePausedByParent_Active,20063,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StatePausedByParent_Classification,20064,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StatePausedByParent_DiagnosticsLevel,20065,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StatePausedByParent_TimeFirstChange,20066,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateDisabledByMethod,20067,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateDisabledByMethod_Active,20068,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateDisabledByMethod_Classification,20069,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateDisabledByMethod_DiagnosticsLevel,20070,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_StateDisabledByMethod_TimeFirstChange,20071,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues,20072,Object
-PubSubDiagnosticsDataSetReaderType_Counters_FailedDataSetMessages,20073,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_FailedDataSetMessages_Active,20074,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_FailedDataSetMessages_Classification,20075,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_FailedDataSetMessages_DiagnosticsLevel,20076,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_FailedDataSetMessages_TimeFirstChange,20077,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_DecryptionErrors,20078,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_DecryptionErrors_Active,20079,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_DecryptionErrors_Classification,20080,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_DecryptionErrors_DiagnosticsLevel,20081,Variable
-PubSubDiagnosticsDataSetReaderType_Counters_DecryptionErrors_TimeFirstChange,20082,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_MessageSequenceNumber,20083,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_MessageSequenceNumber_DiagnosticsLevel,20084,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_StatusCode,20085,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_StatusCode_DiagnosticsLevel,20086,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_MajorVersion,20087,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_MajorVersion_DiagnosticsLevel,20088,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_MinorVersion,20089,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_MinorVersion_DiagnosticsLevel,20090,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_SecurityTokenID,20091,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_SecurityTokenID_DiagnosticsLevel,20092,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_TimeToNextTokenID,20093,Variable
-PubSubDiagnosticsDataSetReaderType_LiveValues_TimeToNextTokenID_DiagnosticsLevel,20094,Variable
-DataSetOrderingType,20408,DataType
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_SecurityTokenID,20409,Variable
-VersionTime,20998,DataType
-SessionlessInvokeResponseType,20999,DataType
-SessionlessInvokeResponseType_Encoding_DefaultXml,21000,Object
-SessionlessInvokeResponseType_Encoding_DefaultBinary,21001,Object
-OpcUa_BinarySchema_FieldTargetDataType,21002,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_SecurityTokenID_DiagnosticsLevel,21003,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_TimeToNextTokenID,21004,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_Diagnostics_LiveValues_TimeToNextTokenID_DiagnosticsLevel,21005,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_SubscribedDataSet,21006,Object
-ReaderGroupType_DataSetReaderName_Placeholder_CreateTargetVariables,21009,Method
-ReaderGroupType_DataSetReaderName_Placeholder_CreateTargetVariables_InputArguments,21010,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_CreateTargetVariables_OutputArguments,21011,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_CreateDataSetMirror,21012,Method
-ReaderGroupType_DataSetReaderName_Placeholder_CreateDataSetMirror_InputArguments,21013,Variable
-ReaderGroupType_DataSetReaderName_Placeholder_CreateDataSetMirror_OutputArguments,21014,Variable
-ReaderGroupType_Diagnostics,21015,Object
-ReaderGroupType_Diagnostics_DiagnosticsLevel,21016,Variable
-ReaderGroupType_Diagnostics_TotalInformation,21017,Variable
-ReaderGroupType_Diagnostics_TotalInformation_Active,21018,Variable
-ReaderGroupType_Diagnostics_TotalInformation_Classification,21019,Variable
-ReaderGroupType_Diagnostics_TotalInformation_DiagnosticsLevel,21020,Variable
-ReaderGroupType_Diagnostics_TotalInformation_TimeFirstChange,21021,Variable
-ReaderGroupType_Diagnostics_TotalError,21022,Variable
-ReaderGroupType_Diagnostics_TotalError_Active,21023,Variable
-ReaderGroupType_Diagnostics_TotalError_Classification,21024,Variable
-ReaderGroupType_Diagnostics_TotalError_DiagnosticsLevel,21025,Variable
-ReaderGroupType_Diagnostics_TotalError_TimeFirstChange,21026,Variable
-ReaderGroupType_Diagnostics_Reset,21027,Method
-ReaderGroupType_Diagnostics_SubError,21028,Variable
-ReaderGroupType_Diagnostics_Counters,21029,Object
-ReaderGroupType_Diagnostics_Counters_StateError,21030,Variable
-ReaderGroupType_Diagnostics_Counters_StateError_Active,21031,Variable
-ReaderGroupType_Diagnostics_Counters_StateError_Classification,21032,Variable
-ReaderGroupType_Diagnostics_Counters_StateError_DiagnosticsLevel,21033,Variable
-ReaderGroupType_Diagnostics_Counters_StateError_TimeFirstChange,21034,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByMethod,21035,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByMethod_Active,21036,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByMethod_Classification,21037,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByMethod_DiagnosticsLevel,21038,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByMethod_TimeFirstChange,21039,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByParent,21040,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByParent_Active,21041,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByParent_Classification,21042,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByParent_DiagnosticsLevel,21043,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalByParent_TimeFirstChange,21044,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalFromError,21045,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalFromError_Active,21046,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalFromError_Classification,21047,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalFromError_DiagnosticsLevel,21048,Variable
-ReaderGroupType_Diagnostics_Counters_StateOperationalFromError_TimeFirstChange,21049,Variable
-ReaderGroupType_Diagnostics_Counters_StatePausedByParent,21050,Variable
-ReaderGroupType_Diagnostics_Counters_StatePausedByParent_Active,21051,Variable
-ReaderGroupType_Diagnostics_Counters_StatePausedByParent_Classification,21052,Variable
-ReaderGroupType_Diagnostics_Counters_StatePausedByParent_DiagnosticsLevel,21053,Variable
-ReaderGroupType_Diagnostics_Counters_StatePausedByParent_TimeFirstChange,21054,Variable
-ReaderGroupType_Diagnostics_Counters_StateDisabledByMethod,21055,Variable
-ReaderGroupType_Diagnostics_Counters_StateDisabledByMethod_Active,21056,Variable
-ReaderGroupType_Diagnostics_Counters_StateDisabledByMethod_Classification,21057,Variable
-ReaderGroupType_Diagnostics_Counters_StateDisabledByMethod_DiagnosticsLevel,21058,Variable
-ReaderGroupType_Diagnostics_Counters_StateDisabledByMethod_TimeFirstChange,21059,Variable
-ReaderGroupType_Diagnostics_LiveValues,21060,Object
-ReaderGroupType_Diagnostics_Counters_ReceivedNetworkMessages,21061,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedNetworkMessages_Active,21062,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedNetworkMessages_Classification,21063,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedNetworkMessages_DiagnosticsLevel,21064,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedNetworkMessages_TimeFirstChange,21065,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedInvalidNetworkMessages,21066,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedInvalidNetworkMessages_Active,21067,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedInvalidNetworkMessages_Classification,21068,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedInvalidNetworkMessages_DiagnosticsLevel,21069,Variable
-ReaderGroupType_Diagnostics_Counters_ReceivedInvalidNetworkMessages_TimeFirstChange,21070,Variable
-ReaderGroupType_Diagnostics_Counters_DecryptionErrors,21071,Variable
-ReaderGroupType_Diagnostics_Counters_DecryptionErrors_Active,21072,Variable
-ReaderGroupType_Diagnostics_Counters_DecryptionErrors_Classification,21073,Variable
-ReaderGroupType_Diagnostics_Counters_DecryptionErrors_DiagnosticsLevel,21074,Variable
-ReaderGroupType_Diagnostics_Counters_DecryptionErrors_TimeFirstChange,21075,Variable
-ReaderGroupType_Diagnostics_LiveValues_ConfiguredDataSetReaders,21076,Variable
-ReaderGroupType_Diagnostics_LiveValues_ConfiguredDataSetReaders_DiagnosticsLevel,21077,Variable
-ReaderGroupType_Diagnostics_LiveValues_OperationalDataSetReaders,21078,Variable
-ReaderGroupType_Diagnostics_LiveValues_OperationalDataSetReaders_DiagnosticsLevel,21079,Variable
-ReaderGroupType_TransportSettings,21080,Object
-ReaderGroupType_MessageSettings,21081,Object
-ReaderGroupType_AddDataSetReader,21082,Method
-ReaderGroupType_AddDataSetReader_InputArguments,21083,Variable
-ReaderGroupType_AddDataSetReader_OutputArguments,21084,Variable
-ReaderGroupType_RemoveDataSetReader,21085,Method
-ReaderGroupType_RemoveDataSetReader_InputArguments,21086,Variable
-PubSubGroupTypeAddReaderMethodType,21087,Method
-PubSubGroupTypeAddReaderMethodType_InputArguments,21088,Variable
-PubSubGroupTypeAddReaderMethodType_OutputArguments,21089,Variable
-ReaderGroupTransportType,21090,ObjectType
-ReaderGroupMessageType,21091,ObjectType
-DataSetWriterType_DataSetWriterId,21092,Variable
-DataSetWriterType_DataSetFieldContentMask,21093,Variable
-DataSetWriterType_KeyFrameCount,21094,Variable
-DataSetWriterType_MessageSettings,21095,Object
-DataSetWriterMessageType,21096,ObjectType
-DataSetReaderType_PublisherId,21097,Variable
-DataSetReaderType_WriterGroupId,21098,Variable
-DataSetReaderType_DataSetWriterId,21099,Variable
-DataSetReaderType_DataSetMetaData,21100,Variable
-DataSetReaderType_DataSetFieldContentMask,21101,Variable
-DataSetReaderType_MessageReceiveTimeout,21102,Variable
-DataSetReaderType_MessageSettings,21103,Object
-DataSetReaderMessageType,21104,ObjectType
-UadpWriterGroupMessageType,21105,ObjectType
-UadpWriterGroupMessageType_GroupVersion,21106,Variable
-UadpWriterGroupMessageType_DataSetOrdering,21107,Variable
-UadpWriterGroupMessageType_NetworkMessageContentMask,21108,Variable
-UadpWriterGroupMessageType_SamplingOffset,21109,Variable
-UadpWriterGroupMessageType_PublishingOffset,21110,Variable
-UadpDataSetWriterMessageType,21111,ObjectType
-UadpDataSetWriterMessageType_DataSetMessageContentMask,21112,Variable
-UadpDataSetWriterMessageType_ConfiguredSize,21113,Variable
-UadpDataSetWriterMessageType_NetworkMessageNumber,21114,Variable
-UadpDataSetWriterMessageType_DataSetOffset,21115,Variable
-UadpDataSetReaderMessageType,21116,ObjectType
-UadpDataSetReaderMessageType_GroupVersion,21117,Variable
-UadpDataSetReaderMessageType_NetworkMessageNumber,21119,Variable
-UadpDataSetReaderMessageType_DataSetClassId,21120,Variable
-UadpDataSetReaderMessageType_NetworkMessageContentMask,21121,Variable
-UadpDataSetReaderMessageType_DataSetMessageContentMask,21122,Variable
-UadpDataSetReaderMessageType_PublishingInterval,21123,Variable
-UadpDataSetReaderMessageType_ProcessingOffset,21124,Variable
-UadpDataSetReaderMessageType_ReceiveOffset,21125,Variable
-JsonWriterGroupMessageType,21126,ObjectType
-JsonWriterGroupMessageType_NetworkMessageContentMask,21127,Variable
-JsonDataSetWriterMessageType,21128,ObjectType
-JsonDataSetWriterMessageType_DataSetMessageContentMask,21129,Variable
-JsonDataSetReaderMessageType,21130,ObjectType
-JsonDataSetReaderMessageType_NetworkMessageContentMask,21131,Variable
-JsonDataSetReaderMessageType_DataSetMessageContentMask,21132,Variable
-DatagramWriterGroupTransportType,21133,ObjectType
-DatagramWriterGroupTransportType_MessageRepeatCount,21134,Variable
-DatagramWriterGroupTransportType_MessageRepeatDelay,21135,Variable
-BrokerWriterGroupTransportType,21136,ObjectType
-BrokerWriterGroupTransportType_QueueName,21137,Variable
-BrokerDataSetWriterTransportType,21138,ObjectType
-BrokerDataSetWriterTransportType_QueueName,21139,Variable
-BrokerDataSetWriterTransportType_MetaDataQueueName,21140,Variable
-BrokerDataSetWriterTransportType_MetaDataUpdateTime,21141,Variable
-BrokerDataSetReaderTransportType,21142,ObjectType
-BrokerDataSetReaderTransportType_QueueName,21143,Variable
-BrokerDataSetReaderTransportType_MetaDataQueueName,21144,Variable
-NetworkAddressType,21145,ObjectType
-NetworkAddressType_NetworkInterface,21146,Variable
-NetworkAddressUrlType,21147,ObjectType
-NetworkAddressUrlType_NetworkInterface,21148,Variable
-NetworkAddressUrlType_Url,21149,Variable
-WriterGroupDataType_Encoding_DefaultBinary,21150,Object
-NetworkAddressDataType_Encoding_DefaultBinary,21151,Object
-NetworkAddressUrlDataType_Encoding_DefaultBinary,21152,Object
-ReaderGroupDataType_Encoding_DefaultBinary,21153,Object
-PubSubConfigurationDataType_Encoding_DefaultBinary,21154,Object
-DatagramWriterGroupTransportDataType_Encoding_DefaultBinary,21155,Object
-OpcUa_BinarySchema_WriterGroupDataType,21156,Variable
-OpcUa_BinarySchema_WriterGroupDataType_DataTypeVersion,21157,Variable
-OpcUa_BinarySchema_WriterGroupDataType_DictionaryFragment,21158,Variable
-OpcUa_BinarySchema_NetworkAddressDataType,21159,Variable
-OpcUa_BinarySchema_NetworkAddressDataType_DataTypeVersion,21160,Variable
-OpcUa_BinarySchema_NetworkAddressDataType_DictionaryFragment,21161,Variable
-OpcUa_BinarySchema_NetworkAddressUrlDataType,21162,Variable
-OpcUa_BinarySchema_NetworkAddressUrlDataType_DataTypeVersion,21163,Variable
-OpcUa_BinarySchema_NetworkAddressUrlDataType_DictionaryFragment,21164,Variable
-OpcUa_BinarySchema_ReaderGroupDataType,21165,Variable
-OpcUa_BinarySchema_ReaderGroupDataType_DataTypeVersion,21166,Variable
-OpcUa_BinarySchema_ReaderGroupDataType_DictionaryFragment,21167,Variable
-OpcUa_BinarySchema_PubSubConfigurationDataType,21168,Variable
-OpcUa_BinarySchema_PubSubConfigurationDataType_DataTypeVersion,21169,Variable
-OpcUa_BinarySchema_PubSubConfigurationDataType_DictionaryFragment,21170,Variable
-OpcUa_BinarySchema_DatagramWriterGroupTransportDataType,21171,Variable
-OpcUa_BinarySchema_DatagramWriterGroupTransportDataType_DataTypeVersion,21172,Variable
-OpcUa_BinarySchema_DatagramWriterGroupTransportDataType_DictionaryFragment,21173,Variable
-WriterGroupDataType_Encoding_DefaultXml,21174,Object
-NetworkAddressDataType_Encoding_DefaultXml,21175,Object
-NetworkAddressUrlDataType_Encoding_DefaultXml,21176,Object
-ReaderGroupDataType_Encoding_DefaultXml,21177,Object
-PubSubConfigurationDataType_Encoding_DefaultXml,21178,Object
-DatagramWriterGroupTransportDataType_Encoding_DefaultXml,21179,Object
-OpcUa_XmlSchema_WriterGroupDataType,21180,Variable
-OpcUa_XmlSchema_WriterGroupDataType_DataTypeVersion,21181,Variable
-OpcUa_XmlSchema_WriterGroupDataType_DictionaryFragment,21182,Variable
-OpcUa_XmlSchema_NetworkAddressDataType,21183,Variable
-OpcUa_XmlSchema_NetworkAddressDataType_DataTypeVersion,21184,Variable
-OpcUa_XmlSchema_NetworkAddressDataType_DictionaryFragment,21185,Variable
-OpcUa_XmlSchema_NetworkAddressUrlDataType,21186,Variable
-OpcUa_XmlSchema_NetworkAddressUrlDataType_DataTypeVersion,21187,Variable
-OpcUa_XmlSchema_NetworkAddressUrlDataType_DictionaryFragment,21188,Variable
-OpcUa_XmlSchema_ReaderGroupDataType,21189,Variable
-OpcUa_XmlSchema_ReaderGroupDataType_DataTypeVersion,21190,Variable
-OpcUa_XmlSchema_ReaderGroupDataType_DictionaryFragment,21191,Variable
-OpcUa_XmlSchema_PubSubConfigurationDataType,21192,Variable
-OpcUa_XmlSchema_PubSubConfigurationDataType_DataTypeVersion,21193,Variable
-OpcUa_XmlSchema_PubSubConfigurationDataType_DictionaryFragment,21194,Variable
-OpcUa_XmlSchema_DatagramWriterGroupTransportDataType,21195,Variable
-OpcUa_XmlSchema_DatagramWriterGroupTransportDataType_DataTypeVersion,21196,Variable
-OpcUa_XmlSchema_DatagramWriterGroupTransportDataType_DictionaryFragment,21197,Variable
-WriterGroupDataType_Encoding_DefaultJson,21198,Object
-NetworkAddressDataType_Encoding_DefaultJson,21199,Object
-NetworkAddressUrlDataType_Encoding_DefaultJson,21200,Object
-ReaderGroupDataType_Encoding_DefaultJson,21201,Object
-PubSubConfigurationDataType_Encoding_DefaultJson,21202,Object
-DatagramWriterGroupTransportDataType_Encoding_DefaultJson,21203,Object
diff --git a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.EventsMinimal.xml b/ext/open62541/tools/schema/Opc.Ua.NodeSet2.EventsMinimal.xml
deleted file mode 100644
index 7ac5a2e..0000000
--- a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.EventsMinimal.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2018 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<UANodeSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LastModified="2019-01-31T00:00:00Z" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
-  <Models>
-    <Model ModelUri="http://opcfoundation.org/UA/" Version="1.04" PublicationDate="2019-01-31T00:00:00Z" />
-  </Models>
-  <UAObjectType NodeId="i=2041" BrowseName="BaseEventType" IsAbstract="true">
-    <DisplayName>BaseEventType</DisplayName>
-    <Description>The base type for all events.</Description>
-    <References>
-      <Reference ReferenceType="HasProperty">i=2042</Reference>
-      <Reference ReferenceType="HasProperty">i=2043</Reference>
-      <Reference ReferenceType="HasProperty">i=2044</Reference>
-      <Reference ReferenceType="HasProperty">i=2045</Reference>
-      <Reference ReferenceType="HasProperty">i=2046</Reference>
-      <Reference ReferenceType="HasProperty">i=2047</Reference>
-      <Reference ReferenceType="HasProperty">i=3190</Reference>
-      <Reference ReferenceType="HasProperty">i=2050</Reference>
-      <Reference ReferenceType="HasProperty">i=2051</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=2042" BrowseName="EventId" ParentNodeId="i=2041" DataType="ByteString">
-    <DisplayName>EventId</DisplayName>
-    <Description>A globally unique identifier for the event.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2043" BrowseName="EventType" ParentNodeId="i=2041" DataType="NodeId">
-    <DisplayName>EventType</DisplayName>
-    <Description>The identifier for the event type.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2044" BrowseName="SourceNode" ParentNodeId="i=2041" DataType="NodeId">
-    <DisplayName>SourceNode</DisplayName>
-    <Description>The source of the event.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2045" BrowseName="SourceName" ParentNodeId="i=2041" DataType="String">
-    <DisplayName>SourceName</DisplayName>
-    <Description>A description of the source of the event.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2046" BrowseName="Time" ParentNodeId="i=2041" DataType="i=294">
-    <DisplayName>Time</DisplayName>
-    <Description>When the event occurred.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2047" BrowseName="ReceiveTime" ParentNodeId="i=2041" DataType="i=294">
-    <DisplayName>ReceiveTime</DisplayName>
-    <Description>When the server received the event from the underlying system.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=3190" BrowseName="LocalTime" ParentNodeId="i=2041" DataType="i=8912">
-    <DisplayName>LocalTime</DisplayName>
-    <Description>Information about the local time where the event originated.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2050" BrowseName="Message" ParentNodeId="i=2041" DataType="LocalizedText">
-    <DisplayName>Message</DisplayName>
-    <Description>A localized description of the event.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2051" BrowseName="Severity" ParentNodeId="i=2041" DataType="UInt16">
-    <DisplayName>Severity</DisplayName>
-    <Description>Indicates how urgent an event is.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2041</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=3035" BrowseName="EventQueueOverflowEventType" IsAbstract="true">
-    <DisplayName>EventQueueOverflowEventType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=2041</Reference>
-    </References>
-  </UAObjectType>
-  <UADataType NodeId="i=8912" BrowseName="TimeZoneDataType">
-    <DisplayName>TimeZoneDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="TimeZoneDataType">
-      <Field Name="Offset" DataType="i=4"/>
-      <Field Name="DaylightSavingInOffset" DataType="i=1"/>
-    </Definition>
-  </UADataType>
-</UANodeSet>
diff --git a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.HistorizingMinimal.xml b/ext/open62541/tools/schema/Opc.Ua.NodeSet2.HistorizingMinimal.xml
deleted file mode 100644
index 5a48e45..0000000
--- a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.HistorizingMinimal.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2018 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<UANodeSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LastModified="2019-01-31T00:00:00Z" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
-  <Models>
-    <Model ModelUri="http://opcfoundation.org/UA/" Version="1.04" PublicationDate="2019-01-31T00:00:00Z" />
-  </Models>
-  <UAObjectType NodeId="i=2330" BrowseName="HistoryServerCapabilitiesType">
-    <DisplayName>HistoryServerCapabilitiesType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObject NodeId="i=11192" BrowseName="HistoryServerCapabilities">
-    <DisplayName>HistoryServerCapabilities</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=11193</Reference>
-      <Reference ReferenceType="HasProperty">i=11242</Reference>
-      <Reference ReferenceType="HasProperty">i=11273</Reference>
-      <Reference ReferenceType="HasProperty">i=11274</Reference>
-      <Reference ReferenceType="HasProperty">i=11196</Reference>
-      <Reference ReferenceType="HasProperty">i=11197</Reference>
-      <Reference ReferenceType="HasProperty">i=11198</Reference>
-      <Reference ReferenceType="HasProperty">i=11199</Reference>
-      <Reference ReferenceType="HasProperty">i=11200</Reference>
-      <Reference ReferenceType="HasProperty">i=11281</Reference>
-      <Reference ReferenceType="HasProperty">i=11282</Reference>
-      <Reference ReferenceType="HasProperty">i=11283</Reference>
-      <Reference ReferenceType="HasProperty">i=11502</Reference>
-      <Reference ReferenceType="HasProperty">i=11275</Reference>
-      <Reference ReferenceType="HasComponent">i=11201</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2268</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2330</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=11193" BrowseName="AccessHistoryDataCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>AccessHistoryDataCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11242" BrowseName="AccessHistoryEventsCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>AccessHistoryEventsCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11273" BrowseName="MaxReturnDataValues" ParentNodeId="i=11192" DataType="UInt32">
-    <DisplayName>MaxReturnDataValues</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11274" BrowseName="MaxReturnEventValues" ParentNodeId="i=11192" DataType="UInt32">
-    <DisplayName>MaxReturnEventValues</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11196" BrowseName="InsertDataCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>InsertDataCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11197" BrowseName="ReplaceDataCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>ReplaceDataCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11198" BrowseName="UpdateDataCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>UpdateDataCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11199" BrowseName="DeleteRawCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>DeleteRawCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11200" BrowseName="DeleteAtTimeCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>DeleteAtTimeCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11281" BrowseName="InsertEventCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>InsertEventCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11282" BrowseName="ReplaceEventCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>ReplaceEventCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11283" BrowseName="UpdateEventCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>UpdateEventCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11502" BrowseName="DeleteEventCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>DeleteEventCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11275" BrowseName="InsertAnnotationCapability" ParentNodeId="i=11192" DataType="Boolean">
-    <DisplayName>InsertAnnotationCapability</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11192</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=11201" BrowseName="AggregateFunctions" ParentNodeId="i=11192">
-    <DisplayName>AggregateFunctions</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=11192</Reference>
-    </References>
-  </UAObject>
-</UANodeSet>
diff --git a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.Minimal.xml b/ext/open62541/tools/schema/Opc.Ua.NodeSet2.Minimal.xml
deleted file mode 100644
index d2cf8b0..0000000
--- a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.Minimal.xml
+++ /dev/null
@@ -1,1743 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<UANodeSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LastModified="2019-05-01T00:00:00Z" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
-  <Models>
-    <Model ModelUri="http://opcfoundation.org/UA/" Version="1.04" PublicationDate="2019-05-01T00:00:00Z" />
-  </Models>
-  <Aliases>
-    <Alias Alias="Boolean">i=1</Alias>
-    <Alias Alias="SByte">i=2</Alias>
-    <Alias Alias="Byte">i=3</Alias>
-    <Alias Alias="Int16">i=4</Alias>
-    <Alias Alias="UInt16">i=5</Alias>
-    <Alias Alias="Int32">i=6</Alias>
-    <Alias Alias="UInt32">i=7</Alias>
-    <Alias Alias="Int64">i=8</Alias>
-    <Alias Alias="UInt64">i=9</Alias>
-    <Alias Alias="Float">i=10</Alias>
-    <Alias Alias="Double">i=11</Alias>
-    <Alias Alias="DateTime">i=13</Alias>
-    <Alias Alias="String">i=12</Alias>
-    <Alias Alias="ByteString">i=15</Alias>
-    <Alias Alias="Guid">i=14</Alias>
-    <Alias Alias="XmlElement">i=16</Alias>
-    <Alias Alias="NodeId">i=17</Alias>
-    <Alias Alias="ExpandedNodeId">i=18</Alias>
-    <Alias Alias="QualifiedName">i=20</Alias>
-    <Alias Alias="LocalizedText">i=21</Alias>
-    <Alias Alias="StatusCode">i=19</Alias>
-    <Alias Alias="Structure">i=22</Alias>
-    <Alias Alias="Number">i=26</Alias>
-    <Alias Alias="Integer">i=27</Alias>
-    <Alias Alias="UInteger">i=28</Alias>
-    <Alias Alias="HasComponent">i=47</Alias>
-    <Alias Alias="HasProperty">i=46</Alias>
-    <Alias Alias="Organizes">i=35</Alias>
-    <Alias Alias="HasEventSource">i=36</Alias>
-    <Alias Alias="HasNotifier">i=48</Alias>
-    <Alias Alias="HasSubtype">i=45</Alias>
-    <Alias Alias="HasTypeDefinition">i=40</Alias>
-    <Alias Alias="HasModellingRule">i=37</Alias>
-    <Alias Alias="HasEncoding">i=38</Alias>
-    <Alias Alias="HasDescription">i=39</Alias>
-  </Aliases>
-  <UAObject NodeId="i=3062" BrowseName="Default Binary" SymbolicName="DefaultBinary">
-    <DisplayName>Default Binary</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=58</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=3063" BrowseName="Default XML" SymbolicName="DefaultXml">
-    <DisplayName>Default XML</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=58</Reference>
-    </References>
-  </UAObject>
-  <UADataType NodeId="i=24" BrowseName="BaseDataType" IsAbstract="true">
-    <DisplayName>BaseDataType</DisplayName>
-    <References />
-  </UADataType>
-  <UADataType NodeId="i=26" BrowseName="Number" IsAbstract="true">
-    <DisplayName>Number</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=27" BrowseName="Integer" IsAbstract="true">
-    <DisplayName>Integer</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=28" BrowseName="UInteger" IsAbstract="true">
-    <DisplayName>UInteger</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=29" BrowseName="Enumeration" IsAbstract="true">
-    <DisplayName>Enumeration</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=1" BrowseName="Boolean">
-    <DisplayName>Boolean</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=2" BrowseName="SByte">
-    <DisplayName>SByte</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=3" BrowseName="Byte">
-    <DisplayName>Byte</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=4" BrowseName="Int16">
-    <DisplayName>Int16</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=5" BrowseName="UInt16">
-    <DisplayName>UInt16</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=6" BrowseName="Int32">
-    <DisplayName>Int32</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=7" BrowseName="UInt32">
-    <DisplayName>UInt32</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=8" BrowseName="Int64">
-    <DisplayName>Int64</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=27</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=9" BrowseName="UInt64">
-    <DisplayName>UInt64</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=28</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=10" BrowseName="Float">
-    <DisplayName>Float</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=11" BrowseName="Double">
-    <DisplayName>Double</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=12" BrowseName="String">
-    <DisplayName>String</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=13" BrowseName="DateTime">
-    <DisplayName>DateTime</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=14" BrowseName="Guid">
-    <DisplayName>Guid</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=15" BrowseName="ByteString">
-    <DisplayName>ByteString</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=16" BrowseName="XmlElement">
-    <DisplayName>XmlElement</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=17" BrowseName="NodeId">
-    <DisplayName>NodeId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=18" BrowseName="ExpandedNodeId">
-    <DisplayName>ExpandedNodeId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=19" BrowseName="StatusCode">
-    <DisplayName>StatusCode</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=20" BrowseName="QualifiedName">
-    <DisplayName>QualifiedName</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=21" BrowseName="LocalizedText">
-    <DisplayName>LocalizedText</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=22" BrowseName="Structure" IsAbstract="true">
-    <DisplayName>Structure</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=23" BrowseName="DataValue">
-    <DisplayName>DataValue</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=25" BrowseName="DiagnosticInfo">
-    <DisplayName>DiagnosticInfo</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=24</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=30" BrowseName="Image" IsAbstract="true">
-    <DisplayName>Image</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=15</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=50" BrowseName="Decimal">
-    <DisplayName>Decimal</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=26</Reference>
-    </References>
-  </UADataType>
-  <UAReferenceType NodeId="i=31" BrowseName="References" IsAbstract="true" Symmetric="true">
-    <DisplayName>References</DisplayName>
-    <References />
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=32" BrowseName="NonHierarchicalReferences" IsAbstract="true">
-    <DisplayName>NonHierarchicalReferences</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=31</Reference>
-    </References>
-    <InverseName>NonHierarchicalReferences</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=33" BrowseName="HierarchicalReferences" IsAbstract="true">
-    <DisplayName>HierarchicalReferences</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=31</Reference>
-    </References>
-    <InverseName>HierarchicalReferences</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=34" BrowseName="HasChild" IsAbstract="true">
-    <DisplayName>HasChild</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
-    </References>
-    <InverseName>ChildOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=35" BrowseName="Organizes">
-    <DisplayName>Organizes</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
-    </References>
-    <InverseName>OrganizedBy</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=36" BrowseName="HasEventSource">
-    <DisplayName>HasEventSource</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
-    </References>
-    <InverseName>EventSourceOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=37" BrowseName="HasModellingRule">
-    <DisplayName>HasModellingRule</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>ModellingRuleOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=38" BrowseName="HasEncoding">
-    <DisplayName>HasEncoding</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>EncodingOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=39" BrowseName="HasDescription">
-    <DisplayName>HasDescription</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>DescriptionOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=40" BrowseName="HasTypeDefinition">
-    <DisplayName>HasTypeDefinition</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>TypeDefinitionOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=41" BrowseName="GeneratesEvent">
-    <DisplayName>GeneratesEvent</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>GeneratedBy</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=44" BrowseName="Aggregates" IsAbstract="true">
-    <DisplayName>Aggregates</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=34</Reference>
-    </References>
-    <InverseName>AggregatedBy</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=45" BrowseName="HasSubtype">
-    <DisplayName>HasSubtype</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=34</Reference>
-    </References>
-    <InverseName>SubtypeOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=46" BrowseName="HasProperty">
-    <DisplayName>HasProperty</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=44</Reference>
-    </References>
-    <InverseName>PropertyOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=47" BrowseName="HasComponent">
-    <DisplayName>HasComponent</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=44</Reference>
-    </References>
-    <InverseName>ComponentOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=48" BrowseName="HasNotifier">
-    <DisplayName>HasNotifier</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=36</Reference>
-    </References>
-    <InverseName>NotifierOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=49" BrowseName="HasOrderedComponent">
-    <DisplayName>HasOrderedComponent</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=47</Reference>
-    </References>
-    <InverseName>OrderedComponentOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=51" BrowseName="FromState">
-    <DisplayName>FromState</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>ToTransition</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=52" BrowseName="ToState">
-    <DisplayName>ToState</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>FromTransition</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=53" BrowseName="HasCause">
-    <DisplayName>HasCause</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>MayBeCausedBy</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=54" BrowseName="HasEffect">
-    <DisplayName>HasEffect</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>MayBeEffectedBy</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=56" BrowseName="HasHistoricalConfiguration">
-    <DisplayName>HasHistoricalConfiguration</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=44</Reference>
-    </References>
-    <InverseName>HistoricalConfigurationOf</InverseName>
-  </UAReferenceType>
-  <UAObjectType NodeId="i=58" BrowseName="BaseObjectType">
-    <DisplayName>BaseObjectType</DisplayName>
-    <References />
-  </UAObjectType>
-  <UAObjectType NodeId="i=61" BrowseName="FolderType">
-    <DisplayName>FolderType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariableType NodeId="i=62" BrowseName="BaseVariableType" IsAbstract="true" ValueRank="-2">
-    <DisplayName>BaseVariableType</DisplayName>
-    <References />
-  </UAVariableType>
-  <UAVariableType NodeId="i=63" BrowseName="BaseDataVariableType" ValueRank="-2">
-    <DisplayName>BaseDataVariableType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=62</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariableType NodeId="i=68" BrowseName="PropertyType" ValueRank="-2">
-    <DisplayName>PropertyType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=62</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariableType NodeId="i=69" BrowseName="DataTypeDescriptionType" DataType="String">
-    <DisplayName>DataTypeDescriptionType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=104</Reference>
-      <Reference ReferenceType="HasProperty">i=105</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariable NodeId="i=104" BrowseName="DataTypeVersion" ParentNodeId="i=69" DataType="String">
-    <DisplayName>DataTypeVersion</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=69</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=105" BrowseName="DictionaryFragment" ParentNodeId="i=69" DataType="ByteString">
-    <DisplayName>DictionaryFragment</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=69</Reference>
-    </References>
-  </UAVariable>
-  <UAVariableType NodeId="i=72" BrowseName="DataTypeDictionaryType" DataType="ByteString">
-    <DisplayName>DataTypeDictionaryType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=106</Reference>
-      <Reference ReferenceType="HasProperty">i=107</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariable NodeId="i=106" BrowseName="DataTypeVersion" ParentNodeId="i=72" DataType="String">
-    <DisplayName>DataTypeVersion</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=72</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=107" BrowseName="NamespaceUri" ParentNodeId="i=72" DataType="String">
-    <DisplayName>NamespaceUri</DisplayName>
-    <Description>A URI that uniquely identifies the dictionary.</Description>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=72</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=75" BrowseName="DataTypeSystemType">
-    <DisplayName>DataTypeSystemType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=76" BrowseName="DataTypeEncodingType">
-    <DisplayName>DataTypeEncodingType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UADataType NodeId="i=120" BrowseName="NamingRuleType">
-    <DisplayName>NamingRuleType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=12169</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=29</Reference>
-    </References>
-    <Definition Name="NamingRuleType">
-      <Field Name="Mandatory" Value="1">
-        <Description>The BrowseName must appear in all instances of the type.</Description>
-      </Field>
-      <Field Name="Optional" Value="2">
-        <Description>The BrowseName may appear in an instance of the type.</Description>
-      </Field>
-      <Field Name="Constraint" Value="3">
-        <Description>The modelling rule defines a constraint and the BrowseName is not used in an instance of the type.</Description>
-      </Field>
-    </Definition>
-  </UADataType>
-  <UAVariable NodeId="i=12169" BrowseName="EnumValues" ParentNodeId="i=120" DataType="i=7594" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>EnumValues</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=120</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=7616</Identifier>
-          </TypeId>
-          <Body>
-            <EnumValueType>
-              <Value>1</Value>
-              <DisplayName>
-                <Locale>
-                </Locale>
-                <Text>Mandatory</Text>
-              </DisplayName>
-              <Description>
-                <Locale>
-                </Locale>
-                <Text>The BrowseName must appear in all instances of the type.</Text>
-              </Description>
-            </EnumValueType>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=7616</Identifier>
-          </TypeId>
-          <Body>
-            <EnumValueType>
-              <Value>2</Value>
-              <DisplayName>
-                <Locale>
-                </Locale>
-                <Text>Optional</Text>
-              </DisplayName>
-              <Description>
-                <Locale>
-                </Locale>
-                <Text>The BrowseName may appear in an instance of the type.</Text>
-              </Description>
-            </EnumValueType>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=7616</Identifier>
-          </TypeId>
-          <Body>
-            <EnumValueType>
-              <Value>3</Value>
-              <DisplayName>
-                <Locale>
-                </Locale>
-                <Text>Constraint</Text>
-              </DisplayName>
-              <Description>
-                <Locale>
-                </Locale>
-                <Text>The modelling rule defines a constraint and the BrowseName is not used in an instance of the type.</Text>
-              </Description>
-            </EnumValueType>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAObjectType NodeId="i=77" BrowseName="ModellingRuleType">
-    <DisplayName>ModellingRuleType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=111</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=111" BrowseName="NamingRule" ParentNodeId="i=77" DataType="i=120">
-    <DisplayName>NamingRule</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=77</Reference>
-    </References>
-    <Value>
-      <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">1</Int32>
-    </Value>
-  </UAVariable>
-  <UAObject NodeId="i=78" BrowseName="Mandatory" SymbolicName="ModellingRule_Mandatory">
-    <DisplayName>Mandatory</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=112</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=112" BrowseName="NamingRule" ParentNodeId="i=78" DataType="i=120">
-    <DisplayName>NamingRule</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=78</Reference>
-    </References>
-    <Value>
-      <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">1</Int32>
-    </Value>
-  </UAVariable>
-  <UAObject NodeId="i=80" BrowseName="Optional" SymbolicName="ModellingRule_Optional">
-    <DisplayName>Optional</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=113</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=113" BrowseName="NamingRule" ParentNodeId="i=80" DataType="i=120">
-    <DisplayName>NamingRule</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=80</Reference>
-    </References>
-    <Value>
-      <Int32 xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">2</Int32>
-    </Value>
-  </UAVariable>
-  <UAObject NodeId="i=84" BrowseName="Root" SymbolicName="RootFolder">
-    <DisplayName>Root</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=85" BrowseName="Objects" SymbolicName="ObjectsFolder">
-    <DisplayName>Objects</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=84</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=86" BrowseName="Types" SymbolicName="TypesFolder">
-    <DisplayName>Types</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=84</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=87" BrowseName="Views" SymbolicName="ViewsFolder">
-    <DisplayName>Views</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=84</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=88" BrowseName="ObjectTypes" SymbolicName="ObjectTypesFolder">
-    <DisplayName>ObjectTypes</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
-      <Reference ReferenceType="Organizes">i=58</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=89" BrowseName="VariableTypes" SymbolicName="VariableTypesFolder">
-    <DisplayName>VariableTypes</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
-      <Reference ReferenceType="Organizes">i=62</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=90" BrowseName="DataTypes" SymbolicName="DataTypesFolder">
-    <DisplayName>DataTypes</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
-      <Reference ReferenceType="Organizes">i=24</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=91" BrowseName="ReferenceTypes" SymbolicName="ReferenceTypesFolder">
-    <DisplayName>ReferenceTypes</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
-      <Reference ReferenceType="Organizes">i=31</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=92" BrowseName="XML Schema" SymbolicName="XmlSchema_TypeSystem">
-    <DisplayName>XML Schema</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=90</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=75</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=93" BrowseName="OPC Binary" SymbolicName="OPCBinarySchema_TypeSystem">
-    <DisplayName>OPC Binary</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes" IsForward="false">i=90</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=75</Reference>
-    </References>
-  </UAObject>
-  <UAObjectType NodeId="i=2004" BrowseName="ServerType">
-    <DisplayName>ServerType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObject NodeId="i=2011" BrowseName="VendorServerInfo" ParentNodeId="i=2004">
-    <DisplayName>VendorServerInfo</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=2033</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2004</Reference>
-    </References>
-  </UAObject>
-  <UAObjectType NodeId="i=2013" BrowseName="ServerCapabilitiesType">
-    <DisplayName>ServerCapabilitiesType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObject NodeId="i=11551" BrowseName="OperationLimits" ParentNodeId="i=2013">
-    <DisplayName>OperationLimits</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=11564</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2013</Reference>
-    </References>
-  </UAObject>
-  <UAObjectType NodeId="i=2020" BrowseName="ServerDiagnosticsType">
-    <DisplayName>ServerDiagnosticsType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=2033" BrowseName="VendorServerInfoType">
-    <DisplayName>VendorServerInfoType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=2034" BrowseName="ServerRedundancyType">
-    <DisplayName>ServerRedundancyType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=2035</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=2035" BrowseName="RedundancySupport" ParentNodeId="i=2034" DataType="i=851">
-    <DisplayName>RedundancySupport</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2034</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=11564" BrowseName="OperationLimitsType">
-    <DisplayName>OperationLimitsType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=11565</Reference>
-      <Reference ReferenceType="HasProperty">i=11567</Reference>
-      <Reference ReferenceType="HasProperty">i=11569</Reference>
-      <Reference ReferenceType="HasProperty">i=11570</Reference>
-      <Reference ReferenceType="HasProperty">i=11571</Reference>
-      <Reference ReferenceType="HasProperty">i=11572</Reference>
-      <Reference ReferenceType="HasProperty">i=11573</Reference>
-      <Reference ReferenceType="HasProperty">i=11574</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=61</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=11565" BrowseName="MaxNodesPerRead" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerRead</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11567" BrowseName="MaxNodesPerWrite" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerWrite</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11569" BrowseName="MaxNodesPerMethodCall" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerMethodCall</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11570" BrowseName="MaxNodesPerBrowse" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerBrowse</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11571" BrowseName="MaxNodesPerRegisterNodes" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerRegisterNodes</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11572" BrowseName="MaxNodesPerTranslateBrowsePathsToNodeIds" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerTranslateBrowsePathsToNodeIds</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11573" BrowseName="MaxNodesPerNodeManagement" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxNodesPerNodeManagement</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11574" BrowseName="MaxMonitoredItemsPerCall" ParentNodeId="i=11564" DataType="UInt32">
-    <DisplayName>MaxMonitoredItemsPerCall</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11564</Reference>
-    </References>
-  </UAVariable>
-  <UAVariableType NodeId="i=2138" BrowseName="ServerStatusType" DataType="i=862">
-    <DisplayName>ServerStatusType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariableType NodeId="i=3051" BrowseName="BuildInfoType" DataType="i=338">
-    <DisplayName>BuildInfoType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariableType NodeId="i=2150" BrowseName="ServerDiagnosticsSummaryType" DataType="i=859">
-    <DisplayName>ServerDiagnosticsSummaryType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=2151</Reference>
-      <Reference ReferenceType="HasComponent">i=2152</Reference>
-      <Reference ReferenceType="HasComponent">i=2153</Reference>
-      <Reference ReferenceType="HasComponent">i=2154</Reference>
-      <Reference ReferenceType="HasComponent">i=2155</Reference>
-      <Reference ReferenceType="HasComponent">i=2156</Reference>
-      <Reference ReferenceType="HasComponent">i=2157</Reference>
-      <Reference ReferenceType="HasComponent">i=2159</Reference>
-      <Reference ReferenceType="HasComponent">i=2160</Reference>
-      <Reference ReferenceType="HasComponent">i=2161</Reference>
-      <Reference ReferenceType="HasComponent">i=2162</Reference>
-      <Reference ReferenceType="HasComponent">i=2163</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariable NodeId="i=2151" BrowseName="ServerViewCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>ServerViewCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2152" BrowseName="CurrentSessionCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>CurrentSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2153" BrowseName="CumulatedSessionCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>CumulatedSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2154" BrowseName="SecurityRejectedSessionCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>SecurityRejectedSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2155" BrowseName="RejectedSessionCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>RejectedSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2156" BrowseName="SessionTimeoutCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>SessionTimeoutCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2157" BrowseName="SessionAbortCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>SessionAbortCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2159" BrowseName="PublishingIntervalCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>PublishingIntervalCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2160" BrowseName="CurrentSubscriptionCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>CurrentSubscriptionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2161" BrowseName="CumulatedSubscriptionCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>CumulatedSubscriptionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2162" BrowseName="SecurityRejectedRequestsCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>SecurityRejectedRequestsCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2163" BrowseName="RejectedRequestsCount" ParentNodeId="i=2150" DataType="UInt32">
-    <DisplayName>RejectedRequestsCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2150</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=2253" BrowseName="Server" EventNotifier="1">
-    <DisplayName>Server</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=2254</Reference>
-      <Reference ReferenceType="HasProperty">i=2255</Reference>
-      <Reference ReferenceType="HasComponent">i=2256</Reference>
-      <Reference ReferenceType="HasComponent">i=2268</Reference>
-      <Reference ReferenceType="HasComponent">i=2274</Reference>
-      <Reference ReferenceType="HasComponent">i=2295</Reference>
-      <Reference ReferenceType="HasComponent">i=11492</Reference>
-      <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2004</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=2254" BrowseName="ServerArray" ParentNodeId="i=2253" DataType="String" ValueRank="1" ArrayDimensions="0" MinimumSamplingInterval="1000">
-    <DisplayName>ServerArray</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2253</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2255" BrowseName="NamespaceArray" ParentNodeId="i=2253" DataType="String" ValueRank="1" ArrayDimensions="0" MinimumSamplingInterval="1000">
-    <DisplayName>NamespaceArray</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2253</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2256" BrowseName="ServerStatus" ParentNodeId="i=2253" DataType="i=862" MinimumSamplingInterval="1000">
-    <DisplayName>ServerStatus</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=2257</Reference>
-      <Reference ReferenceType="HasComponent">i=2258</Reference>
-      <Reference ReferenceType="HasComponent">i=2259</Reference>
-      <Reference ReferenceType="HasComponent">i=2260</Reference>
-      <Reference ReferenceType="HasComponent">i=2992</Reference>
-      <Reference ReferenceType="HasComponent">i=2993</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2138</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2257" BrowseName="StartTime" ParentNodeId="i=2256" DataType="i=294">
-    <DisplayName>StartTime</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2256</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2258" BrowseName="CurrentTime" ParentNodeId="i=2256" DataType="i=294">
-    <DisplayName>CurrentTime</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2256</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2259" BrowseName="State" ParentNodeId="i=2256" DataType="i=852">
-    <DisplayName>State</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2256</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2260" BrowseName="BuildInfo" ParentNodeId="i=2256" DataType="i=338">
-    <DisplayName>BuildInfo</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=2262</Reference>
-      <Reference ReferenceType="HasComponent">i=2263</Reference>
-      <Reference ReferenceType="HasComponent">i=2261</Reference>
-      <Reference ReferenceType="HasComponent">i=2264</Reference>
-      <Reference ReferenceType="HasComponent">i=2265</Reference>
-      <Reference ReferenceType="HasComponent">i=2266</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=3051</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2256</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2262" BrowseName="ProductUri" ParentNodeId="i=2260" DataType="String" MinimumSamplingInterval="1000">
-    <DisplayName>ProductUri</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2260</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2263" BrowseName="ManufacturerName" ParentNodeId="i=2260" DataType="String" MinimumSamplingInterval="1000">
-    <DisplayName>ManufacturerName</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2260</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2261" BrowseName="ProductName" ParentNodeId="i=2260" DataType="String" MinimumSamplingInterval="1000">
-    <DisplayName>ProductName</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2260</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2264" BrowseName="SoftwareVersion" ParentNodeId="i=2260" DataType="String" MinimumSamplingInterval="1000">
-    <DisplayName>SoftwareVersion</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2260</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2265" BrowseName="BuildNumber" ParentNodeId="i=2260" DataType="String" MinimumSamplingInterval="1000">
-    <DisplayName>BuildNumber</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2260</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2266" BrowseName="BuildDate" ParentNodeId="i=2260" DataType="i=294" MinimumSamplingInterval="1000">
-    <DisplayName>BuildDate</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2260</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2992" BrowseName="SecondsTillShutdown" ParentNodeId="i=2256" DataType="UInt32">
-    <DisplayName>SecondsTillShutdown</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2256</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2993" BrowseName="ShutdownReason" ParentNodeId="i=2256" DataType="LocalizedText">
-    <DisplayName>ShutdownReason</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2256</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2267" BrowseName="ServiceLevel" ParentNodeId="i=2253" DataType="Byte" MinimumSamplingInterval="1000">
-    <DisplayName>ServiceLevel</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2253</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2994" BrowseName="Auditing" ParentNodeId="i=2253" DataType="Boolean" MinimumSamplingInterval="1000">
-    <DisplayName>Auditing</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2253</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=2268" BrowseName="ServerCapabilities" ParentNodeId="i=2253">
-    <DisplayName>ServerCapabilities</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=2269</Reference>
-      <Reference ReferenceType="HasProperty">i=2271</Reference>
-      <Reference ReferenceType="HasProperty">i=2272</Reference>
-      <Reference ReferenceType="HasProperty">i=2735</Reference>
-      <Reference ReferenceType="HasProperty">i=2736</Reference>
-      <Reference ReferenceType="HasProperty">i=2737</Reference>
-      <Reference ReferenceType="HasProperty">i=3704</Reference>
-      <Reference ReferenceType="HasComponent">i=2996</Reference>
-      <Reference ReferenceType="HasComponent">i=2997</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2013</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=2269" BrowseName="ServerProfileArray" ParentNodeId="i=2268" DataType="String" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>ServerProfileArray</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2271" BrowseName="LocaleIdArray" ParentNodeId="i=2268" DataType="i=295" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>LocaleIdArray</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2272" BrowseName="MinSupportedSampleRate" ParentNodeId="i=2268" DataType="i=290">
-    <DisplayName>MinSupportedSampleRate</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2735" BrowseName="MaxBrowseContinuationPoints" ParentNodeId="i=2268" DataType="UInt16">
-    <DisplayName>MaxBrowseContinuationPoints</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2736" BrowseName="MaxQueryContinuationPoints" ParentNodeId="i=2268" DataType="UInt16">
-    <DisplayName>MaxQueryContinuationPoints</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2737" BrowseName="MaxHistoryContinuationPoints" ParentNodeId="i=2268" DataType="UInt16">
-    <DisplayName>MaxHistoryContinuationPoints</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=3704" BrowseName="SoftwareCertificates" ParentNodeId="i=2268" DataType="i=344" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>SoftwareCertificates</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2268</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=11704" BrowseName="OperationLimits" ParentNodeId="i=2268">
-    <DisplayName>OperationLimits</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=11705</Reference>
-      <Reference ReferenceType="HasProperty">i=11707</Reference>
-      <Reference ReferenceType="HasProperty">i=11709</Reference>
-      <Reference ReferenceType="HasProperty">i=11710</Reference>
-      <Reference ReferenceType="HasProperty">i=11711</Reference>
-      <Reference ReferenceType="HasProperty">i=11712</Reference>
-      <Reference ReferenceType="HasProperty">i=11713</Reference>
-      <Reference ReferenceType="HasProperty">i=11714</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=11564</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2268</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=11705" BrowseName="MaxNodesPerRead" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerRead</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11707" BrowseName="MaxNodesPerWrite" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerWrite</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11709" BrowseName="MaxNodesPerMethodCall" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerMethodCall</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11710" BrowseName="MaxNodesPerBrowse" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerBrowse</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11711" BrowseName="MaxNodesPerRegisterNodes" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerRegisterNodes</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11712" BrowseName="MaxNodesPerTranslateBrowsePathsToNodeIds" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerTranslateBrowsePathsToNodeIds</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11713" BrowseName="MaxNodesPerNodeManagement" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxNodesPerNodeManagement</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=11714" BrowseName="MaxMonitoredItemsPerCall" ParentNodeId="i=11704" DataType="UInt32">
-    <DisplayName>MaxMonitoredItemsPerCall</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11704</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=2996" BrowseName="ModellingRules" ParentNodeId="i=2268">
-    <DisplayName>ModellingRules</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2268</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=2997" BrowseName="AggregateFunctions" ParentNodeId="i=2268">
-    <DisplayName>AggregateFunctions</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2268</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=2274" BrowseName="ServerDiagnostics" ParentNodeId="i=2253">
-    <DisplayName>ServerDiagnostics</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=2275</Reference>
-      <Reference ReferenceType="HasProperty">i=2294</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2020</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=2275" BrowseName="ServerDiagnosticsSummary" ParentNodeId="i=2274" DataType="i=859">
-    <DisplayName>ServerDiagnosticsSummary</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=2276</Reference>
-      <Reference ReferenceType="HasComponent">i=2277</Reference>
-      <Reference ReferenceType="HasComponent">i=2278</Reference>
-      <Reference ReferenceType="HasComponent">i=2279</Reference>
-      <Reference ReferenceType="HasComponent">i=3705</Reference>
-      <Reference ReferenceType="HasComponent">i=2281</Reference>
-      <Reference ReferenceType="HasComponent">i=2282</Reference>
-      <Reference ReferenceType="HasComponent">i=2284</Reference>
-      <Reference ReferenceType="HasComponent">i=2285</Reference>
-      <Reference ReferenceType="HasComponent">i=2286</Reference>
-      <Reference ReferenceType="HasComponent">i=2287</Reference>
-      <Reference ReferenceType="HasComponent">i=2288</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2150</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2274</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2276" BrowseName="ServerViewCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>ServerViewCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2277" BrowseName="CurrentSessionCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>CurrentSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2278" BrowseName="CumulatedSessionCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>CumulatedSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2279" BrowseName="SecurityRejectedSessionCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>SecurityRejectedSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=3705" BrowseName="RejectedSessionCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>RejectedSessionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2281" BrowseName="SessionTimeoutCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>SessionTimeoutCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2282" BrowseName="SessionAbortCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>SessionAbortCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2284" BrowseName="PublishingIntervalCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>PublishingIntervalCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2285" BrowseName="CurrentSubscriptionCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>CurrentSubscriptionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2286" BrowseName="CumulatedSubscriptionCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>CumulatedSubscriptionCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2287" BrowseName="SecurityRejectedRequestsCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>SecurityRejectedRequestsCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2288" BrowseName="RejectedRequestsCount" ParentNodeId="i=2275" DataType="UInt32">
-    <DisplayName>RejectedRequestsCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2275</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=2294" BrowseName="EnabledFlag" ParentNodeId="i=2274" DataType="Boolean" AccessLevel="3">
-    <DisplayName>EnabledFlag</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2274</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=2295" BrowseName="VendorServerInfo" ParentNodeId="i=2253">
-    <DisplayName>VendorServerInfo</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=2033</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=2296" BrowseName="ServerRedundancy" ParentNodeId="i=2253">
-    <DisplayName>ServerRedundancy</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=3709</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=2034</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=3709" BrowseName="RedundancySupport" ParentNodeId="i=2296" DataType="i=851">
-    <DisplayName>RedundancySupport</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=2296</Reference>
-    </References>
-  </UAVariable>
-  <UAMethod NodeId="i=11492" BrowseName="GetMonitoredItems" ParentNodeId="i=2253" MethodDeclarationId="i=11489">
-    <DisplayName>GetMonitoredItems</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=11493</Reference>
-      <Reference ReferenceType="HasProperty">i=11494</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=11493" BrowseName="InputArguments" ParentNodeId="i=11492" DataType="i=296" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11492</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>SubscriptionId</Name>
-              <DataType>
-                <Identifier>i=7</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=11494" BrowseName="OutputArguments" ParentNodeId="i=11492" DataType="i=296" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=11492</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ServerHandles</Name>
-              <DataType>
-                <Identifier>i=7</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions>
-                <UInt32>0</UInt32>
-              </ArrayDimensions>
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ClientHandles</Name>
-              <DataType>
-                <Identifier>i=7</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions>
-                <UInt32>0</UInt32>
-              </ArrayDimensions>
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAObjectType NodeId="i=17602" BrowseName="BaseInterfaceType" IsAbstract="true">
-    <DisplayName>BaseInterfaceType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObject NodeId="i=17708" BrowseName="InterfaceTypes">
-    <DisplayName>InterfaceTypes</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes">i=17602</Reference>
-      <Reference ReferenceType="Organizes" IsForward="false">i=86</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=61</Reference>
-    </References>
-  </UAObject>
-  <UAReferenceType NodeId="i=17603" BrowseName="HasInterface">
-    <DisplayName>HasInterface</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>InterfaceOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=17604" BrowseName="HasAddIn">
-    <DisplayName>HasAddIn</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
-    </References>
-    <InverseName>AddInOf</InverseName>
-  </UAReferenceType>
-  <UADataType NodeId="i=296" BrowseName="Argument">
-    <DisplayName>Argument</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="Argument">
-      <Field Name="Name" DataType="i=12" />
-      <Field Name="DataType" DataType="i=17" />
-      <Field Name="ValueRank" DataType="i=6" />
-      <Field Name="ArrayDimensions" DataType="i=7" ValueRank="1" />
-      <Field Name="Description" DataType="i=21" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=7594" BrowseName="EnumValueType">
-    <DisplayName>EnumValueType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="EnumValueType">
-      <Field Name="Value" DataType="i=8" />
-      <Field Name="DisplayName" DataType="i=21" />
-      <Field Name="Description" DataType="i=21" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=290" BrowseName="Duration">
-    <DisplayName>Duration</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=11</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=294" BrowseName="UtcTime">
-    <DisplayName>UtcTime</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=13</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=295" BrowseName="LocaleId">
-    <DisplayName>LocaleId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=12</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=344" BrowseName="SignedSoftwareCertificate">
-    <DisplayName>SignedSoftwareCertificate</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="SignedSoftwareCertificate">
-      <Field Name="CertificateData" DataType="i=15" />
-      <Field Name="Signature" DataType="i=15" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=338" BrowseName="BuildInfo">
-    <DisplayName>BuildInfo</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="BuildInfo">
-      <Field Name="ProductUri" DataType="i=12" />
-      <Field Name="ManufacturerName" DataType="i=12" />
-      <Field Name="ProductName" DataType="i=12" />
-      <Field Name="SoftwareVersion" DataType="i=12" />
-      <Field Name="BuildNumber" DataType="i=12" />
-      <Field Name="BuildDate" DataType="i=294" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=851" BrowseName="RedundancySupport">
-    <DisplayName>RedundancySupport</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=7611</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=29</Reference>
-    </References>
-    <Definition Name="RedundancySupport">
-      <Field Name="None" Value="0" />
-      <Field Name="Cold" Value="1" />
-      <Field Name="Warm" Value="2" />
-      <Field Name="Hot" Value="3" />
-      <Field Name="Transparent" Value="4" />
-      <Field Name="HotAndMirrored" Value="5" />
-    </Definition>
-  </UADataType>
-  <UAVariable NodeId="i=7611" BrowseName="EnumStrings" ParentNodeId="i=851" DataType="LocalizedText" ValueRank="1" ArrayDimensions="0">
-    <DisplayName>EnumStrings</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=851</Reference>
-    </References>
-    <Value>
-      <ListOfLocalizedText xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>None</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Cold</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Warm</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Hot</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Transparent</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>HotAndMirrored</Text>
-        </LocalizedText>
-      </ListOfLocalizedText>
-    </Value>
-  </UAVariable>
-  <UADataType NodeId="i=852" BrowseName="ServerState">
-    <DisplayName>ServerState</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=29</Reference>
-    </References>
-    <Definition Name="ServerState">
-      <Field Name="Running" Value="0" />
-      <Field Name="Failed" Value="1" />
-      <Field Name="NoConfiguration" Value="2" />
-      <Field Name="Suspended" Value="3" />
-      <Field Name="Shutdown" Value="4" />
-      <Field Name="Test" Value="5" />
-      <Field Name="CommunicationFault" Value="6" />
-      <Field Name="Unknown" Value="7" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=859" BrowseName="ServerDiagnosticsSummaryDataType">
-    <DisplayName>ServerDiagnosticsSummaryDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="ServerDiagnosticsSummaryDataType">
-      <Field Name="ServerViewCount" DataType="i=7" />
-      <Field Name="CurrentSessionCount" DataType="i=7" />
-      <Field Name="CumulatedSessionCount" DataType="i=7" />
-      <Field Name="SecurityRejectedSessionCount" DataType="i=7" />
-      <Field Name="RejectedSessionCount" DataType="i=7" />
-      <Field Name="SessionTimeoutCount" DataType="i=7" />
-      <Field Name="SessionAbortCount" DataType="i=7" />
-      <Field Name="CurrentSubscriptionCount" DataType="i=7" />
-      <Field Name="CumulatedSubscriptionCount" DataType="i=7" />
-      <Field Name="PublishingIntervalCount" DataType="i=7" />
-      <Field Name="SecurityRejectedRequestsCount" DataType="i=7" />
-      <Field Name="RejectedRequestsCount" DataType="i=7" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=862" BrowseName="ServerStatusDataType">
-    <DisplayName>ServerStatusDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="ServerStatusDataType">
-      <Field Name="StartTime" DataType="i=294" />
-      <Field Name="CurrentTime" DataType="i=294" />
-      <Field Name="State" DataType="i=852" />
-      <Field Name="BuildInfo" DataType="i=338" />
-      <Field Name="SecondsTillShutdown" DataType="i=7" />
-      <Field Name="ShutdownReason" DataType="i=21" />
-    </Definition>
-  </UADataType>
-  <UAObject NodeId="i=298" BrowseName="Default Binary" SymbolicName="DefaultBinary">
-    <DisplayName>Default Binary</DisplayName>
-    <References>
-      <Reference ReferenceType="HasEncoding" IsForward="false">i=296</Reference>
-      <Reference ReferenceType="HasDescription">i=7650</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=76</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=8251" BrowseName="Default Binary" SymbolicName="DefaultBinary">
-    <DisplayName>Default Binary</DisplayName>
-    <References>
-      <Reference ReferenceType="HasEncoding" IsForward="false">i=7594</Reference>
-      <Reference ReferenceType="HasDescription">i=7656</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=76</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=7617" BrowseName="Opc.Ua" SymbolicName="OpcUa_BinarySchema" DataType="ByteString">
-    <DisplayName>Opc.Ua</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=7656</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=93</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=72</Reference>
-    </References>
-    <Value>
-    <ByteString xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd"></ByteString>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=7650" BrowseName="Argument" ParentNodeId="i=7617" DataType="String">
-    <DisplayName>Argument</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=69</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=7617</Reference>
-    </References>
-    <Value>
-      <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">Argument</String>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=7656" BrowseName="EnumValueType" ParentNodeId="i=7617" DataType="String">
-    <DisplayName>EnumValueType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=69</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=7617</Reference>
-    </References>
-    <Value>
-      <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">EnumValueType</String>
-    </Value>
-  </UAVariable>
-</UANodeSet>
diff --git a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.PubSubMinimal.xml b/ext/open62541/tools/schema/Opc.Ua.NodeSet2.PubSubMinimal.xml
deleted file mode 100644
index a836211..0000000
--- a/ext/open62541/tools/schema/Opc.Ua.NodeSet2.PubSubMinimal.xml
+++ /dev/null
@@ -1,1924 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2018 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<UANodeSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" LastModified="2019-01-31T00:00:00Z" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
-  <Models>
-    <Model ModelUri="http://opcfoundation.org/UA/" Version="1.04" PublicationDate="2019-01-31T00:00:00Z" />
-  </Models>
-  <UAObjectType NodeId="i=15906" BrowseName="PubSubKeyServiceType">
-    <DisplayName>PubSubKeyServiceType</DisplayName>
-    <References>
-      <!--      <Reference ReferenceType="HasComponent">i=15907</Reference> || GetSecurityKeys
-            <Reference ReferenceType="HasComponent">i=15910</Reference>  ||GetSecurityGroup
-            <Reference ReferenceType="HasComponent">i=15913</Reference> || SecurityGroups   -->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=14416" BrowseName="PublishSubscribeType">
-    <DisplayName>PublishSubscribeType</DisplayName>
-    <References>
-
-      <!--      <Reference ReferenceType="HasComponent">i=17296</Reference>  SetSecurityKeys
-            <Reference ReferenceType="HasComponent">i=18715</Reference> Diagnostics SupportedTransportProfiles-->
-      <Reference ReferenceType="HasComponent">i=15844</Reference> <!--Status-->
-      <Reference ReferenceType="i=14476">i=14417</Reference>
-      <Reference ReferenceType="HasProperty">i=17479</Reference>
-      <Reference ReferenceType="HasComponent">i=14434</Reference>
-      <Reference ReferenceType="HasComponent">i=16598</Reference>
-      <Reference ReferenceType="HasComponent">i=14432</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=15906</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=17479" BrowseName="SupportedTransportProfiles" ParentNodeId="i=14416" DataType="String" ValueRank="1">
-    <DisplayName>SupportedTransportProfiles</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14416</Reference>
-    </References>
-  </UAVariable>
-
-  <UAObjectType NodeId="i=14477" BrowseName="DataSetFolderType">
-    <DisplayName>DataSetFolderType</DisplayName>
-    <References>
-      <Reference ReferenceType="Organizes">i=14478</Reference>
-      <Reference ReferenceType="HasComponent">i=14493</Reference> <!--AddPublishedDataItems-->
-      <Reference ReferenceType="HasComponent">i=14499</Reference> <!--RemovePublishedDataSet-->
-      <Reference ReferenceType="HasComponent">i=16994</Reference> <!--AddDataSetFolder-->
-      <Reference ReferenceType="HasComponent">i=16997</Reference> <!--RemoveDataSetFolder-->
-      <!--      <Reference ReferenceType="HasComponent">i=14487</Reference>
-            <Reference ReferenceType="HasComponent">i=14496</Reference>
-            <Reference ReferenceType="HasComponent">i=16935</Reference>
-            <Reference ReferenceType="HasComponent">i=16960</Reference> -->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=61</Reference>
-    </References>
-  </UAObjectType>
-  <UAObject NodeId="i=14478" BrowseName="&lt;DataSetFolderName&gt;" SymbolicName="DataSetFolderName_Placeholder" ParentNodeId="i=14477">
-    <DisplayName>&lt;DataSetFolderName&gt;</DisplayName>
-    <References>
-<!--      <Reference ReferenceType="HasComponent">i=14479</Reference>
-      <Reference ReferenceType="HasComponent">i=14482</Reference>
-      <Reference ReferenceType="HasComponent">i=16842</Reference>
-      <Reference ReferenceType="HasComponent">i=16881</Reference>
-      <Reference ReferenceType="HasComponent">i=14485</Reference>
-      <Reference ReferenceType="HasComponent">i=16884</Reference>
-      <Reference ReferenceType="HasComponent">i=16923</Reference>-->
-      <Reference ReferenceType="HasTypeDefinition">i=14477</Reference>
-<!--
-      <Reference ReferenceType="HasModellingRule">i=11508</Reference>
--->
-      <Reference ReferenceType="Organizes" IsForward="false">i=14477</Reference>
-    </References>
-  </UAObject>
-  <UAMethod NodeId="i=14493" BrowseName="AddPublishedDataItems" ParentNodeId="i=14477">
-    <DisplayName>AddPublishedDataItems</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14494</Reference>
-      <Reference ReferenceType="HasProperty">i=14495</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14477</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=14494" BrowseName="InputArguments" ParentNodeId="i=14493" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14493</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Name</Name>
-              <DataType>
-                <Identifier>i=12</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>FieldNameAliases</Name>
-              <DataType>
-                <Identifier>i=12</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>FieldFlags</Name>
-              <DataType>
-                <Identifier>i=15904</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>VariablesToAdd</Name>
-              <DataType>
-                <Identifier>i=14273</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=14495" BrowseName="OutputArguments" ParentNodeId="i=14493" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14493</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>DataSetNodeId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConfigurationVersion</Name>
-              <DataType>
-                <Identifier>i=14593</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>AddResults</Name>
-              <DataType>
-                <Identifier>i=19</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=14499" BrowseName="RemovePublishedDataSet" ParentNodeId="i=14477">
-    <DisplayName>RemovePublishedDataSet</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14500</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14477</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=14500" BrowseName="InputArguments" ParentNodeId="i=14499" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14499</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>DataSetNodeId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=16994" BrowseName="AddDataSetFolder" ParentNodeId="i=14477">
-    <DisplayName>AddDataSetFolder</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=16995</Reference>
-      <Reference ReferenceType="HasProperty">i=16996</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14477</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=16995" BrowseName="InputArguments" ParentNodeId="i=16994" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16994</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Name</Name>
-              <DataType>
-                <Identifier>i=12</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=16996" BrowseName="OutputArguments" ParentNodeId="i=16994" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16994</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>DataSetFolderNodeId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=16997" BrowseName="RemoveDataSetFolder" ParentNodeId="i=14477">
-    <DisplayName>RemoveDataSetFolder</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17007</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14477</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=17007" BrowseName="InputArguments" ParentNodeId="i=16997" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16997</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>DataSetFolderNodeId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAObject NodeId="i=14434" BrowseName="PublishedDataSets" ParentNodeId="i=14416">
-    <DisplayName>PublishedDataSets</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=14477</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14416</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=15844" BrowseName="Status" ParentNodeId="i=14416">
-    <DisplayName>Status</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=15845</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=14643</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14416</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=15845" BrowseName="State" ParentNodeId="i=15844" DataType="i=14647">
-    <DisplayName>State</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=15844</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=14509" BrowseName="PublishedDataSetType">
-    <DisplayName>PublishedDataSetType</DisplayName>
-      <References>
-        <Reference ReferenceType="HasProperty">i=14519</Reference>
-        <Reference ReferenceType="HasProperty">i=15229</Reference> <!--DataSetMetaData-->
-        <Reference ReferenceType="HasProperty">i=16759</Reference>
-<!--            <Reference ReferenceType="i=14936">i=15222</Reference>
-
-        Reference ReferenceType="HasComponent">i=15481</Reference>-->
-        <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-      </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=14519" BrowseName="ConfigurationVersion" ParentNodeId="i=14509" DataType="i=14593">
-    <DisplayName>ConfigurationVersion</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14509</Reference>
-    </References>
-  </UAVariable>
-  <UAReferenceType NodeId="i=14936" BrowseName="DataSetToWriter">
-    <DisplayName>DataSetToWriter</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
-    </References>
-    <InverseName>WriterToDataSet</InverseName>
-  </UAReferenceType>
-  <UAVariable NodeId="i=15229" BrowseName="DataSetMetaData" ParentNodeId="i=14509" DataType="i=14523">
-    <DisplayName>DataSetMetaData</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14509</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=16759" BrowseName="DataSetClassId" ParentNodeId="i=14509" DataType="Guid">
-    <DisplayName>DataSetClassId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14509</Reference>
-    </References>
-  </UAVariable>
-  <UADataType NodeId="i=15534" BrowseName="DataTypeSchemaHeader">
-    <DisplayName>DataTypeSchemaHeader</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="DataTypeSchemaHeader">
-      <Field Name="Namespaces" DataType="i=12" ValueRank="1" />
-<!--      <Field Name="StructureDataTypes" DataType="i=15487" ValueRank="1" />
-      <Field Name="EnumDataTypes" DataType="i=15488" ValueRank="1" />
-      <Field Name="SimpleDataTypes" DataType="i=15005" ValueRank="1" />-->
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=14647" BrowseName="PubSubState">
-    <DisplayName>PubSubState</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14648</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=29</Reference>
-    </References>
-    <Definition Name="PubSubState">
-      <Field Name="Disabled" Value="0" />
-      <Field Name="Paused" Value="1" />
-      <Field Name="Operational" Value="2" />
-      <Field Name="Error" Value="3" />
-    </Definition>
-  </UADataType>
-  <UAVariable NodeId="i=14648" BrowseName="EnumStrings" ParentNodeId="i=14647" DataType="LocalizedText" ValueRank="1">
-    <DisplayName>EnumStrings</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14647</Reference>
-    </References>
-    <Value>
-      <ListOfLocalizedText xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Disabled</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Paused</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Operational</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>Error</Text>
-        </LocalizedText>
-      </ListOfLocalizedText>
-    </Value>
-  </UAVariable>
-  <UADataType NodeId="i=14523" BrowseName="DataSetMetaDataType">
-    <DisplayName>DataSetMetaDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=15534</Reference>
-    </References>
-    <Definition Name="DataSetMetaDataType">
-      <Field Name="Name" DataType="i=12" />
-      <Field Name="Description" DataType="i=21" />
-<!--
-      <Field Name="Fields" DataType="i=14524" ValueRank="1" />
--->
-      <Field Name="DataSetClassId" DataType="i=14" />
-      <Field Name="ConfigurationVersion" DataType="i=14593" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=20998" BrowseName="VersionTime">
-    <DisplayName>VersionTime</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=7</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=14593" BrowseName="ConfigurationVersionDataType">
-    <DisplayName>ConfigurationVersionDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="ConfigurationVersionDataType">
-      <Field Name="MajorVersion" DataType="i=20998" />
-      <Field Name="MinorVersion" DataType="i=20998" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=15578" BrowseName="PublishedDataSetDataType">
-    <DisplayName>PublishedDataSetDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="PublishedDataSetDataType">
-      <Field Name="Name" DataType="i=12" />
-      <Field Name="DataSetFolder" DataType="i=12" ValueRank="1" />
-      <Field Name="DataSetMetaData" DataType="i=14523" />
-<!--
-      <Field Name="ExtensionFields" DataType="i=14533" ValueRank="1" />
--->
-      <Field Name="DataSetSource" DataType="i=22" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=15583" BrowseName="DataSetFieldContentMask">
-    <DisplayName>DataSetFieldContentMask</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=15584</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=7</Reference>
-    </References>
-    <Definition Name="DataSetFieldContentMask" IsOptionSet="true">
-      <Field Name="StatusCode" Value="0" />
-      <Field Name="SourceTimestamp" Value="1" />
-      <Field Name="ServerTimestamp" Value="2" />
-      <Field Name="SourcePicoSeconds" Value="3" />
-      <Field Name="ServerPicoSeconds" Value="4" />
-      <Field Name="RawDataEncoding" Value="5" />
-    </Definition>
-  </UADataType>
-  <UAVariable NodeId="i=15584" BrowseName="OptionSetValues" ParentNodeId="i=15583" DataType="LocalizedText" ValueRank="1">
-    <DisplayName>OptionSetValues</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=15583</Reference>
-    </References>
-    <Value>
-      <ListOfLocalizedText xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>StatusCode</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>SourceTimestamp</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>ServerTimestamp</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>SourcePicoSeconds</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>ServerPicoSeconds</Text>
-        </LocalizedText>
-        <LocalizedText>
-          <Locale>
-          </Locale>
-          <Text>RawDataEncoding</Text>
-        </LocalizedText>
-      </ListOfLocalizedText>
-    </Value>
-  </UAVariable>
-
-  <UAObjectType NodeId="i=14534" BrowseName="PublishedDataItemsType">
-      <DisplayName>PublishedDataItemsType</DisplayName>
-      <References>
-        <Reference ReferenceType="HasProperty">i=14548</Reference>
-        <Reference ReferenceType="HasComponent">i=14555</Reference> <!--AddVariables-->
-        <Reference ReferenceType="HasComponent">i=14558</Reference> <!--RemoveVariables-->
-        <Reference ReferenceType="HasSubtype" IsForward="false">i=14509</Reference>
-      </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=14548" BrowseName="PublishedData" ParentNodeId="i=14534" DataType="i=14273" ValueRank="1">
-    <DisplayName>PublishedData</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14534</Reference>
-    </References>
-  </UAVariable>
-  <UAMethod NodeId="i=14555" BrowseName="AddVariables" ParentNodeId="i=14534">
-    <DisplayName>AddVariables</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14556</Reference>
-      <Reference ReferenceType="HasProperty">i=14557</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14534</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=14556" BrowseName="InputArguments" ParentNodeId="i=14555" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14555</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConfigurationVersion</Name>
-              <DataType>
-                <Identifier>i=14593</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>FieldNameAliases</Name>
-              <DataType>
-                <Identifier>i=12</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>PromotedFields</Name>
-              <DataType>
-                <Identifier>i=1</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>VariablesToAdd</Name>
-              <DataType>
-                <Identifier>i=14273</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=14557" BrowseName="OutputArguments" ParentNodeId="i=14555" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14555</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>NewConfigurationVersion</Name>
-              <DataType>
-                <Identifier>i=14593</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>AddResults</Name>
-              <DataType>
-                <Identifier>i=19</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=14558" BrowseName="RemoveVariables" ParentNodeId="i=14534">
-    <DisplayName>RemoveVariables</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14559</Reference>
-      <Reference ReferenceType="HasProperty">i=14560</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14534</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=14559" BrowseName="InputArguments" ParentNodeId="i=14558" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14558</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConfigurationVersion</Name>
-              <DataType>
-                <Identifier>i=14593</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>VariablesToRemove</Name>
-              <DataType>
-                <Identifier>i=7</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=14560" BrowseName="OutputArguments" ParentNodeId="i=14558" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14558</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>NewConfigurationVersion</Name>
-              <DataType>
-                <Identifier>i=14593</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>RemoveResults</Name>
-              <DataType>
-                <Identifier>i=19</Identifier>
-              </DataType>
-              <ValueRank>1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAObject NodeId="i=11508" BrowseName="OptionalPlaceholder" SymbolicName="ModellingRule_OptionalPlaceholder">
-    <DisplayName>OptionalPlaceholder</DisplayName>
-    <Description>Specifies that zero or more instances with the attributes and references of the instance declaration may appear when a type is instantiated.</Description>
-    <References>
-      <!--<Reference ReferenceType="HasProperty">i=11509</Reference>-->
-      <Reference ReferenceType="HasTypeDefinition">i=77</Reference>
-    </References>
-  </UAObject>
-  <UADataType NodeId="i=15617" BrowseName="PubSubConnectionDataType">
-    <DisplayName>PubSubConnectionDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="PubSubConnectionDataType">
-      <Field Name="Name" DataType="i=12" />
-      <Field Name="Enabled" DataType="i=1" />
-      <Field Name="PublisherId" />
-      <Field Name="TransportProfileUri" DataType="i=12" />
-      <Field Name="Address" DataType="i=22" />
-      <Field Name="ConnectionProperties" DataType="i=14533" ValueRank="1" />
-      <!--      <Field Name="TransportSettings" DataType="i=22" />
-            <Field Name="WriterGroups" DataType="i=15480" ValueRank="1" />
-            <Field Name="ReaderGroups" DataType="i=15520" ValueRank="1" />-->
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=14533" BrowseName="KeyValuePair">
-    <DisplayName>KeyValuePair</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="KeyValuePair">
-      <Field Name="Key" DataType="i=20" />
-      <Field Name="Value" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=16313" BrowseName="AdditionalParametersType" ReleaseStatus="Draft">
-    <DisplayName>AdditionalParametersType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="AdditionalParametersType">
-      <Field Name="Parameters" DataType="i=14533" ValueRank="1" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=15581" BrowseName="PublishedDataItemsDataType">
-    <DisplayName>PublishedDataItemsDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=15580</Reference>
-    </References>
-    <Definition Name="PublishedDataItemsDataType">
-      <Field Name="PublishedData" DataType="i=14273" ValueRank="1" />
-    </Definition>
-  </UADataType>
-  <UADataType NodeId="i=15580" BrowseName="PublishedDataSetSourceDataType" IsAbstract="true">
-    <DisplayName>PublishedDataSetSourceDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-  </UADataType>
-  <UADataType NodeId="i=14273" BrowseName="PublishedVariableDataType">
-    <DisplayName>PublishedVariableDataType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
-    </References>
-    <Definition Name="PublishedVariableDataType">
-      <Field Name="PublishedVariable" DataType="i=17" />
-<!--      <Field Name="AttributeId" DataType="i=288" />
-      <Field Name="SamplingIntervalHint" DataType="i=290" />
-      <Field Name="DeadbandType" DataType="i=7" />
-      <Field Name="DeadbandValue" DataType="i=11" />
-      <Field Name="IndexRange" DataType="i=291" />
-      <Field Name="SubstituteValue" />
-      <Field Name="MetaDataProperties" DataType="i=20" ValueRank="1" />-->
-    </Definition>
-  </UADataType>
-  <UAObjectType NodeId="i=14209" BrowseName="PubSubConnectionType">
-    <DisplayName>PubSubConnectionType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14595</Reference>
-      <Reference ReferenceType="HasComponent">i=17306</Reference>
-      <Reference ReferenceType="HasComponent">i=17310</Reference>
-      <Reference ReferenceType="HasComponent">i=14221</Reference>
-      <Reference ReferenceType="HasComponent">i=17427</Reference> <!--AddWriterGroup-->
-      <Reference ReferenceType="HasComponent">i=14225</Reference> <!--RemoveGroup-->
-      <Reference ReferenceType="HasComponent">i=17465</Reference> <!--AddReaderGroup-->
-      <Reference ReferenceType="HasProperty">i=17485</Reference>  <!--ConnectionProperties-->
-      <Reference ReferenceType="HasComponent">i=14600</Reference> <!--Status -->
-      <Reference ReferenceType="HasComponent">i=17203</Reference> <!--TransportSettings-->
-
-
-      <!--
-            <Reference ReferenceType="HasComponent">i=17325</Reference> ReaderGroupName
-            <Reference ReferenceType="HasComponent">i=19241</Reference> Diagnostics -->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=17485" BrowseName="ConnectionProperties" ParentNodeId="i=14209" DataType="i=14533" ValueRank="1">
-    <DisplayName>ConnectionProperties</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14209</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=14221" BrowseName="Address" ParentNodeId="i=14209">
-    <DisplayName>Address</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=17202</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=21145</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=17202" BrowseName="NetworkInterface" ParentNodeId="i=14221" DataType="String">
-    <DisplayName>NetworkInterface</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14221</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=21145" BrowseName="NetworkAddressType" IsAbstract="true">
-    <DisplayName>NetworkAddressType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=21146</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=21146" BrowseName="NetworkInterface" ParentNodeId="i=21145" DataType="String">
-    <DisplayName>NetworkInterface</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=21145</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=21147" BrowseName="NetworkAddressUrlType">
-    <DisplayName>NetworkAddressUrlType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=21149</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=21145</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=21149" BrowseName="Url" ParentNodeId="i=21147" DataType="String">
-    <DisplayName>Url</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=21147</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=17203" BrowseName="TransportSettings" ParentNodeId="i=14209">
-    <DisplayName>TransportSettings</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=17721</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=17310" BrowseName="&lt;WriterGroupName&gt;" SymbolicName="WriterGroupName_Placeholder" ParentNodeId="i=14209">
-    <DisplayName>&lt;WriterGroupName&gt;</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=17725</Reference>
-
-      <!--      <Reference ReferenceType="HasProperty">i=17311</Reference>
-            <Reference ReferenceType="HasProperty">i=17204</Reference>
-            <Reference ReferenceType="HasProperty">i=17486</Reference>
-            <Reference ReferenceType="HasComponent">i=17314</Reference>
-            <Reference ReferenceType="HasProperty">i=17214</Reference>
-            <Reference ReferenceType="HasProperty">i=17318</Reference>
-            <Reference ReferenceType="HasProperty">i=17319</Reference>
-            <Reference ReferenceType="HasProperty">i=17321</Reference>
-            <Reference ReferenceType="HasProperty">i=17322</Reference>
-            <Reference ReferenceType="HasModellingRule">i=11508</Reference>
-            <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>-->
-    </References>
-  </UAObject>
-  <UAObject NodeId="i=14600" BrowseName="Status" ParentNodeId="i=14209">
-    <DisplayName>Status</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=14601</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=14643</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=14601" BrowseName="State" ParentNodeId="i=14600" DataType="i=14647">
-    <DisplayName>State</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14600</Reference>
-    </References>
-  </UAVariable>
-  <UAMethod NodeId="i=17427" BrowseName="AddWriterGroup" ParentNodeId="i=14209">
-    <DisplayName>AddWriterGroup</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17428</Reference>
-      <Reference ReferenceType="HasProperty">i=17456</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=17428" BrowseName="InputArguments" ParentNodeId="i=17427" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17427</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Configuration</Name>
-              <DataType>
-                <Identifier>i=15480</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=17456" BrowseName="OutputArguments" ParentNodeId="i=17427" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17427</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>GroupId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=17465" BrowseName="AddReaderGroup" ParentNodeId="i=14209">
-    <DisplayName>AddReaderGroup</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17507</Reference>
-      <Reference ReferenceType="HasProperty">i=17508</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=17507" BrowseName="InputArguments" ParentNodeId="i=17465" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17465</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Configuration</Name>
-              <DataType>
-                <Identifier>i=15520</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=17508" BrowseName="OutputArguments" ParentNodeId="i=17465" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17465</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>GroupId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=14225" BrowseName="RemoveGroup" ParentNodeId="i=14209">
-    <DisplayName>RemoveGroup</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14226</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=14226" BrowseName="InputArguments" ParentNodeId="i=14225" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14225</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>GroupId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAObjectType NodeId="i=17721" BrowseName="ConnectionTransportType" IsAbstract="true">
-    <DisplayName>ConnectionTransportType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=14232" BrowseName="PubSubGroupType">
-    <DisplayName>PubSubGroupType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=15927</Reference>
-<!--
-      <Reference ReferenceType="HasProperty">i=15926</Reference> SecurityMode
-      <Reference ReferenceType="HasProperty">i=15928</Reference> SecurityKeyServices
-      <Reference ReferenceType="HasProperty">i=17488</Reference> GroupProperties
-      <Reference ReferenceType="HasComponent">i=15265</Reference> Status
--->
-      <Reference ReferenceType="HasProperty">i=17724</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=15927" BrowseName="SecurityGroupId" ParentNodeId="i=14232" DataType="String">
-    <DisplayName>SecurityGroupId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14232</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17724" BrowseName="MaxNetworkMessageSize" ParentNodeId="i=14232" DataType="UInt32">
-    <DisplayName>MaxNetworkMessageSize</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14232</Reference>
-    </References>
-  </UAVariable>
-<!--  <UAObject NodeId="i=15265" BrowseName="Status" ParentNodeId="i=14232">
-    <DisplayName>Status</DisplayName>
-    <References>
-&lt;!&ndash;
-      <Reference ReferenceType="HasComponent">i=15266</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=14643</Reference>
-
-&ndash;&gt;
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14232</Reference>
-    </References>
-  </UAObject>-->
-  <UAObjectType NodeId="i=17725" BrowseName="WriterGroupType">
-    <DisplayName>WriterGroupType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17736</Reference> <!--WriterGroupId-->
-      <Reference ReferenceType="HasProperty">i=17737</Reference> <!--PublishingInterval-->
-      <Reference ReferenceType="HasProperty">i=17738</Reference> <!--KeepAliveTime-->
-      <Reference ReferenceType="HasProperty">i=17739</Reference> <!--Priority-->
-      <Reference ReferenceType="HasProperty">i=17740</Reference> <!--LocaleIds-->
-      <Reference ReferenceType="i=15296">i=17743</Reference> <!--DataSetWriterName-->
-      <Reference ReferenceType="HasComponent">i=17969</Reference> <!--AddDataSetWriter-->
-
-
-      <!--
-            <Reference ReferenceType="HasComponent">i=17741</Reference> TransportSettings
-            <Reference ReferenceType="HasComponent">i=17742</Reference> MessageSettings
-            <Reference ReferenceType="HasComponent">i=17812</Reference> Diagnostics
-            <Reference ReferenceType="HasComponent">i=17992</Reference> RemoveDataSetWriter-->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=14232</Reference>  <!--PubSubGroupType-->
-    </References>
-  </UAObjectType>
-  <UAMethod NodeId="i=17969" BrowseName="AddDataSetWriter" ParentNodeId="i=17725">
-    <DisplayName>AddDataSetWriter</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17976</Reference>
-      <Reference ReferenceType="HasProperty">i=17987</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=17725</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=17976" BrowseName="InputArguments" ParentNodeId="i=17969" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17969</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Configuration</Name>
-              <DataType>
-                <Identifier>i=15597</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=17987" BrowseName="OutputArguments" ParentNodeId="i=17969" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17969</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>DataSetWriterNodeId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=17736" BrowseName="WriterGroupId" ParentNodeId="i=17725" DataType="UInt16">
-    <DisplayName>WriterGroupId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17725</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17737" BrowseName="PublishingInterval" ParentNodeId="i=17725" DataType="i=290">
-    <DisplayName>PublishingInterval</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17725</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17738" BrowseName="KeepAliveTime" ParentNodeId="i=17725" DataType="i=290">
-    <DisplayName>KeepAliveTime</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17725</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17739" BrowseName="Priority" ParentNodeId="i=17725" DataType="Byte">
-    <DisplayName>Priority</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17725</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17740" BrowseName="LocaleIds" ParentNodeId="i=17725" DataType="i=295" ValueRank="1">
-    <DisplayName>LocaleIds</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17725</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17306" BrowseName="TransportProfileUri" ParentNodeId="i=14209" DataType="String">
-    <DisplayName>TransportProfileUri</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17710</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=16309</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14209</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17710" BrowseName="Selections" ParentNodeId="i=17306" ValueRank="1">
-    <DisplayName>Selections</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17306</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=15298" BrowseName="DataSetWriterType">
-    <DisplayName>DataSetWriterType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=21092</Reference> <!--DataSetWriterId-->
-      <Reference ReferenceType="HasProperty">i=21093</Reference> <!--DataSetFieldContentMask-->
-      <Reference ReferenceType="HasProperty">i=21094</Reference> <!--KeyFrameCount-->
-      <Reference ReferenceType="HasProperty">i=17493</Reference> <!--DataSetWriterProperties-->
-      <Reference ReferenceType="HasComponent">i=15303</Reference> <!--TransportSettings-->
-<!--      <Reference ReferenceType="HasComponent">i=21095</Reference> MessageSettings
-      <Reference ReferenceType="HasComponent">i=15299</Reference> Status
-      <Reference ReferenceType="HasComponent">i=19550</Reference>  Diagnostics-->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAVariable NodeId="i=21092" BrowseName="DataSetWriterId" ParentNodeId="i=15298" DataType="UInt16">
-    <DisplayName>DataSetWriterId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=15298</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=21093" BrowseName="DataSetFieldContentMask" ParentNodeId="i=15298" DataType="i=15583">
-    <DisplayName>DataSetFieldContentMask</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=15298</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=21094" BrowseName="KeyFrameCount" ParentNodeId="i=15298" DataType="UInt32">
-    <DisplayName>KeyFrameCount</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=15298</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17493" BrowseName="DataSetWriterProperties" ParentNodeId="i=15298" DataType="i=14533" ValueRank="1">
-    <DisplayName>DataSetWriterProperties</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=15298</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=15303" BrowseName="TransportSettings" ParentNodeId="i=15298">
-    <DisplayName>TransportSettings</DisplayName>
-    <References>
-      <!--<Reference ReferenceType="HasTypeDefinition">i=15305</Reference>-->
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=15298</Reference>
-    </References>
-  </UAObject>
-  <UAObjectType NodeId="i=14643" BrowseName="PubSubStatusType">
-    <DisplayName>PubSubStatusType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=14644</Reference>
-      <Reference ReferenceType="HasComponent">i=14645</Reference>
-      <Reference ReferenceType="HasComponent">i=14646</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObject NodeId="i=17743" BrowseName="&lt;DataSetWriterName&gt;" SymbolicName="DataSetWriterName_Placeholder" ParentNodeId="i=17725">
-    <DisplayName>&lt;DataSetWriterName&gt;</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17744</Reference>
-      <Reference ReferenceType="HasProperty">i=17745</Reference>
-      <Reference ReferenceType="HasProperty">i=17490</Reference>
-      <Reference ReferenceType="HasComponent">i=17749</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=15298</Reference>
-      <Reference ReferenceType="HasModellingRule">i=11508</Reference>
-      <Reference ReferenceType="i=15296" IsForward="false">i=17725</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=17744" BrowseName="DataSetWriterId" ParentNodeId="i=17743" DataType="UInt16">
-    <DisplayName>DataSetWriterId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17743</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17745" BrowseName="DataSetFieldContentMask" ParentNodeId="i=17743" DataType="i=15583">
-    <DisplayName>DataSetFieldContentMask</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17743</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17490" BrowseName="DataSetWriterProperties" ParentNodeId="i=17743" DataType="i=14533" ValueRank="1">
-    <DisplayName>DataSetWriterProperties</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17743</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=17749" BrowseName="Status" ParentNodeId="i=17743">
-    <DisplayName>Status</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=17750</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=14643</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=17743</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=17750" BrowseName="State" ParentNodeId="i=17749" DataType="i=14647">
-    <DisplayName>State</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=17749</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=14644" BrowseName="State" ParentNodeId="i=14643" DataType="i=14647">
-    <DisplayName>State</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14643</Reference>
-    </References>
-  </UAVariable>
-  <UAMethod NodeId="i=14645" BrowseName="Enable" ParentNodeId="i=14643">
-    <DisplayName>Enable</DisplayName>
-    <References>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14643</Reference>
-    </References>
-  </UAMethod>
-  <UAMethod NodeId="i=14646" BrowseName="Disable" ParentNodeId="i=14643">
-    <DisplayName>Disable</DisplayName>
-    <References>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14643</Reference>
-    </References>
-  </UAMethod>
-  <UAVariableType NodeId="i=16309" BrowseName="SelectionListType" ValueRank="-2">
-    <DisplayName>SelectionListType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17632</Reference>
-      <Reference ReferenceType="HasProperty">i=17633</Reference>
-      <Reference ReferenceType="HasProperty">i=16312</Reference>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
-    </References>
-  </UAVariableType>
-  <UAVariable NodeId="i=17632" BrowseName="Selections" ParentNodeId="i=16309" ValueRank="1">
-    <DisplayName>Selections</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16309</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17633" BrowseName="SelectionDescriptions" ParentNodeId="i=16309" DataType="LocalizedText" ValueRank="1">
-    <DisplayName>SelectionDescriptions</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16309</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=16312" BrowseName="RestrictToList" ParentNodeId="i=16309" DataType="Boolean">
-    <DisplayName>RestrictToList</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16309</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=14595" BrowseName="PublisherId" ParentNodeId="i=14209">
-    <DisplayName>PublisherId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14209</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=14417" BrowseName="&lt;ConnectionName&gt;" SymbolicName="ConnectionName_Placeholder" ParentNodeId="i=14416">
-    <DisplayName>&lt;ConnectionName&gt;</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=14209</Reference>
-      <Reference ReferenceType="HasModellingRule">i=11508</Reference>
-      <Reference ReferenceType="i=14476" IsForward="false">i=14416</Reference>
-      <Reference ReferenceType="HasComponent">i=14423</Reference>
-      <Reference ReferenceType="HasComponent">i=17292</Reference> <!--TransportProfileUri-->
-      <Reference ReferenceType="HasProperty">i=14418</Reference>  <!--PublisherId -->
-      <Reference ReferenceType="HasProperty">i=17478</Reference>  <!--ConnectionProperties -->
-
-    </References>
-
-    <!--<References>
-      <Reference ReferenceType="HasComponent">i=14419</Reference> Status
-    </References>-->
-  </UAObject>
-    <UAVariable NodeId="i=14418" BrowseName="PublisherId" ParentNodeId="i=14417">
-    <DisplayName>PublisherId</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14417</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17478" BrowseName="ConnectionProperties" ParentNodeId="i=14417" DataType="i=14533" ValueRank="1">
-    <DisplayName>ConnectionProperties</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14417</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=14423" BrowseName="Address" ParentNodeId="i=14417">
-    <DisplayName>Address</DisplayName>
-    <References>
-      <Reference ReferenceType="HasComponent">i=15533</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=21145</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14417</Reference>
-    </References>
-  </UAObject>
-  <UAVariable NodeId="i=15533" BrowseName="NetworkInterface" ParentNodeId="i=14423" DataType="String">
-    <DisplayName>NetworkInterface</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14423</Reference>
-    </References>
-  </UAVariable>
-  <UAObject NodeId="i=14443" BrowseName="PublishSubscribe">
-    <DisplayName>PublishSubscribe</DisplayName>
-    <References>
-      <!--      <Reference ReferenceType="HasComponent">i=15215</Reference> GetSecurityKeys
-            <Reference ReferenceType="HasComponent">i=15440</Reference> GetSecurityGroup
-            <Reference ReferenceType="HasComponent">i=15443</Reference> SecurityGroups
-            <Reference ReferenceType="HasComponent">i=17405</Reference> Status
-            <Reference ReferenceType="HasComponent">i=17409</Reference> Diagnostics-->
-      <Reference ReferenceType="HasProperty">i=17481</Reference>
-      <Reference ReferenceType="HasComponent">i=17366</Reference> <!-- addConnection -->
-      <Reference ReferenceType="HasComponent">i=17369</Reference>
-      <Reference ReferenceType="HasComponent">i=17371</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=2253</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=14416</Reference>
-    </References>
-  </UAObject>
-  <UAReferenceType NodeId="i=14476" BrowseName="HasPubSubConnection">
-    <DisplayName>HasPubSubConnection</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=47</Reference>
-    </References>
-    <InverseName>PubSubConnectionOf</InverseName>
-  </UAReferenceType>
-  <UAReferenceType NodeId="i=15296" BrowseName="HasDataSetWriter">
-    <DisplayName>HasDataSetWriter</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=47</Reference>
-    </References>
-    <InverseName>IsWriterInGroup</InverseName>
-  </UAReferenceType>
-  <UAObjectType NodeId="i=17998" BrowseName="WriterGroupMessageType" IsAbstract="true">
-    <DisplayName>WriterGroupMessageType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAMethod NodeId="i=16598" BrowseName="AddConnection" ParentNodeId="i=14416">
-    <DisplayName>AddConnection</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=16599</Reference>
-      <Reference ReferenceType="HasProperty">i=16600</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14416</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=16599" BrowseName="InputArguments" ParentNodeId="i=16598" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16598</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Configuration</Name>
-              <DataType>
-                <Identifier>i=15617</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=16600" BrowseName="OutputArguments" ParentNodeId="i=16598" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=16598</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConnectionId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=17366" BrowseName="AddConnection" ParentNodeId="i=14443" MethodDeclarationId="i=16598">
-    <DisplayName>AddConnection</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17367</Reference>
-      <Reference ReferenceType="HasProperty">i=17368</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14443</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=17367" BrowseName="InputArguments" ParentNodeId="i=17366" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17366</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>Configuration</Name>
-              <DataType>
-                <Identifier>i=15617</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAVariable NodeId="i=17368" BrowseName="OutputArguments" ParentNodeId="i=17366" DataType="i=296" ValueRank="1">
-    <DisplayName>OutputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17366</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConnectionId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=14432" BrowseName="RemoveConnection" ParentNodeId="i=14416">
-    <DisplayName>RemoveConnection</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=14433</Reference>
-      <Reference ReferenceType="HasModellingRule">i=80</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14416</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=14433" BrowseName="InputArguments" ParentNodeId="i=14432" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14432</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConnectionId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAMethod NodeId="i=17369" BrowseName="RemoveConnection" ParentNodeId="i=14443" MethodDeclarationId="i=14432">
-    <DisplayName>RemoveConnection</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17370</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14443</Reference>
-    </References>
-  </UAMethod>
-  <UAVariable NodeId="i=17370" BrowseName="InputArguments" ParentNodeId="i=17369" DataType="i=296" ValueRank="1">
-    <DisplayName>InputArguments</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17369</Reference>
-    </References>
-    <Value>
-      <ListOfExtensionObject xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
-        <ExtensionObject>
-          <TypeId>
-            <Identifier>i=297</Identifier>
-          </TypeId>
-          <Body>
-            <Argument>
-              <Name>ConnectionId</Name>
-              <DataType>
-                <Identifier>i=17</Identifier>
-              </DataType>
-              <ValueRank>-1</ValueRank>
-              <ArrayDimensions />
-              <Description p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
-            </Argument>
-          </Body>
-        </ExtensionObject>
-      </ListOfExtensionObject>
-    </Value>
-  </UAVariable>
-  <UAObject NodeId="i=17371" BrowseName="PublishedDataSets" ParentNodeId="i=14443">
-      <DisplayName>PublishedDataSets</DisplayName>
-      <References>
-          <Reference ReferenceType="HasTypeDefinition">i=14477</Reference>
-          <Reference ReferenceType="HasComponent" IsForward="false">i=14443</Reference>
-      </References>
-  </UAObject>
-  <UAVariable NodeId="i=17481" BrowseName="SupportedTransportProfiles" ParentNodeId="i=14443" DataType="String" ValueRank="1">
-    <DisplayName>SupportedTransportProfiles</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=14443</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17292" BrowseName="TransportProfileUri" ParentNodeId="i=14417" DataType="String">
-    <DisplayName>TransportProfileUri</DisplayName>
-    <References>
-      <Reference ReferenceType="HasProperty">i=17706</Reference>
-      <Reference ReferenceType="HasTypeDefinition">i=16309</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasComponent" IsForward="false">i=14417</Reference>
-    </References>
-  </UAVariable>
-  <UAVariable NodeId="i=17706" BrowseName="Selections" ParentNodeId="i=17292" ValueRank="1">
-    <DisplayName>Selections</DisplayName>
-    <References>
-      <Reference ReferenceType="HasTypeDefinition">i=68</Reference>
-      <Reference ReferenceType="HasModellingRule">i=78</Reference>
-      <Reference ReferenceType="HasProperty" IsForward="false">i=17292</Reference>
-    </References>
-  </UAVariable>
-  <UAObjectType NodeId="i=21105" BrowseName="UadpWriterGroupMessageType">
-    <DisplayName>UadpWriterGroupMessageType</DisplayName>
-    <References>
-      <!-- <Reference ReferenceType="HasProperty">i=21106</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21107</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21108</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21109</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21110</Reference> -->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=17998</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=21096" BrowseName="DataSetWriterMessageType" IsAbstract="true">
-    <DisplayName>DataSetWriterMessageType</DisplayName>
-    <References>
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
-    </References>
-  </UAObjectType>
-  <UAObjectType NodeId="i=21111" BrowseName="UadpDataSetWriterMessageType">
-    <DisplayName>UadpDataSetWriterMessageType</DisplayName>
-    <References>
-      <!-- <Reference ReferenceType="HasProperty">i=21112</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21113</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21114</Reference> -->
-      <!-- <Reference ReferenceType="HasProperty">i=21115</Reference> -->
-      <Reference ReferenceType="HasSubtype" IsForward="false">i=21096</Reference>
-    </References>
-  </UAObjectType>
-</UANodeSet>
diff --git a/ext/open62541/tools/schema/Opc.Ua.Types.bsd b/ext/open62541/tools/schema/Opc.Ua.Types.bsd
deleted file mode 100644
index 3de0aae..0000000
--- a/ext/open62541/tools/schema/Opc.Ua.Types.bsd
+++ /dev/null
@@ -1,3114 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
- * Copyright (c) 2005-2018 The OPC Foundation, Inc. All rights reserved.
- *
- * OPC Foundation MIT License 1.00
- * 
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- * 
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * The complete license agreement can be found here:
- * http://opcfoundation.org/License/MIT/1.00/
--->
-
-<opc:TypeDictionary
-  xmlns:opc="http://opcfoundation.org/BinarySchema/"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xmlns:ua="http://opcfoundation.org/UA/"
-  xmlns:tns="http://opcfoundation.org/UA/"
-  DefaultByteOrder="LittleEndian"
-  TargetNamespace="http://opcfoundation.org/UA/"
->
-
-  <opc:Import Namespace="http://opcfoundation.org/BinarySchema/" />
-
-  <opc:StructuredType Name="XmlElement">
-    <opc:Documentation>An XML element encoded as a UTF-8 string.</opc:Documentation>
-    <opc:Field Name="Length" TypeName="opc:Int32" />
-    <opc:Field Name="Value" TypeName="opc:Char" LengthField="Length" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="NodeIdType" LengthInBits="6">
-    <opc:Documentation>The possible encodings for a NodeId value.</opc:Documentation>
-    <opc:EnumeratedValue Name="TwoByte" Value="0" />
-    <opc:EnumeratedValue Name="FourByte" Value="1" />
-    <opc:EnumeratedValue Name="Numeric" Value="2" />
-    <opc:EnumeratedValue Name="String" Value="3" />
-    <opc:EnumeratedValue Name="Guid" Value="4" />
-    <opc:EnumeratedValue Name="ByteString" Value="5" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="TwoByteNodeId">
-    <opc:Field Name="Identifier" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FourByteNodeId">
-    <opc:Field Name="NamespaceIndex" TypeName="opc:Byte" />
-    <opc:Field Name="Identifier" TypeName="opc:UInt16" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NumericNodeId">
-    <opc:Field Name="NamespaceIndex" TypeName="opc:UInt16" />
-    <opc:Field Name="Identifier" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="StringNodeId">
-    <opc:Field Name="NamespaceIndex" TypeName="opc:UInt16" />
-    <opc:Field Name="Identifier" TypeName="opc:CharArray" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="GuidNodeId">
-    <opc:Field Name="NamespaceIndex" TypeName="opc:UInt16" />
-    <opc:Field Name="Identifier" TypeName="opc:Guid" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ByteStringNodeId">
-    <opc:Field Name="NamespaceIndex" TypeName="opc:UInt16" />
-    <opc:Field Name="Identifier" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NodeId">
-    <opc:Documentation>An identifier for a node in a UA server address space.</opc:Documentation>
-    <opc:Field Name="NodeIdType" TypeName="ua:NodeIdType" />
-    <opc:Field Name="Reserved1" TypeName="opc:Bit" Length="2" />
-    <opc:Field Name="TwoByte" TypeName="ua:TwoByteNodeId" SwitchField="NodeIdType" SwitchValue="0" />
-    <opc:Field Name="FourByte" TypeName="ua:FourByteNodeId" SwitchField="NodeIdType" SwitchValue="1" />
-    <opc:Field Name="Numeric" TypeName="ua:NumericNodeId" SwitchField="NodeIdType" SwitchValue="2" />
-    <opc:Field Name="String" TypeName="ua:StringNodeId" SwitchField="NodeIdType" SwitchValue="3" />
-    <opc:Field Name="Guid" TypeName="ua:GuidNodeId" SwitchField="NodeIdType" SwitchValue="4" />
-    <opc:Field Name="ByteString" TypeName="ua:ByteStringNodeId" SwitchField="NodeIdType" SwitchValue="5" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ExpandedNodeId">
-    <opc:Documentation>An identifier for a node in a UA server address space qualified with a complete namespace string.</opc:Documentation>
-    <opc:Field Name="NodeIdType" TypeName="ua:NodeIdType" />
-    <opc:Field Name="ServerIndexSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="NamespaceURISpecified" TypeName="opc:Bit" />
-    <opc:Field Name="TwoByte" TypeName="ua:TwoByteNodeId" SwitchField="NodeIdType" SwitchValue="0" />
-    <opc:Field Name="FourByte" TypeName="ua:FourByteNodeId" SwitchField="NodeIdType" SwitchValue="1" />
-    <opc:Field Name="Numeric" TypeName="ua:NumericNodeId" SwitchField="NodeIdType" SwitchValue="2" />
-    <opc:Field Name="String" TypeName="ua:StringNodeId" SwitchField="NodeIdType" SwitchValue="3" />
-    <opc:Field Name="Guid" TypeName="ua:GuidNodeId" SwitchField="NodeIdType" SwitchValue="4" />
-    <opc:Field Name="ByteString" TypeName="ua:ByteStringNodeId" SwitchField="NodeIdType" SwitchValue="5" />
-    <opc:Field Name="NamespaceURI" TypeName="opc:CharArray" SwitchField="NamespaceURISpecified"/>
-    <opc:Field Name="ServerIndex" TypeName="opc:UInt32" SwitchField="ServerIndexSpecified"/>
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="StatusCode" LengthInBits="32" ByteOrderSignificant="true">
-    <opc:Documentation>A 32-bit status code value.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="DiagnosticInfo">
-    <opc:Documentation>A recursive structure containing diagnostic information associated with a status code.</opc:Documentation>
-    <opc:Field Name="SymbolicIdSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="NamespaceURISpecified" TypeName="opc:Bit" />
-    <opc:Field Name="LocaleSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="LocalizedTextSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="AdditionalInfoSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="InnerStatusCodeSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="InnerDiagnosticInfoSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="Reserved1" TypeName="opc:Bit" Length="2" />
-    <opc:Field Name="SymbolicId" TypeName="opc:Int32" SwitchField="SymbolicIdSpecified" />
-    <opc:Field Name="NamespaceURI" TypeName="opc:Int32" SwitchField="NamespaceURISpecified" />
-    <opc:Field Name="Locale" TypeName="opc:Int32" SwitchField="LocaleSpecified" />
-    <opc:Field Name="LocalizedText" TypeName="opc:Int32" SwitchField="LocalizedTextSpecified" />
-    <opc:Field Name="AdditionalInfo" TypeName="opc:CharArray" SwitchField="AdditionalInfoSpecified" />
-    <opc:Field Name="InnerStatusCode" TypeName="ua:StatusCode" SwitchField="InnerStatusCodeSpecified" />
-    <opc:Field Name="InnerDiagnosticInfo" TypeName="ua:DiagnosticInfo" SwitchField="InnerDiagnosticInfoSpecified" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="QualifiedName">
-    <opc:Documentation>A string qualified with a namespace index.</opc:Documentation>
-    <opc:Field Name="NamespaceIndex" TypeName="opc:UInt16" />
-    <opc:Field Name="Name" TypeName="opc:CharArray" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="LocalizedText">
-    <opc:Documentation>A string qualified with a namespace index.</opc:Documentation>
-    <opc:Field Name="LocaleSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="TextSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="Reserved1" TypeName="opc:Bit" Length="6" />
-    <opc:Field Name="Locale" TypeName="opc:CharArray" SwitchField="LocaleSpecified" />
-    <opc:Field Name="Text" TypeName="opc:CharArray" SwitchField="TextSpecified" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataValue">
-    <opc:Documentation>A value with an associated timestamp, and quality.</opc:Documentation>
-    <opc:Field Name="ValueSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="StatusCodeSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="SourceTimestampSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="SourcePicosecondsSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="ServerTimestampSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="ServerPicosecondsSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="Reserved1" TypeName="opc:Bit" Length="2" />
-    <opc:Field Name="Value" TypeName="ua:Variant" SwitchField="ValueSpecified" />
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" SwitchField="StatusCodeSpecified" />
-    <opc:Field Name="SourceTimestamp" TypeName="opc:DateTime" SwitchField="SourceTimestampSpecified" />
-    <opc:Field Name="SourcePicoseconds" TypeName="opc:UInt16" SwitchField="SourcePicosecondsSpecified" />
-    <opc:Field Name="ServerTimestamp" TypeName="opc:DateTime" SwitchField="ServerTimestampSpecified" />
-    <opc:Field Name="ServerPicoseconds" TypeName="opc:UInt16" SwitchField="ServerPicosecondsSpecified" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ExtensionObject">
-    <opc:Documentation>A serialized object prefixed with its data type identifier.</opc:Documentation>
-    <opc:Field Name="TypeIdSpecified" TypeName="opc:Bit" />
-    <opc:Field Name="BinaryBody" TypeName="opc:Bit" />
-    <opc:Field Name="XmlBody" TypeName="opc:Bit" />
-    <opc:Field Name="Reserved1" TypeName="opc:Bit" Length="5" />
-    <opc:Field Name="TypeId" TypeName="ua:ExpandedNodeId" SwitchField="TypeIdSpecified" />
-    <opc:Field Name="BodyLength" TypeName="opc:Int32" />
-    <opc:Field Name="Body" TypeName="opc:Byte" LengthField="BodyLength" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="Variant">
-    <opc:Documentation>A union of several types.</opc:Documentation>
-    <opc:Field Name="VariantType" TypeName="opc:Bit" Length="6" />
-    <opc:Field Name="ArrayDimensionsSpecified" TypeName="opc:Bit" Length="1"/>
-    <opc:Field Name="ArrayLengthSpecified" TypeName="opc:Bit" Length="1"/>
-    <opc:Field Name="ArrayLength" TypeName="opc:Int32" SwitchField="ArrayLengthSpecified" />
-    <opc:Field Name="Boolean" TypeName="opc:Boolean" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="1" />
-    <opc:Field Name="SByte" TypeName="opc:SByte" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="2" />
-    <opc:Field Name="Byte" TypeName="opc:Byte" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="3" />
-    <opc:Field Name="Int16" TypeName="opc:Int16" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="4" />
-    <opc:Field Name="UInt16" TypeName="opc:UInt16" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="5" />
-    <opc:Field Name="Int32" TypeName="opc:Int32" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="6" />
-    <opc:Field Name="UInt32" TypeName="opc:UInt32" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="7" />
-    <opc:Field Name="Int64" TypeName="opc:Int64" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="8" />
-    <opc:Field Name="UInt64" TypeName="opc:UInt64" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="9" />
-    <opc:Field Name="Float" TypeName="opc:Float" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="10" />
-    <opc:Field Name="Double" TypeName="opc:Double" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="11" />
-    <opc:Field Name="String" TypeName="opc:CharArray" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="12" />
-    <opc:Field Name="DateTime" TypeName="opc:DateTime" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="13" />
-    <opc:Field Name="Guid" TypeName="opc:Guid" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="14" />
-    <opc:Field Name="ByteString" TypeName="opc:ByteString" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="15" />
-    <opc:Field Name="XmlElement" TypeName="ua:XmlElement" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="16" />
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="17" />
-    <opc:Field Name="ExpandedNodeId" TypeName="ua:ExpandedNodeId" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="18" />
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="19" />
-    <opc:Field Name="QualifiedName" TypeName="ua:QualifiedName" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="20" />
-    <opc:Field Name="LocalizedText" TypeName="ua:LocalizedText" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="21" />
-    <opc:Field Name="ExtensionObject" TypeName="ua:ExtensionObject" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="22" />
-    <opc:Field Name="DataValue" TypeName="ua:DataValue" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="23" />
-    <opc:Field Name="Variant" TypeName="ua:Variant" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="24" />
-    <opc:Field Name="DiagnosticInfo" TypeName="ua:DiagnosticInfo" LengthField="ArrayLength" SwitchField="VariantType" SwitchValue="25" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" SwitchField="ArrayDimensionsSpecified" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:Int32" LengthField="NoOfArrayDimensions" SwitchField="ArrayDimensionsSpecified" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="NamingRuleType" LengthInBits="32">
-    <opc:EnumeratedValue Name="Mandatory" Value="1" />
-    <opc:EnumeratedValue Name="Optional" Value="2" />
-    <opc:EnumeratedValue Name="Constraint" Value="3" />
-  </opc:EnumeratedType>
-    
-
-  <opc:OpaqueType Name="ImageBMP">
-    <opc:Documentation>An image encoded in BMP format.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="ImageGIF">
-    <opc:Documentation>An image encoded in GIF format.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="ImageJPG">
-    <opc:Documentation>An image encoded in JPEG format.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="ImagePNG">
-    <opc:Documentation>An image encoded in PNG format.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="AudioDataType">
-    <opc:Documentation>An image encoded in PNG format.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="BitFieldMaskDataType">
-    <opc:Documentation>A mask of 32 bits that can be updated individually by using the top 32 bits as a mask.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="KeyValuePair" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Key" TypeName="ua:QualifiedName" />
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EndpointType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" />
-    <opc:Field Name="SecurityPolicyUri" TypeName="opc:String" />
-    <opc:Field Name="TransportProfileUri" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="OpenFileMode" LengthInBits="32">
-    <opc:EnumeratedValue Name="Read" Value="1" />
-    <opc:EnumeratedValue Name="Write" Value="2" />
-    <opc:EnumeratedValue Name="EraseExisting" Value="4" />
-    <opc:EnumeratedValue Name="Append" Value="8" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="IdentityCriteriaType" LengthInBits="32">
-    <opc:EnumeratedValue Name="UserName" Value="1" />
-    <opc:EnumeratedValue Name="Thumbprint" Value="2" />
-    <opc:EnumeratedValue Name="Role" Value="3" />
-    <opc:EnumeratedValue Name="GroupId" Value="4" />
-    <opc:EnumeratedValue Name="Anonymous" Value="5" />
-    <opc:EnumeratedValue Name="AuthenticatedUser" Value="6" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="IdentityMappingRuleType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="CriteriaType" TypeName="tns:IdentityCriteriaType" />
-    <opc:Field Name="Criteria" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="TrustListMasks" LengthInBits="32">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="TrustedCertificates" Value="1" />
-    <opc:EnumeratedValue Name="TrustedCrls" Value="2" />
-    <opc:EnumeratedValue Name="IssuerCertificates" Value="4" />
-    <opc:EnumeratedValue Name="IssuerCrls" Value="8" />
-    <opc:EnumeratedValue Name="All" Value="15" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="TrustListDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SpecifiedLists" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfTrustedCertificates" TypeName="opc:Int32" />
-    <opc:Field Name="TrustedCertificates" TypeName="opc:ByteString" LengthField="NoOfTrustedCertificates" />
-    <opc:Field Name="NoOfTrustedCrls" TypeName="opc:Int32" />
-    <opc:Field Name="TrustedCrls" TypeName="opc:ByteString" LengthField="NoOfTrustedCrls" />
-    <opc:Field Name="NoOfIssuerCertificates" TypeName="opc:Int32" />
-    <opc:Field Name="IssuerCertificates" TypeName="opc:ByteString" LengthField="NoOfIssuerCertificates" />
-    <opc:Field Name="NoOfIssuerCrls" TypeName="opc:Int32" />
-    <opc:Field Name="IssuerCrls" TypeName="opc:ByteString" LengthField="NoOfIssuerCrls" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DecimalDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Scale" TypeName="opc:Int16" />
-    <opc:Field Name="Value" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataTypeSchemaHeader" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfNamespaces" TypeName="opc:Int32" />
-    <opc:Field Name="Namespaces" TypeName="opc:String" LengthField="NoOfNamespaces" />
-    <opc:Field Name="NoOfStructureDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="StructureDataTypes" TypeName="tns:StructureDescription" LengthField="NoOfStructureDataTypes" />
-    <opc:Field Name="NoOfEnumDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="EnumDataTypes" TypeName="tns:EnumDescription" LengthField="NoOfEnumDataTypes" />
-    <opc:Field Name="NoOfSimpleDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="SimpleDataTypes" TypeName="tns:SimpleTypeDescription" LengthField="NoOfSimpleDataTypes" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataTypeDescription" BaseType="ua:ExtensionObject">
-    <opc:Field Name="DataTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="Name" TypeName="ua:QualifiedName" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="StructureDescription" BaseType="tns:DataTypeDescription">
-    <opc:Field Name="DataTypeId" TypeName="ua:NodeId" SourceType="tns:DataTypeDescription" />
-    <opc:Field Name="Name" TypeName="ua:QualifiedName" SourceType="tns:DataTypeDescription" />
-    <opc:Field Name="StructureDefinition" TypeName="tns:StructureDefinition" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EnumDescription" BaseType="tns:DataTypeDescription">
-    <opc:Field Name="DataTypeId" TypeName="ua:NodeId" SourceType="tns:DataTypeDescription" />
-    <opc:Field Name="Name" TypeName="ua:QualifiedName" SourceType="tns:DataTypeDescription" />
-    <opc:Field Name="EnumDefinition" TypeName="tns:EnumDefinition" />
-    <opc:Field Name="BuiltInType" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SimpleTypeDescription" BaseType="tns:DataTypeDescription">
-    <opc:Field Name="DataTypeId" TypeName="ua:NodeId" SourceType="tns:DataTypeDescription" />
-    <opc:Field Name="Name" TypeName="ua:QualifiedName" SourceType="tns:DataTypeDescription" />
-    <opc:Field Name="BaseDataType" TypeName="ua:NodeId" />
-    <opc:Field Name="BuiltInType" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UABinaryFileDataType" BaseType="tns:DataTypeSchemaHeader">
-    <opc:Field Name="NoOfNamespaces" TypeName="opc:Int32" />
-    <opc:Field Name="Namespaces" TypeName="opc:String" LengthField="NoOfNamespaces" />
-    <opc:Field Name="NoOfStructureDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="StructureDataTypes" TypeName="tns:StructureDescription" LengthField="NoOfStructureDataTypes" />
-    <opc:Field Name="NoOfEnumDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="EnumDataTypes" TypeName="tns:EnumDescription" LengthField="NoOfEnumDataTypes" />
-    <opc:Field Name="NoOfSimpleDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="SimpleDataTypes" TypeName="tns:SimpleTypeDescription" LengthField="NoOfSimpleDataTypes" />
-    <opc:Field Name="SchemaLocation" TypeName="opc:String" />
-    <opc:Field Name="NoOfFileHeader" TypeName="opc:Int32" />
-    <opc:Field Name="FileHeader" TypeName="tns:KeyValuePair" LengthField="NoOfFileHeader" />
-    <opc:Field Name="Body" TypeName="ua:Variant" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="PubSubState" LengthInBits="32">
-    <opc:EnumeratedValue Name="Disabled" Value="0" />
-    <opc:EnumeratedValue Name="Paused" Value="1" />
-    <opc:EnumeratedValue Name="Operational" Value="2" />
-    <opc:EnumeratedValue Name="Error" Value="3" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="DataSetMetaDataType" BaseType="tns:DataTypeSchemaHeader">
-    <opc:Field Name="NoOfNamespaces" TypeName="opc:Int32" />
-    <opc:Field Name="Namespaces" TypeName="opc:String" LengthField="NoOfNamespaces" />
-    <opc:Field Name="NoOfStructureDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="StructureDataTypes" TypeName="tns:StructureDescription" LengthField="NoOfStructureDataTypes" />
-    <opc:Field Name="NoOfEnumDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="EnumDataTypes" TypeName="tns:EnumDescription" LengthField="NoOfEnumDataTypes" />
-    <opc:Field Name="NoOfSimpleDataTypes" TypeName="opc:Int32" />
-    <opc:Field Name="SimpleDataTypes" TypeName="tns:SimpleTypeDescription" LengthField="NoOfSimpleDataTypes" />
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-    <opc:Field Name="NoOfFields" TypeName="opc:Int32" />
-    <opc:Field Name="Fields" TypeName="tns:FieldMetaData" LengthField="NoOfFields" />
-    <opc:Field Name="DataSetClassId" TypeName="opc:Guid" />
-    <opc:Field Name="ConfigurationVersion" TypeName="tns:ConfigurationVersionDataType" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FieldMetaData" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-    <opc:Field Name="FieldFlags" TypeName="tns:DataSetFieldFlags" />
-    <opc:Field Name="BuiltInType" TypeName="opc:Byte" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="MaxStringLength" TypeName="opc:UInt32" />
-    <opc:Field Name="DataSetFieldId" TypeName="opc:Guid" />
-    <opc:Field Name="NoOfProperties" TypeName="opc:Int32" />
-    <opc:Field Name="Properties" TypeName="tns:KeyValuePair" LengthField="NoOfProperties" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="DataSetFieldFlags" LengthInBits="16" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="PromotedField" Value="1" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ConfigurationVersionDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="MajorVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="MinorVersion" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishedDataSetDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="NoOfDataSetFolder" TypeName="opc:Int32" />
-    <opc:Field Name="DataSetFolder" TypeName="opc:String" LengthField="NoOfDataSetFolder" />
-    <opc:Field Name="DataSetMetaData" TypeName="tns:DataSetMetaDataType" />
-    <opc:Field Name="NoOfExtensionFields" TypeName="opc:Int32" />
-    <opc:Field Name="ExtensionFields" TypeName="tns:KeyValuePair" LengthField="NoOfExtensionFields" />
-    <opc:Field Name="DataSetSource" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishedDataSetSourceDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishedVariableDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="PublishedVariable" TypeName="ua:NodeId" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="SamplingIntervalHint" TypeName="opc:Double" />
-    <opc:Field Name="DeadbandType" TypeName="opc:UInt32" />
-    <opc:Field Name="DeadbandValue" TypeName="opc:Double" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-    <opc:Field Name="SubstituteValue" TypeName="ua:Variant" />
-    <opc:Field Name="NoOfMetaDataProperties" TypeName="opc:Int32" />
-    <opc:Field Name="MetaDataProperties" TypeName="ua:QualifiedName" LengthField="NoOfMetaDataProperties" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishedDataItemsDataType" BaseType="tns:PublishedDataSetSourceDataType">
-    <opc:Field Name="NoOfPublishedData" TypeName="opc:Int32" />
-    <opc:Field Name="PublishedData" TypeName="tns:PublishedVariableDataType" LengthField="NoOfPublishedData" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishedEventsDataType" BaseType="tns:PublishedDataSetSourceDataType">
-    <opc:Field Name="EventNotifier" TypeName="ua:NodeId" />
-    <opc:Field Name="NoOfSelectedFields" TypeName="opc:Int32" />
-    <opc:Field Name="SelectedFields" TypeName="tns:SimpleAttributeOperand" LengthField="NoOfSelectedFields" />
-    <opc:Field Name="Filter" TypeName="tns:ContentFilter" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="DataSetFieldContentMask" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="StatusCode" Value="1" />
-    <opc:EnumeratedValue Name="SourceTimestamp" Value="2" />
-    <opc:EnumeratedValue Name="ServerTimestamp" Value="4" />
-    <opc:EnumeratedValue Name="SourcePicoSeconds" Value="8" />
-    <opc:EnumeratedValue Name="ServerPicoSeconds" Value="16" />
-    <opc:EnumeratedValue Name="RawData" Value="32" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="DataSetWriterDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" />
-    <opc:Field Name="DataSetWriterId" TypeName="opc:UInt16" />
-    <opc:Field Name="DataSetFieldContentMask" TypeName="tns:DataSetFieldContentMask" />
-    <opc:Field Name="KeyFrameCount" TypeName="opc:UInt32" />
-    <opc:Field Name="DataSetName" TypeName="opc:String" />
-    <opc:Field Name="NoOfDataSetWriterProperties" TypeName="opc:Int32" />
-    <opc:Field Name="DataSetWriterProperties" TypeName="tns:KeyValuePair" LengthField="NoOfDataSetWriterProperties" />
-    <opc:Field Name="TransportSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="MessageSettings" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataSetWriterTransportDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataSetWriterMessageDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PubSubGroupDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" />
-    <opc:Field Name="SecurityGroupId" TypeName="opc:String" />
-    <opc:Field Name="NoOfSecurityKeyServices" TypeName="opc:Int32" />
-    <opc:Field Name="SecurityKeyServices" TypeName="tns:EndpointDescription" LengthField="NoOfSecurityKeyServices" />
-    <opc:Field Name="MaxNetworkMessageSize" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfGroupProperties" TypeName="opc:Int32" />
-    <opc:Field Name="GroupProperties" TypeName="tns:KeyValuePair" LengthField="NoOfGroupProperties" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="WriterGroupDataType" BaseType="tns:PubSubGroupDataType">
-    <opc:Field Name="Name" TypeName="opc:String" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="SecurityGroupId" TypeName="opc:String" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="NoOfSecurityKeyServices" TypeName="opc:Int32" />
-    <opc:Field Name="SecurityKeyServices" TypeName="tns:EndpointDescription" LengthField="NoOfSecurityKeyServices" />
-    <opc:Field Name="MaxNetworkMessageSize" TypeName="opc:UInt32" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="NoOfGroupProperties" TypeName="opc:Int32" />
-    <opc:Field Name="GroupProperties" TypeName="tns:KeyValuePair" LengthField="NoOfGroupProperties" />
-    <opc:Field Name="WriterGroupId" TypeName="opc:UInt16" />
-    <opc:Field Name="PublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="KeepAliveTime" TypeName="opc:Double" />
-    <opc:Field Name="Priority" TypeName="opc:Byte" />
-    <opc:Field Name="NoOfLocaleIds" TypeName="opc:Int32" />
-    <opc:Field Name="LocaleIds" TypeName="opc:String" LengthField="NoOfLocaleIds" />
-    <opc:Field Name="HeaderLayoutUri" TypeName="opc:String" />
-    <opc:Field Name="TransportSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="MessageSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="NoOfDataSetWriters" TypeName="opc:Int32" />
-    <opc:Field Name="DataSetWriters" TypeName="tns:DataSetWriterDataType" LengthField="NoOfDataSetWriters" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="WriterGroupTransportDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="WriterGroupMessageDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PubSubConnectionDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" />
-    <opc:Field Name="PublisherId" TypeName="ua:Variant" />
-    <opc:Field Name="TransportProfileUri" TypeName="opc:String" />
-    <opc:Field Name="Address" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="NoOfConnectionProperties" TypeName="opc:Int32" />
-    <opc:Field Name="ConnectionProperties" TypeName="tns:KeyValuePair" LengthField="NoOfConnectionProperties" />
-    <opc:Field Name="TransportSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="NoOfWriterGroups" TypeName="opc:Int32" />
-    <opc:Field Name="WriterGroups" TypeName="tns:WriterGroupDataType" LengthField="NoOfWriterGroups" />
-    <opc:Field Name="NoOfReaderGroups" TypeName="opc:Int32" />
-    <opc:Field Name="ReaderGroups" TypeName="tns:ReaderGroupDataType" LengthField="NoOfReaderGroups" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ConnectionTransportDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NetworkAddressDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NetworkInterface" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NetworkAddressUrlDataType" BaseType="tns:NetworkAddressDataType">
-    <opc:Field Name="NetworkInterface" TypeName="opc:String" SourceType="tns:NetworkAddressDataType" />
-    <opc:Field Name="Url" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReaderGroupDataType" BaseType="tns:PubSubGroupDataType">
-    <opc:Field Name="Name" TypeName="opc:String" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="SecurityGroupId" TypeName="opc:String" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="NoOfSecurityKeyServices" TypeName="opc:Int32" />
-    <opc:Field Name="SecurityKeyServices" TypeName="tns:EndpointDescription" LengthField="NoOfSecurityKeyServices" />
-    <opc:Field Name="MaxNetworkMessageSize" TypeName="opc:UInt32" SourceType="tns:PubSubGroupDataType" />
-    <opc:Field Name="NoOfGroupProperties" TypeName="opc:Int32" />
-    <opc:Field Name="GroupProperties" TypeName="tns:KeyValuePair" LengthField="NoOfGroupProperties" />
-    <opc:Field Name="TransportSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="MessageSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="NoOfDataSetReaders" TypeName="opc:Int32" />
-    <opc:Field Name="DataSetReaders" TypeName="tns:DataSetReaderDataType" LengthField="NoOfDataSetReaders" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReaderGroupTransportDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReaderGroupMessageDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataSetReaderDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" />
-    <opc:Field Name="PublisherId" TypeName="ua:Variant" />
-    <opc:Field Name="WriterGroupId" TypeName="opc:UInt16" />
-    <opc:Field Name="DataSetWriterId" TypeName="opc:UInt16" />
-    <opc:Field Name="DataSetMetaData" TypeName="tns:DataSetMetaDataType" />
-    <opc:Field Name="DataSetFieldContentMask" TypeName="tns:DataSetFieldContentMask" />
-    <opc:Field Name="MessageReceiveTimeout" TypeName="opc:Double" />
-    <opc:Field Name="KeyFrameCount" TypeName="opc:UInt32" />
-    <opc:Field Name="HeaderLayoutUri" TypeName="opc:String" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" />
-    <opc:Field Name="SecurityGroupId" TypeName="opc:String" />
-    <opc:Field Name="NoOfSecurityKeyServices" TypeName="opc:Int32" />
-    <opc:Field Name="SecurityKeyServices" TypeName="tns:EndpointDescription" LengthField="NoOfSecurityKeyServices" />
-    <opc:Field Name="NoOfDataSetReaderProperties" TypeName="opc:Int32" />
-    <opc:Field Name="DataSetReaderProperties" TypeName="tns:KeyValuePair" LengthField="NoOfDataSetReaderProperties" />
-    <opc:Field Name="TransportSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="MessageSettings" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="SubscribedDataSet" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataSetReaderTransportDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataSetReaderMessageDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SubscribedDataSetDataType" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TargetVariablesDataType" BaseType="tns:SubscribedDataSetDataType">
-    <opc:Field Name="NoOfTargetVariables" TypeName="opc:Int32" />
-    <opc:Field Name="TargetVariables" TypeName="tns:FieldTargetDataType" LengthField="NoOfTargetVariables" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FieldTargetDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="DataSetFieldId" TypeName="opc:Guid" />
-    <opc:Field Name="ReceiverIndexRange" TypeName="opc:String" />
-    <opc:Field Name="TargetNodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="WriteIndexRange" TypeName="opc:String" />
-    <opc:Field Name="OverrideValueHandling" TypeName="tns:OverrideValueHandling" />
-    <opc:Field Name="OverrideValue" TypeName="ua:Variant" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="OverrideValueHandling" LengthInBits="32">
-    <opc:EnumeratedValue Name="Disabled" Value="0" />
-    <opc:EnumeratedValue Name="LastUsableValue" Value="1" />
-    <opc:EnumeratedValue Name="OverrideValue" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="SubscribedDataSetMirrorDataType" BaseType="tns:SubscribedDataSetDataType">
-    <opc:Field Name="ParentNodeName" TypeName="opc:String" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PubSubConfigurationDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfPublishedDataSets" TypeName="opc:Int32" />
-    <opc:Field Name="PublishedDataSets" TypeName="tns:PublishedDataSetDataType" LengthField="NoOfPublishedDataSets" />
-    <opc:Field Name="NoOfConnections" TypeName="opc:Int32" />
-    <opc:Field Name="Connections" TypeName="tns:PubSubConnectionDataType" LengthField="NoOfConnections" />
-    <opc:Field Name="Enabled" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="DataSetOrderingType" LengthInBits="32">
-    <opc:EnumeratedValue Name="Undefined" Value="0" />
-    <opc:EnumeratedValue Name="AscendingWriterId" Value="1" />
-    <opc:EnumeratedValue Name="AscendingWriterIdSingle" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="UadpNetworkMessageContentMask" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="PublisherId" Value="1" />
-    <opc:EnumeratedValue Name="GroupHeader" Value="2" />
-    <opc:EnumeratedValue Name="WriterGroupId" Value="4" />
-    <opc:EnumeratedValue Name="GroupVersion" Value="8" />
-    <opc:EnumeratedValue Name="NetworkMessageNumber" Value="16" />
-    <opc:EnumeratedValue Name="SequenceNumber" Value="32" />
-    <opc:EnumeratedValue Name="PayloadHeader" Value="64" />
-    <opc:EnumeratedValue Name="Timestamp" Value="128" />
-    <opc:EnumeratedValue Name="PicoSeconds" Value="256" />
-    <opc:EnumeratedValue Name="DataSetClassId" Value="512" />
-    <opc:EnumeratedValue Name="PromotedFields" Value="1024" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="UadpWriterGroupMessageDataType" BaseType="tns:WriterGroupMessageDataType">
-    <opc:Field Name="GroupVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="DataSetOrdering" TypeName="tns:DataSetOrderingType" />
-    <opc:Field Name="NetworkMessageContentMask" TypeName="tns:UadpNetworkMessageContentMask" />
-    <opc:Field Name="SamplingOffset" TypeName="opc:Double" />
-    <opc:Field Name="NoOfPublishingOffset" TypeName="opc:Int32" />
-    <opc:Field Name="PublishingOffset" TypeName="opc:Double" LengthField="NoOfPublishingOffset" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="UadpDataSetMessageContentMask" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="Timestamp" Value="1" />
-    <opc:EnumeratedValue Name="PicoSeconds" Value="2" />
-    <opc:EnumeratedValue Name="Status" Value="4" />
-    <opc:EnumeratedValue Name="MajorVersion" Value="8" />
-    <opc:EnumeratedValue Name="MinorVersion" Value="16" />
-    <opc:EnumeratedValue Name="SequenceNumber" Value="32" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="UadpDataSetWriterMessageDataType" BaseType="tns:DataSetWriterMessageDataType">
-    <opc:Field Name="DataSetMessageContentMask" TypeName="tns:UadpDataSetMessageContentMask" />
-    <opc:Field Name="ConfiguredSize" TypeName="opc:UInt16" />
-    <opc:Field Name="NetworkMessageNumber" TypeName="opc:UInt16" />
-    <opc:Field Name="DataSetOffset" TypeName="opc:UInt16" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UadpDataSetReaderMessageDataType" BaseType="tns:DataSetReaderMessageDataType">
-    <opc:Field Name="GroupVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="NetworkMessageNumber" TypeName="opc:UInt16" />
-    <opc:Field Name="DataSetOffset" TypeName="opc:UInt16" />
-    <opc:Field Name="DataSetClassId" TypeName="opc:Guid" />
-    <opc:Field Name="NetworkMessageContentMask" TypeName="tns:UadpNetworkMessageContentMask" />
-    <opc:Field Name="DataSetMessageContentMask" TypeName="tns:UadpDataSetMessageContentMask" />
-    <opc:Field Name="PublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="ReceiveOffset" TypeName="opc:Double" />
-    <opc:Field Name="ProcessingOffset" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="JsonNetworkMessageContentMask" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="NetworkMessageHeader" Value="1" />
-    <opc:EnumeratedValue Name="DataSetMessageHeader" Value="2" />
-    <opc:EnumeratedValue Name="SingleDataSetMessage" Value="4" />
-    <opc:EnumeratedValue Name="PublisherId" Value="8" />
-    <opc:EnumeratedValue Name="DataSetClassId" Value="16" />
-    <opc:EnumeratedValue Name="ReplyTo" Value="32" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="JsonWriterGroupMessageDataType" BaseType="tns:WriterGroupMessageDataType">
-    <opc:Field Name="NetworkMessageContentMask" TypeName="tns:JsonNetworkMessageContentMask" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="JsonDataSetMessageContentMask" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="DataSetWriterId" Value="1" />
-    <opc:EnumeratedValue Name="MetaDataVersion" Value="2" />
-    <opc:EnumeratedValue Name="SequenceNumber" Value="4" />
-    <opc:EnumeratedValue Name="Timestamp" Value="8" />
-    <opc:EnumeratedValue Name="Status" Value="16" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="JsonDataSetWriterMessageDataType" BaseType="tns:DataSetWriterMessageDataType">
-    <opc:Field Name="DataSetMessageContentMask" TypeName="tns:JsonDataSetMessageContentMask" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="JsonDataSetReaderMessageDataType" BaseType="tns:DataSetReaderMessageDataType">
-    <opc:Field Name="NetworkMessageContentMask" TypeName="tns:JsonNetworkMessageContentMask" />
-    <opc:Field Name="DataSetMessageContentMask" TypeName="tns:JsonDataSetMessageContentMask" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DatagramConnectionTransportDataType" BaseType="tns:ConnectionTransportDataType">
-    <opc:Field Name="DiscoveryAddress" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DatagramWriterGroupTransportDataType" BaseType="tns:WriterGroupTransportDataType">
-    <opc:Field Name="MessageRepeatCount" TypeName="opc:Byte" />
-    <opc:Field Name="MessageRepeatDelay" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrokerConnectionTransportDataType" BaseType="tns:ConnectionTransportDataType">
-    <opc:Field Name="ResourceUri" TypeName="opc:String" />
-    <opc:Field Name="AuthenticationProfileUri" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="BrokerTransportQualityOfService" LengthInBits="32">
-    <opc:EnumeratedValue Name="NotSpecified" Value="0" />
-    <opc:EnumeratedValue Name="BestEffort" Value="1" />
-    <opc:EnumeratedValue Name="AtLeastOnce" Value="2" />
-    <opc:EnumeratedValue Name="AtMostOnce" Value="3" />
-    <opc:EnumeratedValue Name="ExactlyOnce" Value="4" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="BrokerWriterGroupTransportDataType" BaseType="tns:WriterGroupTransportDataType">
-    <opc:Field Name="QueueName" TypeName="opc:String" />
-    <opc:Field Name="ResourceUri" TypeName="opc:String" />
-    <opc:Field Name="AuthenticationProfileUri" TypeName="opc:String" />
-    <opc:Field Name="RequestedDeliveryGuarantee" TypeName="tns:BrokerTransportQualityOfService" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrokerDataSetWriterTransportDataType" BaseType="tns:DataSetWriterTransportDataType">
-    <opc:Field Name="QueueName" TypeName="opc:String" />
-    <opc:Field Name="ResourceUri" TypeName="opc:String" />
-    <opc:Field Name="AuthenticationProfileUri" TypeName="opc:String" />
-    <opc:Field Name="RequestedDeliveryGuarantee" TypeName="tns:BrokerTransportQualityOfService" />
-    <opc:Field Name="MetaDataQueueName" TypeName="opc:String" />
-    <opc:Field Name="MetaDataUpdateTime" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrokerDataSetReaderTransportDataType" BaseType="tns:DataSetReaderTransportDataType">
-    <opc:Field Name="QueueName" TypeName="opc:String" />
-    <opc:Field Name="ResourceUri" TypeName="opc:String" />
-    <opc:Field Name="AuthenticationProfileUri" TypeName="opc:String" />
-    <opc:Field Name="RequestedDeliveryGuarantee" TypeName="tns:BrokerTransportQualityOfService" />
-    <opc:Field Name="MetaDataQueueName" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="DiagnosticsLevel" LengthInBits="32">
-    <opc:EnumeratedValue Name="Basic" Value="0" />
-    <opc:EnumeratedValue Name="Advanced" Value="1" />
-    <opc:EnumeratedValue Name="Info" Value="2" />
-    <opc:EnumeratedValue Name="Log" Value="3" />
-    <opc:EnumeratedValue Name="Debug" Value="4" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="PubSubDiagnosticsCounterClassification" LengthInBits="32">
-    <opc:EnumeratedValue Name="Information" Value="0" />
-    <opc:EnumeratedValue Name="Error" Value="1" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="IdType" LengthInBits="32">
-    <opc:Documentation>The type of identifier used in a node id.</opc:Documentation>
-    <opc:EnumeratedValue Name="Numeric" Value="0" />
-    <opc:EnumeratedValue Name="String" Value="1" />
-    <opc:EnumeratedValue Name="Guid" Value="2" />
-    <opc:EnumeratedValue Name="Opaque" Value="3" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="NodeClass" LengthInBits="32">
-    <opc:Documentation>A mask specifying the class of the node.</opc:Documentation>
-    <opc:EnumeratedValue Name="Unspecified" Value="0" />
-    <opc:EnumeratedValue Name="Object" Value="1" />
-    <opc:EnumeratedValue Name="Variable" Value="2" />
-    <opc:EnumeratedValue Name="Method" Value="4" />
-    <opc:EnumeratedValue Name="ObjectType" Value="8" />
-    <opc:EnumeratedValue Name="VariableType" Value="16" />
-    <opc:EnumeratedValue Name="ReferenceType" Value="32" />
-    <opc:EnumeratedValue Name="DataType" Value="64" />
-    <opc:EnumeratedValue Name="View" Value="128" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="PermissionType" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="Browse" Value="1" />
-    <opc:EnumeratedValue Name="ReadRolePermissions" Value="2" />
-    <opc:EnumeratedValue Name="WriteAttribute" Value="4" />
-    <opc:EnumeratedValue Name="WriteRolePermissions" Value="8" />
-    <opc:EnumeratedValue Name="WriteHistorizing" Value="16" />
-    <opc:EnumeratedValue Name="Read" Value="32" />
-    <opc:EnumeratedValue Name="Write" Value="64" />
-    <opc:EnumeratedValue Name="ReadHistory" Value="128" />
-    <opc:EnumeratedValue Name="InsertHistory" Value="256" />
-    <opc:EnumeratedValue Name="ModifyHistory" Value="512" />
-    <opc:EnumeratedValue Name="DeleteHistory" Value="1024" />
-    <opc:EnumeratedValue Name="ReceiveEvents" Value="2048" />
-    <opc:EnumeratedValue Name="Call" Value="4096" />
-    <opc:EnumeratedValue Name="AddReference" Value="8192" />
-    <opc:EnumeratedValue Name="RemoveReference" Value="16384" />
-    <opc:EnumeratedValue Name="DeleteNode" Value="32768" />
-    <opc:EnumeratedValue Name="AddNode" Value="65536" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="AccessLevelType" LengthInBits="8" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="CurrentRead" Value="1" />
-    <opc:EnumeratedValue Name="CurrentWrite" Value="2" />
-    <opc:EnumeratedValue Name="HistoryRead" Value="4" />
-    <opc:EnumeratedValue Name="HistoryWrite" Value="8" />
-    <opc:EnumeratedValue Name="SemanticChange" Value="16" />
-    <opc:EnumeratedValue Name="StatusWrite" Value="32" />
-    <opc:EnumeratedValue Name="TimestampWrite" Value="64" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="AccessLevelExType" LengthInBits="32" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="CurrentRead" Value="1" />
-    <opc:EnumeratedValue Name="CurrentWrite" Value="2" />
-    <opc:EnumeratedValue Name="HistoryRead" Value="4" />
-    <opc:EnumeratedValue Name="HistoryWrite" Value="8" />
-    <opc:EnumeratedValue Name="SemanticChange" Value="16" />
-    <opc:EnumeratedValue Name="StatusWrite" Value="32" />
-    <opc:EnumeratedValue Name="TimestampWrite" Value="64" />
-    <opc:EnumeratedValue Name="NonatomicRead" Value="256" />
-    <opc:EnumeratedValue Name="NonatomicWrite" Value="512" />
-    <opc:EnumeratedValue Name="WriteFullArrayOnly" Value="1024" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="EventNotifierType" LengthInBits="8" IsOptionSet="true">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="SubscribeToEvents" Value="1" />
-    <opc:EnumeratedValue Name="HistoryRead" Value="4" />
-    <opc:EnumeratedValue Name="HistoryWrite" Value="8" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="RolePermissionType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RoleId" TypeName="ua:NodeId" />
-    <opc:Field Name="Permissions" TypeName="tns:PermissionType" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="AccessRestrictionType" LengthInBits="32">
-    <opc:EnumeratedValue Name="SigningRequired" Value="0" />
-    <opc:EnumeratedValue Name="EncryptionRequired" Value="1" />
-    <opc:EnumeratedValue Name="SessionRequired" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="StructureType" LengthInBits="32">
-    <opc:EnumeratedValue Name="Structure" Value="0" />
-    <opc:EnumeratedValue Name="StructureWithOptionalFields" Value="1" />
-    <opc:EnumeratedValue Name="Union" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="StructureField" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="MaxStringLength" TypeName="opc:UInt32" />
-    <opc:Field Name="IsOptional" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="StructureDefinition" BaseType="tns:DataTypeDefinition">
-    <opc:Field Name="DefaultEncodingId" TypeName="ua:NodeId" />
-    <opc:Field Name="BaseDataType" TypeName="ua:NodeId" />
-    <opc:Field Name="StructureType" TypeName="tns:StructureType" />
-    <opc:Field Name="NoOfFields" TypeName="opc:Int32" />
-    <opc:Field Name="Fields" TypeName="tns:StructureField" LengthField="NoOfFields" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EnumDefinition" BaseType="tns:DataTypeDefinition">
-    <opc:Field Name="NoOfFields" TypeName="opc:Int32" />
-    <opc:Field Name="Fields" TypeName="tns:EnumField" LengthField="NoOfFields" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="Node" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Specifies the attributes which belong to all nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="InstanceNode" BaseType="tns:Node">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TypeNode" BaseType="tns:Node">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ObjectNode" BaseType="tns:InstanceNode">
-    <opc:Documentation>Specifies the attributes which belong to object nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="EventNotifier" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ObjectTypeNode" BaseType="tns:TypeNode">
-    <opc:Documentation>Specifies the attributes which belong to object type nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="VariableNode" BaseType="tns:InstanceNode">
-    <opc:Documentation>Specifies the attributes which belong to variable nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="AccessLevel" TypeName="opc:Byte" />
-    <opc:Field Name="UserAccessLevel" TypeName="opc:Byte" />
-    <opc:Field Name="MinimumSamplingInterval" TypeName="opc:Double" />
-    <opc:Field Name="Historizing" TypeName="opc:Boolean" />
-    <opc:Field Name="AccessLevelEx" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="VariableTypeNode" BaseType="tns:TypeNode">
-    <opc:Documentation>Specifies the attributes which belong to variable type nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReferenceTypeNode" BaseType="tns:TypeNode">
-    <opc:Documentation>Specifies the attributes which belong to reference type nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-    <opc:Field Name="Symmetric" TypeName="opc:Boolean" />
-    <opc:Field Name="InverseName" TypeName="ua:LocalizedText" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MethodNode" BaseType="tns:InstanceNode">
-    <opc:Documentation>Specifies the attributes which belong to method nodes.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="Executable" TypeName="opc:Boolean" />
-    <opc:Field Name="UserExecutable" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ViewNode" BaseType="tns:InstanceNode">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="ContainsNoLoops" TypeName="opc:Boolean" />
-    <opc:Field Name="EventNotifier" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataTypeNode" BaseType="tns:TypeNode">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:Node" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" SourceType="tns:Node" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" SourceType="tns:Node" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:Node" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:Node" />
-    <opc:Field Name="NoOfRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="RolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfRolePermissions" />
-    <opc:Field Name="NoOfUserRolePermissions" TypeName="opc:Int32" />
-    <opc:Field Name="UserRolePermissions" TypeName="tns:RolePermissionType" LengthField="NoOfUserRolePermissions" />
-    <opc:Field Name="AccessRestrictions" TypeName="opc:UInt16" SourceType="tns:Node" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceNode" LengthField="NoOfReferences" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-    <opc:Field Name="DataTypeDefinition" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReferenceNode" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Specifies a reference which belongs to a node.</opc:Documentation>
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IsInverse" TypeName="opc:Boolean" />
-    <opc:Field Name="TargetId" TypeName="ua:ExpandedNodeId" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="Argument" BaseType="ua:ExtensionObject">
-    <opc:Documentation>An argument for a method.</opc:Documentation>
-    <opc:Field Name="Name" TypeName="opc:String" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EnumValueType" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A mapping between a value of an enumerated type and a name and description.</opc:Documentation>
-    <opc:Field Name="Value" TypeName="opc:Int64" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EnumField" BaseType="tns:EnumValueType">
-    <opc:Field Name="Value" TypeName="opc:Int64" SourceType="tns:EnumValueType" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:EnumValueType" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:EnumValueType" />
-    <opc:Field Name="Name" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="OptionSet" BaseType="ua:ExtensionObject">
-    <opc:Documentation>This abstract Structured DataType is the base DataType for all DataTypes representing a bit mask.</opc:Documentation>
-    <opc:Field Name="Value" TypeName="opc:ByteString" />
-    <opc:Field Name="ValidBits" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="Union" BaseType="ua:ExtensionObject">
-    <opc:Documentation>This abstract DataType is the base DataType for all union DataTypes.</opc:Documentation>
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="NormalizedString">
-    <opc:Documentation>A string normalized based on the rules in the unicode specification.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="DecimalString">
-    <opc:Documentation>An arbitraty numeric value.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="DurationString">
-    <opc:Documentation>A period of time formatted as defined in ISO 8601-2000.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="TimeString">
-    <opc:Documentation>A time formatted as defined in ISO 8601-2000.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="DateString">
-    <opc:Documentation>A date formatted as defined in ISO 8601-2000.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="Duration">
-    <opc:Documentation>A period of time measured in milliseconds.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="UtcTime">
-    <opc:Documentation>A date/time value specified in Universal Coordinated Time (UTC).</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="LocaleId">
-    <opc:Documentation>An identifier for a user locale.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="TimeZoneDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Offset" TypeName="opc:Int16" />
-    <opc:Field Name="DaylightSavingInOffset" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="Index">
-    <opc:Documentation>This primitive data type is a UInt32 that identifies an element of an array.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="IntegerId">
-    <opc:Documentation>A numeric identifier for an object.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:EnumeratedType Name="ApplicationType" LengthInBits="32">
-    <opc:Documentation>The types of applications.</opc:Documentation>
-    <opc:EnumeratedValue Name="Server" Value="0" />
-    <opc:EnumeratedValue Name="Client" Value="1" />
-    <opc:EnumeratedValue Name="ClientAndServer" Value="2" />
-    <opc:EnumeratedValue Name="DiscoveryServer" Value="3" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ApplicationDescription" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Describes an application and how to find it.</opc:Documentation>
-    <opc:Field Name="ApplicationUri" TypeName="opc:String" />
-    <opc:Field Name="ProductUri" TypeName="opc:String" />
-    <opc:Field Name="ApplicationName" TypeName="ua:LocalizedText" />
-    <opc:Field Name="ApplicationType" TypeName="tns:ApplicationType" />
-    <opc:Field Name="GatewayServerUri" TypeName="opc:String" />
-    <opc:Field Name="DiscoveryProfileUri" TypeName="opc:String" />
-    <opc:Field Name="NoOfDiscoveryUrls" TypeName="opc:Int32" />
-    <opc:Field Name="DiscoveryUrls" TypeName="opc:String" LengthField="NoOfDiscoveryUrls" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RequestHeader" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The header passed with every server request.</opc:Documentation>
-    <opc:Field Name="AuthenticationToken" TypeName="ua:NodeId" />
-    <opc:Field Name="Timestamp" TypeName="opc:DateTime" />
-    <opc:Field Name="RequestHandle" TypeName="opc:UInt32" />
-    <opc:Field Name="ReturnDiagnostics" TypeName="opc:UInt32" />
-    <opc:Field Name="AuditEntryId" TypeName="opc:String" />
-    <opc:Field Name="TimeoutHint" TypeName="opc:UInt32" />
-    <opc:Field Name="AdditionalHeader" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ResponseHeader" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The header passed with every server response.</opc:Documentation>
-    <opc:Field Name="Timestamp" TypeName="opc:DateTime" />
-    <opc:Field Name="RequestHandle" TypeName="opc:UInt32" />
-    <opc:Field Name="ServiceResult" TypeName="ua:StatusCode" />
-    <opc:Field Name="ServiceDiagnostics" TypeName="ua:DiagnosticInfo" />
-    <opc:Field Name="NoOfStringTable" TypeName="opc:Int32" />
-    <opc:Field Name="StringTable" TypeName="opc:String" LengthField="NoOfStringTable" />
-    <opc:Field Name="AdditionalHeader" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="VersionTime">
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="ServiceFault" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The response returned by all services when there is a service level error.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SessionlessInvokeRequestType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfUrisVersion" TypeName="opc:Int32" />
-    <opc:Field Name="UrisVersion" TypeName="opc:UInt32" LengthField="NoOfUrisVersion" />
-    <opc:Field Name="NoOfNamespaceUris" TypeName="opc:Int32" />
-    <opc:Field Name="NamespaceUris" TypeName="opc:String" LengthField="NoOfNamespaceUris" />
-    <opc:Field Name="NoOfServerUris" TypeName="opc:Int32" />
-    <opc:Field Name="ServerUris" TypeName="opc:String" LengthField="NoOfServerUris" />
-    <opc:Field Name="NoOfLocaleIds" TypeName="opc:Int32" />
-    <opc:Field Name="LocaleIds" TypeName="opc:String" LengthField="NoOfLocaleIds" />
-    <opc:Field Name="ServiceId" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SessionlessInvokeResponseType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfNamespaceUris" TypeName="opc:Int32" />
-    <opc:Field Name="NamespaceUris" TypeName="opc:String" LengthField="NoOfNamespaceUris" />
-    <opc:Field Name="NoOfServerUris" TypeName="opc:Int32" />
-    <opc:Field Name="ServerUris" TypeName="opc:String" LengthField="NoOfServerUris" />
-    <opc:Field Name="ServiceId" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FindServersRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Finds the servers known to the discovery server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="NoOfLocaleIds" TypeName="opc:Int32" />
-    <opc:Field Name="LocaleIds" TypeName="opc:String" LengthField="NoOfLocaleIds" />
-    <opc:Field Name="NoOfServerUris" TypeName="opc:Int32" />
-    <opc:Field Name="ServerUris" TypeName="opc:String" LengthField="NoOfServerUris" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FindServersResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Finds the servers known to the discovery server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfServers" TypeName="opc:Int32" />
-    <opc:Field Name="Servers" TypeName="tns:ApplicationDescription" LengthField="NoOfServers" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ServerOnNetwork" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RecordId" TypeName="opc:UInt32" />
-    <opc:Field Name="ServerName" TypeName="opc:String" />
-    <opc:Field Name="DiscoveryUrl" TypeName="opc:String" />
-    <opc:Field Name="NoOfServerCapabilities" TypeName="opc:Int32" />
-    <opc:Field Name="ServerCapabilities" TypeName="opc:String" LengthField="NoOfServerCapabilities" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FindServersOnNetworkRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="StartingRecordId" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxRecordsToReturn" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfServerCapabilityFilter" TypeName="opc:Int32" />
-    <opc:Field Name="ServerCapabilityFilter" TypeName="opc:String" LengthField="NoOfServerCapabilityFilter" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FindServersOnNetworkResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="LastCounterResetTime" TypeName="opc:DateTime" />
-    <opc:Field Name="NoOfServers" TypeName="opc:Int32" />
-    <opc:Field Name="Servers" TypeName="tns:ServerOnNetwork" LengthField="NoOfServers" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="ApplicationInstanceCertificate">
-    <opc:Documentation>A certificate for an instance of an application.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:EnumeratedType Name="MessageSecurityMode" LengthInBits="32">
-    <opc:Documentation>The type of security to use on a message.</opc:Documentation>
-    <opc:EnumeratedValue Name="Invalid" Value="0" />
-    <opc:EnumeratedValue Name="None" Value="1" />
-    <opc:EnumeratedValue Name="Sign" Value="2" />
-    <opc:EnumeratedValue Name="SignAndEncrypt" Value="3" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="UserTokenType" LengthInBits="32">
-    <opc:Documentation>The possible user token types.</opc:Documentation>
-    <opc:EnumeratedValue Name="Anonymous" Value="0" />
-    <opc:EnumeratedValue Name="UserName" Value="1" />
-    <opc:EnumeratedValue Name="Certificate" Value="2" />
-    <opc:EnumeratedValue Name="IssuedToken" Value="3" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="UserTokenPolicy" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Describes a user token that can be used with a server.</opc:Documentation>
-    <opc:Field Name="PolicyId" TypeName="opc:String" />
-    <opc:Field Name="TokenType" TypeName="tns:UserTokenType" />
-    <opc:Field Name="IssuedTokenType" TypeName="opc:String" />
-    <opc:Field Name="IssuerEndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="SecurityPolicyUri" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EndpointDescription" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The description of a endpoint that can be used to access a server.</opc:Documentation>
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="Server" TypeName="tns:ApplicationDescription" />
-    <opc:Field Name="ServerCertificate" TypeName="opc:ByteString" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" />
-    <opc:Field Name="SecurityPolicyUri" TypeName="opc:String" />
-    <opc:Field Name="NoOfUserIdentityTokens" TypeName="opc:Int32" />
-    <opc:Field Name="UserIdentityTokens" TypeName="tns:UserTokenPolicy" LengthField="NoOfUserIdentityTokens" />
-    <opc:Field Name="TransportProfileUri" TypeName="opc:String" />
-    <opc:Field Name="SecurityLevel" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="GetEndpointsRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Gets the endpoints used by the server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="NoOfLocaleIds" TypeName="opc:Int32" />
-    <opc:Field Name="LocaleIds" TypeName="opc:String" LengthField="NoOfLocaleIds" />
-    <opc:Field Name="NoOfProfileUris" TypeName="opc:Int32" />
-    <opc:Field Name="ProfileUris" TypeName="opc:String" LengthField="NoOfProfileUris" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="GetEndpointsResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Gets the endpoints used by the server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfEndpoints" TypeName="opc:Int32" />
-    <opc:Field Name="Endpoints" TypeName="tns:EndpointDescription" LengthField="NoOfEndpoints" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisteredServer" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The information required to register a server with a discovery server.</opc:Documentation>
-    <opc:Field Name="ServerUri" TypeName="opc:String" />
-    <opc:Field Name="ProductUri" TypeName="opc:String" />
-    <opc:Field Name="NoOfServerNames" TypeName="opc:Int32" />
-    <opc:Field Name="ServerNames" TypeName="ua:LocalizedText" LengthField="NoOfServerNames" />
-    <opc:Field Name="ServerType" TypeName="tns:ApplicationType" />
-    <opc:Field Name="GatewayServerUri" TypeName="opc:String" />
-    <opc:Field Name="NoOfDiscoveryUrls" TypeName="opc:Int32" />
-    <opc:Field Name="DiscoveryUrls" TypeName="opc:String" LengthField="NoOfDiscoveryUrls" />
-    <opc:Field Name="SemaphoreFilePath" TypeName="opc:String" />
-    <opc:Field Name="IsOnline" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisterServerRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Registers a server with the discovery server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="Server" TypeName="tns:RegisteredServer" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisterServerResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Registers a server with the discovery server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DiscoveryConfiguration" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A base type for discovery configuration information.</opc:Documentation>
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MdnsDiscoveryConfiguration" BaseType="tns:DiscoveryConfiguration">
-    <opc:Documentation>The discovery information needed for mDNS registration.</opc:Documentation>
-    <opc:Field Name="MdnsServerName" TypeName="opc:String" />
-    <opc:Field Name="NoOfServerCapabilities" TypeName="opc:Int32" />
-    <opc:Field Name="ServerCapabilities" TypeName="opc:String" LengthField="NoOfServerCapabilities" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisterServer2Request" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="Server" TypeName="tns:RegisteredServer" />
-    <opc:Field Name="NoOfDiscoveryConfiguration" TypeName="opc:Int32" />
-    <opc:Field Name="DiscoveryConfiguration" TypeName="ua:ExtensionObject" LengthField="NoOfDiscoveryConfiguration" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisterServer2Response" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfConfigurationResults" TypeName="opc:Int32" />
-    <opc:Field Name="ConfigurationResults" TypeName="ua:StatusCode" LengthField="NoOfConfigurationResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="SecurityTokenRequestType" LengthInBits="32">
-    <opc:Documentation>Indicates whether a token if being created or renewed.</opc:Documentation>
-    <opc:EnumeratedValue Name="Issue" Value="0" />
-    <opc:EnumeratedValue Name="Renew" Value="1" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ChannelSecurityToken" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The token that identifies a set of keys for an active secure channel.</opc:Documentation>
-    <opc:Field Name="ChannelId" TypeName="opc:UInt32" />
-    <opc:Field Name="TokenId" TypeName="opc:UInt32" />
-    <opc:Field Name="CreatedAt" TypeName="opc:DateTime" />
-    <opc:Field Name="RevisedLifetime" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="OpenSecureChannelRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Creates a secure channel with a server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="ClientProtocolVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="RequestType" TypeName="tns:SecurityTokenRequestType" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" />
-    <opc:Field Name="ClientNonce" TypeName="opc:ByteString" />
-    <opc:Field Name="RequestedLifetime" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="OpenSecureChannelResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Creates a secure channel with a server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="ServerProtocolVersion" TypeName="opc:UInt32" />
-    <opc:Field Name="SecurityToken" TypeName="tns:ChannelSecurityToken" />
-    <opc:Field Name="ServerNonce" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CloseSecureChannelRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Closes a secure channel.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CloseSecureChannelResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Closes a secure channel.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SignedSoftwareCertificate" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A software certificate with a digital signature.</opc:Documentation>
-    <opc:Field Name="CertificateData" TypeName="opc:ByteString" />
-    <opc:Field Name="Signature" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="SessionAuthenticationToken">
-    <opc:Documentation>A unique identifier for a session used to authenticate requests.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="SignatureData" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A digital signature.</opc:Documentation>
-    <opc:Field Name="Algorithm" TypeName="opc:String" />
-    <opc:Field Name="Signature" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CreateSessionRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Creates a new session with the server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="ClientDescription" TypeName="tns:ApplicationDescription" />
-    <opc:Field Name="ServerUri" TypeName="opc:String" />
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="SessionName" TypeName="opc:String" />
-    <opc:Field Name="ClientNonce" TypeName="opc:ByteString" />
-    <opc:Field Name="ClientCertificate" TypeName="opc:ByteString" />
-    <opc:Field Name="RequestedSessionTimeout" TypeName="opc:Double" />
-    <opc:Field Name="MaxResponseMessageSize" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CreateSessionResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Creates a new session with the server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="SessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="AuthenticationToken" TypeName="ua:NodeId" />
-    <opc:Field Name="RevisedSessionTimeout" TypeName="opc:Double" />
-    <opc:Field Name="ServerNonce" TypeName="opc:ByteString" />
-    <opc:Field Name="ServerCertificate" TypeName="opc:ByteString" />
-    <opc:Field Name="NoOfServerEndpoints" TypeName="opc:Int32" />
-    <opc:Field Name="ServerEndpoints" TypeName="tns:EndpointDescription" LengthField="NoOfServerEndpoints" />
-    <opc:Field Name="NoOfServerSoftwareCertificates" TypeName="opc:Int32" />
-    <opc:Field Name="ServerSoftwareCertificates" TypeName="tns:SignedSoftwareCertificate" LengthField="NoOfServerSoftwareCertificates" />
-    <opc:Field Name="ServerSignature" TypeName="tns:SignatureData" />
-    <opc:Field Name="MaxRequestMessageSize" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UserIdentityToken" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A base type for a user identity token.</opc:Documentation>
-    <opc:Field Name="PolicyId" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AnonymousIdentityToken" BaseType="tns:UserIdentityToken">
-    <opc:Documentation>A token representing an anonymous user.</opc:Documentation>
-    <opc:Field Name="PolicyId" TypeName="opc:String" SourceType="tns:UserIdentityToken" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UserNameIdentityToken" BaseType="tns:UserIdentityToken">
-    <opc:Documentation>A token representing a user identified by a user name and password.</opc:Documentation>
-    <opc:Field Name="PolicyId" TypeName="opc:String" SourceType="tns:UserIdentityToken" />
-    <opc:Field Name="UserName" TypeName="opc:String" />
-    <opc:Field Name="Password" TypeName="opc:ByteString" />
-    <opc:Field Name="EncryptionAlgorithm" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="X509IdentityToken" BaseType="tns:UserIdentityToken">
-    <opc:Documentation>A token representing a user identified by an X509 certificate.</opc:Documentation>
-    <opc:Field Name="PolicyId" TypeName="opc:String" SourceType="tns:UserIdentityToken" />
-    <opc:Field Name="CertificateData" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="IssuedIdentityToken" BaseType="tns:UserIdentityToken">
-    <opc:Documentation>A token representing a user identified by a WS-Security XML token.</opc:Documentation>
-    <opc:Field Name="PolicyId" TypeName="opc:String" SourceType="tns:UserIdentityToken" />
-    <opc:Field Name="TokenData" TypeName="opc:ByteString" />
-    <opc:Field Name="EncryptionAlgorithm" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="RsaEncryptedSecret">
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="ActivateSessionRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Activates a session with the server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="ClientSignature" TypeName="tns:SignatureData" />
-    <opc:Field Name="NoOfClientSoftwareCertificates" TypeName="opc:Int32" />
-    <opc:Field Name="ClientSoftwareCertificates" TypeName="tns:SignedSoftwareCertificate" LengthField="NoOfClientSoftwareCertificates" />
-    <opc:Field Name="NoOfLocaleIds" TypeName="opc:Int32" />
-    <opc:Field Name="LocaleIds" TypeName="opc:String" LengthField="NoOfLocaleIds" />
-    <opc:Field Name="UserIdentityToken" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="UserTokenSignature" TypeName="tns:SignatureData" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ActivateSessionResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Activates a session with the server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="ServerNonce" TypeName="opc:ByteString" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CloseSessionRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Closes a session with the server.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="DeleteSubscriptions" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CloseSessionResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Closes a session with the server.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CancelRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Cancels an outstanding request.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="RequestHandle" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CancelResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Cancels an outstanding request.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="CancelCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="NodeAttributesMask" LengthInBits="32">
-    <opc:Documentation>The bits used to specify default attributes for a new node.</opc:Documentation>
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="AccessLevel" Value="1" />
-    <opc:EnumeratedValue Name="ArrayDimensions" Value="2" />
-    <opc:EnumeratedValue Name="BrowseName" Value="4" />
-    <opc:EnumeratedValue Name="ContainsNoLoops" Value="8" />
-    <opc:EnumeratedValue Name="DataType" Value="16" />
-    <opc:EnumeratedValue Name="Description" Value="32" />
-    <opc:EnumeratedValue Name="DisplayName" Value="64" />
-    <opc:EnumeratedValue Name="EventNotifier" Value="128" />
-    <opc:EnumeratedValue Name="Executable" Value="256" />
-    <opc:EnumeratedValue Name="Historizing" Value="512" />
-    <opc:EnumeratedValue Name="InverseName" Value="1024" />
-    <opc:EnumeratedValue Name="IsAbstract" Value="2048" />
-    <opc:EnumeratedValue Name="MinimumSamplingInterval" Value="4096" />
-    <opc:EnumeratedValue Name="NodeClass" Value="8192" />
-    <opc:EnumeratedValue Name="NodeId" Value="16384" />
-    <opc:EnumeratedValue Name="Symmetric" Value="32768" />
-    <opc:EnumeratedValue Name="UserAccessLevel" Value="65536" />
-    <opc:EnumeratedValue Name="UserExecutable" Value="131072" />
-    <opc:EnumeratedValue Name="UserWriteMask" Value="262144" />
-    <opc:EnumeratedValue Name="ValueRank" Value="524288" />
-    <opc:EnumeratedValue Name="WriteMask" Value="1048576" />
-    <opc:EnumeratedValue Name="Value" Value="2097152" />
-    <opc:EnumeratedValue Name="DataTypeDefinition" Value="4194304" />
-    <opc:EnumeratedValue Name="RolePermissions" Value="8388608" />
-    <opc:EnumeratedValue Name="AccessRestrictions" Value="16777216" />
-    <opc:EnumeratedValue Name="All" Value="33554431" />
-    <opc:EnumeratedValue Name="BaseNode" Value="26501220" />
-    <opc:EnumeratedValue Name="Object" Value="26501348" />
-    <opc:EnumeratedValue Name="ObjectType" Value="26503268" />
-    <opc:EnumeratedValue Name="Variable" Value="26571383" />
-    <opc:EnumeratedValue Name="VariableType" Value="28600438" />
-    <opc:EnumeratedValue Name="Method" Value="26632548" />
-    <opc:EnumeratedValue Name="ReferenceType" Value="26537060" />
-    <opc:EnumeratedValue Name="View" Value="26501356" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="NodeAttributes" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The base attributes for all nodes.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ObjectAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for an object node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="EventNotifier" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="VariableAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for a variable node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="AccessLevel" TypeName="opc:Byte" />
-    <opc:Field Name="UserAccessLevel" TypeName="opc:Byte" />
-    <opc:Field Name="MinimumSamplingInterval" TypeName="opc:Double" />
-    <opc:Field Name="Historizing" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MethodAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for a method node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Executable" TypeName="opc:Boolean" />
-    <opc:Field Name="UserExecutable" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ObjectTypeAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for an object type node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="VariableTypeAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for a variable type node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-    <opc:Field Name="DataType" TypeName="ua:NodeId" />
-    <opc:Field Name="ValueRank" TypeName="opc:Int32" />
-    <opc:Field Name="NoOfArrayDimensions" TypeName="opc:Int32" />
-    <opc:Field Name="ArrayDimensions" TypeName="opc:UInt32" LengthField="NoOfArrayDimensions" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReferenceTypeAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for a reference type node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-    <opc:Field Name="Symmetric" TypeName="opc:Boolean" />
-    <opc:Field Name="InverseName" TypeName="ua:LocalizedText" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataTypeAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for a data type node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="IsAbstract" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ViewAttributes" BaseType="tns:NodeAttributes">
-    <opc:Documentation>The attributes for a view node.</opc:Documentation>
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="ContainsNoLoops" TypeName="opc:Boolean" />
-    <opc:Field Name="EventNotifier" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="GenericAttributeValue" BaseType="ua:ExtensionObject">
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="GenericAttributes" BaseType="tns:NodeAttributes">
-    <opc:Field Name="SpecifiedAttributes" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="WriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="UserWriteMask" TypeName="opc:UInt32" SourceType="tns:NodeAttributes" />
-    <opc:Field Name="NoOfAttributeValues" TypeName="opc:Int32" />
-    <opc:Field Name="AttributeValues" TypeName="tns:GenericAttributeValue" LengthField="NoOfAttributeValues" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddNodesItem" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A request to add a node to the server address space.</opc:Documentation>
-    <opc:Field Name="ParentNodeId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="RequestedNewNodeId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" />
-    <opc:Field Name="NodeAttributes" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="TypeDefinition" TypeName="ua:ExpandedNodeId" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddNodesResult" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A result of an add node operation.</opc:Documentation>
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="AddedNodeId" TypeName="ua:NodeId" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddNodesRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Adds one or more nodes to the server address space.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfNodesToAdd" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToAdd" TypeName="tns:AddNodesItem" LengthField="NoOfNodesToAdd" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddNodesResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Adds one or more nodes to the server address space.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:AddNodesResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddReferencesItem" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A request to add a reference to the server address space.</opc:Documentation>
-    <opc:Field Name="SourceNodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IsForward" TypeName="opc:Boolean" />
-    <opc:Field Name="TargetServerUri" TypeName="opc:String" />
-    <opc:Field Name="TargetNodeId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="TargetNodeClass" TypeName="tns:NodeClass" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddReferencesRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Adds one or more references to the server address space.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfReferencesToAdd" TypeName="opc:Int32" />
-    <opc:Field Name="ReferencesToAdd" TypeName="tns:AddReferencesItem" LengthField="NoOfReferencesToAdd" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AddReferencesResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Adds one or more references to the server address space.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteNodesItem" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A request to delete a node to the server address space.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="DeleteTargetReferences" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteNodesRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Delete one or more nodes from the server address space.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfNodesToDelete" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToDelete" TypeName="tns:DeleteNodesItem" LengthField="NoOfNodesToDelete" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteNodesResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Delete one or more nodes from the server address space.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteReferencesItem" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A request to delete a node from the server address space.</opc:Documentation>
-    <opc:Field Name="SourceNodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IsForward" TypeName="opc:Boolean" />
-    <opc:Field Name="TargetNodeId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="DeleteBidirectional" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteReferencesRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Delete one or more references from the server address space.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfReferencesToDelete" TypeName="opc:Int32" />
-    <opc:Field Name="ReferencesToDelete" TypeName="tns:DeleteReferencesItem" LengthField="NoOfReferencesToDelete" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteReferencesResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Delete one or more references from the server address space.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="AttributeWriteMask" LengthInBits="32" IsOptionSet="true">
-    <opc:Documentation>Define bits used to indicate which attributes are writable.</opc:Documentation>
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="AccessLevel" Value="1" />
-    <opc:EnumeratedValue Name="ArrayDimensions" Value="2" />
-    <opc:EnumeratedValue Name="BrowseName" Value="4" />
-    <opc:EnumeratedValue Name="ContainsNoLoops" Value="8" />
-    <opc:EnumeratedValue Name="DataType" Value="16" />
-    <opc:EnumeratedValue Name="Description" Value="32" />
-    <opc:EnumeratedValue Name="DisplayName" Value="64" />
-    <opc:EnumeratedValue Name="EventNotifier" Value="128" />
-    <opc:EnumeratedValue Name="Executable" Value="256" />
-    <opc:EnumeratedValue Name="Historizing" Value="512" />
-    <opc:EnumeratedValue Name="InverseName" Value="1024" />
-    <opc:EnumeratedValue Name="IsAbstract" Value="2048" />
-    <opc:EnumeratedValue Name="MinimumSamplingInterval" Value="4096" />
-    <opc:EnumeratedValue Name="NodeClass" Value="8192" />
-    <opc:EnumeratedValue Name="NodeId" Value="16384" />
-    <opc:EnumeratedValue Name="Symmetric" Value="32768" />
-    <opc:EnumeratedValue Name="UserAccessLevel" Value="65536" />
-    <opc:EnumeratedValue Name="UserExecutable" Value="131072" />
-    <opc:EnumeratedValue Name="UserWriteMask" Value="262144" />
-    <opc:EnumeratedValue Name="ValueRank" Value="524288" />
-    <opc:EnumeratedValue Name="WriteMask" Value="1048576" />
-    <opc:EnumeratedValue Name="ValueForVariableType" Value="2097152" />
-    <opc:EnumeratedValue Name="DataTypeDefinition" Value="4194304" />
-    <opc:EnumeratedValue Name="RolePermissions" Value="8388608" />
-    <opc:EnumeratedValue Name="AccessRestrictions" Value="16777216" />
-    <opc:EnumeratedValue Name="AccessLevelEx" Value="33554432" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="BrowseDirection" LengthInBits="32">
-    <opc:Documentation>The directions of the references to return.</opc:Documentation>
-    <opc:EnumeratedValue Name="Forward" Value="0" />
-    <opc:EnumeratedValue Name="Inverse" Value="1" />
-    <opc:EnumeratedValue Name="Both" Value="2" />
-    <opc:EnumeratedValue Name="Invalid" Value="3" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ViewDescription" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The view to browse.</opc:Documentation>
-    <opc:Field Name="ViewId" TypeName="ua:NodeId" />
-    <opc:Field Name="Timestamp" TypeName="opc:DateTime" />
-    <opc:Field Name="ViewVersion" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowseDescription" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A request to browse the the references from a node.</opc:Documentation>
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="BrowseDirection" TypeName="tns:BrowseDirection" />
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IncludeSubtypes" TypeName="opc:Boolean" />
-    <opc:Field Name="NodeClassMask" TypeName="opc:UInt32" />
-    <opc:Field Name="ResultMask" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="BrowseResultMask" LengthInBits="32">
-    <opc:Documentation>A bit mask which specifies what should be returned in a browse response.</opc:Documentation>
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="ReferenceTypeId" Value="1" />
-    <opc:EnumeratedValue Name="IsForward" Value="2" />
-    <opc:EnumeratedValue Name="NodeClass" Value="4" />
-    <opc:EnumeratedValue Name="BrowseName" Value="8" />
-    <opc:EnumeratedValue Name="DisplayName" Value="16" />
-    <opc:EnumeratedValue Name="TypeDefinition" Value="32" />
-    <opc:EnumeratedValue Name="All" Value="63" />
-    <opc:EnumeratedValue Name="ReferenceTypeInfo" Value="3" />
-    <opc:EnumeratedValue Name="TargetInfo" Value="60" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ReferenceDescription" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The description of a reference.</opc:Documentation>
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IsForward" TypeName="opc:Boolean" />
-    <opc:Field Name="NodeId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="BrowseName" TypeName="ua:QualifiedName" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" />
-    <opc:Field Name="NodeClass" TypeName="tns:NodeClass" />
-    <opc:Field Name="TypeDefinition" TypeName="ua:ExpandedNodeId" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="ContinuationPoint">
-    <opc:Documentation>An identifier for a suspended query or browse operation.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="BrowseResult" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The result of a browse operation.</opc:Documentation>
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="ContinuationPoint" TypeName="opc:ByteString" />
-    <opc:Field Name="NoOfReferences" TypeName="opc:Int32" />
-    <opc:Field Name="References" TypeName="tns:ReferenceDescription" LengthField="NoOfReferences" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowseRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Browse the references for one or more nodes from the server address space.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="View" TypeName="tns:ViewDescription" />
-    <opc:Field Name="RequestedMaxReferencesPerNode" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfNodesToBrowse" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToBrowse" TypeName="tns:BrowseDescription" LengthField="NoOfNodesToBrowse" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowseResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Browse the references for one or more nodes from the server address space.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:BrowseResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowseNextRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Continues one or more browse operations.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="ReleaseContinuationPoints" TypeName="opc:Boolean" />
-    <opc:Field Name="NoOfContinuationPoints" TypeName="opc:Int32" />
-    <opc:Field Name="ContinuationPoints" TypeName="opc:ByteString" LengthField="NoOfContinuationPoints" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowseNextResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Continues one or more browse operations.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:BrowseResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RelativePathElement" BaseType="ua:ExtensionObject">
-    <opc:Documentation>An element in a relative path.</opc:Documentation>
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IsInverse" TypeName="opc:Boolean" />
-    <opc:Field Name="IncludeSubtypes" TypeName="opc:Boolean" />
-    <opc:Field Name="TargetName" TypeName="ua:QualifiedName" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RelativePath" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A relative path constructed from reference types and browse names.</opc:Documentation>
-    <opc:Field Name="NoOfElements" TypeName="opc:Int32" />
-    <opc:Field Name="Elements" TypeName="tns:RelativePathElement" LengthField="NoOfElements" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowsePath" BaseType="ua:ExtensionObject">
-    <opc:Documentation>A request to translate a path into a node id.</opc:Documentation>
-    <opc:Field Name="StartingNode" TypeName="ua:NodeId" />
-    <opc:Field Name="RelativePath" TypeName="tns:RelativePath" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowsePathTarget" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The target of the translated path.</opc:Documentation>
-    <opc:Field Name="TargetId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="RemainingPathIndex" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BrowsePathResult" BaseType="ua:ExtensionObject">
-    <opc:Documentation>The result of a translate opearation.</opc:Documentation>
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="NoOfTargets" TypeName="opc:Int32" />
-    <opc:Field Name="Targets" TypeName="tns:BrowsePathTarget" LengthField="NoOfTargets" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TranslateBrowsePathsToNodeIdsRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Translates one or more paths in the server address space.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfBrowsePaths" TypeName="opc:Int32" />
-    <opc:Field Name="BrowsePaths" TypeName="tns:BrowsePath" LengthField="NoOfBrowsePaths" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TranslateBrowsePathsToNodeIdsResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Translates one or more paths in the server address space.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:BrowsePathResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisterNodesRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Registers one or more nodes for repeated use within a session.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfNodesToRegister" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToRegister" TypeName="ua:NodeId" LengthField="NoOfNodesToRegister" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RegisterNodesResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Registers one or more nodes for repeated use within a session.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfRegisteredNodeIds" TypeName="opc:Int32" />
-    <opc:Field Name="RegisteredNodeIds" TypeName="ua:NodeId" LengthField="NoOfRegisteredNodeIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UnregisterNodesRequest" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Unregisters one or more previously registered nodes.</opc:Documentation>
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfNodesToUnregister" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToUnregister" TypeName="ua:NodeId" LengthField="NoOfNodesToUnregister" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UnregisterNodesResponse" BaseType="ua:ExtensionObject">
-    <opc:Documentation>Unregisters one or more previously registered nodes.</opc:Documentation>
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-  </opc:StructuredType>
-
-  <opc:OpaqueType Name="Counter">
-    <opc:Documentation>A monotonically increasing value.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="NumericRange">
-    <opc:Documentation>Specifies a range of array indexes.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="Time">
-    <opc:Documentation>A time value specified as HH:MM:SS.SSS.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:OpaqueType Name="Date">
-    <opc:Documentation>A date value.</opc:Documentation>
-  </opc:OpaqueType>
-
-  <opc:StructuredType Name="EndpointConfiguration" BaseType="ua:ExtensionObject">
-    <opc:Field Name="OperationTimeout" TypeName="opc:Int32" />
-    <opc:Field Name="UseBinaryEncoding" TypeName="opc:Boolean" />
-    <opc:Field Name="MaxStringLength" TypeName="opc:Int32" />
-    <opc:Field Name="MaxByteStringLength" TypeName="opc:Int32" />
-    <opc:Field Name="MaxArrayLength" TypeName="opc:Int32" />
-    <opc:Field Name="MaxMessageSize" TypeName="opc:Int32" />
-    <opc:Field Name="MaxBufferSize" TypeName="opc:Int32" />
-    <opc:Field Name="ChannelLifetime" TypeName="opc:Int32" />
-    <opc:Field Name="SecurityTokenLifetime" TypeName="opc:Int32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="QueryDataDescription" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RelativePath" TypeName="tns:RelativePath" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NodeTypeDescription" BaseType="ua:ExtensionObject">
-    <opc:Field Name="TypeDefinitionNode" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="IncludeSubTypes" TypeName="opc:Boolean" />
-    <opc:Field Name="NoOfDataToReturn" TypeName="opc:Int32" />
-    <opc:Field Name="DataToReturn" TypeName="tns:QueryDataDescription" LengthField="NoOfDataToReturn" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="FilterOperator" LengthInBits="32">
-    <opc:EnumeratedValue Name="Equals" Value="0" />
-    <opc:EnumeratedValue Name="IsNull" Value="1" />
-    <opc:EnumeratedValue Name="GreaterThan" Value="2" />
-    <opc:EnumeratedValue Name="LessThan" Value="3" />
-    <opc:EnumeratedValue Name="GreaterThanOrEqual" Value="4" />
-    <opc:EnumeratedValue Name="LessThanOrEqual" Value="5" />
-    <opc:EnumeratedValue Name="Like" Value="6" />
-    <opc:EnumeratedValue Name="Not" Value="7" />
-    <opc:EnumeratedValue Name="Between" Value="8" />
-    <opc:EnumeratedValue Name="InList" Value="9" />
-    <opc:EnumeratedValue Name="And" Value="10" />
-    <opc:EnumeratedValue Name="Or" Value="11" />
-    <opc:EnumeratedValue Name="Cast" Value="12" />
-    <opc:EnumeratedValue Name="InView" Value="13" />
-    <opc:EnumeratedValue Name="OfType" Value="14" />
-    <opc:EnumeratedValue Name="RelatedTo" Value="15" />
-    <opc:EnumeratedValue Name="BitwiseAnd" Value="16" />
-    <opc:EnumeratedValue Name="BitwiseOr" Value="17" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="QueryDataSet" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NodeId" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="TypeDefinitionNode" TypeName="ua:ExpandedNodeId" />
-    <opc:Field Name="NoOfValues" TypeName="opc:Int32" />
-    <opc:Field Name="Values" TypeName="ua:Variant" LengthField="NoOfValues" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NodeReference" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="ReferenceTypeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IsForward" TypeName="opc:Boolean" />
-    <opc:Field Name="NoOfReferencedNodeIds" TypeName="opc:Int32" />
-    <opc:Field Name="ReferencedNodeIds" TypeName="ua:NodeId" LengthField="NoOfReferencedNodeIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ContentFilterElement" BaseType="ua:ExtensionObject">
-    <opc:Field Name="FilterOperator" TypeName="tns:FilterOperator" />
-    <opc:Field Name="NoOfFilterOperands" TypeName="opc:Int32" />
-    <opc:Field Name="FilterOperands" TypeName="ua:ExtensionObject" LengthField="NoOfFilterOperands" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ContentFilter" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfElements" TypeName="opc:Int32" />
-    <opc:Field Name="Elements" TypeName="tns:ContentFilterElement" LengthField="NoOfElements" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="FilterOperand" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ElementOperand" BaseType="tns:FilterOperand">
-    <opc:Field Name="Index" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="LiteralOperand" BaseType="tns:FilterOperand">
-    <opc:Field Name="Value" TypeName="ua:Variant" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AttributeOperand" BaseType="tns:FilterOperand">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="Alias" TypeName="opc:String" />
-    <opc:Field Name="BrowsePath" TypeName="tns:RelativePath" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SimpleAttributeOperand" BaseType="tns:FilterOperand">
-    <opc:Field Name="TypeDefinitionId" TypeName="ua:NodeId" />
-    <opc:Field Name="NoOfBrowsePath" TypeName="opc:Int32" />
-    <opc:Field Name="BrowsePath" TypeName="ua:QualifiedName" LengthField="NoOfBrowsePath" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ContentFilterElementResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="NoOfOperandStatusCodes" TypeName="opc:Int32" />
-    <opc:Field Name="OperandStatusCodes" TypeName="ua:StatusCode" LengthField="NoOfOperandStatusCodes" />
-    <opc:Field Name="NoOfOperandDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="OperandDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfOperandDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ContentFilterResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfElementResults" TypeName="opc:Int32" />
-    <opc:Field Name="ElementResults" TypeName="tns:ContentFilterElementResult" LengthField="NoOfElementResults" />
-    <opc:Field Name="NoOfElementDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="ElementDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfElementDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ParsingResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="NoOfDataStatusCodes" TypeName="opc:Int32" />
-    <opc:Field Name="DataStatusCodes" TypeName="ua:StatusCode" LengthField="NoOfDataStatusCodes" />
-    <opc:Field Name="NoOfDataDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DataDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDataDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="QueryFirstRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="View" TypeName="tns:ViewDescription" />
-    <opc:Field Name="NoOfNodeTypes" TypeName="opc:Int32" />
-    <opc:Field Name="NodeTypes" TypeName="tns:NodeTypeDescription" LengthField="NoOfNodeTypes" />
-    <opc:Field Name="Filter" TypeName="tns:ContentFilter" />
-    <opc:Field Name="MaxDataSetsToReturn" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxReferencesToReturn" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="QueryFirstResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfQueryDataSets" TypeName="opc:Int32" />
-    <opc:Field Name="QueryDataSets" TypeName="tns:QueryDataSet" LengthField="NoOfQueryDataSets" />
-    <opc:Field Name="ContinuationPoint" TypeName="opc:ByteString" />
-    <opc:Field Name="NoOfParsingResults" TypeName="opc:Int32" />
-    <opc:Field Name="ParsingResults" TypeName="tns:ParsingResult" LengthField="NoOfParsingResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-    <opc:Field Name="FilterResult" TypeName="tns:ContentFilterResult" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="QueryNextRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="ReleaseContinuationPoint" TypeName="opc:Boolean" />
-    <opc:Field Name="ContinuationPoint" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="QueryNextResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfQueryDataSets" TypeName="opc:Int32" />
-    <opc:Field Name="QueryDataSets" TypeName="tns:QueryDataSet" LengthField="NoOfQueryDataSets" />
-    <opc:Field Name="RevisedContinuationPoint" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="TimestampsToReturn" LengthInBits="32">
-    <opc:EnumeratedValue Name="Source" Value="0" />
-    <opc:EnumeratedValue Name="Server" Value="1" />
-    <opc:EnumeratedValue Name="Both" Value="2" />
-    <opc:EnumeratedValue Name="Neither" Value="3" />
-    <opc:EnumeratedValue Name="Invalid" Value="4" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ReadValueId" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-    <opc:Field Name="DataEncoding" TypeName="ua:QualifiedName" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReadRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="MaxAge" TypeName="opc:Double" />
-    <opc:Field Name="TimestampsToReturn" TypeName="tns:TimestampsToReturn" />
-    <opc:Field Name="NoOfNodesToRead" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToRead" TypeName="tns:ReadValueId" LengthField="NoOfNodesToRead" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReadResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:DataValue" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryReadValueId" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-    <opc:Field Name="DataEncoding" TypeName="ua:QualifiedName" />
-    <opc:Field Name="ContinuationPoint" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryReadResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="ContinuationPoint" TypeName="opc:ByteString" />
-    <opc:Field Name="HistoryData" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryReadDetails" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReadEventDetails" BaseType="tns:HistoryReadDetails">
-    <opc:Field Name="NumValuesPerNode" TypeName="opc:UInt32" />
-    <opc:Field Name="StartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="EndTime" TypeName="opc:DateTime" />
-    <opc:Field Name="Filter" TypeName="tns:EventFilter" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReadRawModifiedDetails" BaseType="tns:HistoryReadDetails">
-    <opc:Field Name="IsReadModified" TypeName="opc:Boolean" />
-    <opc:Field Name="StartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="EndTime" TypeName="opc:DateTime" />
-    <opc:Field Name="NumValuesPerNode" TypeName="opc:UInt32" />
-    <opc:Field Name="ReturnBounds" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReadProcessedDetails" BaseType="tns:HistoryReadDetails">
-    <opc:Field Name="StartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="EndTime" TypeName="opc:DateTime" />
-    <opc:Field Name="ProcessingInterval" TypeName="opc:Double" />
-    <opc:Field Name="NoOfAggregateType" TypeName="opc:Int32" />
-    <opc:Field Name="AggregateType" TypeName="ua:NodeId" LengthField="NoOfAggregateType" />
-    <opc:Field Name="AggregateConfiguration" TypeName="tns:AggregateConfiguration" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ReadAtTimeDetails" BaseType="tns:HistoryReadDetails">
-    <opc:Field Name="NoOfReqTimes" TypeName="opc:Int32" />
-    <opc:Field Name="ReqTimes" TypeName="opc:DateTime" LengthField="NoOfReqTimes" />
-    <opc:Field Name="UseSimpleBounds" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryData" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfDataValues" TypeName="opc:Int32" />
-    <opc:Field Name="DataValues" TypeName="ua:DataValue" LengthField="NoOfDataValues" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ModificationInfo" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ModificationTime" TypeName="opc:DateTime" />
-    <opc:Field Name="UpdateType" TypeName="tns:HistoryUpdateType" />
-    <opc:Field Name="UserName" TypeName="opc:String" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryModifiedData" BaseType="tns:HistoryData">
-    <opc:Field Name="NoOfDataValues" TypeName="opc:Int32" />
-    <opc:Field Name="DataValues" TypeName="ua:DataValue" LengthField="NoOfDataValues" />
-    <opc:Field Name="NoOfModificationInfos" TypeName="opc:Int32" />
-    <opc:Field Name="ModificationInfos" TypeName="tns:ModificationInfo" LengthField="NoOfModificationInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryEvent" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfEvents" TypeName="opc:Int32" />
-    <opc:Field Name="Events" TypeName="tns:HistoryEventFieldList" LengthField="NoOfEvents" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryReadRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="HistoryReadDetails" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="TimestampsToReturn" TypeName="tns:TimestampsToReturn" />
-    <opc:Field Name="ReleaseContinuationPoints" TypeName="opc:Boolean" />
-    <opc:Field Name="NoOfNodesToRead" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToRead" TypeName="tns:HistoryReadValueId" LengthField="NoOfNodesToRead" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryReadResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:HistoryReadResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="WriteValue" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-    <opc:Field Name="AttributeId" TypeName="opc:UInt32" />
-    <opc:Field Name="IndexRange" TypeName="opc:String" />
-    <opc:Field Name="Value" TypeName="ua:DataValue" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="WriteRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfNodesToWrite" TypeName="opc:Int32" />
-    <opc:Field Name="NodesToWrite" TypeName="tns:WriteValue" LengthField="NoOfNodesToWrite" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="WriteResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryUpdateDetails" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="HistoryUpdateType" LengthInBits="32">
-    <opc:EnumeratedValue Name="Insert" Value="1" />
-    <opc:EnumeratedValue Name="Replace" Value="2" />
-    <opc:EnumeratedValue Name="Update" Value="3" />
-    <opc:EnumeratedValue Name="Delete" Value="4" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="PerformUpdateType" LengthInBits="32">
-    <opc:EnumeratedValue Name="Insert" Value="1" />
-    <opc:EnumeratedValue Name="Replace" Value="2" />
-    <opc:EnumeratedValue Name="Update" Value="3" />
-    <opc:EnumeratedValue Name="Remove" Value="4" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="UpdateDataDetails" BaseType="tns:HistoryUpdateDetails">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:HistoryUpdateDetails" />
-    <opc:Field Name="PerformInsertReplace" TypeName="tns:PerformUpdateType" />
-    <opc:Field Name="NoOfUpdateValues" TypeName="opc:Int32" />
-    <opc:Field Name="UpdateValues" TypeName="ua:DataValue" LengthField="NoOfUpdateValues" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UpdateStructureDataDetails" BaseType="tns:HistoryUpdateDetails">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:HistoryUpdateDetails" />
-    <opc:Field Name="PerformInsertReplace" TypeName="tns:PerformUpdateType" />
-    <opc:Field Name="NoOfUpdateValues" TypeName="opc:Int32" />
-    <opc:Field Name="UpdateValues" TypeName="ua:DataValue" LengthField="NoOfUpdateValues" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="UpdateEventDetails" BaseType="tns:HistoryUpdateDetails">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:HistoryUpdateDetails" />
-    <opc:Field Name="PerformInsertReplace" TypeName="tns:PerformUpdateType" />
-    <opc:Field Name="Filter" TypeName="tns:EventFilter" />
-    <opc:Field Name="NoOfEventData" TypeName="opc:Int32" />
-    <opc:Field Name="EventData" TypeName="tns:HistoryEventFieldList" LengthField="NoOfEventData" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteRawModifiedDetails" BaseType="tns:HistoryUpdateDetails">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:HistoryUpdateDetails" />
-    <opc:Field Name="IsDeleteModified" TypeName="opc:Boolean" />
-    <opc:Field Name="StartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="EndTime" TypeName="opc:DateTime" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteAtTimeDetails" BaseType="tns:HistoryUpdateDetails">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:HistoryUpdateDetails" />
-    <opc:Field Name="NoOfReqTimes" TypeName="opc:Int32" />
-    <opc:Field Name="ReqTimes" TypeName="opc:DateTime" LengthField="NoOfReqTimes" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteEventDetails" BaseType="tns:HistoryUpdateDetails">
-    <opc:Field Name="NodeId" TypeName="ua:NodeId" SourceType="tns:HistoryUpdateDetails" />
-    <opc:Field Name="NoOfEventIds" TypeName="opc:Int32" />
-    <opc:Field Name="EventIds" TypeName="opc:ByteString" LengthField="NoOfEventIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryUpdateResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="NoOfOperationResults" TypeName="opc:Int32" />
-    <opc:Field Name="OperationResults" TypeName="ua:StatusCode" LengthField="NoOfOperationResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryUpdateRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfHistoryUpdateDetails" TypeName="opc:Int32" />
-    <opc:Field Name="HistoryUpdateDetails" TypeName="ua:ExtensionObject" LengthField="NoOfHistoryUpdateDetails" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryUpdateResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:HistoryUpdateResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CallMethodRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ObjectId" TypeName="ua:NodeId" />
-    <opc:Field Name="MethodId" TypeName="ua:NodeId" />
-    <opc:Field Name="NoOfInputArguments" TypeName="opc:Int32" />
-    <opc:Field Name="InputArguments" TypeName="ua:Variant" LengthField="NoOfInputArguments" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CallMethodResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="NoOfInputArgumentResults" TypeName="opc:Int32" />
-    <opc:Field Name="InputArgumentResults" TypeName="ua:StatusCode" LengthField="NoOfInputArgumentResults" />
-    <opc:Field Name="NoOfInputArgumentDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="InputArgumentDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfInputArgumentDiagnosticInfos" />
-    <opc:Field Name="NoOfOutputArguments" TypeName="opc:Int32" />
-    <opc:Field Name="OutputArguments" TypeName="ua:Variant" LengthField="NoOfOutputArguments" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CallRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfMethodsToCall" TypeName="opc:Int32" />
-    <opc:Field Name="MethodsToCall" TypeName="tns:CallMethodRequest" LengthField="NoOfMethodsToCall" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CallResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:CallMethodResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="MonitoringMode" LengthInBits="32">
-    <opc:EnumeratedValue Name="Disabled" Value="0" />
-    <opc:EnumeratedValue Name="Sampling" Value="1" />
-    <opc:EnumeratedValue Name="Reporting" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="DataChangeTrigger" LengthInBits="32">
-    <opc:EnumeratedValue Name="Status" Value="0" />
-    <opc:EnumeratedValue Name="StatusValue" Value="1" />
-    <opc:EnumeratedValue Name="StatusValueTimestamp" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="DeadbandType" LengthInBits="32">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="Absolute" Value="1" />
-    <opc:EnumeratedValue Name="Percent" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="MonitoringFilter" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataChangeFilter" BaseType="tns:MonitoringFilter">
-    <opc:Field Name="Trigger" TypeName="tns:DataChangeTrigger" />
-    <opc:Field Name="DeadbandType" TypeName="opc:UInt32" />
-    <opc:Field Name="DeadbandValue" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EventFilter" BaseType="tns:MonitoringFilter">
-    <opc:Field Name="NoOfSelectClauses" TypeName="opc:Int32" />
-    <opc:Field Name="SelectClauses" TypeName="tns:SimpleAttributeOperand" LengthField="NoOfSelectClauses" />
-    <opc:Field Name="WhereClause" TypeName="tns:ContentFilter" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AggregateConfiguration" BaseType="ua:ExtensionObject">
-    <opc:Field Name="UseServerCapabilitiesDefaults" TypeName="opc:Boolean" />
-    <opc:Field Name="TreatUncertainAsBad" TypeName="opc:Boolean" />
-    <opc:Field Name="PercentDataBad" TypeName="opc:Byte" />
-    <opc:Field Name="PercentDataGood" TypeName="opc:Byte" />
-    <opc:Field Name="UseSlopedExtrapolation" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AggregateFilter" BaseType="tns:MonitoringFilter">
-    <opc:Field Name="StartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="AggregateType" TypeName="ua:NodeId" />
-    <opc:Field Name="ProcessingInterval" TypeName="opc:Double" />
-    <opc:Field Name="AggregateConfiguration" TypeName="tns:AggregateConfiguration" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoringFilterResult" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EventFilterResult" BaseType="tns:MonitoringFilterResult">
-    <opc:Field Name="NoOfSelectClauseResults" TypeName="opc:Int32" />
-    <opc:Field Name="SelectClauseResults" TypeName="ua:StatusCode" LengthField="NoOfSelectClauseResults" />
-    <opc:Field Name="NoOfSelectClauseDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="SelectClauseDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfSelectClauseDiagnosticInfos" />
-    <opc:Field Name="WhereClauseResult" TypeName="tns:ContentFilterResult" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AggregateFilterResult" BaseType="tns:MonitoringFilterResult">
-    <opc:Field Name="RevisedStartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="RevisedProcessingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RevisedAggregateConfiguration" TypeName="tns:AggregateConfiguration" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoringParameters" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ClientHandle" TypeName="opc:UInt32" />
-    <opc:Field Name="SamplingInterval" TypeName="opc:Double" />
-    <opc:Field Name="Filter" TypeName="ua:ExtensionObject" />
-    <opc:Field Name="QueueSize" TypeName="opc:UInt32" />
-    <opc:Field Name="DiscardOldest" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoredItemCreateRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ItemToMonitor" TypeName="tns:ReadValueId" />
-    <opc:Field Name="MonitoringMode" TypeName="tns:MonitoringMode" />
-    <opc:Field Name="RequestedParameters" TypeName="tns:MonitoringParameters" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoredItemCreateResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="MonitoredItemId" TypeName="opc:UInt32" />
-    <opc:Field Name="RevisedSamplingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RevisedQueueSize" TypeName="opc:UInt32" />
-    <opc:Field Name="FilterResult" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CreateMonitoredItemsRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="TimestampsToReturn" TypeName="tns:TimestampsToReturn" />
-    <opc:Field Name="NoOfItemsToCreate" TypeName="opc:Int32" />
-    <opc:Field Name="ItemsToCreate" TypeName="tns:MonitoredItemCreateRequest" LengthField="NoOfItemsToCreate" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CreateMonitoredItemsResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:MonitoredItemCreateResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoredItemModifyRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="MonitoredItemId" TypeName="opc:UInt32" />
-    <opc:Field Name="RequestedParameters" TypeName="tns:MonitoringParameters" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoredItemModifyResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="RevisedSamplingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RevisedQueueSize" TypeName="opc:UInt32" />
-    <opc:Field Name="FilterResult" TypeName="ua:ExtensionObject" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ModifyMonitoredItemsRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="TimestampsToReturn" TypeName="tns:TimestampsToReturn" />
-    <opc:Field Name="NoOfItemsToModify" TypeName="opc:Int32" />
-    <opc:Field Name="ItemsToModify" TypeName="tns:MonitoredItemModifyRequest" LengthField="NoOfItemsToModify" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ModifyMonitoredItemsResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:MonitoredItemModifyResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SetMonitoringModeRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="MonitoringMode" TypeName="tns:MonitoringMode" />
-    <opc:Field Name="NoOfMonitoredItemIds" TypeName="opc:Int32" />
-    <opc:Field Name="MonitoredItemIds" TypeName="opc:UInt32" LengthField="NoOfMonitoredItemIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SetMonitoringModeResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SetTriggeringRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="TriggeringItemId" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfLinksToAdd" TypeName="opc:Int32" />
-    <opc:Field Name="LinksToAdd" TypeName="opc:UInt32" LengthField="NoOfLinksToAdd" />
-    <opc:Field Name="NoOfLinksToRemove" TypeName="opc:Int32" />
-    <opc:Field Name="LinksToRemove" TypeName="opc:UInt32" LengthField="NoOfLinksToRemove" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SetTriggeringResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfAddResults" TypeName="opc:Int32" />
-    <opc:Field Name="AddResults" TypeName="ua:StatusCode" LengthField="NoOfAddResults" />
-    <opc:Field Name="NoOfAddDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="AddDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfAddDiagnosticInfos" />
-    <opc:Field Name="NoOfRemoveResults" TypeName="opc:Int32" />
-    <opc:Field Name="RemoveResults" TypeName="ua:StatusCode" LengthField="NoOfRemoveResults" />
-    <opc:Field Name="NoOfRemoveDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="RemoveDiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfRemoveDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteMonitoredItemsRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfMonitoredItemIds" TypeName="opc:Int32" />
-    <opc:Field Name="MonitoredItemIds" TypeName="opc:UInt32" LengthField="NoOfMonitoredItemIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteMonitoredItemsResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CreateSubscriptionRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="RequestedPublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RequestedLifetimeCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RequestedMaxKeepAliveCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxNotificationsPerPublish" TypeName="opc:UInt32" />
-    <opc:Field Name="PublishingEnabled" TypeName="opc:Boolean" />
-    <opc:Field Name="Priority" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="CreateSubscriptionResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="RevisedPublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RevisedLifetimeCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RevisedMaxKeepAliveCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ModifySubscriptionRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="RequestedPublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RequestedLifetimeCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RequestedMaxKeepAliveCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxNotificationsPerPublish" TypeName="opc:UInt32" />
-    <opc:Field Name="Priority" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ModifySubscriptionResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="RevisedPublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="RevisedLifetimeCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RevisedMaxKeepAliveCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SetPublishingModeRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="PublishingEnabled" TypeName="opc:Boolean" />
-    <opc:Field Name="NoOfSubscriptionIds" TypeName="opc:Int32" />
-    <opc:Field Name="SubscriptionIds" TypeName="opc:UInt32" LengthField="NoOfSubscriptionIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SetPublishingModeResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NotificationMessage" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SequenceNumber" TypeName="opc:UInt32" />
-    <opc:Field Name="PublishTime" TypeName="opc:DateTime" />
-    <opc:Field Name="NoOfNotificationData" TypeName="opc:Int32" />
-    <opc:Field Name="NotificationData" TypeName="ua:ExtensionObject" LengthField="NoOfNotificationData" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NotificationData" BaseType="ua:ExtensionObject">
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DataChangeNotification" BaseType="tns:NotificationData">
-    <opc:Field Name="NoOfMonitoredItems" TypeName="opc:Int32" />
-    <opc:Field Name="MonitoredItems" TypeName="tns:MonitoredItemNotification" LengthField="NoOfMonitoredItems" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="MonitoredItemNotification" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ClientHandle" TypeName="opc:UInt32" />
-    <opc:Field Name="Value" TypeName="ua:DataValue" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EventNotificationList" BaseType="tns:NotificationData">
-    <opc:Field Name="NoOfEvents" TypeName="opc:Int32" />
-    <opc:Field Name="Events" TypeName="tns:EventFieldList" LengthField="NoOfEvents" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EventFieldList" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ClientHandle" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfEventFields" TypeName="opc:Int32" />
-    <opc:Field Name="EventFields" TypeName="ua:Variant" LengthField="NoOfEventFields" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="HistoryEventFieldList" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfEventFields" TypeName="opc:Int32" />
-    <opc:Field Name="EventFields" TypeName="ua:Variant" LengthField="NoOfEventFields" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="StatusChangeNotification" BaseType="tns:NotificationData">
-    <opc:Field Name="Status" TypeName="ua:StatusCode" />
-    <opc:Field Name="DiagnosticInfo" TypeName="ua:DiagnosticInfo" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SubscriptionAcknowledgement" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="SequenceNumber" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfSubscriptionAcknowledgements" TypeName="opc:Int32" />
-    <opc:Field Name="SubscriptionAcknowledgements" TypeName="tns:SubscriptionAcknowledgement" LengthField="NoOfSubscriptionAcknowledgements" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="PublishResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="NoOfAvailableSequenceNumbers" TypeName="opc:Int32" />
-    <opc:Field Name="AvailableSequenceNumbers" TypeName="opc:UInt32" LengthField="NoOfAvailableSequenceNumbers" />
-    <opc:Field Name="MoreNotifications" TypeName="opc:Boolean" />
-    <opc:Field Name="NotificationMessage" TypeName="tns:NotificationMessage" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RepublishRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="RetransmitSequenceNumber" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="RepublishResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NotificationMessage" TypeName="tns:NotificationMessage" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TransferResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="NoOfAvailableSequenceNumbers" TypeName="opc:Int32" />
-    <opc:Field Name="AvailableSequenceNumbers" TypeName="opc:UInt32" LengthField="NoOfAvailableSequenceNumbers" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TransferSubscriptionsRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfSubscriptionIds" TypeName="opc:Int32" />
-    <opc:Field Name="SubscriptionIds" TypeName="opc:UInt32" LengthField="NoOfSubscriptionIds" />
-    <opc:Field Name="SendInitialValues" TypeName="opc:Boolean" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="TransferSubscriptionsResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="tns:TransferResult" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteSubscriptionsRequest" BaseType="ua:ExtensionObject">
-    <opc:Field Name="RequestHeader" TypeName="tns:RequestHeader" />
-    <opc:Field Name="NoOfSubscriptionIds" TypeName="opc:Int32" />
-    <opc:Field Name="SubscriptionIds" TypeName="opc:UInt32" LengthField="NoOfSubscriptionIds" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DeleteSubscriptionsResponse" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ResponseHeader" TypeName="tns:ResponseHeader" />
-    <opc:Field Name="NoOfResults" TypeName="opc:Int32" />
-    <opc:Field Name="Results" TypeName="ua:StatusCode" LengthField="NoOfResults" />
-    <opc:Field Name="NoOfDiagnosticInfos" TypeName="opc:Int32" />
-    <opc:Field Name="DiagnosticInfos" TypeName="ua:DiagnosticInfo" LengthField="NoOfDiagnosticInfos" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="BuildInfo" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ProductUri" TypeName="opc:String" />
-    <opc:Field Name="ManufacturerName" TypeName="opc:String" />
-    <opc:Field Name="ProductName" TypeName="opc:String" />
-    <opc:Field Name="SoftwareVersion" TypeName="opc:String" />
-    <opc:Field Name="BuildNumber" TypeName="opc:String" />
-    <opc:Field Name="BuildDate" TypeName="opc:DateTime" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="RedundancySupport" LengthInBits="32">
-    <opc:EnumeratedValue Name="None" Value="0" />
-    <opc:EnumeratedValue Name="Cold" Value="1" />
-    <opc:EnumeratedValue Name="Warm" Value="2" />
-    <opc:EnumeratedValue Name="Hot" Value="3" />
-    <opc:EnumeratedValue Name="Transparent" Value="4" />
-    <opc:EnumeratedValue Name="HotAndMirrored" Value="5" />
-  </opc:EnumeratedType>
-
-  <opc:EnumeratedType Name="ServerState" LengthInBits="32">
-    <opc:EnumeratedValue Name="Running" Value="0" />
-    <opc:EnumeratedValue Name="Failed" Value="1" />
-    <opc:EnumeratedValue Name="NoConfiguration" Value="2" />
-    <opc:EnumeratedValue Name="Suspended" Value="3" />
-    <opc:EnumeratedValue Name="Shutdown" Value="4" />
-    <opc:EnumeratedValue Name="Test" Value="5" />
-    <opc:EnumeratedValue Name="CommunicationFault" Value="6" />
-    <opc:EnumeratedValue Name="Unknown" Value="7" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="RedundantServerDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ServerId" TypeName="opc:String" />
-    <opc:Field Name="ServiceLevel" TypeName="opc:Byte" />
-    <opc:Field Name="ServerState" TypeName="tns:ServerState" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EndpointUrlListDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NoOfEndpointUrlList" TypeName="opc:Int32" />
-    <opc:Field Name="EndpointUrlList" TypeName="opc:String" LengthField="NoOfEndpointUrlList" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="NetworkGroupDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ServerUri" TypeName="opc:String" />
-    <opc:Field Name="NoOfNetworkPaths" TypeName="opc:Int32" />
-    <opc:Field Name="NetworkPaths" TypeName="tns:EndpointUrlListDataType" LengthField="NoOfNetworkPaths" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SamplingIntervalDiagnosticsDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SamplingInterval" TypeName="opc:Double" />
-    <opc:Field Name="MonitoredItemCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxMonitoredItemCount" TypeName="opc:UInt32" />
-    <opc:Field Name="DisabledMonitoredItemCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ServerDiagnosticsSummaryDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="ServerViewCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CurrentSessionCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CumulatedSessionCount" TypeName="opc:UInt32" />
-    <opc:Field Name="SecurityRejectedSessionCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RejectedSessionCount" TypeName="opc:UInt32" />
-    <opc:Field Name="SessionTimeoutCount" TypeName="opc:UInt32" />
-    <opc:Field Name="SessionAbortCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CurrentSubscriptionCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CumulatedSubscriptionCount" TypeName="opc:UInt32" />
-    <opc:Field Name="PublishingIntervalCount" TypeName="opc:UInt32" />
-    <opc:Field Name="SecurityRejectedRequestsCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RejectedRequestsCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ServerStatusDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StartTime" TypeName="opc:DateTime" />
-    <opc:Field Name="CurrentTime" TypeName="opc:DateTime" />
-    <opc:Field Name="State" TypeName="tns:ServerState" />
-    <opc:Field Name="BuildInfo" TypeName="tns:BuildInfo" />
-    <opc:Field Name="SecondsTillShutdown" TypeName="opc:UInt32" />
-    <opc:Field Name="ShutdownReason" TypeName="ua:LocalizedText" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SessionDiagnosticsDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="SessionName" TypeName="opc:String" />
-    <opc:Field Name="ClientDescription" TypeName="tns:ApplicationDescription" />
-    <opc:Field Name="ServerUri" TypeName="opc:String" />
-    <opc:Field Name="EndpointUrl" TypeName="opc:String" />
-    <opc:Field Name="NoOfLocaleIds" TypeName="opc:Int32" />
-    <opc:Field Name="LocaleIds" TypeName="opc:String" LengthField="NoOfLocaleIds" />
-    <opc:Field Name="ActualSessionTimeout" TypeName="opc:Double" />
-    <opc:Field Name="MaxResponseMessageSize" TypeName="opc:UInt32" />
-    <opc:Field Name="ClientConnectionTime" TypeName="opc:DateTime" />
-    <opc:Field Name="ClientLastContactTime" TypeName="opc:DateTime" />
-    <opc:Field Name="CurrentSubscriptionsCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CurrentMonitoredItemsCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CurrentPublishRequestsInQueue" TypeName="opc:UInt32" />
-    <opc:Field Name="TotalRequestCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="UnauthorizedRequestCount" TypeName="opc:UInt32" />
-    <opc:Field Name="ReadCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="HistoryReadCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="WriteCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="HistoryUpdateCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="CallCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="CreateMonitoredItemsCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="ModifyMonitoredItemsCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="SetMonitoringModeCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="SetTriggeringCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="DeleteMonitoredItemsCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="CreateSubscriptionCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="ModifySubscriptionCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="SetPublishingModeCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="PublishCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="RepublishCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="TransferSubscriptionsCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="DeleteSubscriptionsCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="AddNodesCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="AddReferencesCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="DeleteNodesCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="DeleteReferencesCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="BrowseCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="BrowseNextCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="TranslateBrowsePathsToNodeIdsCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="QueryFirstCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="QueryNextCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="RegisterNodesCount" TypeName="tns:ServiceCounterDataType" />
-    <opc:Field Name="UnregisterNodesCount" TypeName="tns:ServiceCounterDataType" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SessionSecurityDiagnosticsDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="ClientUserIdOfSession" TypeName="opc:String" />
-    <opc:Field Name="NoOfClientUserIdHistory" TypeName="opc:Int32" />
-    <opc:Field Name="ClientUserIdHistory" TypeName="opc:String" LengthField="NoOfClientUserIdHistory" />
-    <opc:Field Name="AuthenticationMechanism" TypeName="opc:String" />
-    <opc:Field Name="Encoding" TypeName="opc:String" />
-    <opc:Field Name="TransportProtocol" TypeName="opc:String" />
-    <opc:Field Name="SecurityMode" TypeName="tns:MessageSecurityMode" />
-    <opc:Field Name="SecurityPolicyUri" TypeName="opc:String" />
-    <opc:Field Name="ClientCertificate" TypeName="opc:ByteString" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ServiceCounterDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="TotalCount" TypeName="opc:UInt32" />
-    <opc:Field Name="ErrorCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="StatusResult" BaseType="ua:ExtensionObject">
-    <opc:Field Name="StatusCode" TypeName="ua:StatusCode" />
-    <opc:Field Name="DiagnosticInfo" TypeName="ua:DiagnosticInfo" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SubscriptionDiagnosticsDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="SessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="SubscriptionId" TypeName="opc:UInt32" />
-    <opc:Field Name="Priority" TypeName="opc:Byte" />
-    <opc:Field Name="PublishingInterval" TypeName="opc:Double" />
-    <opc:Field Name="MaxKeepAliveCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxLifetimeCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MaxNotificationsPerPublish" TypeName="opc:UInt32" />
-    <opc:Field Name="PublishingEnabled" TypeName="opc:Boolean" />
-    <opc:Field Name="ModifyCount" TypeName="opc:UInt32" />
-    <opc:Field Name="EnableCount" TypeName="opc:UInt32" />
-    <opc:Field Name="DisableCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RepublishRequestCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RepublishMessageRequestCount" TypeName="opc:UInt32" />
-    <opc:Field Name="RepublishMessageCount" TypeName="opc:UInt32" />
-    <opc:Field Name="TransferRequestCount" TypeName="opc:UInt32" />
-    <opc:Field Name="TransferredToAltClientCount" TypeName="opc:UInt32" />
-    <opc:Field Name="TransferredToSameClientCount" TypeName="opc:UInt32" />
-    <opc:Field Name="PublishRequestCount" TypeName="opc:UInt32" />
-    <opc:Field Name="DataChangeNotificationsCount" TypeName="opc:UInt32" />
-    <opc:Field Name="EventNotificationsCount" TypeName="opc:UInt32" />
-    <opc:Field Name="NotificationsCount" TypeName="opc:UInt32" />
-    <opc:Field Name="LatePublishRequestCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CurrentKeepAliveCount" TypeName="opc:UInt32" />
-    <opc:Field Name="CurrentLifetimeCount" TypeName="opc:UInt32" />
-    <opc:Field Name="UnacknowledgedMessageCount" TypeName="opc:UInt32" />
-    <opc:Field Name="DiscardedMessageCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MonitoredItemCount" TypeName="opc:UInt32" />
-    <opc:Field Name="DisabledMonitoredItemCount" TypeName="opc:UInt32" />
-    <opc:Field Name="MonitoringQueueOverflowCount" TypeName="opc:UInt32" />
-    <opc:Field Name="NextSequenceNumber" TypeName="opc:UInt32" />
-    <opc:Field Name="EventQueueOverFlowCount" TypeName="opc:UInt32" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="ModelChangeStructureVerbMask" LengthInBits="32">
-    <opc:EnumeratedValue Name="NodeAdded" Value="1" />
-    <opc:EnumeratedValue Name="NodeDeleted" Value="2" />
-    <opc:EnumeratedValue Name="ReferenceAdded" Value="4" />
-    <opc:EnumeratedValue Name="ReferenceDeleted" Value="8" />
-    <opc:EnumeratedValue Name="DataTypeChanged" Value="16" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ModelChangeStructureDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Affected" TypeName="ua:NodeId" />
-    <opc:Field Name="AffectedType" TypeName="ua:NodeId" />
-    <opc:Field Name="Verb" TypeName="opc:Byte" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="SemanticChangeStructureDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Affected" TypeName="ua:NodeId" />
-    <opc:Field Name="AffectedType" TypeName="ua:NodeId" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="Range" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Low" TypeName="opc:Double" />
-    <opc:Field Name="High" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="EUInformation" BaseType="ua:ExtensionObject">
-    <opc:Field Name="NamespaceUri" TypeName="opc:String" />
-    <opc:Field Name="UnitId" TypeName="opc:Int32" />
-    <opc:Field Name="DisplayName" TypeName="ua:LocalizedText" />
-    <opc:Field Name="Description" TypeName="ua:LocalizedText" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="AxisScaleEnumeration" LengthInBits="32">
-    <opc:EnumeratedValue Name="Linear" Value="0" />
-    <opc:EnumeratedValue Name="Log" Value="1" />
-    <opc:EnumeratedValue Name="Ln" Value="2" />
-  </opc:EnumeratedType>
-
-  <opc:StructuredType Name="ComplexNumberType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Real" TypeName="opc:Float" />
-    <opc:Field Name="Imaginary" TypeName="opc:Float" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="DoubleComplexNumberType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Real" TypeName="opc:Double" />
-    <opc:Field Name="Imaginary" TypeName="opc:Double" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="AxisInformation" BaseType="ua:ExtensionObject">
-    <opc:Field Name="EngineeringUnits" TypeName="tns:EUInformation" />
-    <opc:Field Name="EURange" TypeName="tns:Range" />
-    <opc:Field Name="Title" TypeName="ua:LocalizedText" />
-    <opc:Field Name="AxisScaleType" TypeName="tns:AxisScaleEnumeration" />
-    <opc:Field Name="NoOfAxisSteps" TypeName="opc:Int32" />
-    <opc:Field Name="AxisSteps" TypeName="opc:Double" LengthField="NoOfAxisSteps" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="XVType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="X" TypeName="opc:Double" />
-    <opc:Field Name="Value" TypeName="opc:Float" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ProgramDiagnosticDataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="CreateSessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="CreateClientName" TypeName="opc:String" />
-    <opc:Field Name="InvocationCreationTime" TypeName="opc:DateTime" />
-    <opc:Field Name="LastTransitionTime" TypeName="opc:DateTime" />
-    <opc:Field Name="LastMethodCall" TypeName="opc:String" />
-    <opc:Field Name="LastMethodSessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="NoOfLastMethodInputArguments" TypeName="opc:Int32" />
-    <opc:Field Name="LastMethodInputArguments" TypeName="tns:Argument" LengthField="NoOfLastMethodInputArguments" />
-    <opc:Field Name="NoOfLastMethodOutputArguments" TypeName="opc:Int32" />
-    <opc:Field Name="LastMethodOutputArguments" TypeName="tns:Argument" LengthField="NoOfLastMethodOutputArguments" />
-    <opc:Field Name="LastMethodCallTime" TypeName="opc:DateTime" />
-    <opc:Field Name="LastMethodReturnStatus" TypeName="tns:StatusResult" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="ProgramDiagnostic2DataType" BaseType="ua:ExtensionObject">
-    <opc:Field Name="CreateSessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="CreateClientName" TypeName="opc:String" />
-    <opc:Field Name="InvocationCreationTime" TypeName="opc:DateTime" />
-    <opc:Field Name="LastTransitionTime" TypeName="opc:DateTime" />
-    <opc:Field Name="LastMethodCall" TypeName="opc:String" />
-    <opc:Field Name="LastMethodSessionId" TypeName="ua:NodeId" />
-    <opc:Field Name="NoOfLastMethodInputArguments" TypeName="opc:Int32" />
-    <opc:Field Name="LastMethodInputArguments" TypeName="tns:Argument" LengthField="NoOfLastMethodInputArguments" />
-    <opc:Field Name="NoOfLastMethodOutputArguments" TypeName="opc:Int32" />
-    <opc:Field Name="LastMethodOutputArguments" TypeName="tns:Argument" LengthField="NoOfLastMethodOutputArguments" />
-    <opc:Field Name="NoOfLastMethodInputValues" TypeName="opc:Int32" />
-    <opc:Field Name="LastMethodInputValues" TypeName="ua:Variant" LengthField="NoOfLastMethodInputValues" />
-    <opc:Field Name="NoOfLastMethodOutputValues" TypeName="opc:Int32" />
-    <opc:Field Name="LastMethodOutputValues" TypeName="ua:Variant" LengthField="NoOfLastMethodOutputValues" />
-    <opc:Field Name="LastMethodCallTime" TypeName="opc:DateTime" />
-    <opc:Field Name="LastMethodReturnStatus" TypeName="tns:StatusResult" />
-  </opc:StructuredType>
-
-  <opc:StructuredType Name="Annotation" BaseType="ua:ExtensionObject">
-    <opc:Field Name="Message" TypeName="opc:String" />
-    <opc:Field Name="UserName" TypeName="opc:String" />
-    <opc:Field Name="AnnotationTime" TypeName="opc:DateTime" />
-  </opc:StructuredType>
-
-  <opc:EnumeratedType Name="ExceptionDeviationFormat" LengthInBits="32">
-    <opc:EnumeratedValue Name="AbsoluteValue" Value="0" />
-    <opc:EnumeratedValue Name="PercentOfValue" Value="1" />
-    <opc:EnumeratedValue Name="PercentOfRange" Value="2" />
-    <opc:EnumeratedValue Name="PercentOfEURange" Value="3" />
-    <opc:EnumeratedValue Name="Unknown" Value="4" />
-  </opc:EnumeratedType>
-
-</opc:TypeDictionary>
diff --git a/ext/open62541/tools/schema/StatusCode.csv b/ext/open62541/tools/schema/StatusCode.csv
deleted file mode 100644
index 350b96e..0000000
--- a/ext/open62541/tools/schema/StatusCode.csv
+++ /dev/null
@@ -1,235 +0,0 @@
-BadUnexpectedError,0x80010000,An unexpected error occurred.
-BadInternalError,0x80020000,An internal error occurred as a result of a programming or configuration error.
-BadOutOfMemory,0x80030000,Not enough memory to complete the operation.
-BadResourceUnavailable,0x80040000,An operating system resource is not available.
-BadCommunicationError,0x80050000,A low level communication error occurred.
-BadEncodingError,0x80060000,Encoding halted because of invalid data in the objects being serialized.
-BadDecodingError,0x80070000,Decoding halted because of invalid data in the stream.
-BadEncodingLimitsExceeded,0x80080000,The message encoding/decoding limits imposed by the stack have been exceeded.
-BadRequestTooLarge,0x80B80000,The request message size exceeds limits set by the server.
-BadResponseTooLarge,0x80B90000,The response message size exceeds limits set by the client.
-BadUnknownResponse,0x80090000,An unrecognized response was received from the server.
-BadTimeout,0x800A0000,The operation timed out.
-BadServiceUnsupported,0x800B0000,The server does not support the requested service.
-BadShutdown,0x800C0000,The operation was cancelled because the application is shutting down.
-BadServerNotConnected,0x800D0000,The operation could not complete because the client is not connected to the server.
-BadServerHalted,0x800E0000,The server has stopped and cannot process any requests.
-BadNothingToDo,0x800F0000,There was nothing to do because the client passed a list of operations with no elements.
-BadTooManyOperations,0x80100000,The request could not be processed because it specified too many operations.
-BadTooManyMonitoredItems,0x80DB0000,The request could not be processed because there are too many monitored items in the subscription.
-BadDataTypeIdUnknown,0x80110000,The extension object cannot be (de)serialized because the data type id is not recognized.
-BadCertificateInvalid,0x80120000,The certificate provided as a parameter is not valid.
-BadSecurityChecksFailed,0x80130000,An error occurred verifying security.
-BadCertificatePolicyCheckFailed,0x81140000,The certificate does not meet the requirements of the security policy.
-BadCertificateTimeInvalid,0x80140000,The certificate has expired or is not yet valid.
-BadCertificateIssuerTimeInvalid,0x80150000,An issuer certificate has expired or is not yet valid.
-BadCertificateHostNameInvalid,0x80160000,The HostName used to connect to a server does not match a HostName in the certificate.
-BadCertificateUriInvalid,0x80170000,The URI specified in the ApplicationDescription does not match the URI in the certificate.
-BadCertificateUseNotAllowed,0x80180000,The certificate may not be used for the requested operation.
-BadCertificateIssuerUseNotAllowed,0x80190000,The issuer certificate may not be used for the requested operation.
-BadCertificateUntrusted,0x801A0000,The certificate is not trusted.
-BadCertificateRevocationUnknown,0x801B0000,It was not possible to determine if the certificate has been revoked.
-BadCertificateIssuerRevocationUnknown,0x801C0000,It was not possible to determine if the issuer certificate has been revoked.
-BadCertificateRevoked,0x801D0000,The certificate has been revoked.
-BadCertificateIssuerRevoked,0x801E0000,The issuer certificate has been revoked.
-BadCertificateChainIncomplete,0x810D0000,The certificate chain is incomplete.
-BadUserAccessDenied,0x801F0000,User does not have permission to perform the requested operation.
-BadIdentityTokenInvalid,0x80200000,The user identity token is not valid.
-BadIdentityTokenRejected,0x80210000,The user identity token is valid but the server has rejected it.
-BadSecureChannelIdInvalid,0x80220000,The specified secure channel is no longer valid.
-BadInvalidTimestamp,0x80230000,The timestamp is outside the range allowed by the server.
-BadNonceInvalid,0x80240000,The nonce does appear to be not a random value or it is not the correct length.
-BadSessionIdInvalid,0x80250000,The session id is not valid.
-BadSessionClosed,0x80260000,The session was closed by the client.
-BadSessionNotActivated,0x80270000,The session cannot be used because ActivateSession has not been called.
-BadSubscriptionIdInvalid,0x80280000,The subscription id is not valid.
-BadRequestHeaderInvalid,0x802A0000,The header for the request is missing or invalid.
-BadTimestampsToReturnInvalid,0x802B0000,The timestamps to return parameter is invalid.
-BadRequestCancelledByClient,0x802C0000,The request was cancelled by the client.
-BadTooManyArguments,0x80E50000,Too many arguments were provided.
-BadLicenseExpired,0x810E0000,The server requires a license to operate in general or to perform a service or operation, but existing license is expired.
-BadLicenseLimitsExceeded,0x810F0000,The server has limits on number of allowed operations / objects, based on installed licenses, and these limits where exceeded.
-BadLicenseNotAvailable,0x81100000,The server does not have a license which is required to operate in general or to perform a service or operation.
-GoodSubscriptionTransferred,0x002D0000,The subscription was transferred to another session.
-GoodCompletesAsynchronously,0x002E0000,The processing will complete asynchronously.
-GoodOverload,0x002F0000,Sampling has slowed down due to resource limitations.
-GoodClamped,0x00300000,The value written was accepted but was clamped.
-BadNoCommunication,0x80310000,Communication with the data source is defined, but not established, and there is no last known value available.
-BadWaitingForInitialData,0x80320000,Waiting for the server to obtain values from the underlying data source.
-BadNodeIdInvalid,0x80330000,The syntax of the node id is not valid.
-BadNodeIdUnknown,0x80340000,The node id refers to a node that does not exist in the server address space.
-BadAttributeIdInvalid,0x80350000,The attribute is not supported for the specified Node.
-BadIndexRangeInvalid,0x80360000,The syntax of the index range parameter is invalid.
-BadIndexRangeNoData,0x80370000,No data exists within the range of indexes specified.
-BadDataEncodingInvalid,0x80380000,The data encoding is invalid.
-BadDataEncodingUnsupported,0x80390000,The server does not support the requested data encoding for the node.
-BadNotReadable,0x803A0000,The access level does not allow reading or subscribing to the Node.
-BadNotWritable,0x803B0000,The access level does not allow writing to the Node.
-BadOutOfRange,0x803C0000,The value was out of range.
-BadNotSupported,0x803D0000,The requested operation is not supported.
-BadNotFound,0x803E0000,A requested item was not found or a search operation ended without success.
-BadObjectDeleted,0x803F0000,The object cannot be used because it has been deleted.
-BadNotImplemented,0x80400000,Requested operation is not implemented.
-BadMonitoringModeInvalid,0x80410000,The monitoring mode is invalid.
-BadMonitoredItemIdInvalid,0x80420000,The monitoring item id does not refer to a valid monitored item.
-BadMonitoredItemFilterInvalid,0x80430000,The monitored item filter parameter is not valid.
-BadMonitoredItemFilterUnsupported,0x80440000,The server does not support the requested monitored item filter.
-BadFilterNotAllowed,0x80450000,A monitoring filter cannot be used in combination with the attribute specified.
-BadStructureMissing,0x80460000,A mandatory structured parameter was missing or null.
-BadEventFilterInvalid,0x80470000,The event filter is not valid.
-BadContentFilterInvalid,0x80480000,The content filter is not valid.
-BadFilterOperatorInvalid,0x80C10000,An unrecognized operator was provided in a filter.
-BadFilterOperatorUnsupported,0x80C20000,A valid operator was provided, but the server does not provide support for this filter operator.
-BadFilterOperandCountMismatch,0x80C30000,The number of operands provided for the filter operator was less then expected for the operand provided.
-BadFilterOperandInvalid,0x80490000,The operand used in a content filter is not valid.
-BadFilterElementInvalid,0x80C40000,The referenced element is not a valid element in the content filter.
-BadFilterLiteralInvalid,0x80C50000,The referenced literal is not a valid value.
-BadContinuationPointInvalid,0x804A0000,The continuation point provide is longer valid.
-BadNoContinuationPoints,0x804B0000,The operation could not be processed because all continuation points have been allocated.
-BadReferenceTypeIdInvalid,0x804C0000,The reference type id does not refer to a valid reference type node.
-BadBrowseDirectionInvalid,0x804D0000,The browse direction is not valid.
-BadNodeNotInView,0x804E0000,The node is not part of the view.
-BadNumericOverflow,0x81120000,The number was not accepted because of a numeric overflow.
-BadServerUriInvalid,0x804F0000,The ServerUri is not a valid URI.
-BadServerNameMissing,0x80500000,No ServerName was specified.
-BadDiscoveryUrlMissing,0x80510000,No DiscoveryUrl was specified.
-BadSempahoreFileMissing,0x80520000,The semaphore file specified by the client is not valid.
-BadRequestTypeInvalid,0x80530000,The security token request type is not valid.
-BadSecurityModeRejected,0x80540000,The security mode does not meet the requirements set by the server.
-BadSecurityPolicyRejected,0x80550000,The security policy does not meet the requirements set by the server.
-BadTooManySessions,0x80560000,The server has reached its maximum number of sessions.
-BadUserSignatureInvalid,0x80570000,The user token signature is missing or invalid.
-BadApplicationSignatureInvalid,0x80580000,The signature generated with the client certificate is missing or invalid.
-BadNoValidCertificates,0x80590000,The client did not provide at least one software certificate that is valid and meets the profile requirements for the server.
-BadIdentityChangeNotSupported,0x80C60000,The server does not support changing the user identity assigned to the session.
-BadRequestCancelledByRequest,0x805A0000,The request was cancelled by the client with the Cancel service.
-BadParentNodeIdInvalid,0x805B0000,The parent node id does not to refer to a valid node.
-BadReferenceNotAllowed,0x805C0000,The reference could not be created because it violates constraints imposed by the data model.
-BadNodeIdRejected,0x805D0000,The requested node id was reject because it was either invalid or server does not allow node ids to be specified by the client.
-BadNodeIdExists,0x805E0000,The requested node id is already used by another node.
-BadNodeClassInvalid,0x805F0000,The node class is not valid.
-BadBrowseNameInvalid,0x80600000,The browse name is invalid.
-BadBrowseNameDuplicated,0x80610000,The browse name is not unique among nodes that share the same relationship with the parent.
-BadNodeAttributesInvalid,0x80620000,The node attributes are not valid for the node class.
-BadTypeDefinitionInvalid,0x80630000,The type definition node id does not reference an appropriate type node.
-BadSourceNodeIdInvalid,0x80640000,The source node id does not reference a valid node.
-BadTargetNodeIdInvalid,0x80650000,The target node id does not reference a valid node.
-BadDuplicateReferenceNotAllowed,0x80660000,The reference type between the nodes is already defined.
-BadInvalidSelfReference,0x80670000,The server does not allow this type of self reference on this node.
-BadReferenceLocalOnly,0x80680000,The reference type is not valid for a reference to a remote server.
-BadNoDeleteRights,0x80690000,The server will not allow the node to be deleted.
-UncertainReferenceNotDeleted,0x40BC0000,The server was not able to delete all target references.
-BadServerIndexInvalid,0x806A0000,The server index is not valid.
-BadViewIdUnknown,0x806B0000,The view id does not refer to a valid view node.
-BadViewTimestampInvalid,0x80C90000,The view timestamp is not available or not supported.
-BadViewParameterMismatch,0x80CA0000,The view parameters are not consistent with each other.
-BadViewVersionInvalid,0x80CB0000,The view version is not available or not supported.
-UncertainNotAllNodesAvailable,0x40C00000,The list of references may not be complete because the underlying system is not available.
-GoodResultsMayBeIncomplete,0x00BA0000,The server should have followed a reference to a node in a remote server but did not. The result set may be incomplete.
-BadNotTypeDefinition,0x80C80000,The provided Nodeid was not a type definition nodeid.
-UncertainReferenceOutOfServer,0x406C0000,One of the references to follow in the relative path references to a node in the address space in another server.
-BadTooManyMatches,0x806D0000,The requested operation has too many matches to return.
-BadQueryTooComplex,0x806E0000,The requested operation requires too many resources in the server.
-BadNoMatch,0x806F0000,The requested operation has no match to return.
-BadMaxAgeInvalid,0x80700000,The max age parameter is invalid.
-BadSecurityModeInsufficient,0x80E60000,The operation is not permitted over the current secure channel.
-BadHistoryOperationInvalid,0x80710000,The history details parameter is not valid.
-BadHistoryOperationUnsupported,0x80720000,The server does not support the requested operation.
-BadInvalidTimestampArgument,0x80BD0000,The defined timestamp to return was invalid.
-BadWriteNotSupported,0x80730000,The server does not support writing the combination of value, status and timestamps provided.
-BadTypeMismatch,0x80740000,The value supplied for the attribute is not of the same type as the attribute's value.
-BadMethodInvalid,0x80750000,The method id does not refer to a method for the specified object.
-BadArgumentsMissing,0x80760000,The client did not specify all of the input arguments for the method.
-BadNotExecutable,0x81110000,The executable attribute does not allow the execution of the method.
-BadTooManySubscriptions,0x80770000,The server has reached its maximum number of subscriptions.
-BadTooManyPublishRequests,0x80780000,The server has reached the maximum number of queued publish requests.
-BadNoSubscription,0x80790000,There is no subscription available for this session.
-BadSequenceNumberUnknown,0x807A0000,The sequence number is unknown to the server.
-BadMessageNotAvailable,0x807B0000,The requested notification message is no longer available.
-BadInsufficientClientProfile,0x807C0000,The client of the current session does not support one or more Profiles that are necessary for the subscription.
-BadStateNotActive,0x80BF0000,The sub-state machine is not currently active.
-BadAlreadyExists,0x81150000,An equivalent rule already exists.
-BadTcpServerTooBusy,0x807D0000,The server cannot process the request because it is too busy.
-BadTcpMessageTypeInvalid,0x807E0000,The type of the message specified in the header invalid.
-BadTcpSecureChannelUnknown,0x807F0000,The SecureChannelId and/or TokenId are not currently in use.
-BadTcpMessageTooLarge,0x80800000,The size of the message specified in the header is too large.
-BadTcpNotEnoughResources,0x80810000,There are not enough resources to process the request.
-BadTcpInternalError,0x80820000,An internal error occurred.
-BadTcpEndpointUrlInvalid,0x80830000,The server does not recognize the QueryString specified.
-BadRequestInterrupted,0x80840000,The request could not be sent because of a network interruption.
-BadRequestTimeout,0x80850000,Timeout occurred while processing the request.
-BadSecureChannelClosed,0x80860000,The secure channel has been closed.
-BadSecureChannelTokenUnknown,0x80870000,The token has expired or is not recognized.
-BadSequenceNumberInvalid,0x80880000,The sequence number is not valid.
-BadProtocolVersionUnsupported,0x80BE0000,The applications do not have compatible protocol versions.
-BadConfigurationError,0x80890000,There is a problem with the configuration that affects the usefulness of the value.
-BadNotConnected,0x808A0000,The variable should receive its value from another variable, but has never been configured to do so.
-BadDeviceFailure,0x808B0000,There has been a failure in the device/data source that generates the value that has affected the value.
-BadSensorFailure,0x808C0000,There has been a failure in the sensor from which the value is derived by the device/data source.
-BadOutOfService,0x808D0000,The source of the data is not operational.
-BadDeadbandFilterInvalid,0x808E0000,The deadband filter is not valid.
-UncertainNoCommunicationLastUsableValue,0x408F0000,Communication to the data source has failed. The variable value is the last value that had a good quality.
-UncertainLastUsableValue,0x40900000,Whatever was updating this value has stopped doing so.
-UncertainSubstituteValue,0x40910000,The value is an operational value that was manually overwritten.
-UncertainInitialValue,0x40920000,The value is an initial value for a variable that normally receives its value from another variable.
-UncertainSensorNotAccurate,0x40930000,The value is at one of the sensor limits.
-UncertainEngineeringUnitsExceeded,0x40940000,The value is outside of the range of values defined for this parameter.
-UncertainSubNormal,0x40950000,The value is derived from multiple sources and has less than the required number of Good sources.
-GoodLocalOverride,0x00960000,The value has been overridden.
-BadRefreshInProgress,0x80970000,This Condition refresh failed, a Condition refresh operation is already in progress.
-BadConditionAlreadyDisabled,0x80980000,This condition has already been disabled.
-BadConditionAlreadyEnabled,0x80CC0000,This condition has already been enabled.
-BadConditionDisabled,0x80990000,Property not available, this condition is disabled.
-BadEventIdUnknown,0x809A0000,The specified event id is not recognized.
-BadEventNotAcknowledgeable,0x80BB0000,The event cannot be acknowledged.
-BadDialogNotActive,0x80CD0000,The dialog condition is not active.
-BadDialogResponseInvalid,0x80CE0000,The response is not valid for the dialog.
-BadConditionBranchAlreadyAcked,0x80CF0000,The condition branch has already been acknowledged.
-BadConditionBranchAlreadyConfirmed,0x80D00000,The condition branch has already been confirmed.
-BadConditionAlreadyShelved,0x80D10000,The condition has already been shelved.
-BadConditionNotShelved,0x80D20000,The condition is not currently shelved.
-BadShelvingTimeOutOfRange,0x80D30000,The shelving time not within an acceptable range.
-BadNoData,0x809B0000,No data exists for the requested time range or event filter.
-BadBoundNotFound,0x80D70000,No data found to provide upper or lower bound value.
-BadBoundNotSupported,0x80D80000,The server cannot retrieve a bound for the variable.
-BadDataLost,0x809D0000,Data is missing due to collection started/stopped/lost.
-BadDataUnavailable,0x809E0000,Expected data is unavailable for the requested time range due to an un-mounted volume, an off-line archive or tape, or similar reason for temporary unavailability.
-BadEntryExists,0x809F0000,The data or event was not successfully inserted because a matching entry exists.
-BadNoEntryExists,0x80A00000,The data or event was not successfully updated because no matching entry exists.
-BadTimestampNotSupported,0x80A10000,The client requested history using a timestamp format the server does not support (i.e requested ServerTimestamp when server only supports SourceTimestamp).
-GoodEntryInserted,0x00A20000,The data or event was successfully inserted into the historical database.
-GoodEntryReplaced,0x00A30000,The data or event field was successfully replaced in the historical database.
-UncertainDataSubNormal,0x40A40000,The value is derived from multiple values and has less than the required number of Good values.
-GoodNoData,0x00A50000,No data exists for the requested time range or event filter.
-GoodMoreData,0x00A60000,The data or event field was successfully replaced in the historical database.
-BadAggregateListMismatch,0x80D40000,The requested number of Aggregates does not match the requested number of NodeIds.
-BadAggregateNotSupported,0x80D50000,The requested Aggregate is not support by the server.
-BadAggregateInvalidInputs,0x80D60000,The aggregate value could not be derived due to invalid data inputs.
-BadAggregateConfigurationRejected,0x80DA0000,The aggregate configuration is not valid for specified node.
-GoodDataIgnored,0x00D90000,The request specifies fields which are not valid for the EventType or cannot be saved by the historian.
-BadRequestNotAllowed,0x80E40000,The request was rejected by the server because it did not meet the criteria set by the server.
-BadRequestNotComplete,0x81130000,The request has not been processed by the server yet.
-GoodEdited,0x00DC0000,The value does not come from the real source and has been edited by the server.
-GoodPostActionFailed,0x00DD0000,There was an error in execution of these post-actions.
-UncertainDominantValueChanged,0x40DE0000,The related EngineeringUnit has been changed but the Variable Value is still provided based on the previous unit.
-GoodDependentValueChanged,0x00E00000,A dependent value has been changed but the change has not been applied to the device.
-BadDominantValueChanged,0x80E10000,The related EngineeringUnit has been changed but this change has not been applied to the device. The Variable Value is still dependent on the previous unit but its status is currently Bad.
-UncertainDependentValueChanged,0x40E20000,A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is uncertain.
-BadDependentValueChanged,0x80E30000,A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is Bad.
-GoodCommunicationEvent,0x00A70000,The communication layer has raised an event.
-GoodShutdownEvent,0x00A80000,The system is shutting down.
-GoodCallAgain,0x00A90000,The operation is not finished and needs to be called again.
-GoodNonCriticalTimeout,0x00AA0000,A non-critical timeout occurred.
-BadInvalidArgument,0x80AB0000,One or more arguments are invalid.
-BadConnectionRejected,0x80AC0000,Could not establish a network connection to remote server.
-BadDisconnect,0x80AD0000,The server has disconnected from the client.
-BadConnectionClosed,0x80AE0000,The network connection has been closed.
-BadInvalidState,0x80AF0000,The operation cannot be completed because the object is closed, uninitialized or in some other invalid state.
-BadEndOfStream,0x80B00000,Cannot move beyond end of the stream.
-BadNoDataAvailable,0x80B10000,No data is currently available for reading from a non-blocking stream.
-BadWaitingForResponse,0x80B20000,The asynchronous operation is waiting for a response.
-BadOperationAbandoned,0x80B30000,The asynchronous operation was abandoned by the caller.
-BadExpectedStreamToBlock,0x80B40000,The stream did not return all data requested (possibly because it is a non-blocking stream).
-BadWouldBlock,0x80B50000,Non blocking behaviour is required and the operation would block.
-BadSyntaxError,0x80B60000,A value had an invalid syntax.
-BadMaxConnectionsReached,0x80B70000,The operation could not be finished because all available connections are in use.
\ No newline at end of file
diff --git a/ext/open62541/tools/schema/datatypes_dataaccess.txt b/ext/open62541/tools/schema/datatypes_dataaccess.txt
deleted file mode 100644
index 31c0b78..0000000
--- a/ext/open62541/tools/schema/datatypes_dataaccess.txt
+++ /dev/null
@@ -1 +0,0 @@
-Range
diff --git a/ext/open62541/tools/schema/datatypes_discovery.txt b/ext/open62541/tools/schema/datatypes_discovery.txt
deleted file mode 100644
index 348561e..0000000
--- a/ext/open62541/tools/schema/datatypes_discovery.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-ServerOnNetwork
-FindServersOnNetworkRequest
-FindServersOnNetworkResponse
-RegisteredServer
-RegisterServerRequest
-RegisterServerResponse
-DiscoveryConfiguration
-MdnsDiscoveryConfiguration
-RegisterServer2Request
-RegisterServer2Response
diff --git a/ext/open62541/tools/schema/datatypes_events.txt b/ext/open62541/tools/schema/datatypes_events.txt
deleted file mode 100644
index 4ffa4bf..0000000
--- a/ext/open62541/tools/schema/datatypes_events.txt
+++ /dev/null
@@ -1 +0,0 @@
-TimeZoneDataType
diff --git a/ext/open62541/tools/schema/datatypes_historizing.txt b/ext/open62541/tools/schema/datatypes_historizing.txt
deleted file mode 100644
index 9344d8b..0000000
--- a/ext/open62541/tools/schema/datatypes_historizing.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-HistoryReadRequest
-HistoryReadResponse
-HistoryReadResult
-HistoryReadValueId
-ReadEventDetails
-ReadRawModifiedDetails
-ReadProcessedDetails
-ReadAtTimeDetails
-HistoryData
-HistoryModifiedData
-HistoryUpdateType
-ModificationInfo
-HistoryEvent
-HistoryEventFieldList
-HistoryUpdateRequest
-HistoryUpdateResponse
-HistoryUpdateResult
-UpdateDataDetails
-DeleteRawModifiedDetails
-PerformUpdateType
diff --git a/ext/open62541/tools/schema/datatypes_method.txt b/ext/open62541/tools/schema/datatypes_method.txt
deleted file mode 100644
index 7a461d1..0000000
--- a/ext/open62541/tools/schema/datatypes_method.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-CallMethodRequest
-CallMethodResult
-CallResponse
-CallRequest
-Argument
diff --git a/ext/open62541/tools/schema/datatypes_minimal.txt b/ext/open62541/tools/schema/datatypes_minimal.txt
deleted file mode 100644
index 73fa33c..0000000
--- a/ext/open62541/tools/schema/datatypes_minimal.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-Boolean
-SByte
-Byte
-Int16
-UInt16
-Int32
-UInt32
-Int64
-UInt64
-Float
-Double
-String
-DateTime
-Guid
-ByteString
-XmlElement
-NodeId
-ExpandedNodeId
-StatusCode
-QualifiedName
-LocalizedText
-ExtensionObject
-DataValue
-Variant
-DiagnosticInfo
-NodeClass
-ApplicationDescription
-ApplicationType
-ChannelSecurityToken
-OpenSecureChannelRequest
-OpenSecureChannelResponse
-CloseSecureChannelRequest
-CloseSecureChannelResponse
-RequestHeader
-ResponseHeader
-SecurityTokenRequestType
-MessageSecurityMode
-CloseSessionResponse
-CloseSessionRequest
-ActivateSessionRequest
-ActivateSessionResponse
-SignatureData
-SignedSoftwareCertificate
-ServiceFault
-UserIdentityToken
-UserNameIdentityToken
-AnonymousIdentityToken
-X509IdentityToken
-IssuedIdentityToken
-CreateSessionResponse
-CreateSessionRequest
-EndpointDescription
-UserTokenPolicy
-UserTokenType
-GetEndpointsRequest
-GetEndpointsResponse
-FindServersRequest
-FindServersResponse
-TimestampsToReturn
-ReadRequest
-ReadResponse
-ReadValueId
-WriteRequest
-WriteResponse
-WriteValue
-TranslateBrowsePathsToNodeIdsRequest
-TranslateBrowsePathsToNodeIdsResponse
-BrowseResultMask
-BrowsePath
-BrowsePathResult
-BrowsePathTarget
-RelativePath
-RelativePathElement
-BrowseResponse
-BrowseResult
-ReferenceDescription
-ViewDescription
-BrowseRequest
-BrowseNextRequest
-BrowseNextResponse
-BrowseDescription
-BrowseDirection
-AddNodesRequest
-AddNodesResponse
-AddNodesItem
-AddNodesResult
-AddReferencesRequest
-AddReferencesResponse
-AddReferencesItem
-NodeAttributes
-VariableAttributes
-ObjectAttributes
-ReferenceTypeAttributes
-ViewAttributes
-MethodAttributes
-ObjectTypeAttributes
-VariableTypeAttributes
-DataTypeAttributes
-NodeAttributesMask
-DeleteNodesItem
-DeleteNodesRequest
-DeleteNodesResponse
-DeleteReferencesItem
-DeleteReferencesRequest
-DeleteReferencesResponse
-RegisterNodesRequest
-RegisterNodesResponse
-UnregisterNodesRequest
-UnregisterNodesResponse
-Duration
-UtcTime
-LocaleId
-EnumValueType
-BuildInfo
-ServerStatusDataType
-ServerState
-ServerDiagnosticsSummaryDataType
-RedundancySupport
diff --git a/ext/open62541/tools/schema/datatypes_pubsub.txt b/ext/open62541/tools/schema/datatypes_pubsub.txt
deleted file mode 100644
index aa1d66f..0000000
--- a/ext/open62541/tools/schema/datatypes_pubsub.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-KeyValuePair
-DataSetMetaDataType
-ConfigurationVersionDataType
-UadpDataSetWriterMessageDataType
-UadpWriterGroupMessageDataType
-UadpDataSetMessageContentMask
-UadpNetworkMessageContentMask
-NetworkAddressUrlDataType
-PublishedVariableDataType
-DataSetOrderingType
-DataSetFieldContentMask
-StructureDefinition
-StructureDescription
-StructureType
-StructureField
-EnumField
-EnumDefinition
-EnumDescription
-SimpleTypeDescription
-DataSetFieldFlags
-FieldMetaData
-PubSubConnectionDataType
-WriterGroupDataType
-ReaderGroupDataType
-DataSetWriterDataType
-DataSetReaderDataType
-PubSubState
-JsonDataSetWriterMessageDataType
-JsonDataSetMessageContentMask
-JsonNetworkMessageContentMask
-BrokerTransportQualityOfService
-BrokerConnectionTransportDataType
-BrokerWriterGroupTransportDataType
-BrokerDataSetWriterTransportDataType
-BrokerWriterGroupTransportType
-UadpDataSetReaderMessageDataType
-TargetVariablesDataType
-FieldTargetDataType
-OverrideValueHandling
\ No newline at end of file
diff --git a/ext/open62541/tools/schema/datatypes_query.txt b/ext/open62541/tools/schema/datatypes_query.txt
deleted file mode 100644
index 42282a8..0000000
--- a/ext/open62541/tools/schema/datatypes_query.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-ParsingResult
-NodeTypeDescription
-QueryDataDescription
-QueryDataSet
-QueryFirstRequest
-QueryFirstResponse
-QueryNextRequest
-QueryNextResponse
diff --git a/ext/open62541/tools/schema/datatypes_subscriptions.txt b/ext/open62541/tools/schema/datatypes_subscriptions.txt
deleted file mode 100644
index f43dda4..0000000
--- a/ext/open62541/tools/schema/datatypes_subscriptions.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-SubscriptionAcknowledgement
-FilterOperator
-ContentFilterElement
-ContentFilter
-ContentFilterElementResult
-ContentFilterResult
-EventFilterResult
-DeadbandType
-AggregateConfiguration
-AggregateFilter
-MonitoringMode
-MonitoringParameters
-CreateMonitoredItemsRequest
-MonitoredItemCreateRequest
-MonitoredItemCreateResult
-CreateMonitoredItemsResponse
-MonitoredItemModifyRequest
-ModifyMonitoredItemsRequest
-MonitoredItemModifyResult
-ModifyMonitoredItemsResponse
-SetMonitoringModeRequest
-SetMonitoringModeResponse
-DataChangeTrigger
-SetTriggeringRequest
-SetTriggeringResponse
-DeleteMonitoredItemsRequest
-DeleteMonitoredItemsResponse
-CreateSubscriptionRequest
-CreateSubscriptionResponse
-ModifySubscriptionRequest
-ModifySubscriptionResponse
-SetPublishingModeRequest
-SetPublishingModeResponse
-DataChangeFilter
-EventFilter
-FilterOperand
-ElementOperand
-LiteralOperand
-AttributeOperand
-SimpleAttributeOperand
-EventNotificationList
-EventFieldList
-DataChangeNotification
-NotificationMessage
-MonitoredItemNotification
-StatusChangeNotification
-PublishRequest
-PublishResponse
-RepublishRequest
-RepublishResponse
-DeleteSubscriptionsRequest
-DeleteSubscriptionsResponse
diff --git a/ext/open62541/tools/schema/datatypes_transport.txt b/ext/open62541/tools/schema/datatypes_transport.txt
deleted file mode 100644
index 399add9..0000000
--- a/ext/open62541/tools/schema/datatypes_transport.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-MessageType
-ChunkType
-TcpMessageHeader
-TcpHelloMessage
-TcpAcknowledgeMessage
-TcpErrorMessage
-SecureConversationMessageHeader
-AsymmetricAlgorithmSecurityHeader
-SymmetricAlgorithmSecurityHeader
-SequenceHeader
-SecureConversationMessageFooter
-SecureConversationMessageAbortBody
diff --git a/ext/open62541/tools/schema/datatypes_typedescription.txt b/ext/open62541/tools/schema/datatypes_typedescription.txt
deleted file mode 100644
index d6535a1..0000000
--- a/ext/open62541/tools/schema/datatypes_typedescription.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-StructureDefinition
-StructureField
-StructureType
\ No newline at end of file
diff --git a/ext/open62541/tools/travis/travis_linux_after_success.sh b/ext/open62541/tools/travis/travis_linux_after_success.sh
deleted file mode 100644
index 7de72ea..0000000
--- a/ext/open62541/tools/travis/travis_linux_after_success.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-set -e
-
-# We only want to push the docs once, so we just take the travis run where MINGW=true which is only enabled once
-if [ "$MINGW" = "true" ] && [ "${TRAVIS_REPO_SLUG}" = "open62541/open62541" ] && [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
-    echo "=== Executing after_success scripts ==="
-    # List branches where the doc should be pushed to the webpage
-    if [ "${TRAVIS_BRANCH}" = "master" ] || [ "${TRAVIS_BRANCH}" = "0.3" ] || [ "${TRAVIS_BRANCH}" = "1.0" ]; then
-        sh ./tools/travis/travis_push_doc.sh
-    fi
-    sh ./tools/travis/travis_push_release.sh;
-else
-    echo "=== Not in the main repository or not the main build; Skip release scripts ==="
-    exit 0;
-fi
diff --git a/ext/open62541/tools/travis/travis_linux_before_install.sh b/ext/open62541/tools/travis/travis_linux_before_install.sh
deleted file mode 100644
index 29ed699..0000000
--- a/ext/open62541/tools/travis/travis_linux_before_install.sh
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/bash
-set -e
-
-if [ -z ${LOCAL_PKG+x} ] || [ -z "$LOCAL_PKG" ]; then
-    echo "LOCAL_PKG is not set. Aborting..."
-    exit 1
-fi
-
-if ! [ -z ${CLANG_FORMAT+x} ]; then
-    echo "CLANG_FORMAT does not need any dependencies. Done."
-    exit 0
-fi
-
-if [ -z ${DOCKER+x} ] && [ -z ${SONAR+x} ]; then
-	# Only on non-docker builds required
-
- 	echo "=== Installing from external package sources in $LOCAL_PKG ===" && echo -en 'travis_fold:start:before_install.external\\r'
-
-   # Increase the environment version to force a rebuild of the packages
-    # The version is writen to the cache file after every build of the dependencies
-    ENV_VERSION="1"
-    ENV_INSTALLED=""
-    if [ -e $LOCAL_PKG/.build_env ]; then
-        echo "=== No cached build environment ==="
-        read -r ENV_INSTALLED < $LOCAL_PKG/.build_env
-    fi
-
-    # travis caches the $LOCAL_PKG dir. If it is loaded, we don't need to reinstall the packages
-    if [ "$ENV_VERSION" = "$ENV_INSTALLED" ]; then
-        echo "=== The build environment is current ==="
-        exit 0
-    fi
-
-    echo "=== The build environment is outdated ==="
-
-    # Clean up
-    # additional safety measure to avoid rm -rf on root
-    # only execute it on travis
-    if ! [ -z ${TRAVIS+x} ]; then
-        echo "rm -rf $LOCAL_PKG/*"
-    fi
-
-	if [ "$CC" = "tcc" ]; then
-		mkdir tcc_install && cd tcc_install
-		wget https://mirror.netcologne.de/savannah/tinycc/tcc-0.9.27.tar.bz2
-		tar xf tcc-0.9.27.tar.bz2
-		cd tcc-0.9.27
-		./configure --prefix=$LOCAL_PKG
-		make
-		make install
-		cd ../..
-		rm -rf tcc_install
-	fi
-
-	wget https://github.com/ARMmbed/mbedtls/archive/mbedtls-2.7.1.tar.gz
-	tar xf mbedtls-2.7.1.tar.gz
-	cd mbedtls-mbedtls-2.7.1
-	cmake -DENABLE_TESTING=Off -DCMAKE_INSTALL_PREFIX=$LOCAL_PKG .
-	make -j
-	make install
-
-	echo -en 'travis_fold:end:script.before_install.external\\r'
-
-	echo "=== Installing python packages ===" && echo -en 'travis_fold:start:before_install.python\\r'
-	pip install --user cpp-coveralls
-	# Pin docutils to version smaller 0.15. Otherwise we run into https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=839299
-	pip install --user 'docutils<=0.14'
-	pip install --user sphinx_rtd_theme
-	pip install --user cpplint
-	echo -en 'travis_fold:end:script.before_install.python\\r'
-
-fi
diff --git a/ext/open62541/tools/travis/travis_linux_script.sh b/ext/open62541/tools/travis/travis_linux_script.sh
deleted file mode 100644
index b9709b8..0000000
--- a/ext/open62541/tools/travis/travis_linux_script.sh
+++ /dev/null
@@ -1,560 +0,0 @@
-#!/bin/bash
-set -e
-
-
-# Sonar code quality
-if ! [ -z ${SONAR+x} ]; then
-    if ([ "${TRAVIS_REPO_SLUG}" != "open62541/open62541" ] ||
-        [ "${TRAVIS_PULL_REQUEST}" != "false" ] ||
-        [ "${TRAVIS_BRANCH}" != "master" ]); then
-        echo "Skipping Sonarcloud on forks"
-        # Skip on forks
-        exit 0;
-    fi
-	mkdir -p build && cd build
-	build-wrapper-linux-x86-64 --out-dir ../bw-output cmake \
-        -DCMAKE_BUILD_TYPE=Debug \
-        -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-	    -DUA_BUILD_EXAMPLES=ON \
-        -DUA_ENABLE_DISCOVERY=ON \
-        -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
-        -DUA_ENABLE_ENCRYPTION .. \
-    && make -j
-	cd ..
-	sonar-scanner
-	exit 0
-fi
-
-# Docker build test
-if ! [ -z ${DOCKER+x} ]; then
-    docker build -t open62541 .
-    docker run -d -p 127.0.0.1:4840:4840 --name open62541 open62541 /bin/sh
-    docker ps | grep -q open62541
-    # disabled since it randomly fails
-    # docker ps | grep -q open62541
-    exit 0
-fi
-
-# Cpplint checking
-if ! [ -z ${LINT+x} ]; then
-    mkdir -p build
-    cd build
-    cmake ..
-    make cpplint
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    exit 0
-fi
-
-# Fuzzer build test
-if ! [ -z ${FUZZER+x} ]; then
-    # First check if the build is successful
-    ./tests/fuzz/check_build.sh
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-
-
-    # Test the corpus generator and use new corpus for fuzz test
-    ./tests/fuzz/generate_corpus.sh
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-
-    cd build_fuzz
-    make && make run_fuzzer
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    exit 0
-fi
-
-# INSTALL build test
-if ! [ -z ${INSTALL+x} ]; then
-echo "=== Install build, then compile examples ===" && echo -en 'travis_fold:start:script.build.install\\r'
-    # Use make install to deploy files and then test if we can build the examples based on the installed files
-    mkdir -p build
-    cd build
-    cmake \
-        -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-        -DBUILD_SHARED_LIBS=ON \
-        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-        -DUA_NAMESPACE_ZERO=FULL \
-        -DUA_ENABLE_AMALGAMATION=OFF \
-        -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/open62541_install ..
-    make -j install
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-
-    cd .. && rm build -rf
-    echo -en 'travis_fold:end:script.build.install\\r'
-
-    echo -en 'travis_fold:start:script.build.mini-example\\r'
-    # Now create a simple CMake Project which uses the installed file
-    mkdir compile
-    cp -r examples compile/examples && cd compile/examples
-    cmake \
-        -DCMAKE_PREFIX_PATH=$TRAVIS_BUILD_DIR/open62541_install \
-        -DUA_NAMESPACE_ZERO=FULL .
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd ../..
-    rm -rf compile
-    echo -en 'travis_fold:end:script.build.mini-example\\r'
-    exit 0
-fi
-
-if ! [ -z ${CLANG_FORMAT+x} ]; then
-
-    # Only run clang format on Pull requests, not on direct push
-    if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
-        echo -en "\\nSkipping clang-format on non-pull request\\n"
-        exit 0
-    fi
-
-    echo "=== Running clang-format with diff against branch '$TRAVIS_BRANCH' ===" && echo -en 'travis_fold:start:script.clang-format\\r'
-
-    # add clang-format-ci
-    curl -Ls "https://raw.githubusercontent.com/llvm-mirror/clang/c510fac5695e904b43d5bf0feee31cc9550f110e/tools/clang-format/git-clang-format" -o "$LOCAL_PKG/bin/git-clang-format"
-    chmod +x $LOCAL_PKG/bin/git-clang-format
-
-    # Ignore files in the deps directory diff by resetting them to master
-    git diff --name-only $TRAVIS_BRANCH | grep 'deps/*' | xargs git checkout $TRAVIS_BRANCH --
-
-    # clang-format the diff to the target branch of the PR
-    difference="$($LOCAL_PKG/bin/git-clang-format --style=file --diff $TRAVIS_BRANCH)"
-
-    if ! case $difference in *"no modified files to format"*) false;; esac; then
-        echo "====== clang-format did not find any issues. Well done! ======"
-        exit 0
-    fi
-    if ! case $difference in *"clang-format did not modify any files"*) false;; esac; then
-        echo "====== clang-format did not find any issues. Well done! ======"
-        exit 0
-    fi
-
-    echo "====== clang-format Format Errors ======"
-
-    echo "Uploading the patch to a pastebin page ..."
-    pastebinUrl="$($LOCAL_PKG/bin/git-clang-format --style=file --diff $TRAVIS_BRANCH | curl -F 'sprunge=<-' http://sprunge.us)"
-
-    echo "Created a patch file under: $pastebinUrl"
-
-    echo "Please fix the following issues.\n\n"
-    echo "You can also use the following command to apply the diff to your source locally:\n-------------\n"
-    echo "curl -o format.patch $pastebinUrl && git apply format.patch\n-------------\n"
-    echo "=============== DIFFERENCE - START =================\n"
-    # We want to get colored diff output into the variable
-    git config color.diff always
-    $LOCAL_PKG/bin/git-clang-format --binary=clang-format-6.0 --style=file --diff $TRAVIS_BRANCH
-    echo "\n============= DIFFERENCE - END ===================="
-
-    echo -en 'travis_fold:start:script.clang-format\\r'
-    exit 1
-fi
-
-if ! [ -z ${ANALYZE+x} ]; then
-    echo "=== Running static code analysis ===" && echo -en 'travis_fold:start:script.analyze\\r'
-    if ! case $CC in clang*) false;; esac; then
-        mkdir -p build
-        cd build
-        scan-build-6.0 cmake \
-            -DUA_BUILD_EXAMPLES=ON \
-            -DUA_BUILD_UNIT_TESTS=ON ..
-        scan-build-6.0 -enable-checker security.FloatLoopCounter \
-          -enable-checker security.insecureAPI.UncheckedReturn \
-          --status-bugs -v \
-          make -j
-        cd .. && rm build -rf
-
-        mkdir -p build
-        cd build
-        scan-build-6.0 cmake \
-            -DUA_ENABLE_PUBSUB=ON \
-            -DUA_ENABLE_PUBSUB_DELTAFRAMES=ON \
-            -DUA_ENABLE_PUBSUB_INFORMATIONMODEL=ON ..
-        scan-build-6.0 -enable-checker security.FloatLoopCounter \
-          -enable-checker security.insecureAPI.UncheckedReturn \
-          --status-bugs -v \
-          make -j
-        cd .. && rm build -rf
-
-        mkdir -p build
-        cd build
-        scan-build-6.0 cmake \
-            -DUA_ENABLE_AMALGAMATION=OFF ..
-        scan-build-6.0 -enable-checker security.FloatLoopCounter \
-          -enable-checker security.insecureAPI.UncheckedReturn \
-          --status-bugs -v \
-          make -j
-        cd .. && rm build -rf
-
-        #mkdir -p build && cd build
-        #cmake -DUA_ENABLE_STATIC_ANALYZER=REDUCED ..
-        ## previous clang-format to reduce to non-trivial warnings
-        #make clangformat
-        #make
-        #cd .. && rm build -rf
-    else
-        cppcheck --template "{file}({line}): {severity} ({id}): {message}" \
-            --enable=style --force --std=c++11 -j 8 \
-            --suppress=duplicateBranch \
-            --suppress=incorrectStringBooleanError \
-            --suppress=invalidscanf --inline-suppr \
-            -I include src plugins examples 2> cppcheck.txt
-        if [ -s cppcheck.txt ]; then
-            echo "====== CPPCHECK Static Analysis Errors ======"
-            cat cppcheck.txt
-            # flush output
-            sleep 5
-            exit 1
-        fi
-    fi
-    echo -en 'travis_fold:end:script.analyze\\r'
-    exit 0
-fi
-
-echo -en "\r\n=== Building ===\r\n"
-
-echo -e "\r\n== Documentation build =="  && echo -en 'travis_fold:start:script.build.doc\\r'
-mkdir -p build
-cd build
-cmake \
-    -DCMAKE_BUILD_TYPE=Release \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON ..
-make doc
-make doc_pdf
-cp -r doc ../../
-cp -r doc_latex ../../
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.doc\\r'
-
-# cross compilation only with gcc
-if ! [ -z ${MINGW+x} ]; then
-    echo -e "\r\n== Cross compile release build for MinGW 32 bit =="  && echo -en 'travis_fold:start:script.build.cross_mingw32\\r'
-    mkdir -p build && cd build
-    cmake \
-        -DBUILD_SHARED_LIBS=ON \
-        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-        -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-win32 \
-        -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-mingw32.cmake \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_ENABLE_AMALGAMATION=OFF ..
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    make install
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd ..
-    zip -r open62541-win32.zip ../doc_latex/open62541.pdf LICENSE AUTHORS README.md open62541-win32/*
-    rm build -rf
-    echo -en 'travis_fold:end:script.build.cross_mingw32\\r'
-
-    echo -e "\r\n== Cross compile release build for MinGW 64 bit =="  && echo -en 'travis_fold:start:script.build.cross_mingw64\\r'
-    mkdir -p build && cd build
-    cmake \
-        -DBUILD_SHARED_LIBS=ON \
-        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-        -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-win64 \
-        -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-mingw64.cmake \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_ENABLE_AMALGAMATION=OFF ..
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    make install
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd ..
-    zip -r open62541-win64.zip ../doc_latex/open62541.pdf LICENSE AUTHORS README.md open62541-win64/*
-    rm build -rf
-    echo -en 'travis_fold:end:script.build.cross_mingw64\\r'
-
-    echo -e "\r\n== Cross compile release build for 32-bit linux =="  && echo -en 'travis_fold:start:script.build.cross_linux\\r'
-    mkdir -p build && cd build
-    cmake \
-        -DBUILD_SHARED_LIBS=ON \
-        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-        -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-linux32 \
-        -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-gcc-m32.cmake \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_ENABLE_AMALGAMATION=OFF ..
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    make install
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd ..
-    tar -pczf open62541-linux32.tar.gz ../doc_latex/open62541.pdf LICENSE AUTHORS README.md open62541-linux32/*
-    rm build -rf
-    echo -en 'travis_fold:end:script.build.cross_linux\\r'
-
-    echo -e "\r\n== Cross compile release build for RaspberryPi =="  && echo -en 'travis_fold:start:script.build.cross_raspi\\r'
-    mkdir -p build && cd build
-    git clone https://github.com/raspberrypi/tools
-    export PATH=$PATH:${TRAVIS_BUILD_DIR}/build/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/
-    cmake \
-        -DBUILD_SHARED_LIBS=ON \
-        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-        -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-raspberrypi \
-        -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-rpi64.cmake \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_ENABLE_AMALGAMATION=OFF ..
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    make install
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd ..
-    tar -pczf open62541-raspberrypi.tar.gz ../doc_latex/open62541.pdf LICENSE AUTHORS README.md open62541-raspberrypi/*
-    rm build -rf
-    echo -en 'travis_fold:end:script.build.cross_raspi\\r'
-fi
-
-echo -e "\r\n== Compile release build for 64-bit linux =="  && echo -en 'travis_fold:start:script.build.linux_64\\r'
-mkdir -p build && cd build
-cmake \
-    -DBUILD_SHARED_LIBS=ON \
-    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-    -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-linux64 \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_ENABLE_AMALGAMATION=OFF ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-make install
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd ..
-tar -pczf open62541-linux64.tar.gz ../doc_latex/open62541.pdf LICENSE AUTHORS README.md open62541-linux64/*
-rm build -rf
-echo -en 'travis_fold:end:script.build.linux_64\\r'
-
-echo -e "\r\n== Compile with amalgamation =="  && echo -en 'travis_fold:start:script.build.amalgamate\\r'
-mkdir -p build && cd build
-cmake \
-    -DBUILD_SHARED_LIBS=ON \
-    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-    -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-linux64 \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=OFF \
-    -DUA_ENABLE_AMALGAMATION=ON \
-    -DUA_ENABLE_HISTORIZING=ON  ..
-make -j
-cp open62541.h ../.. # copy single file-release
-cp open62541.c ../.. # copy single file-release
-gcc -std=c99 -c open62541.c
-g++ ../examples/server.cpp -I./ open62541.o -lrt -o cpp-server
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.amalgamate\\r'
-
-echo "Compile as shared lib version" && echo -en 'travis_fold:start:script.build.shared_libs\\r'
-mkdir -p build && cd build
-cmake \
-    -DBUILD_SHARED_LIBS=ON \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_ENABLE_AMALGAMATION=OFF ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.shared_libs\\r'
-
-if [ "$CC" != "tcc" ]; then
-    echo -e "\r\n==Compile multithreaded version==" && echo -en 'travis_fold:start:script.build.multithread\\r'
-    mkdir -p build && cd build
-    cmake \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_MULTITHREADING=200 ..
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd .. && rm build -rf
-    echo -en 'travis_fold:end:script.build.multithread\\r'
-fi
-
-echo -e "\r\n== Compile with encryption ==" && echo -en 'travis_fold:start:script.build.encryption\\r'
-mkdir -p build && cd build
-cmake \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_ENABLE_ENCRYPTION=ON ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.encryption\\r'
-
-echo -e "\r\n== Compile without discovery version ==" && echo -en 'travis_fold:start:script.build.discovery\\r'
-mkdir -p build && cd build
-cmake \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_ENABLE_DISCOVERY=OFF \
-    -DUA_ENABLE_DISCOVERY_MULTICAST=OFF ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.discovery\\r'
-
-if [ "$CC" != "tcc" ]; then
-    echo -e "\r\n== Compile multithreaded version with discovery ==" && echo -en 'travis_fold:start:script.build.multithread_discovery\\r'
-    mkdir -p build && cd build
-    cmake \
-        -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_ENABLE_DISCOVERY=ON \
-        -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
-        -DUA_MULTITHREADING=200 ..
-    make -j
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd .. && rm build -rf
-    echo -en 'travis_fold:end:script.build.multithread_discovery\\r'
-fi
-
-echo -e "\r\n== Compile JSON encoding ==" && echo -en 'travis_fold:start:script.build.json\\r'
-mkdir -p build && cd build
-cmake \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_ENABLE_JSON_ENCODING=ON ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.json\\r'
-
-echo -e "\r\n== Unit tests (full NS0) ==" && echo -en 'travis_fold:start:script.build.unit_test_ns0_full\\r'
-mkdir -p build && cd build
-# Valgrind cannot handle the full NS0 because the generated file is too big. Thus run NS0 full without valgrind
-cmake \
-    -DCMAKE_BUILD_TYPE=Debug \
-    -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_BUILD_UNIT_TESTS=ON \
-    -DUA_ENABLE_COVERAGE=OFF \
-    -DUA_ENABLE_DA=ON \
-    -DUA_ENABLE_DISCOVERY=ON \
-    -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
-    -DUA_ENABLE_ENCRYPTION=ON \
-    -DUA_ENABLE_JSON_ENCODING=ON \
-    -DUA_ENABLE_PUBSUB=ON \
-    -DUA_ENABLE_PUBSUB_DELTAFRAMES=ON \
-    -DUA_ENABLE_PUBSUB_INFORMATIONMODEL=ON \
-    -DUA_ENABLE_SUBSCRIPTIONS=ON \
-    -DUA_ENABLE_SUBSCRIPTIONS_EVENTS=ON \
-    -DUA_ENABLE_UNIT_TESTS_MEMCHECK=OFF \
-    -DUA_NAMESPACE_ZERO=FULL ..
-make -j && make test ARGS="-V"
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm build -rf
-echo -en 'travis_fold:end:script.build.unit_test_ns0_full\\r'
-
-if ! [ -z ${DEBIAN+x} ]; then
-    echo -e "\r\n== Building the Debian package =="  && echo -en 'travis_fold:start:script.build.debian\\r'
-    /usr/bin/$PYTHON ./tools/prepare_packaging.py
-    echo -e "\r\n --- New debian changelog content ---"
-    echo "--------------------------------------"
-    cat ./debian/changelog
-    echo "--------------------------------------"
-    # Create a backup copy. We need the clean debian directory for later packaging
-    cp -r debian debian_bak
-    dpkg-buildpackage -b
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    rm -rf debian
-    mv debian_bak debian
-    cp ../libopen62541*.deb .
-    # Copy for github release script
-    cp ../libopen62541*.deb ../..
-    echo -en 'travis_fold:end:script.build.debian\\r'
-fi
-
-
-if [ "$CC" != "tcc" ]; then
-    echo -e "\r\n== Unit tests (minimal NS0) ==" && echo -en 'travis_fold:start:script.build.unit_test_ns0_minimal\\r'
-    mkdir -p build && cd build
-    cmake \
-        -DCMAKE_BUILD_TYPE=Debug \
-        -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_BUILD_UNIT_TESTS=ON \
-        -DUA_ENABLE_COVERAGE=ON \
-        -DUA_ENABLE_DA=ON \
-        -DUA_ENABLE_DISCOVERY=ON \
-        -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
-        -DUA_ENABLE_ENCRYPTION=ON \
-        -DUA_ENABLE_JSON_ENCODING=ON \
-        -DUA_ENABLE_PUBSUB=ON \
-        -DUA_ENABLE_PUBSUB_DELTAFRAMES=ON \
-        -DUA_ENABLE_PUBSUB_INFORMATIONMODEL=OFF \
-        -DUA_ENABLE_UNIT_TESTS_MEMCHECK=ON \
-        -DUA_NAMESPACE_ZERO=MINIMAL ..
-    make -j && make test ARGS="-V"
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    cd .. && rm build -rf
-    echo -en 'travis_fold:end:script.build.unit_test_ns0_minimal\\r'
-
-    echo -e "\r\n== Unit tests (reduced NS0) ==" && echo -en 'travis_fold:start:script.build.unit_test_ns0_reduced\\r'
-    mkdir -p build && cd build
-    cmake \
-        -DCMAKE_BUILD_TYPE=Debug \
-        -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/$PYTHON \
-        -DUA_BUILD_EXAMPLES=ON \
-        -DUA_BUILD_UNIT_TESTS=ON \
-        -DUA_ENABLE_COVERAGE=ON \
-        -DUA_ENABLE_DA=ON \
-        -DUA_ENABLE_DISCOVERY=ON \
-        -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
-        -DUA_ENABLE_ENCRYPTION=ON \
-        -DUA_ENABLE_JSON_ENCODING=ON \
-        -DUA_ENABLE_PUBSUB=ON \
-        -DUA_ENABLE_PUBSUB_DELTAFRAMES=ON \
-        -DUA_ENABLE_PUBSUB_INFORMATIONMODEL=ON \
-        -DUA_ENABLE_UNIT_TESTS_MEMCHECK=ON \
-        -DUA_NAMESPACE_ZERO=REDUCED ..
-    make -j && make test ARGS="-V"
-    if [ $? -ne 0 ] ; then exit 1 ; fi
-    echo -en 'travis_fold:end:script.build.unit_test_ns0_reduced\\r'
-
-    # only run coveralls on main repo and when MINGW=true
-    # We only want to build coveralls once, so we just take the travis run where MINGW=true which is only enabled once
-    echo -e "\r\n== -> Current repo: ${TRAVIS_REPO_SLUG} =="
-    if [ $MINGW = "true" ] && [ "${TRAVIS_REPO_SLUG}" = "open62541/open62541" ]; then
-        echo -en "\r\n==   Building codecov.io for ${TRAVIS_REPO_SLUG} ==" && echo -en 'travis_fold:start:script.build.codecov\\r'
-        cd ..
-        /bin/bash -c "bash <(curl -s https://codecov.io/bash)"
-        if [ $? -ne 0 ] ; then exit 1 ; fi
-        cd build
-        echo -en 'travis_fold:end:script.build.codecov\\r'
-
-        echo -en "\r\n==   Building coveralls for ${TRAVIS_REPO_SLUG} ==" && echo -en 'travis_fold:start:script.build.coveralls\\r'
-        coveralls -E '.*/build/CMakeFiles/.*' -E '.*/examples/.*' -E '.*/tests/.*' -E '.*\.h' -E '.*CMakeCXXCompilerId\.cpp' -E '.*CMakeCCompilerId\.c' -r ../ || true # ignore result since coveralls is unreachable from time to time
-        cd .. && rm build -rf
-        echo -en 'travis_fold:end:script.build.coveralls\\r'
-
-		if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
-			REAL_BRANCH="${TRAVIS_BRANCH}"
-       		echo -en "== Checking branch for packing: BRANCH_FOR_TAG='$BRANCH_FOR_TAG' and TRAVIS_TAG='${TRAVIS_TAG}'. \n"
-			if [ "${TRAVIS_TAG}" = "${TRAVIS_BRANCH}" ]; then
-				REAL_BRANCH="$BRANCH_FOR_TAG"
-        		echo -en "== Commit is tag build for '${TRAVIS_TAG}'. Detected branch for tag = '$BRANCH_FOR_TAG' \n"
-			fi
-
-			if [ "${REAL_BRANCH}" = "master" ] || [ "${REAL_BRANCH}" = "1.0" ]; then
-				# Create a separate branch with the `pack/` prefix. This branch has the correct debian/changelog set, and
-				# The submodules are directly copied
-				echo -e "\r\n== Pushing 'pack/${REAL_BRANCH}' branch =="  && echo -en 'travis_fold:start:script.build.pack-branch\\r'
-
-				git checkout -b pack-tmp/${REAL_BRANCH}
-				cp -r deps/mdnsd deps/mdnsd_back
-				cp -r deps/ua-nodeset deps/ua-nodeset_back
-				git rm -rf --cached deps/mdnsd
-				git rm -rf --cached deps/ua-nodeset
-				mv deps/mdnsd_back deps/mdnsd
-				rm -rf deps/mdnsd/.git
-				mv deps/ua-nodeset_back deps/ua-nodeset
-				rm -rf deps/ua-nodeset/.git
-				rm -rf .gitmodules
-				git add deps/*
-				git add debian/*
-				git add CMakeLists.txt
-				git commit -m "[ci skip] Pack with inline submodules"
-				git remote add origin-auth https://$GITAUTH@github.com/${TRAVIS_REPO_SLUG}
-				git push -uf origin-auth pack-tmp/${REAL_BRANCH}:pack/${REAL_BRANCH}
-
-				echo -en 'travis_fold:end:script.build.pack-branch\\r'
-			else
-				echo -en "== Skipping push to pack/ because branch does not match: REAL_BRANCH='${REAL_BRANCH}' \n"
-			fi
-        else
-        	echo -en "== Skipping push to pack/ because TRAVIS_PULL_REQUEST=false \n"
-        fi
-
-
-    fi
-fi
diff --git a/ext/open62541/tools/travis/travis_osx_before_install.sh b/ext/open62541/tools/travis/travis_osx_before_install.sh
deleted file mode 100644
index a326e75..0000000
--- a/ext/open62541/tools/travis/travis_osx_before_install.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-set -e
-
-brew install check
-brew install --HEAD valgrind
-brew install graphviz
-brew install python
-brew install mbedtls
diff --git a/ext/open62541/tools/travis/travis_osx_script.sh b/ext/open62541/tools/travis/travis_osx_script.sh
deleted file mode 100644
index 0e31181..0000000
--- a/ext/open62541/tools/travis/travis_osx_script.sh
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/bash
-set -e
-
-echo "\n=== Building ==="
-export OPENSSL_ROOT_DIR="/usr/local/opt/openssl"
-export PATH="/Users/travis/Library/Python/2.7/bin:$PATH"
-
-# OSX may have different hostnames between processes, which causes multicast unit test to fail.
-# Hardcode the hostname here
-# Note: do not use the `hostname` addon from travis:
-# addons:
-#  hostname: travis-osx
-#
-# Travis support says:
-# the `hostname` command is actually a super ephemeral way to change it. There’s a different way:
-# `sudo scutil --set HostName <new host name>` which is more permanent and potentially more resilient
-sudo scutil --set HostName travis-osx
-
-echo "Full Namespace 0 Generation" && echo -en 'travis_fold:start:script.build.ns0\\r'
-mkdir -p build
-cd build
-cmake \
-    -DCMAKE_BUILD_TYPE=Debug \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_NAMESPACE_ZERO=FULL ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm -rf build
-echo -en 'travis_fold:end:script.build.ns0\\r'
-
-echo "Compile release build for OS X" && echo -en 'travis_fold:start:script.build.osx\\r'
-mkdir -p build && cd build
-cmake \
-    -DCMAKE_BUILD_TYPE=Release \
-    -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/open62541-osx \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_ENABLE_AMALGAMATION=OFF ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-make install
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd ..
-tar -pczf open62541-osx.tar.gz LICENSE AUTHORS README.md ${TRAVIS_BUILD_DIR}/open62541-osx/*
-rm -rf build
-echo -en 'travis_fold:end:script.build.osx\\r'
-
-echo "Compile multithreaded version" && echo -en 'travis_fold:start:script.build.multithread\\r'
-mkdir -p build && cd build
-cmake \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_MULTITHREADING=200 ..
-make -j
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm -rf build
-echo -en 'travis_fold:end:script.build.multithread\\r'
-
-echo "Debug build and unit tests with valgrind" && echo -en 'travis_fold:start:script.build.unit_test\\r'
-mkdir -p build && cd build
-cmake \
-    -DCHECK_PREFIX=/usr/local/Cellar/check/0.11.0 \
-    -DCMAKE_BUILD_TYPE=Debug \
-    -DUA_BUILD_EXAMPLES=ON \
-    -DUA_BUILD_UNIT_TESTS=ON \
-    -DUA_ENABLE_COVERAGE=OFF \
-    -DUA_ENABLE_DISCOVERY=ON \
-    -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
-    -DUA_ENABLE_ENCRYPTION=ON \
-    -DUA_ENABLE_UNIT_TESTS_MEMCHECK=OFF ..
-make -j && make test ARGS="-V"
-if [ $? -ne 0 ] ; then exit 1 ; fi
-cd .. && rm -rf build
-echo -en 'travis_fold:end:script.build.unit_test\\r'
diff --git a/ext/open62541/tools/travis/travis_push_doc.sh b/ext/open62541/tools/travis/travis_push_doc.sh
deleted file mode 100644
index 2986b7f..0000000
--- a/ext/open62541/tools/travis/travis_push_doc.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-set -e
-
-# This script will only be executed on branches which are either master or a release
-# See travis_linux_after_success.sh
-
-# The encrypted key is not available in pull requests from forks
-if [ -z "$GITAUTH" ]; then
-    exit 0
-fi
-
-git clone --depth=5 -b gh-pages https://$GITAUTH@github.com/open62541/open62541-www
-cd open62541-www
-
-target_dir="${TRAVIS_BRANCH}"
-
-if [ "${TRAVIS_BRANCH}" = "master" ]; then
-    target_dir="current"
-fi
-
-echo "=== Pushing doc for ${target_dir} ==="
-
-rm -r -f ./doc/${target_dir} || true # ignore result
-mkdir ./doc/${target_dir} || true # ignore result
-cp -r ../../doc/* ./doc/${target_dir}/
-cp -r ../../doc_latex/open62541.pdf ./doc/open62541-${target_dir}.pdf
-git add -A ./doc
-git config --global user.email "open62541-travis-ci@users.noreply.github.com"
-git config --global user.name "Open62541 travis-ci"
-git config --global push.default simple
-git commit -am "updated generated documentation on webpage by travis-ci [ci skip]"
-git push https://$GITAUTH@github.com/open62541/open62541-www
-
-cd .. && rm -rf open62541-www
diff --git a/ext/open62541/tools/travis/travis_push_release.sh b/ext/open62541/tools/travis/travis_push_release.sh
deleted file mode 100644
index debcbcb..0000000
--- a/ext/open62541/tools/travis/travis_push_release.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-set -e
-
-TAGSTOSAVE=50
-TAG="$(git rev-parse --short=10 HEAD)"
-BRANCH="$(git log --pretty=format:"%d" --date=iso --abbrev=10 --all -1)"
-DATE="$(git log --pretty=format:"%ad" --date=iso --abbrev=10 --all -1)"
-COMMENT="$(git log --pretty=format:"%s" --date=iso --abbrev=10 --all -1)"
-
-# The encrypted key is not available in pull requests from forks
-if [ -z "$GITAUTH" ]; then
-    exit 0
-fi
-
-git clone --depth=5 -b gh-pages https://$GITAUTH@github.com/open62541/open62541-www
-cd open62541-www
-
-if [ ! -e "releases/$TAG.zip" ]; then
-    cd releases
-    #add the first line
-    echo "<tr><td><a href='./$TAG.zip'>$TAG</a></td><td>$BRANCH</td><td>$DATE</td><td>$COMMENT</td></tr>" | cat - rawtable.txt > temp && mv temp rawtable.txt
-
-    #keep top lines only
-    head "-$TAGSTOSAVE" rawtable.txt > temp && mv temp rawtable.txt
-
-    #compose the index file
-    cat head.txt rawtable.txt foot.txt > index.html
-
-    #create a zip for single-file release and copy the files
-    cp ../../../open62541.c .
-    cp ../../../open62541.h .
-    cp ../../../doc_latex/open62541.pdf .
-    cp ./../../README.md .
-    cp ./../../LICENSE .
-    cp ./../../AUTHORS .
-    cp ./../../libopen62541*.deb .
-
-    zip -r "$TAG.zip" open62541.c open62541.h open62541.pdf README.md LICENSE AUTHORS open62541*.deb
-    rm open62541.c
-    rm open62541.h
-    rm open62541.pdf
-    rm README.md
-    rm LICENSE
-    rm AUTHORS
-    rm libopen62541*.deb
-    git add "$TAG.zip"
-
-    echo "$TAG.zip" | cat - raw.txt > temp && mv temp raw.txt
-
-    LINETOSTART=$((TAGSTOSAVE+1))
-    #remove obsolete zips
-    tail -n +"$LINETOSTART" raw.txt | xargs git rm --ignore-unmatch
-
-    #remove obsolete zips from list
-    head "-$TAGSTOSAVE" raw.txt > temp && mv temp raw.txt
-
-    # quit releases
-    cd ..
-
-    git config --global user.email "open62541-travis-ci@users.noreply.github.com"
-    git config --global user.name "Open62541 travis-ci"
-    git config --global push.default simple
-    git commit --allow-empty -am "added release files and updated releases webpage by travis-ci [ci skip]"
-    git pull && git push https://$GITAUTH@github.com/open62541/open62541-www
-fi
-
-#quit open62541-www
-cd ..
-rm -rf open62541-www
diff --git a/ext/open62541/tools/ua2json/CMakeLists.txt b/ext/open62541/tools/ua2json/CMakeLists.txt
deleted file mode 100644
index 092e626..0000000
--- a/ext/open62541/tools/ua2json/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-include_directories(${PROJECT_SOURCE_DIR}/src)
-
-add_executable(ua2json ua2json.c)
-target_link_libraries(ua2json open62541 ${open62541_LIBRARIES})
-assign_source_group(ua2json)
-add_dependencies(ua2json open62541-object)
-set_target_properties(ua2json PROPERTIES FOLDER "open62541/tools/ua2json")
-set_target_properties(ua2json PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
diff --git a/ext/open62541/tools/ua2json/README.md b/ext/open62541/tools/ua2json/README.md
deleted file mode 100644
index eabd700..0000000
--- a/ext/open62541/tools/ua2json/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# ua2json
-
-ua2json is a command line tool to translate between OPC UA JSON encoding and OPC
-UA binary encoding. ua2json follows the tradition of shell-based unix-tools and
-provides translation between the binary and JSON encoding formats of OPC UA
-messages as a reusable building block. Input can be piped through ua2json from
-stdin to stdout. File input and output is possible as well.
-
-At the core of the OPC UA protocol lies a type system in which the protocol
-messages are defined. The built-in data types include integers, strings, and so
-on. From these, more complex structures are assembled. For example the
-`ReadRequest` and `ReadResponse` message pair.
-
-## Usage
-
-```
-Usage: ua2json [encode|decode] [-t dataType] [-o outputFile] [inputFile]
-- encode/decode: Translate UA binary input to UA JSON / Translate UA JSON input to UA binary (required)
-- dataType: UA DataType of the input (default: Variant)
-- outputFile: Output target (default: write to stdout)
-- inputFile: Input source (default: read from stdin)
-```
-
-## Examples
-
-Take the following JSON encoding of a Variant data type instance with a 2x4
-matrix of numerical values. Variants can encapsulate scalars and
-multi-dimensional arrays of any data type.
-
-```json
-{
-    "Type": 3,
-    "Body": [1,2,3,4,5,6,7,8],
-    "Dimension": [2, 4]
-}
-```
-
-Piping this JSON-encoding through ua2json (and the xxd tool to print the output
-as hex) yields the binary OPC UA encoding.
-
-```bash
-$ cat variant.json | ua2json decode -t Variant | xxd
-00000000: c308 0000 0001 0203 0405 0607 0802 0000  ................
-00000010: 0002 0000 0004 0000 00                   .........
-```
-
-The inverse transformation returns the original JSON (modulo pretty-printing).
-
-```bash
-$ cat variant.bin | ua2json encode -t Variant
-```
\ No newline at end of file
diff --git a/ext/open62541/tools/ua2json/examples/datavalue.bin b/ext/open62541/tools/ua2json/examples/datavalue.bin
deleted file mode 100644
index bc52609..0000000
--- a/ext/open62541/tools/ua2json/examples/datavalue.bin
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tools/ua2json/examples/datavalue.json b/ext/open62541/tools/ua2json/examples/datavalue.json
deleted file mode 100644
index 2837aad..0000000
--- a/ext/open62541/tools/ua2json/examples/datavalue.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "ServerPicoseconds": 0,
-    "ServerTimestamp": "1970-01-15T06:56:07Z",
-    "SourcePicoseconds": 0,
-    "SourceTimestamp": "1970-01-15T06:56:07Z",
-    "Status": 2153250816,
-    "Value": {
-        "Type": 1,
-        "Body": true
-    }
-}
diff --git a/ext/open62541/tools/ua2json/examples/pubsub.bin b/ext/open62541/tools/ua2json/examples/pubsub.bin
deleted file mode 100644
index feec842..0000000
--- a/ext/open62541/tools/ua2json/examples/pubsub.bin
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tools/ua2json/examples/pubsub.json b/ext/open62541/tools/ua2json/examples/pubsub.json
deleted file mode 100644
index ec0e142..0000000
--- a/ext/open62541/tools/ua2json/examples/pubsub.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-    "MessageId": "1CD777E3-9590-A4E2-6DB6-4BE40EE09EB9",
-    "MessageType": "ua-data",
-    "Messages": [
-        {
-            "DataSetWriterId": 62541,
-            "MetaDataVersion": {
-                "MajorVersion": 1708098706,
-                "MinorVersion": 0
-            },
-            "Timestamp": "2019-01-20T23:33:28.493Z",
-            "Payload": {
-                "": {
-                    "Type": 13,
-                    "Body": "2019-01-20T23:33:28.493Z"
-                }
-            }
-        }
-    ]
-}
diff --git a/ext/open62541/tools/ua2json/examples/readrequest.bin b/ext/open62541/tools/ua2json/examples/readrequest.bin
deleted file mode 100644
index ebd4bfb..0000000
--- a/ext/open62541/tools/ua2json/examples/readrequest.bin
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tools/ua2json/examples/readrequest.json b/ext/open62541/tools/ua2json/examples/readrequest.json
deleted file mode 100644
index cc4b05d..0000000
--- a/ext/open62541/tools/ua2json/examples/readrequest.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "RequestHeader": {
-        "AdditionalHeader": null,
-        "AuditEntryId": null,
-        "AuthenticationToken": {
-            "Id": "D358AA6F-D5C7-4AA9-0CB0-EB0E1491E91E",
-            "IdType": 2,
-            "Namespace": 1
-        },
-        "RequestHandle": 1000059,
-        "ReturnDiagnostics": 0,
-        "TimeoutHint": 5000,
-        "Timestamp": "2019-01-09T21:54:40.179Z"
-    },
-    "TimestampsToReturn": 1,
-    "MaxAge": 0,
-    "NodesToRead": [
-        {
-            "AttributeId": 13,
-            "DataEncoding": {
-                "Name": null
-            },
-            "IndexRange": null,
-            "NodeId": {"Id": 2259}
-        }
-    ]
-}
diff --git a/ext/open62541/tools/ua2json/examples/variant.bin b/ext/open62541/tools/ua2json/examples/variant.bin
deleted file mode 100644
index 021b276..0000000
--- a/ext/open62541/tools/ua2json/examples/variant.bin
+++ /dev/null
Binary files differ
diff --git a/ext/open62541/tools/ua2json/examples/variant.json b/ext/open62541/tools/ua2json/examples/variant.json
deleted file mode 100644
index d35b9bf..0000000
--- a/ext/open62541/tools/ua2json/examples/variant.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "Type": 3,
-    "Body": [1,2,3,4,5,6,7,8],
-    "Dimension": [2, 4]
-}
diff --git a/ext/open62541/tools/ua2json/ua2json.c b/ext/open62541/tools/ua2json/ua2json.c
deleted file mode 100644
index a1effe7..0000000
--- a/ext/open62541/tools/ua2json/ua2json.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
- *
- *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
- */
-
-/* Enable POSIX features */
-#if !defined(_XOPEN_SOURCE)
-# define _XOPEN_SOURCE 600
-#endif
-#ifndef _DEFAULT_SOURCE
-# define _DEFAULT_SOURCE
-#endif
-/* On older systems we need to define _BSD_SOURCE.
- * _DEFAULT_SOURCE is an alias for that. */
-#ifndef _BSD_SOURCE
-# define _BSD_SOURCE
-#endif
-
-#include <open62541/types.h>
-
-#include <stdio.h>
-
-/* Internal headers */
-#include <open62541/types_generated.h>
-#include <open62541/types_generated_handling.h>
-
-#include "ua_pubsub_networkmessage.h"
-#include "ua_types_encoding_binary.h"
-#include "ua_types_encoding_json.h"
-
-static UA_StatusCode
-encode(const UA_ByteString *buf, UA_ByteString *out,
-       const UA_DataType *type) {
-    void *data = malloc(type->memSize);
-    if(!data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    size_t offset = 0;
-    UA_StatusCode retval = UA_decodeBinary(buf, &offset, data, type, NULL);
-    if(retval != UA_STATUSCODE_GOOD) {
-        free(data);
-        return retval;
-    }
-    if(offset != buf->length) {
-        UA_delete(data, type);
-        fprintf(stderr, "Input buffer not completely read\n");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    size_t jsonLength = UA_calcSizeJson(data, type, NULL, 0, NULL, 0, true);
-    retval = UA_ByteString_allocBuffer(out, jsonLength);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_delete(data, type);
-        return retval;
-    }
-
-    uint8_t *bufPos = &out->data[0];
-    const uint8_t *bufEnd = &out->data[out->length];
-    retval = UA_encodeJson(data, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-    UA_delete(data, type);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ByteString_deleteMembers(out);
-        return retval;
-    }
-
-    out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-decode(const UA_ByteString *buf, UA_ByteString *out,
-       const UA_DataType *type) {
-    void *data = malloc(type->memSize);
-    if(!data)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-
-    UA_StatusCode retval = UA_decodeJson(buf, data, type);
-    if(retval != UA_STATUSCODE_GOOD) {
-        free(data);
-        return retval;
-    }
-
-    size_t binLength = UA_calcSizeBinary(data, type);
-    retval = UA_ByteString_allocBuffer(out, binLength);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_delete(data, type);
-        return retval;
-    }
-
-    uint8_t *bufPos = &out->data[0];
-    const uint8_t *bufEnd = &out->data[out->length];
-    retval = UA_encodeBinary(data, type, &bufPos, &bufEnd, NULL, NULL);
-    UA_delete(data, type);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ByteString_deleteMembers(out);
-        return retval;
-    }
-
-    out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-#ifdef UA_ENABLE_PUBSUB
-
-static UA_StatusCode
-encodeNetworkMessage(const UA_ByteString *buf, UA_ByteString *out) {
-    size_t offset = 0;
-    UA_NetworkMessage msg;
-    UA_StatusCode retval = UA_NetworkMessage_decodeBinary(buf, &offset, &msg);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    if(offset != buf->length) {
-        UA_NetworkMessage_deleteMembers(&msg);
-        fprintf(stderr, "Input buffer not completely read\n");
-        return UA_STATUSCODE_BADINTERNALERROR;
-    }
-
-    size_t jsonLength = UA_NetworkMessage_calcSizeJson(&msg, NULL, 0, NULL, 0, true);
-    retval = UA_ByteString_allocBuffer(out, jsonLength);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_NetworkMessage_deleteMembers(&msg);
-        return retval;
-    }
-
-    uint8_t *bufPos = &out->data[0];
-    const uint8_t *bufEnd = &out->data[out->length];
-    retval = UA_NetworkMessage_encodeJson(&msg, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
-    UA_NetworkMessage_deleteMembers(&msg);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ByteString_deleteMembers(out);
-        return retval;
-    }
-
-    out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-static UA_StatusCode
-decodeNetworkMessage(const UA_ByteString *buf, UA_ByteString *out) {
-    UA_NetworkMessage msg;
-    UA_StatusCode retval = UA_NetworkMessage_decodeJson(&msg, buf);
-    if(retval != UA_STATUSCODE_GOOD)
-        return retval;
-
-    size_t binLength = UA_NetworkMessage_calcSizeBinary(&msg);
-    retval = UA_ByteString_allocBuffer(out, binLength);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_NetworkMessage_deleteMembers(&msg);
-        return retval;
-    }
-
-    uint8_t *bufPos = &out->data[0];
-    const uint8_t *bufEnd = &out->data[out->length];
-    retval = UA_NetworkMessage_encodeBinary(&msg, &bufPos, bufEnd);
-    UA_NetworkMessage_deleteMembers(&msg);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_ByteString_deleteMembers(out);
-        return retval;
-    }
-
-    out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
-    return UA_STATUSCODE_GOOD;
-}
-
-#endif
-
-static void
-usage(void) {
-    printf("Usage: ua2json [encode|decode] [-t dataType] [-o outputFile] [inputFile]\n"
-           "- encode/decode: Translate UA binary input to UA JSON / "
-             "Translate UA JSON input to UA binary (required)\n"
-           "- dataType: UA DataType of the input (default: Variant)\n"
-           "- outputFile: Output target (default: write to stdout)\n"
-           "- inputFile: Input source (default: read from stdin)\n");
-}
-
-int main(int argc, char **argv) {
-    UA_Boolean encode_option = true;
-    UA_Boolean pubsub = false;
-    const char *datatype_option = "Variant";
-    const char *input_option = NULL;
-    const char *output_option = NULL;
-    UA_ByteString outbuf = UA_BYTESTRING_NULL;
-    UA_ByteString buf = UA_BYTESTRING_NULL;
-    FILE *in = stdin;
-    FILE *out = stdout;
-    int retcode = -1;
-
-    /* Read the command line options */
-    if(argc < 2) {
-        usage();
-        return 0;
-    }
-
-    if(strcmp(argv[1], "encode") == 0) {
-        encode_option = true;
-    } else if(strcmp(argv[1], "decode") == 0) {
-        encode_option = false;
-    } else {
-        fprintf(stderr, "Error: The first argument must be \"encode\" or \"decode\"\n");
-        return -1;
-    }
-        
-    for(int argpos = 2; argpos < argc; argpos++) {
-        if(strcmp(argv[argpos], "--help") == 0) {
-            usage();
-            return 0;
-        }
-
-        if(strcmp(argv[argpos], "-t") == 0) {
-            if(argpos + 1 == argc) {
-                usage();
-                return -1;
-            }
-            argpos++;
-            datatype_option = argv[argpos];
-            continue;
-        }
-
-        if(strcmp(argv[argpos], "-o") == 0) {
-            if(argpos + 1 == argc) {
-                usage();
-                return -1;
-            }
-            argpos++;
-            output_option = argv[argpos];
-            continue;
-        }
-
-        if(argpos + 1 == argc) {
-            input_option = argv[argpos];
-            continue;
-        }
-
-        usage();
-        return -1;
-    }
-
-    /* Find the data type */
-    const UA_DataType *type = NULL;
-    if(strcmp(datatype_option, "PubSub") == 0) {
-        pubsub = true;
-    } else {
-        for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
-            if(strcmp(datatype_option, UA_TYPES[i].typeName) == 0) {
-                type = &UA_TYPES[i];
-                break;
-            }
-        }
-        if(!type) {
-            fprintf(stderr, "Error: Datatype not found\n");
-            return -1;
-        }
-    }
-
-    /* Open files */
-    if(input_option) {
-        in = fopen(input_option, "rb");
-        if(!in) {
-            fprintf(stderr, "Could not open input file %s\n", input_option);
-            goto cleanup;
-        }
-    }
-    if(output_option) {
-        out = fopen(output_option, "wb");
-        if(!out) {
-            fprintf(stderr, "Could not open output file %s\n", output_option);
-            goto cleanup;
-        }
-    }
-
-    /* Read input until EOF */
-    size_t pos = 0;
-    size_t length = 128;
-    while(true) {
-        if(pos >= buf.length) {
-            length = length * 8;
-            UA_Byte *r = (UA_Byte*)realloc(buf.data, length);
-            if(!r) {
-                fprintf(stderr, "Out of memory\n");
-                goto cleanup;
-            }
-            buf.length = length;
-            buf.data = r;
-        }
-
-        ssize_t c = read(fileno(in), &buf.data[pos], length - pos);
-        if(c == 0)
-            break;
-        if(c < 0) {
-            fprintf(stderr, "Reading from input failed\n");
-            goto cleanup;
-        }
-
-        pos += (size_t)c;
-    }
-
-    if(pos == 0) {
-        fprintf(stderr, "No input\n");
-        goto cleanup;
-    }
-    buf.length = pos;
-
-    /* Convert */
-    UA_StatusCode result = UA_STATUSCODE_BADNOTIMPLEMENTED;
-#ifdef UA_ENABLE_PUBSUB
-    if(pubsub && encode_option) {
-        result = encodeNetworkMessage(&buf, &outbuf);
-    } else if(pubsub) {
-        result = decodeNetworkMessage(&buf, &outbuf);
-    } else
-#endif
-    if(encode_option) {
-        result = encode(&buf, &outbuf, type);
-    } else {
-        result = decode(&buf, &outbuf, type);
-    }
-    
-    if(result != UA_STATUSCODE_GOOD) {
-        fprintf(stderr, "Error: Parsing failed with code %s\n",
-                UA_StatusCode_name(result));
-        goto cleanup;
-    }
-
-    /* Print the output and quit */
-    fwrite(outbuf.data, 1, outbuf.length, out);
-    retcode = 0;
-
- cleanup:
-    UA_ByteString_deleteMembers(&buf);
-    UA_ByteString_deleteMembers(&outbuf);
-    if(in != stdin && in)
-        fclose(in);
-    if(out != stdout && out)
-        fclose(out);
-    return retcode;
-}
diff --git a/ext/open62541/tools/update_copyright_header.py b/ext/open62541/tools/update_copyright_header.py
deleted file mode 100644
index a8d950d..0000000
--- a/ext/open62541/tools/update_copyright_header.py
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-# It is based on the idea of http://0pointer.net/blog/projects/copyright.html
-
-import os
-import re
-import io
-import sys
-
-from git import *
-from shutil import move
-
-if sys.version_info[0] >= 3:
-    # strings are already parsed to unicode
-    def unicode(s):
-        return s
-
-
-# Replace the name by another value, i.e. add affiliation or replace user name by full name
-# only use lower case name
-authorFullName = {
-    'staldert': 'Thomas Stalder, Blue Time Concept SA',
-    'mark giraud': 'Mark Giraud, Fraunhofer IOSB',
-    'julius pfrommer': 'Julius Pfrommer, Fraunhofer IOSB',
-    'stefan profanter': 'Stefan Profanter, fortiss GmbH',
-}
-
-# Skip commits with the following authors, since they are not valid names
-# and come from an invalid git config
-skipNames = ['=', 'open62541', 'opcua']
-
-def compactYears(yearList):
-
-    current = None
-    last = None
-    result = []
-
-    for yStr in yearList:
-        y = int(yStr)
-        if last is None:
-            current = y
-            last = y
-            continue
-
-        if y == last + 1:
-            last = y
-            continue
-
-        if last == current:
-            result.append("%i" % last)
-        else:
-            result.append("%i-%i" % (current, last))
-
-        current = y
-        last = y
-
-    if not last is None:
-        if last == current:
-            result.append("%i" % last)
-        else:
-            result.append("%i-%i" % (current, last))
-
-    return ", ".join(result)
-
-fileAuthorStats = dict()
-
-def insertCopyrightAuthors(file, authorsList):
-    copyrightEntries = list()
-    for author in authorsList:
-        copyrightEntries.append(unicode("Copyright {} (c) {}").format(compactYears(author['years']), author['author']))
-
-    copyrightAdded = False
-    commentPattern = re.compile(r"(.*)\*/$")
-
-    tmpName = file + ".new"
-    tempFile = io.open(tmpName, mode="w", encoding="utf-8")
-    with io.open(file, mode="r", encoding="utf-8") as f:
-        for line in f:
-            if copyrightAdded or not commentPattern.match(line):
-                tempFile.write(line)
-            else:
-                tempFile.write(commentPattern.match(line).group(1) + "\n *\n")
-                for e in copyrightEntries:
-                    tempFile.write(unicode(" *    {}\n").format(e))
-                tempFile.write(unicode(" */\n"))
-                copyrightAdded = True
-    tempFile.close()
-    os.unlink(file)
-    move(tmpName, file)
-
-def updateCopyright(repo, file):
-    print("Checking file {}".format(file))
-
-    # Build the info on how many lines every author commited every year
-    relativeFilePath = file[len(repo.working_dir)+1:].replace("\\","/")
-
-    if not relativeFilePath in fileAuthorStats:
-        print("File not found in list: {}".format(relativeFilePath))
-        return
-
-    stats = fileAuthorStats[relativeFilePath]
-
-    # Now create a sorted list and filter out small contributions
-    authorList = list()
-
-    for author in stats:
-        if author in skipNames:
-            continue
-
-        authorYears = list()
-        for year in stats[author]['years']:
-            if stats[author]['years'][year] < 10:
-                # ignore contributions for this year if less than 10 lines changed
-                continue
-            authorYears.append(year)
-        if len(authorYears) == 0:
-            continue
-        authorYears.sort()
-
-        if author.lower() in authorFullName:
-            authorName = authorFullName[author.lower()]
-        else:
-            authorName = author
-
-
-        authorList.append({
-            'author': authorName,
-            'years': authorYears,
-            'first_commit': stats[author]['first_commit']
-        })
-
-    # Sort the authors list first by year, and then by name
-
-    authorListSorted = sorted(authorList, key=lambda a: a['first_commit'])
-    insertCopyrightAuthors(file, authorListSorted)
-
-
-# This is required since some commits use different author names for the same person
-assumeSameAuthor = {
-    'Mark': u'Mark Giraud',
-    'Infinity95': u'Mark Giraud',
-    'janitza-thbe': u'Thomas Bender',
-    'Stasik0': u'Sten Grüner',
-    'Sten': u'Sten Grüner',
-    'Frank Meerkoetter': u'Frank Meerkötter',
-    'ichrispa': u'Chris Iatrou',
-    'Chris Paul Iatrou': u'Chris Iatrou',
-    'Torben-D': u'TorbenD',
-    'FlorianPalm': u'Florian Palm',
-    'ChristianFimmers': u'Christian Fimmers'
-}
-
-def buildFileStats(repo):
-
-    fileRenameMap = dict()
-    renamePattern = re.compile(r"(.*){(.*) => (.*)}(.*)")
-
-    cnt = 0
-    for commit in repo.iter_commits():
-        cnt += 1
-
-    curr = 0
-    for commit in repo.iter_commits():
-        curr += 1
-        print("Checking commit {}/{}  ->   {}".format(curr, cnt, commit.hexsha))
-
-        for objpath, stats in commit.stats.files.items():
-
-            match = renamePattern.match(objpath)
-
-            if match:
-                # the file was renamed, store the rename to follow up later
-                oldFile = (match.group(1) + match.group(2) + match.group(4)).replace("//", "/")
-                newFile = (match.group(1) + match.group(3) + match.group(4)).replace("//", "/")
-
-                while newFile in fileRenameMap:
-                    newFile = fileRenameMap[newFile]
-
-                if oldFile != newFile:
-                    fileRenameMap[oldFile] = newFile
-            else:
-                newFile = fileRenameMap[objpath] if objpath in fileRenameMap else objpath
-
-            if stats['insertions'] > 0:
-                if not newFile in fileAuthorStats:
-                    fileAuthorStats[newFile] = dict()
-
-                authorName = unicode(commit.author.name)
-                if authorName in assumeSameAuthor:
-                    authorName = assumeSameAuthor[authorName]
-
-                if not authorName in fileAuthorStats[newFile]:
-                    fileAuthorStats[newFile][authorName] = {
-                        'years': dict(),
-                        'first_commit': commit.committed_datetime
-                    }
-                elif commit.committed_datetime < fileAuthorStats[newFile][authorName]['first_commit']:
-                    fileAuthorStats[newFile][authorName]['first_commit'] = commit.committed_datetime
-
-                if not commit.committed_datetime.year in fileAuthorStats[newFile][authorName]['years']:
-                    fileAuthorStats[newFile][authorName]['years'][commit.committed_datetime.year] = 0
-
-                fileAuthorStats[newFile][authorName]['years'][commit.committed_datetime.year] += stats['insertions']
-
-
-
-
-def walkFiles(repo, folder, pattern):
-    patternCompiled = re.compile(pattern)
-    for root, subdirs, files in os.walk(folder):
-        for f in files:
-            if patternCompiled.match(f):
-                fname = os.path.join(root,f)
-                updateCopyright(repo, fname)
-
-if __name__ == '__main__':
-    baseDir = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
-    repo = Repo(baseDir)
-    assert not repo.bare
-
-    buildFileStats(repo)
-
-    dirs = ['src', 'plugins', 'include']
-
-    for dir in dirs:
-        walkFiles(repo, os.path.join(baseDir, dir), r"(.*\.c|.*\.h)$")
diff --git a/ext/open62541/tools/valgrind_check_error.py b/ext/open62541/tools/valgrind_check_error.py
deleted file mode 100644
index 5797dbe..0000000
--- a/ext/open62541/tools/valgrind_check_error.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env python
-
-# coding: UTF-8
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# This script checks the valgrind output for errors.
-# The track-fds does not cause an error if there are too many FDs open,
-# therefore we parse the output and fail if there are open FDs
-
-import sys
-import subprocess
-import os.path
-import re
-import os
-
-logfile = sys.argv[1]
-
-valgrind_command = ' '.join('"' + item + '"' for item in sys.argv[2:])
-
-# Execute a command and output its stdout text
-def execute(command):
-
-    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-
-    # Poll process for new output until finished
-    while True:
-        nextline = process.stdout.readline().decode('utf-8')
-        if nextline == '' and process.poll() is not None:
-            break
-        sys.stdout.write(nextline)
-        sys.stdout.flush()
-
-    return process.returncode
-
-ret_code = execute(valgrind_command)
-
-if not os.path.isfile(logfile):
-    print("### PYTHON ERROR: Valgrind logfile does not exist: " + logfile)
-    exit(1)
-
-log_content = ""
-with open(logfile, 'r') as content_file:
-    log_content = content_file.read()
-
-if len(log_content) == 0:
-    print("### PYTHON ERROR: Valgrind logfile is empty: " + logfile)
-    exit(1)
-
-# Remove output of possible bug in OSX
-# --16672-- run: /usr/bin/dsymutil "/Users/travis/build/Pro/open62541/build/bin/tests/check_utils"
-# --16672-- WARNING: unhandled amd64-darwin syscall: unix:464
-# --16672-- You may be able to write your own handler.
-# --16672-- Read the file README_MISSING_SYSCALL_OR_IOCTL.
-# --16672-- Nevertheless we consider this a bug.  Please report
-# --16672-- it at http://valgrind.org/support/bug_reports.html.
-replace_re = re.compile(r"^--(\d+)--\s+run: .*-- it at http://valgrind.org/support/bug_reports.html\.$\n", re.MULTILINE | re.DOTALL)
-log_content = replace_re.sub('', log_content)
-
-# Try to parse the output. Look for the following line:
-# ==17054== FILE DESCRIPTORS: 5 open at exit.
-descriptors_re = re.compile(r".*==(\d+)==\s+FILE DESCRIPTORS: (\d+) open at exit\..*", re.DOTALL)
-m = descriptors_re.match(log_content)
-
-if not m:
-    print("### PYTHON ERROR: File descriptors header not found: " + logfile)
-    print(log_content)
-    exit(1)
-
-log_content = descriptors_re.sub('', log_content)
-
-valgrind_number = m.group(1)
-open_count = int(m.group(2))
-
-# Remove the open file descriptors which are inherited from parent. they look like this:
-#==21343== Open file descriptor 3: /home/user/open62541/build/bin/tests/discovery.log
-#==21343==    <inherited from parent>
-#==21343==
-#==21343== Open file descriptor 2:
-#==21343==    <inherited from parent>
-#==21343==
-#==21343== Open file descriptor 1:
-#==21343==    <inherited from parent>
-#==21343==
-#==21343== Open file descriptor 0: /dev/pts/1
-#==21343==    <inherited from parent>
-
-replace_re = re.compile(r"^=="+str(valgrind_number)+r"==\s+Open file descriptor \d+:\s*[^\s]*$\n^=="+str(valgrind_number)+r"==\s+<inherited from parent>$\n(^=="+str(valgrind_number)+r"==\s+$\n)*", re.MULTILINE)
-log_content = replace_re.sub('', log_content)
-
-# Valgrind detected a memleak if ret_code != 0
-if ret_code != 0:
-    print(log_content)
-    exit(ret_code)
-
-# No issues by valgrind
-if len(log_content) == 0 or log_content.isspace():
-    exit(0)
-
-# There is something fishy in the valgrind output, so error-exit
-print(log_content)
-exit(1)
diff --git a/ext/open62541/tools/valgrind_suppressions.supp b/ext/open62541/tools/valgrind_suppressions.supp
deleted file mode 100644
index 591ffa6..0000000
--- a/ext/open62541/tools/valgrind_suppressions.supp
+++ /dev/null
@@ -1,737 +0,0 @@
-# Probably this: https://bugzilla.redhat.com/show_bug.cgi?id=754026
-{
-   <glibc noai6ai_cached>
-   Memcheck:Free
-   fun:free
-   fun:__libc_freeres
-   fun:_vgnU_freeres
-   fun:__run_exit_handlers
-   fun:exit
-}
-
-
-
-# Custom suppressions added by @Pro
-
-{
-   osx_tmpfile_2
-   Memcheck:Cond
-   ...
-   fun:find_temp_path
-   ...
-   fun:open_tmp_file
-   ...
-}
-{
-   osx_tmpfile_3
-   Memcheck:Value8
-   ...
-   fun:find_temp_path
-   ...
-   fun:open_tmp_file
-   ...
-}
-{
-   osx_tmpfile_4
-   Memcheck:Leak
-   fun:malloc
-   ...
-   fun:find_temp_path
-   ...
-   fun:open_tmp_file
-   ...
-   fun:main
-}
-{
-   osx_leak_1
-   Memcheck:Leak
-   ...
-   fun:map_images_nolock
-   fun:map_images
-   ...
-}
-
-
-
-# Suppressions for Darwin 14.x / Mac OS X 10.10 Yosemite
-
-# Source: https://raw.githubusercontent.com/svn2github/valgrind/master/darwin14.supp
-
-############################################
-## Leaks.  For other stuff see below.
-
-{
-   OSX1010:1-Leak
-   Memcheck:Leak
-   match-leak-kinds: possible
-   fun:malloc_zone_?alloc
-   ...
-   fun:_read_images
-}
-
-#{
-#   OSX1010:2-Leak
-#   Memcheck:Leak
-#   match-leak-kinds: definite
-#   fun:?alloc
-#   ...
-#   fun:_ZN4dyld24initializeMainExecutableEv
-#}
-
-{
-   OSX1010:3-Leak
-   Memcheck:Leak
-   match-leak-kinds: definite
-   fun:malloc_zone_?alloc
-   fun:recursive_mutex_init
-   ...
-   fun:_os_object_init
-   fun:libdispatch_init
-   fun:libSystem_initializer
-   ...
-}
-
-#{
-#   OSX1010:4-Leak
-#   Memcheck:Leak
-#   match-leak-kinds: reachable
-#   fun:malloc_zone_?alloc
-#   ...
-#   fun:dyld_register_image_state_change_handler
-#   ...
-#}
-
-{
-   OSX1010:5-Leak
-   Memcheck:Leak
-   match-leak-kinds: reachable
-   fun:?alloc
-   ...
-   fun:dyld_register_image_state_change_handler
-   ...
-}
-
-{
-   OSX1010:6-Leak
-   Memcheck:Leak
-   match-leak-kinds: reachable
-   fun:malloc_zone_?alloc
-   ...
-   fun:map_images_nolock
-   fun:map_images
-   ...
-}
-
-{
-   OSX1010:7-Leak
-   Memcheck:Leak
-   match-leak-kinds: possible
-   fun:malloc_zone_?alloc
-   ...
-   fun:map_images_nolock
-   fun:map_images
-   ...
-}
-
-#{
-#   OSX1010:8-Leak
-#   Memcheck:Leak
-#   match-leak-kinds: indirect
-#   fun:?alloc
-#   ...
-#   fun:libSystem_initializer
-#   ...
-#}
-
-{
-   OSX1010:9-Leak
-   Memcheck:Leak
-   match-leak-kinds: reachable
-   fun:malloc_zone_?alloc
-   ...
-   fun:libSystem_initializer
-   ...
-}
-
-{
-   OSX1010:10-Leak
-   Memcheck:Leak
-   match-leak-kinds: reachable
-   fun:?alloc
-   ...
-   fun:libSystem_initializer
-   ...
-}
-
-#{
-#   OSX1010:11-Leak
-#   Memcheck:Leak
-#   match-leak-kinds: definite
-#   fun:malloc
-#   fun:currentlocale
-#}
-#
-#{
-#   OSX1010:12-Leak
-#   Memcheck:Leak
-#   match-leak-kinds: possible
-#   fun:malloc
-#   fun:tzsetwall_basic
-#   fun:_st_tzset_basic
-#}
-
-{
-   OSX1010:13-Leak
-   Memcheck:Leak
-   match-leak-kinds: reachable
-   fun:malloc_zone_memalign
-   ...
-   fun:_ZN4dyld24initializeMainExecutableEv
-   ...
-}
-
-############################################
-## Non-leak errors
-
-##{
-##   OSX1010:CoreFoundation-1
-##   Memcheck:Cond
-##   obj:*CoreFoundation.framework*CoreFoundation*
-##   obj:*CoreFoundation.framework*CoreFoundation*
-##   obj:*CoreFoundation.framework*CoreFoundation*
-##}
-
-{
-   OSX1010:CoreFoundation-2
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*libdispatch.dylib*
-   obj:*libdispatch.dylib*
-}
-
-{
-   OSX1010:CoreFoundation-3
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*Foundation.framework*Foundation*
-}
-
-{
-   OSX1010:CoreFoundation-4
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-}
-
-{
-   OSX1010:CoreFoundation-5
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*HIServices.framework*HIServices*
-}
-
-{
-   OSX1010:CoreFoundation-6
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-}
-
-{
-   OSX1010:CoreFoundation-7
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-   obj:*CoreFoundation.framework*CoreFoundation*
-}
-
-{
-   OSX1010:CoreFoundation-8
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*IOKit.framework*IOKit*
-}
-
-{
-   OSX1010:CoreFoundation-9
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*Foundation.framework*Foundation*
-   obj:*AppKit.framework*AppKit*
-}
-
-{
-   OSX1010:CoreFoundation-10
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*HIToolbox.framework*HIToolbox*
-   obj:*HIToolbox.framework*HIToolbox*
-}
-
-{
-   OSX1010:CoreFoundation-11
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*AE.framework*AE*
-   obj:*AE.framework*AE*
-}
-
-{
-   OSX1010:CoreFoundation-12
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*HIToolbox.framework*HIToolbox*
-}
-
-{
-   OSX1010:CoreFoundation-13
-   Memcheck:Cond
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*CoreFoundation.framework*CoreFoundation*
-   obj:*AE.framework*AE*
-}
-
-{
-   OSX1010:AppKit-1
-   Memcheck:Cond
-   obj:*AppKit.framework*AppKit*
-   obj:*AppKit.framework*AppKit*
-   obj:*AppKit.framework*AppKit*
-}
-
-{
-   OSX1010:AppKit-2
-   Memcheck:Cond
-   obj:*AppKit.framework*AppKit*
-   obj:*AppKit.framework*AppKit*
-   obj:*libdispatch.dylib*
-}
-
-#{
-#   OSX1010:AppKit-3
-#   Memcheck:Cond
-#   obj:*AppKit.framework*AppKit*
-#   obj:*libdispatch.dylib*
-#   obj:*libdispatch.dylib*
-#}
-
-##{
-##   OSX1010:AppKit-4
-##   Memcheck:Cond
-##   obj:*AppKit.framework*AppKit*
-##   obj:*AppKit.framework*AppKit*
-##   obj:*CoreFoundation.framework*CoreFoundation*
-##}
-
-{
-   OSX1010:AppKit-5
-   Memcheck:Cond
-   obj:*AppKit.framework*AppKit*
-   obj:*AppKit.framework*AppKit*
-   obj:*Foundation.framework*Foundation*
-}
-
-{
-   OSX1010:AppKit-6
-   Memcheck:Cond
-   obj:*AppKit.framework*AppKit*
-   obj:*Foundation.framework*Foundation*
-   obj:*AppKit.framework*AppKit*
-}
-
-{
-   OSX1010:AppKit-7
-   Memcheck:Cond
-   obj:*AppKit.framework*AppKit*
-   obj:*libdispatch.dylib*
-   obj:*libdispatch.dylib*
-}
-
-{
-   OSX1010:AppKit-8
-   Memcheck:Cond
-   obj:*AppKit.framework*AppKit*
-   obj:*Foundation.framework*Foundation*
-   obj:*Foundation.framework*Foundation*
-}
-
-{
-   OSX1010:ColorSync-1
-   Memcheck:Cond
-   obj:*ColorSync.framework*ColorSync*
-   obj:*ColorSync.framework*ColorSync*
-   obj:*ColorSync.framework*ColorSync*
-}
-
-#{
-#   OSX1010:ColorSync-2
-#   Memcheck:Value8
-#   obj:*ColorSync.framework*ColorSync*
-#   obj:*ColorSync.framework*ColorSync*
-#   obj:*ColorSync.framework*ColorSync*
-#}
-
-{
-   OSX1010:CoreGraphics-1
-   Memcheck:Cond
-   obj:*CoreGraphics.framework*CoreGraphics*
-   obj:*CoreGraphics.framework*CoreGraphics*
-}
-
-#{
-#   OSX1010:CoreGraphics-2
-#   Memcheck:Value8
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#}
-
-{
-   OSX1010:CoreGraphics-3
-   Memcheck:Cond
-   obj:*CoreGraphics.framework*CoreGraphics*
-   obj:*CoreGraphics.framework*libRIP*
-   obj:*CoreGraphics.framework*libRIP*
-}
-
-#{
-#   OSX1010:CoreGraphics-4
-#   Memcheck:Cond
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#   obj:*CoreGraphics.framework*libRIP*
-#}
-
-{
-   OSX1010:CoreGraphics-5
-   Memcheck:Cond
-   obj:*CoreGraphics.framework*CoreGraphics*
-   obj:*libdispatch.dylib*
-   obj:*libdispatch.dylib*
-}
-
-#{
-#   OSX1010:CoreGraphics-6
-#   Memcheck:Cond
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#   obj:*HIToolbox.framework*HIToolbox*
-#}
-
-{
-   OSX1010:HIServices-1
-   Memcheck:Cond
-   obj:*HIServices.framework*HIServices*
-   obj:*HIToolbox.framework*HIToolbox*
-   obj:*HIToolbox.framework*HIToolbox*
-}
-
-{
-   OSX1010:LaunchServices-1
-   Memcheck:Cond
-   obj:*LaunchServices.framework*LaunchServices*
-   obj:*AppKit.framework*AppKit*
-   obj:*AppKit.framework*AppKit*
-}
-
-{
-   OSX1010:LaunchServices-2
-   Memcheck:Cond
-   obj:*LaunchServices.framework*LaunchServices*
-   obj:*libdispatch.dylib*
-   obj:*libdispatch.dylib*
-}
-
-{
-   OSX1010:QuartzCore-1
-   Memcheck:Cond
-   obj:*QuartzCore.framework*QuartzCore
-   obj:*QuartzCore.framework*QuartzCore
-   obj:*QuartzCore.framework*QuartzCore
-}
-
-#{
-#   OSX1010:vImage-1
-#   Memcheck:Cond
-#   obj:*vImage.framework*vImage*
-#   obj:*vImage.framework*vImage*
-#   obj:*CoreGraphics.framework*CoreGraphics*
-#}
-
-{
-   OSX1010:zlib-C
-   Memcheck:Cond
-   obj:/usr/lib/libz.*dylib
-   obj:/usr/lib/libz.*dylib
-}
-
-{
-   OSX1010:zlib-8
-   Memcheck:Value8
-   obj:/usr/lib/libz.*dylib
-   obj:/usr/lib/libz.*dylib
-}
-
-#{
-#   OSX1010:32bit:_libxpc_initializer
-#   Memcheck:Cond
-#   fun:_libxpc_initializer
-#   fun:libSystem_initializer
-#   fun:*ImageLoaderMachO*doModInitFunctions*
-#}
-
-{
-   OSX1010:dyld-1
-   Memcheck:Cond
-   fun:*ImageLoader*weakBind*
-   fun:*ImageLoader*link*
-   fun:*dyld*link*
-}
-
-{
-   OSX1010:dyld-2
-   Memcheck:Cond
-   fun:exit
-   obj:*libdyld*dylib*
-}
-
-{
-   OSX1010:libsystem_kernel-1
-   Memcheck:Cond
-   obj:*libsystem_kernel*dylib*
-   obj:*libsystem_kernel*dylib*
-   obj:*CoreFoundation.framework*CoreFoundation*
-}
-
-{
-   OSX1010:CoreServicesInternal-1
-   Memcheck:Cond
-   obj:*CoreServicesInternal.framework*CoreServicesInternal*
-   obj:*CoreServices.framework*LaunchServices*
-   obj:*CoreServices.framework*LaunchServices*
-}
-
-{
-   OSX1010:CoreServicesInternal-2
-   Memcheck:Cond
-   obj:*CoreServicesInternal.framework*CoreServicesInternal*
-   obj:*CoreServicesInternal.framework*CoreServicesInternal*
-   obj:*CoreServicesInternal.framework*CoreServicesInternal*
-}
-
-{
-   OSX1010:CoreServicesInternal-3
-   Memcheck:Cond
-   obj:*CoreServicesInternal.framework*CoreServicesInternal*
-   obj:*CoreServicesInternal.framework*CoreServicesInternal*
-   obj:*CoreFoundation.framework*CoreFoundation*
-}
-
-{
-   OSX1010:CoreServices-1
-   Memcheck:Cond
-   obj:*CoreServices.framework*LaunchServices*
-   obj:*CoreServices.framework*LaunchServices*
-   obj:*CoreServices.framework*LaunchServices*
-}
-
-##{
-##   OSX1010:libsystem_pthread-1
-##   Memcheck:Cond
-##   obj:*libsystem_pthread*dylib*
-##   obj:*ImageIO.framework*ImageIO*
-##   obj:*ImageIO.framework*ImageIO*
-##}
-
-{
-   OSX1010:ApplicationServices-1
-   Memcheck:Cond
-   obj:*ApplicationServices.framework*ATS*
-   obj:*libsystem_pthread*dylib*
-   obj:*libsystem_platform*dylib*
-}
-
-{
-   OSX1010:HIToolbox-1
-   Memcheck:Cond
-   obj:*HIToolbox.framework*HIToolbox*
-   obj:*HIToolbox.framework*HIToolbox*
-   obj:*HIToolbox.framework*HIToolbox*
-}
-
-{
-   OSX1010:RawCamera-1
-   Memcheck:Cond
-   obj:*RawCamera.bundle*RawCamera*
-   obj:*libdispatch.dylib*
-   obj:*libdispatch.dylib*
-}
-
-##{
-##   OSX1010:CoreImage-1
-##   Memcheck:Cond
-##   obj:*CoreImage.framework*CoreImage*
-##   obj:*CoreImage.framework*CoreImage*
-##   obj:*CoreImage.framework*CoreImage*
-##}
-
-##{
-##   OSX1010:strncpy-1
-##   Memcheck:Cond
-##   fun:strncpy
-##   obj:*CoreServicesInternal.framework*CoreServicesInternal
-##   obj:*CoreServicesInternal.framework*CoreServicesInternal
-##}
-
-{
-   OSX1010:pthread_rwlock_init
-   Memcheck:Cond
-   fun:pthread_rwlock_init
-   obj:*ImageIO.framework*ImageIO*
-   obj:*ImageIO.framework*ImageIO*
-}
-
-{
-   OSX1010:CFBasicHash
-   Memcheck:Value8
-   fun:*CFBasicHash*
-   fun:*CF*
-}
-
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-1-Addr8
-   Memcheck:Addr8
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-}
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-1-Addr8
-   Memcheck:Addr4
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-}
-
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-2-Addr8
-   Memcheck:Addr8
-   fun:*platform_memmove*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-}
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-2-Addr2
-   Memcheck:Addr2
-   fun:*platform_memmove*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-}
-
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-3-Addr8
-   Memcheck:Addr8
-   fun:*platform_memmove*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*GLEngine.bundle*GLEngine*
-}
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-3-Addr2
-   Memcheck:Addr2
-   fun:*platform_memmove*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*GLEngine.bundle*GLEngine*
-}
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-3-Addr1
-   Memcheck:Addr1
-   fun:*platform_memmove*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*GLEngine.bundle*GLEngine*
-}
-
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-4
-   Memcheck:Addr8
-   fun:*platform_bzero*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-}
-
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-6-Addr8
-   Memcheck:Addr8
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*GLEngine.bundle*GLEngine*
-}
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-6-Addr4
-   Memcheck:Addr4
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*GLEngine.bundle*GLEngine*
-}
-
-{
-   OSX1010:AppleIntelHD4000GraphicsGLDriver-7
-   Memcheck:Addr4
-   obj:*AppleIntelHD4000GraphicsGLDriver.bundle*AppleIntelHD4000GraphicsGLDriver*
-   obj:*GLEngine.bundle*GLEngine*
-}
-
-{
-   OSX1010:OSAtomicAdd32
-   Memcheck:Addr4
-   fun:*OSAtomicAdd32*
-   obj:*IOAccelerator.framework*IOAccelerator*
-   obj:*GPUSupport.framework*GPUSupportMercury*
-}
-
-{
-   OSX1010:IOAccelerator-1
-   Memcheck:Addr4
-   obj:*IOAccelerator.framework*IOAccelerator*
-   obj:*GPUSupport.framework*GPUSupportMercury*
-}
-
-{
-   OSX1010:mach_msg_trap-1
-   Memcheck:Param
-   msg->desc.port.name
-   fun:mach_msg_trap
-   obj:*libsystem_kernel.dylib*
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-}
-
-{
-   OSX1010:mach_msg_trap-2
-   Memcheck:Param
-   msg->desc.port.name
-   fun:mach_msg_trap
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-   obj:*SystemConfiguration.framework*SystemConfiguration*
-}
-
-# See https://bugs.kde.org/show_bug.cgi?id=188572 about this;  it's
-# unavoidable due to BSD setenv() semantics.
-{
-   macos-__setenv-leak-see-our-bug-188572
-   Memcheck:Leak
-   match-leak-kinds: definite
-   fun:malloc
-   fun:_owned_ptr_alloc
-   fun:setenv
-}
-
-# See https://bugs.kde.org/show_bug.cgi?id=196528
-{
-macos-__pthread_rwlock_init-see-our-bug-196528
-Memcheck:Cond
-fun:pthread_rwlock_init
-}
diff --git a/ext/open62541_lib.cmake b/ext/open62541_lib.cmake
deleted file mode 100644
index bcf3fdb..0000000
--- a/ext/open62541_lib.cmake
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright 2019 NXP
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-
-PROJECT(open62541_lib)
-
-SET(OPEN62541_VER_MAJOR 0)
-SET(OPEN62541_VER_MINOR 0)
-SET(OPEN62541_VER_PATCH 0)
-SET(OPEN62541_VER_LABEL "-")
-SET(OPEN62541_VER_COMMIT "-")
-SET(UA_LOGLEVEL 300)
-
-SET(UA_ENABLE_METHODCALLS 1)
-SET(UA_ENABLE_NODEMANAGEMENT 1)
-SET(UA_ENABLE_SUBSCRIPTIONS 1)
-SET(UA_ENABLE_DA 1)
-SET(UA_ENABLE_ENCRYPTION 1)
-SET(UA_MULTITHREADING 0)
-SET(UA_ENABLE_STATUSCODE_DESCRIPTIONS 1)
-SET(UA_ENABLE_TYPEDESCRIPTION 1)
-SET(UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS 1)
-SET(UA_ENABLE_DISCOVERY 1)
-SET(UA_ENABLE_DISCOVERY_SEMAPHORE 1)
-SET(UA_VALGRIND_INTERACTIVE_INTERVAL 1000)
-SET(UA_GENERATED_NAMESPACE_ZERO 1)
-SET(UA_DEBUG 1)
-
-IF(WithHost_PCWindows)
-    SET(UA_ARCHITECTURE "win32")
-ELSEIF(
-    WithHost_iMXLinux
-    OR WithHost_PCLinux64
-    OR WithHost_Raspbian
-)
-    SET(UA_ARCHITECTURE "posix")
-ENDIF()
-
-SET(
-    UA_ARCHITECTURES_NODEF
-    "1  && !defined(UA_ARCHITECTURE_ECOS) && !defined(UA_ARCHITECTURE_FREERTOSLWIP) && !defined(UA_ARCHITECTURE_POSIX) && !defined(UA_ARCHITECTURE_VXWORKS) && !defined(UA_ARCHITECTURE_WEC7) && !defined(UA_ARCHITECTURE_WIN32)"
-)
-
-CONFIGURE_FILE(
-    ${CMAKE_CURRENT_SOURCE_DIR}/open62541/include/open62541/config.h.in
-    ${CMAKE_CURRENT_SOURCE_DIR}/open62541/build/src_generated/open62541/config.h
-)
-
-FILE(
-    GLOB
-    ${PROJECT_NAME}_files
-    ${CMAKE_CURRENT_SOURCE_DIR}/../sss/plugin/open62541/plugins/securityPolicies/*.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/../sss/plugin/open62541/sss_interface.c
-    open62541/arch/network_tcp.c
-    open62541/build/src_generated/open62541/*.c
-    open62541/deps/base64.c
-    open62541/deps/libc_time.c
-    open62541/deps/pcg_basic.c
-    open62541/plugins/securityPolicies/securitypolicy_mbedtls_common.c
-    open62541/plugins/securityPolicies/ua_securitypolicy_none.c
-    open62541/plugins/ua_accesscontrol_default.c
-    open62541/plugins/ua_config_default.c
-    open62541/plugins/ua_log_stdout.c
-    open62541/plugins/ua_nodestore_default.c
-    open62541/plugins/ua_pki_default.c
-    open62541/src/client/*.c
-    open62541/src/pubsub/ua_pubsub.c
-    open62541/src/pubsub/ua_pubsub_manager.c
-    open62541/src/pubsub/ua_pubsub_networkmessage.c
-    open62541/src/pubsub/ua_pubsub_ns0.c
-    open62541/src/server/*.c
-    open62541/src/ua_connection.c
-    open62541/src/ua_securechannel.c
-    open62541/src/ua_timer.c
-    open62541/src/ua_types.c
-    open62541/src/ua_types_encoding_binary.c
-    open62541/src/ua_util.c
-    open62541/src/ua_workqueue.c
-)
-
-IF(WithHost_PCWindows)
-    LIST(
-        APPEND
-        ${PROJECT_NAME}_files
-        open62541/arch/win32/ua_clock.c
-        open62541/arch/win32/ua_architecture_functions.c
-    )
-ELSEIF(
-    WithHost_iMXLinux
-    OR WithHost_PCLinux64
-    OR WithHost_Raspbian
-)
-    LIST(
-        APPEND
-        ${PROJECT_NAME}_files
-        open62541/arch/posix/ua_clock.c
-        open62541/arch/posix/ua_architecture_functions.c
-    )
-ENDIF()
-
-ADD_LIBRARY(${PROJECT_NAME} ${${PROJECT_NAME}_files})
-
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ex_common)
-
-TARGET_INCLUDE_DIRECTORIES(
-    ${PROJECT_NAME}
-    PUBLIC open62541/include
-    PUBLIC open62541/plugins/include
-    PUBLIC open62541/examples
-    PUBLIC open62541/build/src_generated/
-    PUBLIC open62541/arch
-    PUBLIC open62541/deps
-    PUBLIC open62541/src
-    PUBLIC open62541/src/server
-    PUBLIC open62541/src/client
-    PUBLIC mbedtls/include
-    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../sss/plugin/open62541
-)
-
-IF(WithHost_PCWindows)
-    ADD_DEFINITIONS(-DUA_ARCHITECTURE_WIN32)
-    ADD_COMPILE_DEFINITIONS(PCWindows=1)
-ELSEIF(
-    WithHost_iMXLinux
-    OR WithHost_PCLinux64
-    OR WithHost_Raspbian
-)
-    ADD_DEFINITIONS(-DUA_ARCHITECTURE_POSIX)
-ENDIF()
-
-IF(
-    "${CMAKE_CXX_COMPILER_ID}"
-    MATCHES
-    "MSVC"
-)
-    TARGET_COMPILE_OPTIONS(
-        ${PROJECT_NAME}
-        PRIVATE
-            /wd4706 # assignment within conditional expression
-            /wd4701 # potentially uninitialized local variable
-            /wd4703 # potentially uninitialized local pointer variable
-    )
-    # 1900 matches VS2015
-    IF(
-        ${MSVC_VERSION}
-        LESS_EQUAL
-        1900
-    )
-        TARGET_COMPILE_OPTIONS(${PROJECT_NAME} PRIVATE /wd4127 # conditional expression is constant
-        )
-    ENDIF()
-ENDIF()
