diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7fa26aa0fb6d234ccf52476cc576bcbdab68a8a3..b2a7acb8ac057bf196ce43a2b20225a4d139bc58 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@ else()
 	set(COMPANY_NAME "Inria")
 endif()
 
-# Options and cahce variables
+# Options and cache variables
 
 option(PUBLISH_DOC_ASSETS "Publish plugin documentation assets" ON)
 option(BUILD_VALIDATION_TEST "Build the validation tests" ON)
@@ -133,11 +133,6 @@ endif()
 
 set(OV_LAUNCHER_SOURCE_PATH "${CMAKE_SOURCE_DIR}/sdk/cmake-modules/launchers")
 
-# By setting SKIP[_FOLDER]* you can skip a subtree (example: SKIP_A_B_C skips folder a/b/c and all its subfolders if any)
-# Skip building documentation
-# a list of all project which will be filled by the directory traversal. This is needed to generate the documentation.
-set_property(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS "")
-set_property(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR "")
 
 # Used by the various Find* scripts to locate OpenViBE modules
 set(OV_BASE_DIR ${CMAKE_SOURCE_DIR}/sdk)
@@ -151,13 +146,11 @@ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO "TARGE
 
 # OpenViBE-specific helper functions that are used by the CMakeLists of the subprojects.
 include("OvAddProjects")
-include("OvLinkBoostLib")
 include("OvDelayLoad")
 
 # Traverse these directories and build their components
 add_subdirectory("build-tool/")
 
-add_subdirectory("documentation/")
 add_subdirectory("common/")
 
 if(NOT(SKIP_OPENVIBE))
diff --git a/CustomCMakeLists.txt-skeleton b/CustomCMakeLists.txt-skeleton
index d73f9d0075a6754004fd909f24da9e8fe2ed723e..8ee3125f92faf5d580abe11231065d782667f1d3 100644
--- a/CustomCMakeLists.txt-skeleton
+++ b/CustomCMakeLists.txt-skeleton
@@ -2,14 +2,6 @@
 # By default all changes are disabled, you can un-comment any that are of interest to you
 # In order to use the file make a copy of it an rename it "CustomCMakeLists.txt"
 
-# ----------------------------------
-# USEFUL ELEMENTS
-# ----------------------------------
-
-# Uncomment the following to build documentation
-# both the global project and the specific projects are affected by this token
-#SET(SKIP_DOCUMENTATION OFF)
-
 # ----------------------------------
 # OPENVIBE
 # ----------------------------------
diff --git a/INSTALL.md b/INSTALL.md
index 1e02041eb84c8d0a86f772d2bf860f825d7f37bd..bb2bddf89f4d2076ea1cf3b0566e74ac582c9f7f 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,95 +1,28 @@
-Dependencies
-============
+# Install
+
+## Dependencies
+
+### Linux Ubuntu (14.04 and 16.04)
 
-Linux Ubuntu (14.04 and 16.04) 
------------------------------
 - Install the dependencies
   - run `linux-install-dependencies.pl` script; you will require sudo rights
-  - run `unix-get-dependencies.sh` script with an existing `DEPENDENCY_CACHE` environment variable or with --cache parameter (OPTIONAL - for tests), 
-  or with `PROXYPASS`
+  - run `unix-get-dependencies.sh` script with an existing `DEPENDENCY_CACHE` environment variable or with --cache parameter (OPTIONAL - for tests), or with `PROXYPASS`
 
+### Windows 7 and later
 
-Windows 7 and later
--------------------
 - Install the dependencies:
   - copy `windows-install-dependencies.cmd` and rename copy to `windows-install-dependencies-custom.cmd`
   - edit line `set PROXYPASS=XXX:XXX` with appropriate username and password
   - run it whenever you want to update dependencies.
 
+## Install
 
-Install
-=======
+### Linux Ubuntu (14.04)
 
-Linux Ubuntu (14.04)
---------------------
 - Run unit tests
   - run `ctest-launcher.sh` from the build directory
 
+### Windows 7 and later
 
-Windows 7 and later
--------------------
 - Run unit tests
   - run `ctest-launcher.cmd` from the build directory
-
-
-Building Documentation
-======================
-
-Documentation Dependencies
---------------------------
-
-The documentation is build by the sphinx tool and has following dependencies:
-
-* Python
-* sphinx
-* sphinx_rtd_theme
-
-The best way to have these dependencies ready is to use a virtualenv in order to make an environment containing these.
-
-Assuming you have virtualenv installed the commands would be:
-
-First time:
-
-    mkdir -p ~/virtualenvs
-    virutalenv ~/virtualenvs/openvibe-doc
-    source ~/virtualenvs/openvibe-doc/bin/activate
-    pip install sphinx sphinx_rtd_theme
-
-or on windows
-
-    md %USERPROFILE%\virtualenvs
-    virtualenv %USERPROFILE%\virtualenvs\openvibe-doc
-    %USERPROFILE%\virtualenvs\openvibe-doc\Scripts\activate.bat
-    pip install sphinx sphinx_rtd_theme
-
-once the environment is created you only need to execute the third line to activate it.
-
-Documentation Building
-----------------------
-
-The documentation main files reside in documentation/sphinx folder and is constructed in the following fashion:
-
-1. During the CMake step documentation files are pooled in the dist/doc-tmp/sphinx folder
-   * The files come from the documentation/sphinx folder and from the plugins `boxes` folders
-2. The documentation will generate a build-documentation script inside the doc-tmp folder which
-   has to be launched manually.
-3. The documentation will be generated in the `doc-tmp/sphinx/build` folder and moved to
-   `doc/OpenViBE Manual`
-
-Extending Documentation
------------------------
-
-If you wish to build a documentation that extends what is already in the SDK you can do so by adding files
-into the doc-tmp folder and overwriting indexes.
-
-A few remarks:
-
-The main index file is in `doc-tmp/sphinx/source/index.rst` and should almost always be overwritten if you
-need to add something to the documentation.
-
-Box list is in `doc-tmp/sphinx/source/boxes/index-boxes.rst`. The plugin-inspector can generate this file
-for you using the `openvibe-plugin-inspector-sdk --box-doc-directory <WHERE>` template. It will also generate
-templates for all boxes that can be loaded by the kernel.
-
-
-
diff --git a/applications/developer-tools/plugin-inspector/CMakeLists.txt b/applications/developer-tools/plugin-inspector/CMakeLists.txt
index e9956d713efc7210ffcad99add7fed4c96e212ad..5784e28372e83f7f12a5576ae8df51ddda6c2a40 100644
--- a/applications/developer-tools/plugin-inspector/CMakeLists.txt
+++ b/applications/developer-tools/plugin-inspector/CMakeLists.txt
@@ -29,14 +29,13 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-toolkit
                       openvibe-module-system
                       openvibe-module-fs
+                      Boost::boost
 ) 
 
 set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER})
 
 add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 
-include("FindThirdPartyBoost")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/applications/developer-tools/scenario-player/CMakeLists.txt b/applications/developer-tools/scenario-player/CMakeLists.txt
index d5b2b8436c5a6fefffd684fdb8adc38692425a1c..36c72cf568a4e6f87c30610638e52774a26f35fb 100755
--- a/applications/developer-tools/scenario-player/CMakeLists.txt
+++ b/applications/developer-tools/scenario-player/CMakeLists.txt
@@ -36,7 +36,9 @@ add_executable(${PROJECT_NAME} ${SRC_FILES})
 target_link_libraries(${PROJECT_NAME}
                       openvibe
                       openvibe-toolkit
-                      openvibe-module-system)
+                      openvibe-module-system
+                      Boost::boost
+)
 
 set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER})
 
@@ -46,10 +48,6 @@ add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 # External dependecies 
 # ----------------------
 
-# To be done after add executable because FindOpenViBEXXX files need a target name
-
-include("FindThirdPartyBoost")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp b/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp
index 9c289bd0574ff2190403edb17c6a078a1ec52f4f..71ab34bce564bbf90e0e929ae59133d2f3704136 100755
--- a/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp
+++ b/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp
@@ -288,7 +288,7 @@ EPlayerReturnCodes CKernelFacade::runScenarioList(const SRunScenarioCmd& command
 		playerIDs.push_back(id);
 
 		CNameValuePairList configTokens;
-		for (auto& token : m_impl->scenarioTokens[name]) { configTokens.setValue(token.first.c_str(), token.second.c_str()); }
+		for (auto& token : m_impl->scenarioTokens[name]) { configTokens.setValue(token.first, token.second); }
 
 		// Scenario attachment with setup of local token
 		if (!player->setScenario(pair.second, &configTokens))
diff --git a/cmake-modules/FindThirdPartyBoost_Chrono.cmake b/cmake-modules/FindThirdPartyBoost_Chrono.cmake
deleted file mode 100644
index b57742216fbe708fe773d01112b22891959b3d34..0000000000000000000000000000000000000000
--- a/cmake-modules/FindThirdPartyBoost_Chrono.cmake
+++ /dev/null
@@ -1,31 +0,0 @@
-# ---------------------------------
-# Finds third party boost chrono
-# Adds a def that its present
-# ---------------------------------
-
-FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${LIST_DEPENDENCIES_PATH}/boost ${LIST_DEPENDENCIES_PATH} NO_DEFAULT_PATH)
-FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${LIST_DEPENDENCIES_PATH}/boost)
-
-IF(PATH_BOOST_CHRONO)
-	debug_message( "  Found boost chrono includes...")
-	ADD_DEFINITIONS(-DTARGET_HAS_Boost_Chrono)
-ELSE(PATH_BOOST_CHRONO)
-	MESSAGE(WARNING "  FAILED to find boost chrono includes...")
-ENDIF(PATH_BOOST_CHRONO)
-
-IF(UNIX)
-	FIND_LIBRARY(LIB_Boost_Chrono NAMES "boost_chrono-mt" "boost_chrono" PATHS ${LIST_DEPENDENCIES_PATH}/lib NO_DEFAULT_PATH)
-	FIND_LIBRARY(LIB_Boost_Chrono NAMES "boost_chrono-mt" "boost_chrono" PATHS ${LIST_DEPENDENCIES_PATH}/lib)
-	
-	IF(LIB_Boost_Chrono)
-		debug_message( "    [  OK  ] lib ${LIB_Boost_Chrono}")
-		TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Chrono} )
-	ELSE(LIB_Boost_Chrono)
-		MESSAGE(WARNING "    [FAILED] lib boost_chrono-mt")	
-		MESSAGE(WARNING "    [FAILED] lib boost_chrono")
-	ENDIF(LIB_Boost_Chrono)
-ENDIF(UNIX)
-
-IF(WIN32)
-	OV_LINK_BOOST_LIB("chrono" ${OV_WIN32_BOOST_VERSION})
-ENDIF(WIN32)
diff --git a/cmake-modules/FindThirdPartyBoost_FileSystem.cmake b/cmake-modules/FindThirdPartyBoost_FileSystem.cmake
deleted file mode 100644
index 5da3c2fd5a743e8c34270d71b5d2ad61985a2221..0000000000000000000000000000000000000000
--- a/cmake-modules/FindThirdPartyBoost_FileSystem.cmake
+++ /dev/null
@@ -1,32 +0,0 @@
-# ---------------------------------
-# Finds third party boost
-# Adds library to target
-# Adds include path
-# ---------------------------------
-IF(APPLE)
-find_package(Boost 1.60.0 COMPONENTS filesystem system)
-if(Boost_FOUND)
-  include_directories(${Boost_INCLUDE_DIRS})
-  target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
-endif()
-ELSEIF(UNIX)
-	find_package(Boost 1.54.0 COMPONENTS filesystem system)
-	if(Boost_FOUND)
-	  include_directories(${Boost_INCLUDE_DIRS})
-	  target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
-	endif()
-
-	# For Fedora
-	FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread)
-	IF(LIB_STANDARD_MODULE_PTHREAD)
-		debug_message( "  Found pthread...")
-		TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD})
-	ELSE(LIB_STANDARD_MODULE_PTHREAD)
-		MESSAGE(WARNING "  FAILED to find pthread...")
-	ENDIF(LIB_STANDARD_MODULE_PTHREAD)
-ENDIF()
-
-IF(WIN32)
-	OV_LINK_BOOST_LIB("filesystem" ${OV_WIN32_BOOST_VERSION} )
-	OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION} )			# filesystem depends on system
-ENDIF(WIN32)
diff --git a/cmake-modules/FindThirdPartyBoost_Regex.cmake b/cmake-modules/FindThirdPartyBoost_Regex.cmake
deleted file mode 100644
index fbd8ed833b5bb64f3d764e163fee914b9e1af330..0000000000000000000000000000000000000000
--- a/cmake-modules/FindThirdPartyBoost_Regex.cmake
+++ /dev/null
@@ -1,22 +0,0 @@
-# ---------------------------------
-# Finds third party boost
-# Adds library to target
-# Adds include path
-# ---------------------------------
-IF(APPLE)
-find_package(Boost 1.60.0 COMPONENTS regex)
-if(Boost_FOUND)
-  include_directories(${Boost_INCLUDE_DIRS})
-  target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
-endif()
-ELSEIF(UNIX)
-	find_package(Boost 1.54.0 COMPONENTS regex)
-	if(Boost_FOUND)
-	  include_directories(${Boost_INCLUDE_DIRS})
-	  target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
-	endif()
-ENDIF()
-
-IF(WIN32)
-	OV_LINK_BOOST_LIB("regex" ${OV_WIN32_BOOST_VERSION} )
-ENDIF(WIN32)
diff --git a/cmake-modules/FindThirdPartyEigen.cmake b/cmake-modules/FindThirdPartyEigen.cmake
deleted file mode 100644
index f20ab740546a718fcf69c197be58be1005ff71db..0000000000000000000000000000000000000000
--- a/cmake-modules/FindThirdPartyEigen.cmake
+++ /dev/null
@@ -1,54 +0,0 @@
-# ---------------------------------
-# Finds Eigen headers
-#
-# Adds include path
-# ---------------------------------
-
-IF(WIN32)
-	SET(PATH_EIGEN "PATH_EIGEN-NOTFOUND")
-	FIND_PATH(PATH_EIGEN Eigen/Eigen PATHS ${LIST_DEPENDENCIES_PATH}/eigen NO_DEFAULT_PATH)
-	IF(PATH_EIGEN)
-		SET(EIGEN_FOUND TRUE)
-		SET(EIGEN_INCLUDE_DIRS ${PATH_EIGEN})
-		SET(EIGEN_CFLAGS "")
-		#SET(EIGEN_LIBRARIES_RELEASE EIGEN)
-		#SET(EIGEN_LIBRARIES_DEBUG EIGENd)	
-		#SET(EIGEN_LIBRARY_DIRS ${PATH_EIGEN}/lib )
-	ENDIF(PATH_EIGEN)
-ENDIF(WIN32)
-
-IF(UNIX)
-    
-	# @FIXME remove that when an Ubuntu package will be available
-	# Find in priority local library for eigen even if linux package has been installed
-	# reason: package on distri Ubuntu 16.04 is still bugged (eigen 3.2.92)
-	INCLUDE("FindPkgConfig")		
-	UNSET(PATH_EIGEN_LOCAL CACHE)		
-	FIND_PATH(PATH_EIGEN_LOCAL eigen3 PATHS "/usr/local/include" NO_DEFAULT_PATH)
-	SET(EIGEN_FOUND FALSE)
-	IF (PATH_EIGEN_LOCAL)	
-		SET(EIGEN_INCLUDE_DIRS "${PATH_EIGEN_LOCAL}/eigen3")				
-		SET(EIGEN_CFLAGS "-I${EIGEN_INCLUDE_DIRS}")		
-		SET(EIGEN_FOUND TRUE)
-	ELSE()			
-		pkg_check_modules(EIGEN eigen3)			
-	ENDIF()
-	
-	# @FIXME uncomment that when an Ubuntu package will be available 
-	#SET(EIGEN_FOUND FALSE)
-	#INCLUDE("FindPkgConfig")
-	#pkg_check_modules(EIGEN eigen3)
-
-ENDIF(UNIX)
-
-IF(EIGEN_FOUND)
-	debug_message( "Found eigen3... [${EIGEN_INCLUDE_DIRS}]")
-	INCLUDE_DIRECTORIES("${EIGEN_INCLUDE_DIRS}")
-	ADD_DEFINITIONS(${EIGEN_CFLAGS})
-	ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEIGEN)
-ELSE(EIGEN_FOUND)
-	MESSAGE(WARNING "  FAILED to find eigen3...")
-ENDIF(EIGEN_FOUND)
-
-
-
diff --git a/cmake-modules/OvAddProjects.cmake b/cmake-modules/OvAddProjects.cmake
index 326c224715df65b6ac1ef029bb4f13b6ddbabe2e..6235b710a27bd19073eb0610fa5ca44162914274 100644
--- a/cmake-modules/OvAddProjects.cmake
+++ b/cmake-modules/OvAddProjects.cmake
@@ -1,36 +1,9 @@
 # Adds the current project to the global properties
 FUNCTION(OV_ADD_THIS_TO_PROJECT_LIST)
-	# MESSAGE(STATUS "ADDING: ${CMAKE_CURRENT_SOURCE_DIR}")
-
 	# Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir
-	#GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS)
-	#SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}")
-	#SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP})
-	IF(NOT ${GENERATOR_IS_MULTI_CONFIG})
-		IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc AND NOT(${SKIP_DOC_OPENVIBE}))
-			FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe FILES_MATCHING PATTERN "*.dox")
-			FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe PATTERN "*.dox" EXCLUDE)
-		ENDIF()
-
-		IF(IS_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/include) AND NOT(${SKIP_DOCUMENTATION}) AND NOT(${SKIP_DOC_OPENVIBE}))
-			FILE(APPEND "${DIST_DOCTMP}/openvibe/source-list.txt" "${CMAKE_CURRENT_SOURCE_DIR}/include\n")
-		ENDIF()
-	ENDIF()
-ENDFUNCTION()
-
-FUNCTION(OV_SET_CUSTOM_DOCUMENTATION doc_project_name doc_product_name)
-	MESSAGE(STATUS "CUSTOM DOCUMENTATION ENABLED FOR ${doc_project_name}")
-	SET(HAS_CUSTOM_DOCUMENTATION_${doc_project_name} "1" PARENT_SCOPE)
-	IF(${BUILD_DOCUMENTATION})
-		SET(CUSTOM_DOCUMENTATION_PRODUCT_NAME_${doc_project_name} "${doc_product_name}" PARENT_SCOPE)
-
-		# if we need also the sources (e.g. the API is documented with doxygen)
-		SET(ADDITIONAL_FOLDERS_STRING_LIST "")
-		FOREACH(additional_cpp_source ${ARGN})
-			SET(ADDITIONAL_FOLDERS_STRING_LIST "${ADDITIONAL_FOLDERS_STRING_LIST} ${CMAKE_CURRENT_SOURCE_DIR}/${doc_project_name}/${additional_cpp_source}")
-		ENDFOREACH()
-		SET(CUSTOM_DOCUMENTATION_CPP_SOURCES_${doc_project_name} "${ADDITIONAL_FOLDERS_STRING_LIST}" PARENT_SCOPE)
-	ENDIF()
+	GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS)
+	SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}")
+	SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP})
 ENDFUNCTION()
 
 #
@@ -52,7 +25,6 @@ FUNCTION(OV_ADD_PROJECTS CURRENT_FOLDER_PREFIX)
 
 			STRING(TOUPPER ${DIRNAME} DIRNAMEUPPER)
 			SET(SKIP_THIS_FOLDER "SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}")
-			SET(SKIP_THIS_CUSTOM_DOCUMENTATION "SKIP_DOC_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}")
 
 			#MESSAGE(STATUS "Checking SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER} as branch var ${SKIP_THIS_FOLDER}")
 
@@ -71,51 +43,6 @@ FUNCTION(OV_ADD_PROJECTS CURRENT_FOLDER_PREFIX)
 				SET(OV_TMP "${OV_TMP};${OV_CURRENT_BINARY_DIR}")
 				SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR ${OV_TMP})
 
-
-				SET(HAS_CUSTOM_DOCUMENTATION "HAS_CUSTOM_DOCUMENTATION_${DIRNAME}")
-				SET(CUSTOM_DOCUMENTATION_PRODUCT_NAME "CUSTOM_DOCUMENTATION_PRODUCT_NAME_${DIRNAME}")
-				SET(CUSTOM_DOCUMENTATION_CPP_SOURCES "${CUSTOM_DOCUMENTATION_CPP_SOURCES_${DIRNAME}}")
-				IF(NOT(${SKIP_DOCUMENTATION}) AND NOT(${SKIP_THIS_CUSTOM_DOCUMENTATION}) AND NOT ${GENERATOR_IS_MULTI_CONFIG})
-					IF(NOT(${HAS_CUSTOM_DOCUMENTATION}))
-						IF(${PUBLISH_DOC_ASSETS})
-							IF(IS_DIRECTORY ${FULLPATH}/doc)
-								MESSAGE(STATUS "Documentation files found in ${FULLPATH}/doc")
-								INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe/box-algorithm-doc/dox-part/ FILES_MATCHING PATTERN "*.dox-part" PATTERN "doc/boxes" EXCLUDE)
-								INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe FILES_MATCHING PATTERN "*.dox" PATTERN "doc/boxes" EXCLUDE)
-								INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe
-									PATTERN "doc/boxes" EXCLUDE PATTERN "*.dox-part" EXCLUDE PATTERN "*.dox" EXCLUDE)
-							ENDIF()
-
-							IF(IS_DIRECTORY ${FULLPATH}/include)
-								FILE(APPEND "${DIST_DOCTMP}/openvibe/source-list.txt" "${FULLPATH}/include\n")
-							ENDIF()
-						ENDIF()
-					ELSE()
-						MESSAGE(STATUS "Project ${DIRNAME} has custom documentation")
-
-						# we copy the doc files into the temporary folder where everything is built thanks to a cmd script
-						IF(IS_DIRECTORY ${FULLPATH}/doc/)
-							FILE(COPY ${FULLPATH}/doc/ DESTINATION "${DIST_DOCTMP}/${DIRNAME}")
-						ENDIF()
-
-						SET(DOC_PROJECT_NAME ${DIRNAME})
-						SET(DOC_PROJECT_VERSION ${PROJECT_VERSION})
-						SET(DOC_PROJECT_PRODUCT_NAME "${${CUSTOM_DOCUMENTATION_PRODUCT_NAME}}")
-						SET(DOC_PROJECT_COMMITHASH ${PROJECT_COMMITHASH})
-						SET(DOC_PROJECT_BRANCH ${PROJECT_BRANCH})
-						SET(DOC_PROJECT_CPP_SOURCES "${CUSTOM_DOCUMENTATION_CPP_SOURCES}")
-
-						get_directory_property( DirDefs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS )
-						SET(DOC_DEFINES "")
-						foreach( d ${DirDefs} )
-							#message( STATUS "Found Define: " ${d} )
-							SET(DOC_DEFINES "${DOC_DEFINES} \\\\ \\n ${d}")
-						endforeach()
-						STRING(REPLACE "\"" "\\\"" DOC_DEFINES "${DOC_DEFINES}")
-
-						#message( STATUS ${DOC_DEFINES} )
-					ENDIF()
-				ENDIF()
 				add_subdirectory(${FULLPATH})
 			ENDIF()
 		ENDIF()
diff --git a/cmake-modules/OvLinkBoostLib.cmake b/cmake-modules/OvLinkBoostLib.cmake
deleted file mode 100644
index 4f11cdbc2b13cada2fafe7a7a7c8d19a511fdc0e..0000000000000000000000000000000000000000
--- a/cmake-modules/OvLinkBoostLib.cmake
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# Win32 only
-#
-# This concoction mainly exists to locate the boost libraries on WIN32 in the case where our dependency/ folder has only a
-# truncated version of boost and we cannot use find_package(). The background story is that we wish to link explicitly
-# instead of using automatic linking and specifying a generic boost path to linker before each project definition.
-#
-# The downside of this is that it assumes the boost library names to have a particular format and only works for VC90/VC100
-#
-# Function: Links specified boost library defined by COMPONENT and BOOST_VERSION to PROJECT_NAME.
-#
-
-FUNCTION(OV_LINK_BOOST_LIB BOOST_COMPONENT BOOST_VERSION)
-
-IF(WIN32)
-	IF(MSVC)
-		IF(MSVC_VERSION EQUAL 1500) # vc9
-			SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc90-mt-${BOOST_VERSION}.lib")
-			SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc90-mt-gd-${BOOST_VERSION}.lib")
-		ELSEIF(MSVC_VERSION EQUAL 1600) # vc 10
-			SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc100-mt-${BOOST_VERSION}.lib")
-			SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc100-mt-gd-${BOOST_VERSION}.lib")
-		ELSEIF(MSVC_VERSION EQUAL 1700) # vc 11
-			SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc110-mt-${BOOST_VERSION}.lib")
-			SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc110-mt-gd-${BOOST_VERSION}.lib")
-		ELSEIF(MSVC_VERSION EQUAL 1800) # vc12
-			SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc120-mt-${BOOST_VERSION}.lib")
-			SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc120-mt-gd-${BOOST_VERSION}.lib")
-		ENDIF(MSVC_VERSION EQUAL 1500)
-	ENDIF(MSVC)
-
-	SET(LIB_BOOST_PATH "-NOTFOUND")
-	FIND_LIBRARY(LIB_BOOST_PATH NAMES ${LIB_BOOST} PATHS ${LIST_DEPENDENCIES_PATH}/boost/lib NO_DEFAULT_PATH)
-	IF(LIB_BOOST_PATH)
-		debug_message( "    [  OK  ] lib ${LIB_BOOST_PATH}")
-		IF(TARGET ${PROJECT_NAME})
-			TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LIB_BOOST_PATH})
-		ENDIF()
-	ELSE(LIB_BOOST_PATH)
-		MESSAGE(WARNING "    Unable to find boost ${LIB_BOOST}")
-	ENDIF(LIB_BOOST_PATH)
-
-	SET(LIB_BOOST_DEBUG_PATH "-NOTFOUND")
-	FIND_LIBRARY(LIB_BOOST_DEBUG_PATH NAMES ${LIB_BOOST_DEBUG} PATHS ${LIST_DEPENDENCIES_PATH}/boost/lib NO_DEFAULT_PATH)
-	IF(LIB_BOOST_DEBUG_PATH)
-		debug_message( "    [  OK  ] lib ${LIB_BOOST_DEBUG_PATH}")
-		IF(TARGET ${PROJECT_NAME})
-			TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_BOOST_DEBUG_PATH})
-		ENDIF()
-	ELSE(LIB_BOOST_DEBUG_PATH)
-		MESSAGE(WARNING "    Unable to find boost ${LIB_BOOST_DEBUG}")
-	ENDIF(LIB_BOOST_DEBUG_PATH)
-ENDIF(WIN32)
-
-ENDFUNCTION(OV_LINK_BOOST_LIB)
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 29de36e7346d8b9fd4d40df23b6076590f2654c8..39e5e11ade57e1a7d24d0e69a67ac1b566d7748d 100755
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -8,15 +8,15 @@ target_include_directories(${PROJECT_NAME} INTERFACE include)
 add_executable(${PROJECT_NAME}-nop src/main.cpp)
 
 target_link_libraries(${PROJECT_NAME}-nop
-					  ${PROJECT_NAME})
+					  ${PROJECT_NAME}
+					  Boost::boost
+)
 	
 set_target_properties(${PROJECT_NAME}-nop PROPERTIES
 	VERSION ${PROJECT_VERSION}
 	SOVERSION ${PROJECT_VERSION_MAJOR}
 	FOLDER ${KERNEL_FOLDER})
 
-include("FindThirdPartyBoost")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/common/include/ov_common_defines.h b/common/include/ov_common_defines.h
index a38da6cbd4fe2cb5ddbdaa163d3b0152e29d54ed..ba14b2972025d0dd7f407b2295e6b5394ff9da75 100644
--- a/common/include/ov_common_defines.h
+++ b/common/include/ov_common_defines.h
@@ -96,6 +96,17 @@
 #define OV_API OV_API_Import
 #endif
 
+
+//[[deprecated(message)]] after c++14 for all OS
+#if defined TARGET_OS_Windows
+#define OV_Deprecated(message) __declspec(deprecated(message))
+#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS
+#define OV_Deprecated(message) __attribute__((deprecated))
+#else
+#define OV_Deprecated(message)
+#endif
+
+
 //___________________________________________________________________//
 //                                                                   //
 // API Definition for plugins                                        //
diff --git a/documentation/CMakeLists.txt b/documentation/CMakeLists.txt
deleted file mode 100644
index aae08e2869a346001172611d1c3a9bcb4342cc41..0000000000000000000000000000000000000000
--- a/documentation/CMakeLists.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-find_package(Doxygen)
-option(BUILD_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen)" OFF)
-
-if(BUILD_DOCUMENTATION)
-    if(NOT DOXYGEN_FOUND)
-        message(FATAL_ERROR "Doxygen is needed to build the documentation.")
-    endif()
-
-	file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html")
-
-    set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/src/Doxyfile.in)
-    set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
-
-    configure_file(${doxyfile_in} ${doxyfile} @ONLY)
-
-    add_custom_target(doc
-        COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
-        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-        COMMENT "Generating API documentation with Doxygen"
-        VERBATIM)
-
-    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION ${DIST_DOCDIR})
-    install(DIRECTORY doc/ DESTINATION ${DIST_DOCDIR}/html)
-
-endif()
-
-# Sphinx Documentation
-install(DIRECTORY DESTINATION "${DIST_DOCTMP}/sphinx")
-install(DIRECTORY DESTINATION "${DIST_DOCTMP}/sphinx/templates")
-
-# Collect all sphinx documentation files from all projects
-
-file(GLOB SPHINX_DOC_DIRS LIST_DIRECTORIES true LIST_FILES false "${PROJECT_SOURCE_DIR}/plugins/processing/*")
-foreach(DOCDIR ${SPHINX_DOC_DIRS})
-	if(IS_DIRECTORY "${DOCDIR}/doc/boxes")
-		install(DIRECTORY "${DOCDIR}/doc/boxes" DESTINATION ${DIST_DOCTMP}/sphinx/source)
-	endif()
-endforeach()
-
-install(DIRECTORY sphinx/source DESTINATION ${DIST_DOCTMP}/sphinx)
-install(FILES sphinx/make.bat DESTINATION ${DIST_DOCTMP}/sphinx)
-install(FILES sphinx/Makefile DESTINATION ${DIST_DOCTMP}/sphinx)
-install(FILES sphinx/build-documentation.cmd DESTINATION ${DIST_DOCTMP})
-install(FILES sphinx/build-documentation.sh DESTINATION ${DIST_DOCTMP})
-
diff --git a/documentation/doc/cc-by-sa.png b/documentation/doc/cc-by-sa.png
deleted file mode 100644
index 924eee54afc4150fd7f9eaf986cbc11701603914..0000000000000000000000000000000000000000
Binary files a/documentation/doc/cc-by-sa.png and /dev/null differ
diff --git a/documentation/doc/doxygen.png b/documentation/doc/doxygen.png
deleted file mode 100644
index b891fd3efa0306eb62256e6ab3aa9b53ecec9d7f..0000000000000000000000000000000000000000
Binary files a/documentation/doc/doxygen.png and /dev/null differ
diff --git a/documentation/doc/logo.png b/documentation/doc/logo.png
deleted file mode 100644
index bf5bb9677c99403a154df7522a0d7a2a7250c068..0000000000000000000000000000000000000000
Binary files a/documentation/doc/logo.png and /dev/null differ
diff --git a/documentation/doc/mensia-logo-large.png b/documentation/doc/mensia-logo-large.png
deleted file mode 100644
index 4b73db4ecd6ac962b70f1f24ae25fc43e4b1cd5c..0000000000000000000000000000000000000000
Binary files a/documentation/doc/mensia-logo-large.png and /dev/null differ
diff --git a/documentation/doc/mensia-logo-small.png b/documentation/doc/mensia-logo-small.png
deleted file mode 100644
index ca5f4fcae3a3117137b100bf23c393535b65a95f..0000000000000000000000000000000000000000
Binary files a/documentation/doc/mensia-logo-small.png and /dev/null differ
diff --git a/documentation/doc/mensia-logo-thumb.png b/documentation/doc/mensia-logo-thumb.png
deleted file mode 100644
index ab469f46ca650675284dfd00bbd5e4d2158aabf8..0000000000000000000000000000000000000000
Binary files a/documentation/doc/mensia-logo-thumb.png and /dev/null differ
diff --git a/documentation/doc/mensia.css b/documentation/doc/mensia.css
deleted file mode 100644
index 39f69ce46ff27e7a0ba4d454b0e69acc98320270..0000000000000000000000000000000000000000
--- a/documentation/doc/mensia.css
+++ /dev/null
@@ -1,45 +0,0 @@
-body {
-/*	position:relative;*/
-	max-width:11in;
-	margin:0 auto;
-	/*background:url('doc-bg.png') #fff left repeat-y;*/
-}
-
-#sidebar {
-	width:200px;
-	float:left;
-	border-left:1px solid #C4CFE5;
-	border-right:1px solid #C4CFE5;
-	padding-bottom:100%;
-}
-
-#sidebar ul, #sidebar div {
-	padding-left:10px;
-}
-
-#sidebar li {
-	list-style:none;
-}
-
-#sidebar b {
-	font-weight:bold;
-}
-
-#search input {
-	border:1px solid black;
-	width:180px;
-
-}
-
-#content {
-	margin-left:200px;
-}
-
-hr.footer {
-	clear:both;
-}
-
-div.fragment *
-{
-	white-space: pre;
-}
\ No newline at end of file
diff --git a/documentation/doc/openvibe-logo-highres.png b/documentation/doc/openvibe-logo-highres.png
deleted file mode 100644
index 4927793f0e192264851fa58ce58d7b88866c5222..0000000000000000000000000000000000000000
Binary files a/documentation/doc/openvibe-logo-highres.png and /dev/null differ
diff --git a/documentation/doc/openvibe-logo.png b/documentation/doc/openvibe-logo.png
deleted file mode 100644
index bf5bb9677c99403a154df7522a0d7a2a7250c068..0000000000000000000000000000000000000000
Binary files a/documentation/doc/openvibe-logo.png and /dev/null differ
diff --git a/documentation/doc/openvibe.css b/documentation/doc/openvibe.css
deleted file mode 100644
index 15f6b8c58a66812535e4285a5fdd29a7f1956498..0000000000000000000000000000000000000000
--- a/documentation/doc/openvibe.css
+++ /dev/null
@@ -1,29 +0,0 @@
-body {
-/*	position:relative;*/
-	max-width:11in;
-	margin:0 auto;
-	/*background:url('doc-bg.png') #fff left repeat-y;*/
-}
-
-#sidebar {
-	display: flex;
-	padding-bottom:10px;
-	width:100%;
-	flex-direction: row;
-}
-
-#sidebar > div {
-	flex: 1;
-}
-
-#sidebar ul {
-	padding-left:10px;
-}
-
-#sidebar li {
-	list-style:none;
-}
-
-#sidebar b {
-	font-weight:bold;
-}
diff --git a/documentation/doc/search.php b/documentation/doc/search.php
deleted file mode 100644
index d8d4da746a32e84c1abad0505b164b67b891584d..0000000000000000000000000000000000000000
--- a/documentation/doc/search.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-function argument_collector(&$v_argument_list, &$s_argument_method, &$s_argument_variable)
-{
-	if($_POST['q']!='')
-	{
-		$s_argument_method='post';
-		$v_argument_list=$_POST;
-		$s_argument_variable='_POST';
-	}
-	else if($_GET['q']!='')
-	{
-		$s_argument_method='get';
-		$v_argument_list=$_GET;
-		$s_argument_variable='_GET';
-	}
-	else if($HTTP_GET_VARS['q']!='')
-	{
-		$s_argument_method='get';
-		$v_argument_list=$HTTP_GET_VARS;
-		$s_argument_variable='HTTP_GET_VARS';
-	}
-	else
-	{
-		$s_argument_method='';
-		$v_argument_list=Array();
-		$s_argument_variable='(none)';
-	}
-}
-
-argument_collector($g_v_argument_list, $g_s_argument_method, $g_s_argument_variable);
-
-header("Location: http://www.google.com/search?q=".$g_v_argument_list['q']."+site%3Aopenvibe.inria.fr");
-
-?>
diff --git a/documentation/sphinx/Makefile b/documentation/sphinx/Makefile
deleted file mode 100644
index 733a8fce6b65e56273e16ef861e43a7a24fe46aa..0000000000000000000000000000000000000000
--- a/documentation/sphinx/Makefile
+++ /dev/null
@@ -1,229 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = build
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-
-.PHONY: help
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  applehelp  to make an Apple Help Book"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  epub3      to make an epub3"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-	@echo "  coverage   to run coverage check of the documentation (if enabled)"
-	@echo "  dummy      to check syntax errors of document sources"
-
-.PHONY: clean
-clean:
-	rm -rf $(BUILDDIR)/*
-
-.PHONY: html
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-.PHONY: livehtml
-livehtml:
-	sphinx-autobuild -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-
-.PHONY: dirhtml
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-.PHONY: singlehtml
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-.PHONY: pickle
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-.PHONY: json
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-.PHONY: htmlhelp
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-.PHONY: qthelp
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/NeuroRTArchway.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/NeuroRTArchway.qhc"
-
-.PHONY: applehelp
-applehelp:
-	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
-	@echo
-	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
-	@echo "N.B. You won't be able to view it unless you put it in" \
-	      "~/Library/Documentation/Help or install it in your application" \
-	      "bundle."
-
-.PHONY: devhelp
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/NeuroRTArchway"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/NeuroRTArchway"
-	@echo "# devhelp"
-
-.PHONY: epub
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-.PHONY: epub3
-epub3:
-	$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
-	@echo
-	@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
-
-.PHONY: latex
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-.PHONY: latexpdf
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: latexpdfja
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-.PHONY: text
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-.PHONY: man
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-.PHONY: texinfo
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-.PHONY: info
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-.PHONY: gettext
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-.PHONY: changes
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-.PHONY: linkcheck
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-.PHONY: doctest
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-.PHONY: coverage
-coverage:
-	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
-	@echo "Testing of coverage in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/coverage/python.txt."
-
-.PHONY: xml
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-.PHONY: pseudoxml
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
-
-.PHONY: dummy
-dummy:
-	$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
-	@echo
-	@echo "Build finished. Dummy builder generates no files."
diff --git a/documentation/sphinx/build-documentation.cmd b/documentation/sphinx/build-documentation.cmd
deleted file mode 100644
index 49ee5640ccae72875b58429549862880a7e1d2d9..0000000000000000000000000000000000000000
--- a/documentation/sphinx/build-documentation.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-setlocal
-setlocal enableextensions
-
-set "OV_PATH_ROOT=%~dp0.."
-set "PATH=%OV_PATH_ROOT%/bin;%PATH%"
-set "TEMPLATE_DIR=sphinx	emplates"
-if not exist %TEMPLATE_DIR% (md %TEMPLATE_DIR%)
-call openvibe-plugin-inspector-sdk --box-doc-directory sphinx/templates
-move sphinx\templates\index-boxes.rst sphinx\source\boxes
-pushd sphinx
-call make.bat html
-popd
-endlocal
-if exist ..\doc (rmdir /s /q ..\doc)
-mkdir ..\doc
-move sphinx\build\html "..\doc\OpenViBE Manual"
-
diff --git a/documentation/sphinx/build-documentation.sh b/documentation/sphinx/build-documentation.sh
deleted file mode 100644
index 3bdfa987132388c36c3cf1007d72d483fe98c538..0000000000000000000000000000000000000000
--- a/documentation/sphinx/build-documentation.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-export OV_PATH_ROOT="${PWD}/.."
-export LD_LIBRARY_PATH="${OV_PATH_ROOT}/lib"
-export DYLD_LIBRARY_PATH="${OV_PATH_ROOT}/lib"
-mkdir -p sphinx/templates
-"${OV_PATH_ROOT}/bin/openvibe-plugin-inspector-sdk" --box-doc-directory sphinx/templates
-mv sphinx/templates/index-boxes.rst sphinx/source/boxes
-
-pushd sphinx
-make html
-popd
-rm -fr "../doc/NeuroRT Manual"
-mkdir -p ../doc
-mv sphinx/build/html "../doc/OpenViBE Manual"
-
diff --git a/documentation/sphinx/make.bat b/documentation/sphinx/make.bat
deleted file mode 100644
index 2d2b1a0fc4ecfc2c73b2193fb8e75afe1b1da1b2..0000000000000000000000000000000000000000
--- a/documentation/sphinx/make.bat
+++ /dev/null
@@ -1,281 +0,0 @@
-@ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
-set I18NSPHINXOPTS=%SPHINXOPTS% source
-if NOT "%PAPER%" == "" (
-	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
-	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
-	:help
-	echo.Please use `make ^<target^>` where ^<target^> is one of
-	echo.  html       to make standalone HTML files
-	echo.  dirhtml    to make HTML files named index.html in directories
-	echo.  singlehtml to make a single large HTML file
-	echo.  pickle     to make pickle files
-	echo.  json       to make JSON files
-	echo.  htmlhelp   to make HTML files and a HTML help project
-	echo.  qthelp     to make HTML files and a qthelp project
-	echo.  devhelp    to make HTML files and a Devhelp project
-	echo.  epub       to make an epub
-	echo.  epub3      to make an epub3
-	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
-	echo.  text       to make text files
-	echo.  man        to make manual pages
-	echo.  texinfo    to make Texinfo files
-	echo.  gettext    to make PO message catalogs
-	echo.  changes    to make an overview over all changed/added/deprecated items
-	echo.  xml        to make Docutils-native XML files
-	echo.  pseudoxml  to make pseudoxml-XML files for display purposes
-	echo.  linkcheck  to check all external links for integrity
-	echo.  doctest    to run all doctests embedded in the documentation if enabled
-	echo.  coverage   to run coverage check of the documentation if enabled
-	echo.  dummy      to check syntax errors of document sources
-	goto end
-)
-
-if "%1" == "clean" (
-	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
-	del /q /s %BUILDDIR%\*
-	goto end
-)
-
-
-REM Check if sphinx-build is available and fallback to Python version if any
-%SPHINXBUILD% 1>NUL 2>NUL
-if errorlevel 9009 goto sphinx_python
-goto sphinx_ok
-
-:sphinx_python
-
-set SPHINXBUILD=python -m sphinx.__init__
-%SPHINXBUILD% 2> nul
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.http://sphinx-doc.org/
-	exit /b 1
-)
-
-:sphinx_ok
-
-
-if "%1" == "html" (
-	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
-	goto end
-)
-
-if "%1" == "dirhtml" (
-	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
-	goto end
-)
-
-if "%1" == "singlehtml" (
-	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
-	goto end
-)
-
-if "%1" == "pickle" (
-	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the pickle files.
-	goto end
-)
-
-if "%1" == "json" (
-	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the JSON files.
-	goto end
-)
-
-if "%1" == "htmlhelp" (
-	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
-	goto end
-)
-
-if "%1" == "qthelp" (
-	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
-	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\NeuroRTArchway.qhcp
-	echo.To view the help file:
-	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\NeuroRTArchway.ghc
-	goto end
-)
-
-if "%1" == "devhelp" (
-	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished.
-	goto end
-)
-
-if "%1" == "epub" (
-	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The epub file is in %BUILDDIR%/epub.
-	goto end
-)
-
-if "%1" == "epub3" (
-	%SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The epub3 file is in %BUILDDIR%/epub3.
-	goto end
-)
-
-if "%1" == "latex" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "latexpdf" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	cd %BUILDDIR%/latex
-	make all-pdf
-	cd %~dp0
-	echo.
-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "latexpdfja" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	cd %BUILDDIR%/latex
-	make all-pdf-ja
-	cd %~dp0
-	echo.
-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "text" (
-	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The text files are in %BUILDDIR%/text.
-	goto end
-)
-
-if "%1" == "man" (
-	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The manual pages are in %BUILDDIR%/man.
-	goto end
-)
-
-if "%1" == "texinfo" (
-	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
-	goto end
-)
-
-if "%1" == "gettext" (
-	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
-	goto end
-)
-
-if "%1" == "changes" (
-	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.The overview file is in %BUILDDIR%/changes.
-	goto end
-)
-
-if "%1" == "linkcheck" (
-	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
-	goto end
-)
-
-if "%1" == "doctest" (
-	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
-	goto end
-)
-
-if "%1" == "coverage" (
-	%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Testing of coverage in the sources finished, look at the ^
-results in %BUILDDIR%/coverage/python.txt.
-	goto end
-)
-
-if "%1" == "xml" (
-	%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The XML files are in %BUILDDIR%/xml.
-	goto end
-)
-
-if "%1" == "pseudoxml" (
-	%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
-	goto end
-)
-
-if "%1" == "dummy" (
-	%SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. Dummy builder generates no files.
-	goto end
-)
-
-:end
diff --git a/documentation/sphinx/source/_static/css/openvibe.css b/documentation/sphinx/source/_static/css/openvibe.css
deleted file mode 100644
index 61a92bcbf32b7963a3f968faec67f5797f365357..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/_static/css/openvibe.css
+++ /dev/null
@@ -1,50 +0,0 @@
-@import url("theme.css");
-
-.color-stream-unidentified {
-  color: #F2F2F2;
-}
-
-.color-stream-if-else {
-  color: #00FDFF;
-}
-
-.color-stream-ebml {
-  color: #ABAEE5;
-}
-
-.color-stream-experiment-information {
-  color: #F0D688;
-}
-
-.color-stream-stimulations {
-  color: #B288AD;
-}
-
-.color-stream-streamed-matrix {
-  color: #A5ED80;
-}
-
-.color-stream-covariance-matrix {
-  color: #82B784;
-}
-
-.color-stream-channel-localization {
-  color: #87A3F4;
-}
-
-.color-stream-feature-vector {
-  color: #F49599;
-}
-
-.color-stream-signal {
-  color: #EA99E1;
-}
-
-.color-stream-spectrum {
-  color: #F6D99C;
-}
-
-.color-stream-time-frequency {
-  color: #F6F99C;
-}
-
diff --git a/documentation/sphinx/source/conf.py b/documentation/sphinx/source/conf.py
deleted file mode 100644
index d70c2144224543e821ec25c67ae89ff69e1a1f0b..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/conf.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# OpenViBE documentation build configuration file, created by
-# sphinx-quickstart on Fri Jun 24 16:43:33 2016.
-#
-# 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.
-
-# 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.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration ------------------------------------------------
-
-extensions = [
-    'sphinx.ext.todo',
-    'sphinx.ext.mathjax',
-    'sphinx.ext.ifconfig',
-]
-
-templates_path = ['_templates']
-
-source_suffix = '.rst'
-
-source_encoding = 'utf-8-sig'
-
-master_doc = 'index'
-
-# General information about the project.
-project = u'OpenViBE'
-copyright = u'2018, Inria & Mensia'
-author = u'OpenViBE Team'
-
-# The short X.Y version.
-version = u'3.2'
-# The full version, including alpha/beta/rc tags.
-release = u'3.2'
-
-language = None
-
-exclude_patterns = []
-
-pygments_style = 'sphinx'
-
-todo_include_todos = True
-
-html_theme = 'sphinx_rtd_theme'
-
-html_static_path = ['_static']
-
-html_style = 'css/openvibe.css'
-
-html_extra_path = []
-
-htmlhelp_basename = 'OpenViBEdoc'
-
-rst_epilog = """
-.. |Brand| replace:: OpenViBE
-.. |AuthTool| replace:: Designer
-.. |BulletEngCtrlPanel| replace:: Custom Tools
-"""
diff --git a/documentation/sphinx/source/data-formats/images/acquisition-stream-small.png b/documentation/sphinx/source/data-formats/images/acquisition-stream-small.png
deleted file mode 100644
index 8c0c5b6e9668764887ca747b9b599a172b0c7b38..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/acquisition-stream-small.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/chanloc-stream-card.png b/documentation/sphinx/source/data-formats/images/chanloc-stream-card.png
deleted file mode 100644
index 8d110f9bce65b66bc9d8d5ea4ffca3c1b37a1687..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/chanloc-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/ebml-stream-card.png b/documentation/sphinx/source/data-formats/images/ebml-stream-card.png
deleted file mode 100644
index dca51282da9ae62230ac8f5d79e581d96e9c2798..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/ebml-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/fvec-stream-card.png b/documentation/sphinx/source/data-formats/images/fvec-stream-card.png
deleted file mode 100644
index cb6889c802dc6b1923ae9ef3c13647d7295726e5..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/fvec-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/signal-stream-card.png b/documentation/sphinx/source/data-formats/images/signal-stream-card.png
deleted file mode 100644
index 43297b8be1e26cd0a07a8ab6431bcccf1868bd1f..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/signal-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/sm-stream-card.png b/documentation/sphinx/source/data-formats/images/sm-stream-card.png
deleted file mode 100644
index 906d344aa838c71b6bc20ef330517d1f9e7bae17..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/sm-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/spec-stream-card.png b/documentation/sphinx/source/data-formats/images/spec-stream-card.png
deleted file mode 100644
index 56f15102b9e85a44f3deca0aaa298a9950bb4432..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/spec-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/stim-stream-card.png b/documentation/sphinx/source/data-formats/images/stim-stream-card.png
deleted file mode 100644
index 29f271ddcb530888b142b30c1d03648d08c738ea..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/stim-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/streams.png b/documentation/sphinx/source/data-formats/images/streams.png
deleted file mode 100644
index c8c9837179405b611a8c88ab0027a901c9d931c7..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/streams.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/images/xp-stream-card.png b/documentation/sphinx/source/data-formats/images/xp-stream-card.png
deleted file mode 100644
index 9cb5c2c48a9489043d72d149284d662af38575e2..0000000000000000000000000000000000000000
Binary files a/documentation/sphinx/source/data-formats/images/xp-stream-card.png and /dev/null differ
diff --git a/documentation/sphinx/source/data-formats/index-data-formats.rst b/documentation/sphinx/source/data-formats/index-data-formats.rst
deleted file mode 100644
index a5f490cd7283f6d7feddf70658b2cd6954fec4d2..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/data-formats/index-data-formats.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-Data Formats Documentation
-==========================
-
-.. toctree::
-   :maxdepth: 1
-
-   stream-structures
-   stimulations
-   matrix-file-format
diff --git a/documentation/sphinx/source/data-formats/matrix-file-format.rst b/documentation/sphinx/source/data-formats/matrix-file-format.rst
deleted file mode 100644
index 44d79d687da8049d5b1edf1fd87ac4c6ebce3c3c..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/data-formats/matrix-file-format.rst
+++ /dev/null
@@ -1,67 +0,0 @@
-.. _Doc_MatrixFileFormat:
-
-Matrix File Format
-==================
-
-Sometimes it is useful to be able to save/load OpenViBE matrices to/from disk.
-Examples of such matrices are channel localization data that contains a list of
-electrode names and their coordinates, and color scales, which may be used by
-visualisation plugins to map potentials to colors. To that end, an OpenViBE
-matrix file format was defined and OpenViBE matrix file reader/writer
-algorithms created to process it. For a programmer, either the algorithms can
-be used, or more straightforwardly via the toolkit functions,
-
-.. code::
-
-   OpenViBE::Toolkit::Matrix::saveToTextFile(...)
-   OpenViBE::Toolkit::Matrix::loadFromTextFile(...)
-
-On disk, this format follows a very simple text syntax for maximum portability.
-
-.. note::
-
-  Since the matrices are stored as text, they do not maintain absolute float
-  precision. For the aforementioned save routine, a desired precision can be
-  given.
-
-Comments may be inserted anywhere, start with a ``#`` character and extend to
-the end of the line.
-
-Also, trailing/leading whitespaces on a line are trimmed by the parser.
-
-The file should begin by the header section, delimited by opening and closing
-brackets. Each dimension of the matrix is listed in turn and delimited by its
-own opening and closing brackets. Dimension element labels should be declared
-within these brackets, each being delimited by quotation marks. Empty labels
-may be used, and the number of labels must match the dimension size. This is
-what a header might look like :
-
-::
-
-   # header
-   [
-           [ "color1" "color2" ]
-           [ "Red" "Green" "Blue" ]
-   ]
-
-The next section of the file is the buffer part of the matrix. Opening and closing brackets are used to identify dimensions. Elements are listed in the innermost dimension, and are separated by quotation marks. This is what an appropriate buffer could look like for a 2×3 matrix :
-
-::
-
-   # header
-   [
-           [ "color1" "color2" ]
-           [ "Red" "Green" "Blue" ]
-   ]
-   
-   #buffer
-   
-   [ #color1
-           [1 0 0] #red
-   ]
-   
-   [ #color2
-           [0 1 0] #blue
-   ]
-   
-   #end of buffer
diff --git a/documentation/sphinx/source/data-formats/stimulations.rst b/documentation/sphinx/source/data-formats/stimulations.rst
deleted file mode 100644
index 9126b7374f8a4e47a437ddeb0f4928934cbbc0f1..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/data-formats/stimulations.rst
+++ /dev/null
@@ -1,443 +0,0 @@
-.. _Doc_Stimulations:
-
-Stimulations
-============
-
-Stimulation codes for available named stimulations are:
-
-.. csv-table::
-   :header: "Stimulation Name", "Stimulation Code"
-
-   "OVTK_StimulationId_ExperimentStart", "0x00008001"
-   "OVTK_StimulationId_ExperimentStop", "0x00008002"
-   "OVTK_StimulationId_SegmentStart", "0x00008003"
-   "OVTK_StimulationId_SegmentStop", "0x00008004"
-   "OVTK_StimulationId_TrialStart", "0x00008005"
-   "OVTK_StimulationId_TrialStop", "0x00008006"
-   "OVTK_StimulationId_BaselineStart", "0x00008007"
-   "OVTK_StimulationId_BaselineStop", "0x00008008"
-   "OVTK_StimulationId_RestStart", "0x00008009"
-   "OVTK_StimulationId_RestStop", "0x0000800a"
-   "OVTK_StimulationId_VisualStimulationStart", "0x0000800b"
-   "OVTK_StimulationId_VisualStimulationStop", "0x0000800c"
-   "OVTK_StimulationId_VisualSteadyStateStimulationStart", "0x00008010"
-   "OVTK_StimulationId_VisualSteadyStateStimulationStop", "0x00008011"
-   "OVTK_StimulationId_Button1_Pressed", "0x00008012"
-   "OVTK_StimulationId_Button1_Released", "0x00008013"
-   "OVTK_StimulationId_Button2_Pressed", "0x00008014"
-   "OVTK_StimulationId_Button2_Released", "0x00008015"
-   "OVTK_StimulationId_Button3_Pressed", "0x00008016"
-   "OVTK_StimulationId_Button3_Released", "0x00008017"
-   "OVTK_StimulationId_Button4_Pressed", "0x00008018"
-   "OVTK_StimulationId_Button4_Released", "0x00008019"
-   "OVTK_StimulationId_Label_00", "0x00008100"
-   "OVTK_StimulationId_Label_01", "0x00008101"
-   "OVTK_StimulationId_Label_02", "0x00008102"
-   "OVTK_StimulationId_Label_03", "0x00008103"
-   "OVTK_StimulationId_Label_04", "0x00008104"
-   "OVTK_StimulationId_Label_05", "0x00008105"
-   "OVTK_StimulationId_Label_06", "0x00008106"
-   "OVTK_StimulationId_Label_07", "0x00008107"
-   "OVTK_StimulationId_Label_08", "0x00008108"
-   "OVTK_StimulationId_Label_09", "0x00008109"
-   "OVTK_StimulationId_Label_0A", "0x0000810a"
-   "OVTK_StimulationId_Label_0B", "0x0000810b"
-   "OVTK_StimulationId_Label_0C", "0x0000810c"
-   "OVTK_StimulationId_Label_0D", "0x0000810d"
-   "OVTK_StimulationId_Label_0E", "0x0000810e"
-   "OVTK_StimulationId_Label_0F", "0x0000810f"
-   "OVTK_StimulationId_Label_10", "0x00008110"
-   "OVTK_StimulationId_Label_11", "0x00008111"
-   "OVTK_StimulationId_Label_12", "0x00008112"
-   "OVTK_StimulationId_Label_13", "0x00008113"
-   "OVTK_StimulationId_Label_14", "0x00008114"
-   "OVTK_StimulationId_Label_15", "0x00008115"
-   "OVTK_StimulationId_Label_16", "0x00008116"
-   "OVTK_StimulationId_Label_17", "0x00008117"
-   "OVTK_StimulationId_Label_18", "0x00008118"
-   "OVTK_StimulationId_Label_19", "0x00008119"
-   "OVTK_StimulationId_Label_1A", "0x0000811a"
-   "OVTK_StimulationId_Label_1B", "0x0000811b"
-   "OVTK_StimulationId_Label_1C", "0x0000811c"
-   "OVTK_StimulationId_Label_1D", "0x0000811d"
-   "OVTK_StimulationId_Label_1E", "0x0000811e"
-   "OVTK_StimulationId_Label_1F", "0x0000811f"
-   "OVTK_StimulationId_Label_20", "0x00008120"
-   "OVTK_StimulationId_Label_21", "0x00008121"
-   "OVTK_StimulationId_Label_22", "0x00008122"
-   "OVTK_StimulationId_Label_23", "0x00008123"
-   "OVTK_StimulationId_Label_24", "0x00008124"
-   "OVTK_StimulationId_Label_25", "0x00008125"
-   "OVTK_StimulationId_Label_26", "0x00008126"
-   "OVTK_StimulationId_Label_27", "0x00008127"
-   "OVTK_StimulationId_Label_28", "0x00008128"
-   "OVTK_StimulationId_Label_29", "0x00008129"
-   "OVTK_StimulationId_Label_2A", "0x0000812a"
-   "OVTK_StimulationId_Label_2B", "0x0000812b"
-   "OVTK_StimulationId_Label_2C", "0x0000812c"
-   "OVTK_StimulationId_Label_2D", "0x0000812d"
-   "OVTK_StimulationId_Label_2E", "0x0000812e"
-   "OVTK_StimulationId_Label_2F", "0x0000812f"
-   "OVTK_StimulationId_Label_30", "0x00008130"
-   "OVTK_StimulationId_Label_31", "0x00008131"
-   "OVTK_StimulationId_Label_32", "0x00008132"
-   "OVTK_StimulationId_Label_33", "0x00008133"
-   "OVTK_StimulationId_Label_34", "0x00008134"
-   "OVTK_StimulationId_Label_35", "0x00008135"
-   "OVTK_StimulationId_Label_36", "0x00008136"
-   "OVTK_StimulationId_Label_37", "0x00008137"
-   "OVTK_StimulationId_Label_38", "0x00008138"
-   "OVTK_StimulationId_Label_39", "0x00008139"
-   "OVTK_StimulationId_Label_3A", "0x0000813a"
-   "OVTK_StimulationId_Label_3B", "0x0000813b"
-   "OVTK_StimulationId_Label_3C", "0x0000813c"
-   "OVTK_StimulationId_Label_3D", "0x0000813d"
-   "OVTK_StimulationId_Label_3E", "0x0000813e"
-   "OVTK_StimulationId_Label_3F", "0x0000813f"
-   "OVTK_StimulationId_Label_40", "0x00008140"
-   "OVTK_StimulationId_Label_41", "0x00008141"
-   "OVTK_StimulationId_Label_42", "0x00008142"
-   "OVTK_StimulationId_Label_43", "0x00008143"
-   "OVTK_StimulationId_Label_44", "0x00008144"
-   "OVTK_StimulationId_Label_45", "0x00008145"
-   "OVTK_StimulationId_Label_46", "0x00008146"
-   "OVTK_StimulationId_Label_47", "0x00008147"
-   "OVTK_StimulationId_Label_48", "0x00008148"
-   "OVTK_StimulationId_Label_49", "0x00008149"
-   "OVTK_StimulationId_Label_4A", "0x0000814a"
-   "OVTK_StimulationId_Label_4B", "0x0000814b"
-   "OVTK_StimulationId_Label_4C", "0x0000814c"
-   "OVTK_StimulationId_Label_4D", "0x0000814d"
-   "OVTK_StimulationId_Label_4E", "0x0000814e"
-   "OVTK_StimulationId_Label_4F", "0x0000814f"
-   "OVTK_StimulationId_Label_50", "0x00008150"
-   "OVTK_StimulationId_Label_51", "0x00008151"
-   "OVTK_StimulationId_Label_52", "0x00008152"
-   "OVTK_StimulationId_Label_53", "0x00008153"
-   "OVTK_StimulationId_Label_54", "0x00008154"
-   "OVTK_StimulationId_Label_55", "0x00008155"
-   "OVTK_StimulationId_Label_56", "0x00008156"
-   "OVTK_StimulationId_Label_57", "0x00008157"
-   "OVTK_StimulationId_Label_58", "0x00008158"
-   "OVTK_StimulationId_Label_59", "0x00008159"
-   "OVTK_StimulationId_Label_5A", "0x0000815a"
-   "OVTK_StimulationId_Label_5B", "0x0000815b"
-   "OVTK_StimulationId_Label_5C", "0x0000815c"
-   "OVTK_StimulationId_Label_5D", "0x0000815d"
-   "OVTK_StimulationId_Label_5E", "0x0000815e"
-   "OVTK_StimulationId_Label_5F", "0x0000815f"
-   "OVTK_StimulationId_Label_60", "0x00008160"
-   "OVTK_StimulationId_Label_61", "0x00008161"
-   "OVTK_StimulationId_Label_62", "0x00008162"
-   "OVTK_StimulationId_Label_63", "0x00008163"
-   "OVTK_StimulationId_Label_64", "0x00008164"
-   "OVTK_StimulationId_Label_65", "0x00008165"
-   "OVTK_StimulationId_Label_66", "0x00008166"
-   "OVTK_StimulationId_Label_67", "0x00008167"
-   "OVTK_StimulationId_Label_68", "0x00008168"
-   "OVTK_StimulationId_Label_69", "0x00008169"
-   "OVTK_StimulationId_Label_6A", "0x0000816a"
-   "OVTK_StimulationId_Label_6B", "0x0000816b"
-   "OVTK_StimulationId_Label_6C", "0x0000816c"
-   "OVTK_StimulationId_Label_6D", "0x0000816d"
-   "OVTK_StimulationId_Label_6E", "0x0000816e"
-   "OVTK_StimulationId_Label_6F", "0x0000816f"
-   "OVTK_StimulationId_Label_70", "0x00008170"
-   "OVTK_StimulationId_Label_71", "0x00008171"
-   "OVTK_StimulationId_Label_72", "0x00008172"
-   "OVTK_StimulationId_Label_73", "0x00008173"
-   "OVTK_StimulationId_Label_74", "0x00008174"
-   "OVTK_StimulationId_Label_75", "0x00008175"
-   "OVTK_StimulationId_Label_76", "0x00008176"
-   "OVTK_StimulationId_Label_77", "0x00008177"
-   "OVTK_StimulationId_Label_78", "0x00008178"
-   "OVTK_StimulationId_Label_79", "0x00008179"
-   "OVTK_StimulationId_Label_7A", "0x0000817a"
-   "OVTK_StimulationId_Label_7B", "0x0000817b"
-   "OVTK_StimulationId_Label_7C", "0x0000817c"
-   "OVTK_StimulationId_Label_7D", "0x0000817d"
-   "OVTK_StimulationId_Label_7E", "0x0000817e"
-   "OVTK_StimulationId_Label_7F", "0x0000817f"
-   "OVTK_StimulationId_Label_80", "0x00008180"
-   "OVTK_StimulationId_Label_81", "0x00008181"
-   "OVTK_StimulationId_Label_82", "0x00008182"
-   "OVTK_StimulationId_Label_83", "0x00008183"
-   "OVTK_StimulationId_Label_84", "0x00008184"
-   "OVTK_StimulationId_Label_85", "0x00008185"
-   "OVTK_StimulationId_Label_86", "0x00008186"
-   "OVTK_StimulationId_Label_87", "0x00008187"
-   "OVTK_StimulationId_Label_88", "0x00008188"
-   "OVTK_StimulationId_Label_89", "0x00008189"
-   "OVTK_StimulationId_Label_8A", "0x0000818a"
-   "OVTK_StimulationId_Label_8B", "0x0000818b"
-   "OVTK_StimulationId_Label_8C", "0x0000818c"
-   "OVTK_StimulationId_Label_8D", "0x0000818d"
-   "OVTK_StimulationId_Label_8E", "0x0000818e"
-   "OVTK_StimulationId_Label_8F", "0x0000818f"
-   "OVTK_StimulationId_Label_90", "0x00008190"
-   "OVTK_StimulationId_Label_91", "0x00008191"
-   "OVTK_StimulationId_Label_92", "0x00008192"
-   "OVTK_StimulationId_Label_93", "0x00008193"
-   "OVTK_StimulationId_Label_94", "0x00008194"
-   "OVTK_StimulationId_Label_95", "0x00008195"
-   "OVTK_StimulationId_Label_96", "0x00008196"
-   "OVTK_StimulationId_Label_97", "0x00008197"
-   "OVTK_StimulationId_Label_98", "0x00008198"
-   "OVTK_StimulationId_Label_99", "0x00008199"
-   "OVTK_StimulationId_Label_9A", "0x0000819a"
-   "OVTK_StimulationId_Label_9B", "0x0000819b"
-   "OVTK_StimulationId_Label_9C", "0x0000819c"
-   "OVTK_StimulationId_Label_9D", "0x0000819d"
-   "OVTK_StimulationId_Label_9E", "0x0000819e"
-   "OVTK_StimulationId_Label_9F", "0x0000819f"
-   "OVTK_StimulationId_Label_A0", "0x000081a0"
-   "OVTK_StimulationId_Label_A1", "0x000081a1"
-   "OVTK_StimulationId_Label_A2", "0x000081a2"
-   "OVTK_StimulationId_Label_A3", "0x000081a3"
-   "OVTK_StimulationId_Label_A4", "0x000081a4"
-   "OVTK_StimulationId_Label_A5", "0x000081a5"
-   "OVTK_StimulationId_Label_A6", "0x000081a6"
-   "OVTK_StimulationId_Label_A7", "0x000081a7"
-   "OVTK_StimulationId_Label_A8", "0x000081a8"
-   "OVTK_StimulationId_Label_A9", "0x000081a9"
-   "OVTK_StimulationId_Label_AA", "0x000081aa"
-   "OVTK_StimulationId_Label_AB", "0x000081ab"
-   "OVTK_StimulationId_Label_AC", "0x000081ac"
-   "OVTK_StimulationId_Label_AD", "0x000081ad"
-   "OVTK_StimulationId_Label_AE", "0x000081ae"
-   "OVTK_StimulationId_Label_AF", "0x000081af"
-   "OVTK_StimulationId_Label_B0", "0x000081b0"
-   "OVTK_StimulationId_Label_B1", "0x000081b1"
-   "OVTK_StimulationId_Label_B2", "0x000081b2"
-   "OVTK_StimulationId_Label_B3", "0x000081b3"
-   "OVTK_StimulationId_Label_B4", "0x000081b4"
-   "OVTK_StimulationId_Label_B5", "0x000081b5"
-   "OVTK_StimulationId_Label_B6", "0x000081b6"
-   "OVTK_StimulationId_Label_B7", "0x000081b7"
-   "OVTK_StimulationId_Label_B8", "0x000081b8"
-   "OVTK_StimulationId_Label_B9", "0x000081b9"
-   "OVTK_StimulationId_Label_BA", "0x000081ba"
-   "OVTK_StimulationId_Label_BB", "0x000081bb"
-   "OVTK_StimulationId_Label_BC", "0x000081bc"
-   "OVTK_StimulationId_Label_BD", "0x000081bd"
-   "OVTK_StimulationId_Label_BE", "0x000081be"
-   "OVTK_StimulationId_Label_BF", "0x000081bf"
-   "OVTK_StimulationId_Label_C0", "0x000081c0"
-   "OVTK_StimulationId_Label_C1", "0x000081c1"
-   "OVTK_StimulationId_Label_C2", "0x000081c2"
-   "OVTK_StimulationId_Label_C3", "0x000081c3"
-   "OVTK_StimulationId_Label_C4", "0x000081c4"
-   "OVTK_StimulationId_Label_C5", "0x000081c5"
-   "OVTK_StimulationId_Label_C6", "0x000081c6"
-   "OVTK_StimulationId_Label_C7", "0x000081c7"
-   "OVTK_StimulationId_Label_C8", "0x000081c8"
-   "OVTK_StimulationId_Label_C9", "0x000081c9"
-   "OVTK_StimulationId_Label_CA", "0x000081ca"
-   "OVTK_StimulationId_Label_CB", "0x000081cb"
-   "OVTK_StimulationId_Label_CC", "0x000081cc"
-   "OVTK_StimulationId_Label_CD", "0x000081cd"
-   "OVTK_StimulationId_Label_CE", "0x000081ce"
-   "OVTK_StimulationId_Label_CF", "0x000081cf"
-   "OVTK_StimulationId_Label_D0", "0x000081d0"
-   "OVTK_StimulationId_Label_D1", "0x000081d1"
-   "OVTK_StimulationId_Label_D2", "0x000081d2"
-   "OVTK_StimulationId_Label_D3", "0x000081d3"
-   "OVTK_StimulationId_Label_D4", "0x000081d4"
-   "OVTK_StimulationId_Label_D5", "0x000081d5"
-   "OVTK_StimulationId_Label_D6", "0x000081d6"
-   "OVTK_StimulationId_Label_D7", "0x000081d7"
-   "OVTK_StimulationId_Label_D8", "0x000081d8"
-   "OVTK_StimulationId_Label_D9", "0x000081d9"
-   "OVTK_StimulationId_Label_DA", "0x000081da"
-   "OVTK_StimulationId_Label_DB", "0x000081db"
-   "OVTK_StimulationId_Label_DC", "0x000081dc"
-   "OVTK_StimulationId_Label_DD", "0x000081dd"
-   "OVTK_StimulationId_Label_DE", "0x000081de"
-   "OVTK_StimulationId_Label_DF", "0x000081df"
-   "OVTK_StimulationId_Label_E0", "0x000081e0"
-   "OVTK_StimulationId_Label_E1", "0x000081e1"
-   "OVTK_StimulationId_Label_E2", "0x000081e2"
-   "OVTK_StimulationId_Label_E3", "0x000081e3"
-   "OVTK_StimulationId_Label_E4", "0x000081e4"
-   "OVTK_StimulationId_Label_E5", "0x000081e5"
-   "OVTK_StimulationId_Label_E6", "0x000081e6"
-   "OVTK_StimulationId_Label_E7", "0x000081e7"
-   "OVTK_StimulationId_Label_E8", "0x000081e8"
-   "OVTK_StimulationId_Label_E9", "0x000081e9"
-   "OVTK_StimulationId_Label_EA", "0x000081ea"
-   "OVTK_StimulationId_Label_EB", "0x000081eb"
-   "OVTK_StimulationId_Label_EC", "0x000081ec"
-   "OVTK_StimulationId_Label_ED", "0x000081ed"
-   "OVTK_StimulationId_Label_EE", "0x000081ee"
-   "OVTK_StimulationId_Label_EF", "0x000081ef"
-   "OVTK_StimulationId_Label_F0", "0x000081f0"
-   "OVTK_StimulationId_Label_F1", "0x000081f1"
-   "OVTK_StimulationId_Label_F2", "0x000081f2"
-   "OVTK_StimulationId_Label_F3", "0x000081f3"
-   "OVTK_StimulationId_Label_F4", "0x000081f4"
-   "OVTK_StimulationId_Label_F5", "0x000081f5"
-   "OVTK_StimulationId_Label_F6", "0x000081f6"
-   "OVTK_StimulationId_Label_F7", "0x000081f7"
-   "OVTK_StimulationId_Label_F8", "0x000081f8"
-   "OVTK_StimulationId_Label_F9", "0x000081f9"
-   "OVTK_StimulationId_Label_FA", "0x000081fa"
-   "OVTK_StimulationId_Label_FB", "0x000081fb"
-   "OVTK_StimulationId_Label_FC", "0x000081fc"
-   "OVTK_StimulationId_Label_FD", "0x000081fd"
-   "OVTK_StimulationId_Label_FE", "0x000081fe"
-   "OVTK_StimulationId_Label_FF", "0x000081ff"
-   "OVTK_StimulationId_Number_00", "0x00000000"
-   "OVTK_StimulationId_Number_01", "0x00000001"
-   "OVTK_StimulationId_Number_02", "0x00000002"
-   "OVTK_StimulationId_Number_03", "0x00000003"
-   "OVTK_StimulationId_Number_04", "0x00000004"
-   "OVTK_StimulationId_Number_05", "0x00000005"
-   "OVTK_StimulationId_Number_06", "0x00000006"
-   "OVTK_StimulationId_Number_07", "0x00000007"
-   "OVTK_StimulationId_Number_08", "0x00000008"
-   "OVTK_StimulationId_Number_09", "0x00000009"
-   "OVTK_StimulationId_Number_0A", "0x0000000a"
-   "OVTK_StimulationId_Number_0B", "0x0000000b"
-   "OVTK_StimulationId_Number_0C", "0x0000000c"
-   "OVTK_StimulationId_Number_0D", "0x0000000d"
-   "OVTK_StimulationId_Number_0E", "0x0000000e"
-   "OVTK_StimulationId_Number_0F", "0x0000000f"
-   "OVTK_StimulationId_Number_10", "0x00000010"
-   "OVTK_StimulationId_Number_11", "0x00000011"
-   "OVTK_StimulationId_Number_12", "0x00000012"
-   "OVTK_StimulationId_Number_13", "0x00000013"
-   "OVTK_StimulationId_Number_14", "0x00000014"
-   "OVTK_StimulationId_Number_15", "0x00000015"
-   "OVTK_StimulationId_Number_16", "0x00000016"
-   "OVTK_StimulationId_Number_17", "0x00000017"
-   "OVTK_StimulationId_Number_18", "0x00000018"
-   "OVTK_StimulationId_Number_19", "0x00000019"
-   "OVTK_StimulationId_Number_1A", "0x0000001a"
-   "OVTK_StimulationId_Number_1B", "0x0000001b"
-   "OVTK_StimulationId_Number_1C", "0x0000001c"
-   "OVTK_StimulationId_Number_1D", "0x0000001d"
-   "OVTK_StimulationId_Number_1E", "0x0000001e"
-   "OVTK_StimulationId_Number_1F", "0x0000001f"
-   "OVTK_StimulationId_Train", "0x00008201"
-   "OVTK_StimulationId_Beep", "0x00008202"
-   "OVTK_StimulationId_DoubleBeep", "0x00008203"
-   "OVTK_StimulationId_EndOfFile", "0x00008204"
-   "OVTK_StimulationId_Target", "0x00008205"
-   "OVTK_StimulationId_NonTarget", "0x00008206"
-   "OVTK_StimulationId_TrainCompleted", "0x00008207"
-   "OVTK_StimulationId_Reset", "0x00008208"
-   "OVTK_StimulationId_ThresholdPassed_Positive", "0x00008209"
-   "OVTK_StimulationId_ThresholdPassed_Negative", "0x00008210"
-   "OVTK_StimulationId_NoArtifact", "0x00008301"
-   "OVTK_StimulationId_Artifact", "0x00008302"
-   "OVTK_StimulationId_RemovedSamples", "0x00008310"
-   "OVTK_StimulationId_AddedSamplesBegin", "0x00008311"
-   "OVTK_StimulationId_AddedSamplesEnd", "0x00008312"
-   "OVTK_GDF_Artifact_EOG_Large", "0x101"
-   "OVTK_GDF_Artifact_ECG", "0x102"
-   "OVTK_GDF_Artifact_EMG", "0x103"
-   "OVTK_GDF_Artifact_Movement", "0x104"
-   "OVTK_GDF_Artifact_Failing_Electrode0x00008004", "0x105"
-   "OVTK_GDF_Artifact_Sweat", "0x106"
-   "OVTK_GDF_Artifact_50_60_Hz_Interference", "0x107"
-   "OVTK_GDF_Artifact_Breathing", "0x108"
-   "OVTK_GDF_Artifact_Pulse", "0x109"
-   "OVTK_GDF_Artifact_EOG_Small", "0x10A"
-   "OVTK_GDF_Calibration", "0x10F"
-   "OVTK_GDF_EEG_Sleep_Splindles", "0x111"
-   "OVTK_GDF_EEG_K_Complexes", "0x112"
-   "OVTK_GDF_EEG_Saw_Tooth_Waves", "0x113"
-   "OVTK_GDF_EEG_Idling_EEG_Eyes_Open", "0x114"
-   "OVTK_GDF_EEG_Idling_EEG_Eyes_Closed", "0x115"
-   "OVTK_GDF_EEG_Spike", "0x116"
-   "OVTK_GDF_EEG_Seizure", "0x117"
-   "OVTK_GDF_VEP", "0x121"
-   "OVTK_GDF_AEP", "0x122"
-   "OVTK_GDF_SEP", "0x123"
-   "OVTK_GDF_TMS", "0x12F"
-   "OVTK_GDF_SSVEP", "0x131"
-   "OVTK_GDF_SSAEP", "0x132"
-   "OVTK_GDF_SSSEP", "0x133"
-   "OVTK_GDF_Start_Of_Trial", "0x300"
-   "OVTK_GDF_Left", "0x301"
-   "OVTK_GDF_Right", "0x302"
-   "OVTK_GDF_Foot", "0x303"
-   "OVTK_GDF_Tongue", "0x304"
-   "OVTK_GDF_class5", "0x305"
-   "OVTK_GDF_Down", "0x306"
-   "OVTK_GDF_class7", "0x307"
-   "OVTK_GDF_class8", "0x308"
-   "OVTK_GDF_class9", "0x309"
-   "OVTK_GDF_class10", "0x30A"
-   "OVTK_GDF_class11", "0x30B"
-   "OVTK_GDF_Up", "0x30C"
-   "OVTK_GDF_Feedback_Continuous", "0x30D"
-   "OVTK_GDF_Feedback_Discrete", "0x30E"
-   "OVTK_GDF_Cue_Unknown_Undefined", "0x30F"
-   "OVTK_GDF_Beep", "0x311"
-   "OVTK_GDF_Cross_On_Screen", "0x312"
-   "OVTK_GDF_Flashing_Light", "0x313"
-   "OVTK_GDF_End_Of_Trial", "0x320"
-   "OVTK_GDF_Correct", "0x381"
-   "OVTK_GDF_Incorrect", "0x382"
-   "OVTK_GDF_End_Of_Session", "0x3F2"
-   "OVTK_GDF_Rejection", "0x3FF"
-   "OVTK_GDF_OAHE", "0x401"
-   "OVTK_GDF_RERA", "0x402"
-   "OVTK_GDF_CAHE", "0x403"
-   "OVTK_GDF_CSB", "0x404"
-   "OVTK_GDF_Sleep_Hypoventilation", "0x405"
-   "OVTK_GDF_Maximum_Inspiration", "0x40E"
-   "OVTK_GDF_Start_Of_Inspiration", "0x40F"
-   "OVTK_GDF_Wake", "0x410"
-   "OVTK_GDF_Stage_1", "0x411"
-   "OVTK_GDF_Stage_2", "0x412"
-   "OVTK_GDF_Stage_3", "0x413"
-   "OVTK_GDF_Stage_4", "0x414"
-   "OVTK_GDF_REM", "0x415"
-   "OVTK_GDF_Lights_On", "0x420"
-   "OVTK_GDF_Lights_Off", "0x8420"
-   "OVTK_GDF_Eyes_Left", "0x431"
-   "OVTK_GDF_Eyes_Right", "0x432"
-   "OVTK_GDF_Eyes_Up", "0x433"
-   "OVTK_GDF_Eyes_Down", "0x434"
-   "OVTK_GDF_Horizontal_Eye_Movement", "0x435"
-   "OVTK_GDF_Vertical_Eye_Movement", "0x436"
-   "OVTK_GDF_Rotation_Clockwise", "0x437"
-   "OVTK_GDF_Rotation_Counterclockwise", "0x438"
-   "OVTK_GDF_Eye_Blink", "0x439"
-   "OVTK_GDF_Left_Hand_Movement", "0x441"
-   "OVTK_GDF_Right_Hand_Movement", "0x442"
-   "OVTK_GDF_Head_Movement", "0x443"
-   "OVTK_GDF_Tongue_Movement", "0x444"
-   "OVTK_GDF_Swallowing", "0x445"
-   "OVTK_GDF_Biting", "0x446"
-   "OVTK_GDF_Foot_Movement", "0x447"
-   "OVTK_GDF_Foot_Right_Movement", "0x448"
-   "OVTK_GDF_Arm_Movement", "0x449"
-   "OVTK_GDF_Arm_Right_Movement", "0x44A"
-   "OVTK_GDF_ECG_Fiducial_Point_QRS_Complex", "0x501"
-   "OVTK_GDF_ECG_P_Wave", "0x502"
-   "OVTK_GDF_ECG_QRS_Complex", "0x503"
-   "OVTK_GDF_ECG_R_Point", "0x504"
-   "OVTK_GDF_ECG_T_Wave", "0x506"
-   "OVTK_GDF_ECG_U_Wave", "0x507"
-   "OVTK_GDF_Start", "0x580"
-   "OVTK_GDF_25_Watt", "0x581"
-   "OVTK_GDF_50_Watt", "0x582"
-   "OVTK_GDF_75_Watt", "0x583"
-   "OVTK_GDF_100_Watt", "0x584"
-   "OVTK_GDF_125_Watt", "0x585"
-   "OVTK_GDF_150_Watt", "0x586"
-   "OVTK_GDF_175_Watt", "0x587"
-   "OVTK_GDF_200_Watt", "0x588"
-   "OVTK_GDF_225_Watt", "0x589"
-   "OVTK_GDF_250_Watt", "0x58A"
-   "OVTK_GDF_275_Watt", "0x58B"
-   "OVTK_GDF_300_Watt", "0x58C"
-   "OVTK_GDF_325_Watt", "0x58D"
-   "OVTK_GDF_350_Watt", "0x58E"
-   "OVTK_GDF_Start_Of_New_Segment", "0x7FFE"
-   "OVTK_GDF_Non_Equidistant_Sampling_Value", "0x7FFF"
-
-
diff --git a/documentation/sphinx/source/data-formats/stream-structures.rst b/documentation/sphinx/source/data-formats/stream-structures.rst
deleted file mode 100644
index c72f0734290ccc0879eb6cbb236d05f4b1b97caf..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/data-formats/stream-structures.rst
+++ /dev/null
@@ -1,652 +0,0 @@
-.. |clearfloat|  raw:: html
-
-    <div style="clear:both"></div>
-
-Stream Structures
-=================
-
-Introduction
-------------
-
-All the streams are defined using EBML (Extensible Binary Meta-Language). They are all structured in 3 sections:
-
-HEADER
-  this part is the first ever sent and received on the stream, when the user presses "play" in a scenario. It usually contains the stream description used by the boxes and algorithms to initialize everything properly (e.g. size of an internal buffer)
-
-BUFFERS
-  the number of buffers that may then transit through the stream is unlimited. Buffers contain the payload, e.g. the current signal matrix.
-
-END
-  this last part is received once, when the user presses "stop" in a scenario. This mechanism is not concretely used in existing boxes, however everything is implemented to handle it.
-
-Hierarchy
----------
-
-The stream hierarchy is displayed on figure below. Every lower stream also
-contains the information specific to the upper stream. The color of the
-corresponding input and output in the Designer are also displayed.
-
-.. figure:: images/streams.png
-   :alt: The OpenViBE stream hierarchy
-
-   The OpenViBE stream hierarchy
-
-As you can see every stream is an **EBML stream**. Then the EBML container is
-specialized in 3 streams : **experiment information**, **stimulations** or
-**streamed matrix***.
-
-The **Streamed Matrix** stream can be used as is, or as one of its 4 derived
-streams : **channel localisation**, **channel units**, **feature vector**,
-**signal** or **spectrum**.
-
-::
-
-   #define OVTK_TypeId_EBMLStream                              		OpenViBE::CIdentifier(0x434F6587, 0x2EFD2B7E)
-   #define   OVTK_TypeId_ExperimentInfo                 			OpenViBE::CIdentifier(0x403488E7, 0x565D70B6)
-   #define   OVTK_TypeId_Stimulations                          		OpenViBE::CIdentifier(0x6F752DD0, 0x082A321E)
-   #define   OVTK_TypeId_StreamedMatrix                        		OpenViBE::CIdentifier(0x544A003E, 0x6DCBA5F6)
-   #define     OVTK_TypeId_FeatureVector                       		OpenViBE::CIdentifier(0x17341935, 0x152FF448)
-   #define     OVTK_TypeId_Signal                              		OpenViBE::CIdentifier(0x5BA36127, 0x195FEAE1)
-   #define     OVTK_TypeId_Spectrum                            		OpenViBE::CIdentifier(0x1F261C0A, 0x593BF6BD)
-   #define     OVTK_TypeId_ChannelLocalisation                 		OpenViBE::CIdentifier(0x1E4C0D6E, 0x5204EEB2)
-   #define     OVTK_TypeId_ChannelUnits                        		OpenViBE::CIdentifier(0x5E330216, 0x2C09724C)
-
-
-The following sections will describe each stream type.
-
-.. _Doc_Streams_EBML:
-
-Standard EBML stream
-~~~~~~~~~~~~~~~~~~~~
-
-.. image:: images/ebml-stream-card.png
-   :align: left
-
-EBML stream description (November 6th 2006, version 1).
-
-From any standard EBML stream header, you can retrieve the stream type identifier, and the stream version.
-
-|clearfloat|
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   * OVTK_NodeId_Buffer
-   * OVTK_NodeId_Buffer
-   * ...
-   * OVTK_NodeId_End
-   *
-
-::
-
-   * NODE IDENTIFIERS
-   * ----------------
-   #define OVTK_NodeId_Header                                           EBML::CIdentifier(0x002B395F, 0x108ADFAE)
-   #define OVTK_NodeId_Header_StreamType                                EBML::CIdentifier(0x00CDD0F7, 0x46B0278D)
-   #define OVTK_NodeId_Header_StreamVersion                             EBML::CIdentifier(0x006F5A08, 0x7796EBC5)
-   #define OVTK_NodeId_Buffer                                           EBML::CIdentifier(0x00CF2101, 0x02375310)
-   #define OVTK_NodeId_End                                              EBML::CIdentifier(0x00D9DDC3, 0x0B12873A)
-
-.. _Doc_Streams_StreamedMatrix:
-
-Streamed matrix stream
-~~~~~~~~~~~~~~~~~~~~~~
-
-.. image:: images/sm-stream-card.png
-   :align: left
-
-Streamed matrix stream description (November 6th 2006, version 1).
-
-The streamed matrix stream is an EBML Stream that also contains a matrix
-descriptor in the header, and a **matrix of double precision floating values**
-in its buffers. The matrix descriptor gives the **dimension count**, **size**
-of each dimension, and **labels** of each dimension.
-
-|clearfloat|
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   *   OVTK_NodeId_Header_StreamedMatrix
-   *     OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:)
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:)
-   *       ...
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * ...
-   * OVTK_NodeId_End
-   *
-
-::
-
-   * NODE IDENTIFIERS
-   * ----------------
-   #define OVTK_NodeId_Header_StreamedMatrix                            EBML::CIdentifier(0x0072F560, 0x7ED2CBED)
-   #define OVTK_NodeId_Header_StreamedMatrix_DimensionCount             EBML::CIdentifier(0x003FEBD4, 0x2725D428)
-   #define OVTK_NodeId_Header_StreamedMatrix_Dimension                  EBML::CIdentifier(0x0000E3C0, 0x3A7D5141)
-   #define OVTK_NodeId_Header_StreamedMatrix_Dimension_Size             EBML::CIdentifier(0x001302F7, 0x36D8438A)
-   #define OVTK_NodeId_Header_StreamedMatrix_Dimension_Label            EBML::CIdentifier(0x00153E40, 0x190227E0)
-   #define OVTK_NodeId_Buffer_StreamedMatrix                            EBML::CIdentifier(0x00120663, 0x08FBC165)
-   #define OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer                  EBML::CIdentifier(0x00B18C10, 0x427D098C)
-
-.. _Doc_Streams_ChannelLocalization:
-
-Channel localization stream
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-.. image:: images/chanloc-stream-card.png
-   :align: left
-
-
-Channel localisation description (nov 04th 2008, version 1)
-
-The channel localisation stream is a stream matrix stream with some
-constraints:
-
-- 2 dimensions : **channels** and **positions**
-
-- First dimension has variable size (channel count)
-
-- Second dimension has a size of 3 : the normalized cartesian coordinates in
-  the following frame of reference : X right, Y front and Z up.
-
-Its header also exposes a boolean value : **Dynamic**. If false the coordinates
-are assumed to be static, thus sent once and for all (e.g. with an EEG system).
-If Dynamic is set, the coordinates of the sensors may change over time, thus
-several buffer can be received over time.
-
-|clearfloat|
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:2)
-   *   OVTK_NodeId_Header_ChannelLocalisation
-   *     OVTK_NodeId_Header_ChannelLocalisation_Dynamic (boolean)
-   *   OVTK_NodeId_Header_StreamedMatrix
-   *     OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2)
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name)
-   *       ...
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:3)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:x)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:y)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:z)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * ...
-   * OVTK_NodeId_End
-   *
-
-::
-
-   * NODE IDENTIFIERS
-   * ----------------
-   #define OVTK_NodeId_Header_ChannelLocalisation                       EBML::CIdentifier(0xF2CFE60B, 0xEFD63E3B)
-   #define OVTK_NodeId_Header_ChannelLocalisation_Dynamic               EBML::CIdentifier(0x5338AF5C, 0x07C469C3)
-
-.. _Doc_Streams_ChannelUnits:
-
-Channel units stream
-~~~~~~~~~~~~~~~~~~~~
-
-Channel units description (mar 30th 2015, version 1).
-
-The channel units stream is a streamed matrix stream intended to carry channel
-measurement unit information from the drivers to Designer (e.g. ‘channel 1 is
-in microvolts’). The stream has some constraints:
-
-- 2 dimensions : **channels** and their **properties**
-
-- First dimension has variable size (channel count)
-
-- Second dimension has a size of 2 : the unit and the scaling factor.  Although
-  the stream contents can be handled as a matrix, the unit codes and scaling
-  factors supported and understood by OpenViBE are limited to a specific set.
-  The list is in in ``toolkit/include/ovtk_defines.h``.
-
-Its header also exposes a boolean value : **Dynamic**. If false the units are assumed to be static, thus sent once and for all (e.g. with an EEG system). If Dynamic is set, the units may change over time, thus several buffer can be received over time. However, no component in 1.0.0 supports the dynamic units.
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:2)
-   *   OVTK_NodeId_Header_ChannelUnits
-   *     OVTK_NodeId_Header_ChannelUnits_Dynamic (boolean)
-   *   OVTK_NodeId_Header_StreamedMatrix
-   *     OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2)
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name)
-   *       ...
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:2)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:unit)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:factor)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * ...
-   * OVTK_NodeId_End
-   *
-
-::
-
-   * NODE IDENTIFIERS
-   * ----------------
-   #define OVTK_NodeId_Header                                           EBML::CIdentifier(0x002B395F, 0x108ADFAE)
-   #define OVTK_NodeId_Header_StreamType                                EBML::CIdentifier(0x00CDD0F7, 0x46B0278D)
-   #define OVTK_NodeId_Header_StreamVersion                             EBML::CIdentifier(0x006F5A08, 0x7796EBC5)
-   #define OVTK_NodeId_Buffer                                           EBML::CIdentifier(0x00CF2101, 0x02375310)
-   #define OVTK_NodeId_End                                              EBML::CIdentifier(0x00D9DDC3, 0x0B12873A)
-
-.. _Doc_Streams_FeatureVector:
-
-Feature vector stream
-~~~~~~~~~~~~~~~~~~~~~
-
-
-.. image:: images/fvec-stream-card.png
-   :align: left
-
-Feature vector stream description (may 24th 2007, version 1).
-
-The feature vector stream is a stream matrix stream with some constraints:
-
-- 1 dimension : the **features**
-
-- Number of features may vary, but remains the same for one stream life time.
-
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   *   OVTK_NodeId_Header_StreamedMatrix
-   *     OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:1)
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:feature count)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:feature 1 name)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:feature 2 name)
-   *       ...
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * ...
-   * OVTK_NodeId_End
-   *
-   
-.. _Doc_Streams_Spectrum:
-
-Spectrum stream
-~~~~~~~~~~~~~~~
-
-.. image:: images/spec-stream-card.png
-   :align: left
-
-Spectrum stream description (jan. 2017, version 2).
-
-The spectrum stream is a stream matrix stream with some constraints:
-
-- 2 dimensions : **channels** and **number of frequency values**
-- First dimension has variable size (channel count)
-- Second dimension has variable size (number of frequency values)
-
-Its header also expose the sampling rate of the signal and the list of frequency values used.
-
-|clearfloat|
-
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   *   OVTK_NodeId_Header_StreamedMatrix
-   *     OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2)
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name)
-   *       ...
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of frequency band)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency band 1 name)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency band 2 name)
-   *       ...
-   *   OVTK_NodeId_Header_Spectrum
-   *     OVTK_NodeId_Header_Spectrum_Sampling
-   *     OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double)
-   *     OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double)
-   *     OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double)
-   *      ...
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * ...
-   * OVTK_NodeId_End
-   *
-
-::
-
-   * NODE IDENTIFIERS
-    * ----------------
-   #define OVTK_NodeId_Header_Spectrum                                     EBML::CIdentifier(0x00CCFA4B, 0x14F37D4D)
-   #define OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated            EBML::CIdentifier(0x0010983C, 0x21F8BDE5)
-   #define OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated      EBML::CIdentifier(0x00AA5654, 0x2403A2CB)
-   #define OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated       EBML::CIdentifier(0x00A44C82, 0x05BE50D5)
-   #define OVTK_NodeId_Header_Spectrum_FrequencyAbscissa                   EBML::CIdentifier(0x00D7287D, 0x622A2BF5)
-   #define OVTK_NodeId_Header_Spectrum_Sampling                            EBML::CIdentifier(0x006876E9, 0x1DCB0CA1)
-
-.. _Doc_Streams_Signal:
-
-Signal stream
-~~~~~~~~~~~~~
-
-
-.. image:: images/signal-stream-card.png
-   :align: left
-
-Signal stream description (may 24th 2007, version 2).
-
-The signal stream is a stream matrix stream with some constraints:
-
-- 2 dimensions : **channels** and **samples**
-
-- First dimension has variable size (channel count)
-
-- Second dimension has a size corresponding to the **sample count per buffer**.
-
-Its header also expose an integer value : the **Sampling Frequency**. Sampling
-frequency and sample count per buffer depends on the data producer (file reader
-or acquisition client).
-
-|clearfloat|
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   *   OVTK_NodeId_Header_Signal
-   *     OVTK_NodeId_Header_Signal_Sampling (integer)
-   *   OVTK_NodeId_Header_StreamedMatrix
-   *     OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2)
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name)
-   *       ...
-   *     OVTK_NodeId_Header_StreamedMatrix_Dimension
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of samples per buffer)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string)
-   *       OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string)
-   *       ...
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_StreamedMatrix
-   *     OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double)
-   * ...
-   * OVTK_NodeId_End
-   *
-   
-::
-
-   * NODE IDENTIFIERS
-   * ----------------
-   #define OVTK_NodeId_Header_Signal                                EBML::CIdentifier(0x007855DE, 0x3748D375)
-   #define OVTK_NodeId_Header_Signal_Sampling                       EBML::CIdentifier(0x00141C43, 0x0C37006B)
-
-.. _Doc_Streams_Stimulation:
-
-Stimulation stream
-~~~~~~~~~~~~~~~~~~
-
-.. image:: images/stim-stream-card.png
-   :align: left
-
-
-Stimulation stream description (may 24th 2007, version 3).
-
-The stimulation stream is an EBML stream which buffers contains stimulation
-sets. Each stimulation has 3 attributes:
-
-- **Stimulation Date**: a 64bit unsigned integer in 32:32 precision (first 32
-  bits for the seconds, last 32 bits for the divisions)
-
-- **Stimulation Identifier** as listed in the documentation page.
-
-- **Stimulation Duration**: same encoding as stimulation date. In practice, the
-  duration is never used by boxes, thus the value is most of the time 0.
-
-|clearfloat|
-
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Buffer_Stimulation
-   *     OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations (integer)
-   *     OVTK_NodeId_Buffer_Stimulation_Stimulation
-   *       OVTK_NodeId_Buffer_Stimulation_Stimulation_ID (integer)
-   *       OVTK_NodeId_Buffer_Stimulation_Stimulation_Date (integer)
-   *       OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration (integer)
-   *     OVTK_NodeId_Stimulation_Stimulation
-   *     ...
-   * OVTK_NodeId_Buffer
-   * OVTK_NodeId_Buffer
-   * ...
-   * OVTK_NodeId_End
-   *
-   
-::
-
-   * NODE IDENTIFIERS
-   * ----------------
-   #define OVTK_NodeId_Buffer_Stimulation                               EBML::CIdentifier(0x006DEABE, 0x7FC05A20)
-   #define OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations          EBML::CIdentifier(0x00BB790B, 0x2B8574D8)
-   #define OVTK_NodeId_Buffer_Stimulation_Stimulation                   EBML::CIdentifier(0x0016EAC6, 0x29FBCAA1)
-   #define OVTK_NodeId_Buffer_Stimulation_Stimulation_ID                EBML::CIdentifier(0x006FA5DB, 0x4BAC31E9)
-   #define OVTK_NodeId_Buffer_Stimulation_Stimulation_Date              EBML::CIdentifier(0x00B866D8, 0x14DA5374)
-   #define OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration          EBML::CIdentifier(0x14EE055F, 0x87FBCC9C)
-
-.. _Doc_Streams_ExperimentInfo:
-
-Experimentation information stream
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. image:: images/xp-stream-card.png
-   :align: left
-
-Experimentation information stream description (november 6th 2006, version 1).
-
-The experiment information stream is an EBML stream that provides in its header
-some information about the experiment being conducted. These information are
-entered for example in the acquisition server, when configuring the driver
-before starting the acquisition. You can find:
-
-- **Experiment description**: identifier and date.
-
-- **Subject description**: identifier, name, age and gender.
-
-- **Context**: laboratory identifier and name, technician identifier and name.
-
-|clearfloat|
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Header_StreamType (integer:)
-   *   OVTK_NodeId_Header_StreamVersion (integer:)
-   *   OVTK_NodeId_Header_ExperimentInfo
-   *     OVTK_NodeId_Header_ExperimentInfo_Experiment
-   *       OVTK_NodeId_Header_ExperimentInfo_Experiment_ID (integer)
-   *       OVTK_NodeId_Header_ExperimentInfo_Experiment_Date (date)
-   *     OVTK_NodeId_Header_ExperimentInfo_Subject
-   *       OVTK_NodeId_Header_ExperimentInfo_Subject_ID (integer)
-   *       OVTK_NodeId_Header_ExperimentInfo_Subject_Name (string)
-   *       OVTK_NodeId_Header_ExperimentInfo_Subject_Age (integer)
-   *       OVTK_NodeId_Header_ExperimentInfo_Subject_Gender (integer)
-   *     OVTK_NodeId_Header_ExperimentInfo_Context
-   *       OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID (integer)
-   *       OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName (string)
-   *       OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID (integer)
-   *       OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName (string)
-   * OVTK_NodeId_End
-   *
-
-::
-
-   * NODE IDENTIFIERS
-    * ----------------
-    #define OVTK_NodeId_Header_ExperimentInfo                               EBML::CIdentifier(0x00746BA0, 0x115AE04D)
-    #define OVTK_NodeId_Header_ExperimentInfo_Experiment                    EBML::CIdentifier(0x0011D6B7, 0x48F1AA39)
-    #define OVTK_NodeId_Header_ExperimentInfo_Experiment_ID                 EBML::CIdentifier(0x006ACD74, 0x1C960C26)
-    #define OVTK_NodeId_Header_ExperimentInfo_Experiment_Date               EBML::CIdentifier(0x002F8FB7, 0x6DA7552D)
-    #define OVTK_NodeId_Header_ExperimentInfo_Subject                       EBML::CIdentifier(0x003EC620, 0x333E0A94)
-    #define OVTK_NodeId_Header_ExperimentInfo_Subject_ID                    EBML::CIdentifier(0x00D62974, 0x473D4AA5)
-    #define OVTK_NodeId_Header_ExperimentInfo_Subject_Name                  EBML::CIdentifier(0x0041FD0A, 0x6BCD9A99)
-    #define OVTK_NodeId_Header_ExperimentInfo_Subject_Age                   EBML::CIdentifier(0x00DF7DD9, 0x33336C51)
-    /* for retro compat */
-    #define OVTK_NodeId_Header_ExperimentInfo_Subject_Sex                   EBML::CIdentifier(0x0069BB84, 0x3FC8E149)
-    #define OVTK_NodeId_Header_ExperimentInfo_Subject_Gender                EBML::CIdentifier(0x0069BB84, 0x3FC8E149)
-    #define OVTK_NodeId_Header_ExperimentInfo_Context                       EBML::CIdentifier(0x0018C291, 0x7985DFDD)
-    #define OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID          EBML::CIdentifier(0x003F11B9, 0x26D76D9C)
-    #define OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName        EBML::CIdentifier(0x00EB1F23, 0x51C23B83)
-    #define OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID          EBML::CIdentifier(0x00874A7F, 0x60DC34C2)
-    #define OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName        EBML::CIdentifier(0x00C8C393, 0x31CE5B3E)
-
-Acquisition stream
-~~~~~~~~~~~~~~~~~~
-
-.. image:: images/acquisition-stream-small.png
-   :align: left
-
-Acquisition stream description (nov 2014, version 3). This is a multiplexed
-stream.
-
-The acquisition stream encapsulates 5 streams : experiment information, channel
-localisation, channel units, signal and stimulation.
-
-This stream is produced by the Acquisition Server and is sent to every client
-connected via tcp/ip network connection. The stream is received by the
-Acquisition Client box, that separates each streams and makes them available on
-5 corresponding outputs.
-
-|clearfloat|
-
-EBML description & identifiers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-::
-
-   * STREAM STRUCTURE
-   * ----------------
-   * OVTK_NodeId_Header
-   *   OVTK_NodeId_Acquisition_Header_ExperimentInfo
-   *     ... some experiment information stream header
-   *   OVTK_NodeId_Acquisition_Header_Signal
-   *     ... some signal stream header
-   *   OVTK_NodeId_Acquisition_Header_Stimulation
-   *     ... some stimulation stream header
-   *   OVTK_NodeId_Acquisition_Header_ChannelLocalisation
-   *     ... some channel localisation stream header
-   *   OVTK_NodeId_Acquisition_Header_ChannelUnits
-   *     ... some channel units stream header
-   * OVTK_NodeId_Buffer
-   *   OVTK_NodeId_Acquisition_Buffer_ExperimentInfo
-   *     ... some experiment information stream buffer
-   *   OVTK_NodeId_Acquisition_Buffer_Signal
-   *     ... some signal stream buffer
-   *   OVTK_NodeId_Acquisition_Buffer_Stimulation
-   *     ... some stimulation stream buffer
-   *   OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation
-   *     ... some channel localisation stream buffer
-   *   OVTK_NodeId_Acquisition_Buffer_ChannelUnits
-   *     ... some channel units stream buffer
-   * OVTK_NodeId_Buffer
-   * OVTK_NodeId_Buffer
-   * ...
-   *
diff --git a/documentation/sphinx/source/index.rst b/documentation/sphinx/source/index.rst
deleted file mode 100644
index a9360d4f14f20130054f99336464da0be8b8ccf6..0000000000000000000000000000000000000000
--- a/documentation/sphinx/source/index.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-OpenViBE SDK Documentation
-==========================
-
-Available Boxes
----------------
-.. toctree::
-   :maxdepth: 1
-
-   boxes/index-boxes
-
-Data Formats Documentation
---------------------------
-
-.. toctree::
-   :maxdepth: 2
-
-   data-formats/index-data-formats
diff --git a/documentation/src/Doxyfile.in b/documentation/src/Doxyfile.in
deleted file mode 100644
index d631be084de3bd35905bec1faa54aa560d928d85..0000000000000000000000000000000000000000
--- a/documentation/src/Doxyfile.in
+++ /dev/null
@@ -1,73 +0,0 @@
-# Doxyfile 1.5.8
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-DOXYFILE_ENCODING      = UTF-8
-
-PROJECT_NAME           = OpenViBE
-
-OUTPUT_DIRECTORY       = @CMAKE_CURRENT_BINARY_DIR@
-
-STRIP_FROM_PATH        = @PROJECT_SOURCE_DIR@ \
-                         @PROJECT_BINARY_DIR@
-
-SOURCE_BROWSER = NO
-VERBATIM_HEADERS = NO
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-BUILTIN_STL_SUPPORT    = NO
-
-QUIET                  = YES
-WARNINGS               = YES
-WARN_IF_UNDOCUMENTED   = YES
-WARN_IF_DOC_ERROR      = YES
-WARN_NO_PARAMDOC       = NO
-WARN_LOGFILE           = doxygen.log
-
-INPUT                  = @doxy_main_page@ \
-                         @PROJECT_SOURCE_DIR@ \
-                         @PROJECT_BINARY_DIR@
-
-GENERATE_TODOLIST      = NO
-GENERATE_TESTLIST      = NO
-GENERATE_BUGLIST       = NO
-
-INPUT_ENCODING         = UTF-8
-
-FILE_PATTERNS          = *.h \
-                         *.dox
-
-RECURSIVE              = YES
-
-EXCLUDE_PATTERNS       = */doc/?ain?age.dox \
-                         */plugins/*/src/*.h \
-						 */dependencies-source/*.h \
-						 */dependencies/*
-
-#EXAMPLE_PATH           = @ov_doxy_input@
-
-IGNORE_PREFIX          = I \
-                         C \
-                         T
-
-GENERATE_HTML          = YES
-HTML_OUTPUT            = html
-HTML_FILE_EXTENSION    = .html
-
-HTML_HEADER            = @CMAKE_CURRENT_SOURCE_DIR@/src/header.html
-HTML_FOOTER            = @CMAKE_CURRENT_SOURCE_DIR@/src/footer.html
-
-
-GENERATE_LATEX          = NO
diff --git a/documentation/src/footer.html b/documentation/src/footer.html
deleted file mode 100644
index 511572e0bf1b3b494eb4993b154ae4f4190ee2fa..0000000000000000000000000000000000000000
--- a/documentation/src/footer.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<div id="sidebar">
-	<div>
-		<h2>Online Manual</h2>
-		<ul>
-			<li><a href="http://openvibe.inria.fr/documentation-index">Documentation Index</a></li>
-			<li><a href="http://openvibe.inria.fr/documentation-index/#User+Documentation">User Documentation</a></li>
-			<li><a href="http://openvibe.inria.fr/documentation-index/#Developer+Documentation">Developer Documentation</a></li>
-			<li><a href="http://openvibe.inria.fr/start">Video Tutorials</a></li>
-			<li><a href="http://openvibe.inria.fr/documentation/">Other versions of this doc</a></li>
-		</ul>
-	</div>
-	<div>
-		<h2>Quick Access</h2>
-		<ul>
-			<li><a href="http://openvibe.inria.fr">OpenViBE Home</a></li>
-			<li><a href="http://openvibe.inria.fr/forum">Forum</a></li>
-			<li><a href="http://gforge.inria.fr/projects/openvibe">Code Repository</a></li>
-			<li><a href="http://openvibe.inria.fr/tracker">Bugtracker</a></li>
-		</ul>
-	</div>
-	<div>
-		<h2>Contact</h2>
-		<ul>
-			<li><b>IRC</b> : #openvibe @ irc.freenode.net</li>
-			<li><a href="http://openvibe.inria.fr/Contact"><b>Project Contact</b></a></li>
-		</ul>
-	</div>
-	<div>
-		<p>This documentation is licenced under CC-BY-SA</p>
-		<a href="http://creativecommons.org/licenses/by-sa/3.0/legalcode"><img src="http://openvibe.inria.fr/documentation/unstable/cc-by-sa.png" alt="cc-by-sa"/></a>
-	</div>
-</div>
-
-<hr class="footer"/><address class="footer"><small>Generated on Tue Jun 26 2012 15:25:54 for Documentation by&#160;
-<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
-</body>
-</html>
diff --git a/documentation/src/header.html b/documentation/src/header.html
deleted file mode 100644
index 5f671fc1864065adcce2357d4ddcb352f77d95c0..0000000000000000000000000000000000000000
--- a/documentation/src/header.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.13"/>
-<meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>Documentation: Main Page</title>
-<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="$relpath^jquery.js"></script>
-<script type="text/javascript" src="$relpath^dynsections.js"></script>
-<link href="$relpath^search/search.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="$relpath^search/searchdata.js"></script>
-<script type="text/javascript" src="$relpath^search/search.js"></script>
-<link href="$relpath^doxygen.css" rel="stylesheet" type="text/css" />
-<link href="openvibe.css" rel="stylesheet" type="text/css"/>
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td id="projectalign" style="padding-left: 0.5em;">
-   <div id="projectname">Documentation
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-	
\ No newline at end of file
diff --git a/documentation/src/licence.dox b/documentation/src/licence.dox
deleted file mode 100644
index 8b39c73c6db95dd191ad3ca0f68ddd468478580a..0000000000000000000000000000000000000000
--- a/documentation/src/licence.dox
+++ /dev/null
@@ -1,513 +0,0 @@
-/**
-
-\page Doc_Licence Licence
-
-\section Doc_Licence_Title GNU LESSER GENERAL PUBLIC LICENSE
-\subsection Doc_Licence_Version Version 2.1, February 1999
-
-\verbatim
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-\endverbatim
-
-\subsection Doc_Licence_Preamble Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-\subsection Doc_Licence_Terms GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-\subsection Doc_Licence_Warranty NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-\subsection Doc_Licence_End END OF TERMS AND CONDITIONS
-
-\subsection Doc_Licence_How How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-\verbatim
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-\endverbatim
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-\verbatim
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-\endverbatim
-
-That's all there is to it!
-
-*/
diff --git a/documentation/src/openvibe-plugin-inspector.cmd b/documentation/src/openvibe-plugin-inspector.cmd
deleted file mode 100644
index c1cb5d19b3c9bb7de8d1024b25e057ce2ed3f6b7..0000000000000000000000000000000000000000
--- a/documentation/src/openvibe-plugin-inspector.cmd
+++ /dev/null
@@ -1,27 +0,0 @@
-REM @ECHO OFF
-SETLOCAL EnableExtensions
-
-REM Get the directory location of this script, assume it contains the OpenViBE dist tree. These variables will be used by OpenViBE executables.
-SET "OV_SOURCE=%1"
-SET "OV_BUILD=%2"
-SHIFT
-SHIFT
-
-SET "OV_PATH_BIN=%OV_BUILD%\openvibe\"
-SET "OV_PATH_LIB=%OV_BUILD%\openvibe\;%OV_BUILD%\modules\ebml\;%OV_BUILD%\modules\system\;%OV_BUILD%\modules\fs\;%OV_BUILD%\modules\xml\;%OV_BUILD%\modules\socket\;%OV_BUILD%\modules\automaton\;%OV_BUILD%\toolkit\"
-SET "OV_PATH_DATA=%OV_BUILD%\share\openvibe"
-
-SET PATH=%OV_PATH_LIB%;%PATH%
-
-
-SET "OV_ENVIRONMENT_FILE=%OV_SOURCE%\scripts\win32-dependencies.cmd"
-IF NOT EXIST "%OV_ENVIRONMENT_FILE%" (
-	ECHO Error: "%OV_ENVIRONMENT_FILE%" was not found
-	GOTO EndOfScript
-)
-CALL "%OV_ENVIRONMENT_FILE%"
-@ECHO ON
-
-"%OV_BUILD%\applications\developer-tools\plugin-inspector\openvibe-plugin-inspector-sdk.exe"  %*
-	
-:EndOfScript
\ No newline at end of file
diff --git a/documentation/src/openvibe.dox-base b/documentation/src/openvibe.dox-base
deleted file mode 100644
index 9fee61ead57ed6fb016557ae89b47218be5b6d23..0000000000000000000000000000000000000000
--- a/documentation/src/openvibe.dox-base
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
-  \mainpage Home
-  \section Doc_Preface Preface
-
-  Welcome to the Doxygen Documentation for OpenViBE @PROJECT_VERSION@. 
-  
-  This document has been automatically generated on Linux. Please note
-  
-  - The documentation lacks components and classes that are not compiled on Linux.
-  - Some source files do not have doxygen information and may not be represented here.
-  - Plugins such as boxes and drivers are not included in the class lists to better illustrate the core part of OpenViBE. 
-  However, you can see the boxes on the <a href="Doc_BoxAlgorithms.html"><b>Box Descriptions</b></a> page.
-				
-  The tutorials and user manual, as well as build instructions for OpenViBE are located on the website : http://openvibe.inria.fr/documentation-index 
-
-  \section Doc_Boxes Box Descriptions
-
-  This section contains the description of all of the Boxes available in the OpenViBE Designer.
-
-  - \subpage Doc_BoxAlgorithms
-
-  \subsection Doc_EBML Details on EBML
-
-  OpenViBE uses EBML as a container for all data streams. If you would like to extend the formats of data OpenViBE can handle you might want to document yourself on EBML usage.
-
-  - \subpage Doc_WhatIsEBML
-  - \subpage Doc_ParsingEBMLStreams
-  - \subpage Doc_FormatingEBMLStreams
-
-  \subsection Doc_OngoingDocumentation Ongoing Documentation
-  - \subpage Doc_SoftwareArchitectureOverview (incomplete)
-
-   */
-
-
-
-
-
-
-
-
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 0473450aa2675aa086fd706e2a7b263fcdf68697..e457de4831bcfffa26ec31203cc194206716087c 100755
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -13,7 +13,9 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-common
                       openvibe-module-fs
                       openvibe-module-system
-                      openvibe-module-xml)
+                      openvibe-module-xml
+                      Boost::boost
+)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
                       VERSION ${PROJECT_VERSION}
@@ -21,8 +23,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
                       FOLDER ${KERNEL_FOLDER}
                       COMPILE_FLAGS "-DOVK_Exports -DOVK_Shared")
 
-include("FindThirdPartyBoost")
-
 # ---------------------------------
 # Finds standard library dl
 # Adds library to target
diff --git a/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h b/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h
index 0c9df7f9e41d89219acea81ad4de8b1b73d8f720..5eb84d34cf27930256f8d3c5dcd73e39735dcccd 100644
--- a/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h
+++ b/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h
@@ -16,7 +16,7 @@ public:
 	IConfigurationManager& getConfigurationManager() const override { return getKernelContext().getConfigurationManager(); }
 	IAlgorithmManager& getAlgorithmManager() const override { return getKernelContext().getAlgorithmManager(); }
 	ILogManager& getLogManager() const override { return m_logManager; }
-	IErrorManager& getErrorManager() const override { return getKernelContext().getErrorManager(); }
+	CErrorManager& getErrorManager() const override { return getKernelContext().getErrorManager(); }
 	ITypeManager& getTypeManager() const override { return getKernelContext().getTypeManager(); }
 
 	CIdentifier getNextInputParameterIdentifier(const CIdentifier& previous) const override
diff --git a/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp b/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp
index f00221d3baa5c19dd88f9e851d385b7f50810c38..5246c4485f56e4af67ea09114aab87c9a78c35ca 100755
--- a/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp
+++ b/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp
@@ -38,7 +38,7 @@ class CConfigurationManagerEntryEnumeratorCallBack final : public FS::IEntryEnum
 {
 public:
 
-	CConfigurationManagerEntryEnumeratorCallBack(ILogManager& logManager, IErrorManager& errorManager, IConfigurationManager& configManger)
+	CConfigurationManagerEntryEnumeratorCallBack(ILogManager& logManager, CErrorManager& errorManager, IConfigurationManager& configManger)
 		: m_logManager(logManager), m_errorManager(errorManager), m_configManager(configManger) { }
 
 	static std::string reduce(const std::string& value)
@@ -126,7 +126,7 @@ public:
 protected:
 
 	ILogManager& m_logManager;
-	IErrorManager& m_errorManager;
+	CErrorManager& m_errorManager;
 	IConfigurationManager& m_configManager;
 };
 
diff --git a/kernel/src/kernel/error/ovkCErrorManager.cpp b/kernel/src/kernel/error/ovkCErrorManager.cpp
deleted file mode 100644
index 75b24555a1b3a04626a716c94354fe8fa9a145d8..0000000000000000000000000000000000000000
--- a/kernel/src/kernel/error/ovkCErrorManager.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*********************************************************************
-* Software License Agreement (AGPL-3 License)
-*
-* OpenViBE SDK Test Software
-* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
-* Copyright (C) Inria, 2015-2017,V1.0
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License version 3,
-* as published by the Free Software Foundation.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.
-* If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <string>
-
-#include "ovkCErrorManager.h"
-
-// Error manager IError internal implementation
-namespace OpenViBE {
-namespace Kernel {
-class CError final : public IError
-{
-public:
-
-	CError(ErrorType type, const char* description, IError* nestedError, const char* filename, const size_t line)
-		: m_errorType(type), m_nestedError(nestedError), m_description(description), m_location(std::string(filename) + ":" + std::to_string(line)) { }
-
-	~CError() override { }
-
-	const char* getErrorString() const override { return m_description.c_str(); }
-	const char* getErrorLocation() const override { return m_location.c_str(); }
-	ErrorType getErrorType() const override { return m_errorType; }
-	const IError* getNestedError() const override { return m_nestedError.get(); }
-
-	_IsDerivedFromClass_Final_(IError, OVK_ClassId_Kernel_Error_Error)
-
-private:
-
-	ErrorType m_errorType;
-	std::unique_ptr<IError> m_nestedError;
-	std::string m_description;
-	std::string m_location;
-};
-
-// Error manager implementation
-void CErrorManager::pushErrorAtLocation(const ErrorType type, const char* description, const char* filename, const size_t line)
-{
-	std::lock_guard<std::mutex> lock(m_managerGuard);
-	const auto lastTopError = m_topError.release();
-	m_topError.reset(new CError(type, description, lastTopError, filename, line));
-}
-
-void CErrorManager::releaseErrors()
-{
-	std::lock_guard<std::mutex> lock(m_managerGuard);
-	m_topError.reset(nullptr);
-}
-
-bool CErrorManager::hasError() const
-{
-	std::lock_guard<std::mutex> lock(m_managerGuard);
-	return (m_topError != nullptr);
-}
-
-const IError* CErrorManager::getLastError() const
-{
-	std::lock_guard<std::mutex> lock(m_managerGuard);
-	return m_topError.get();
-}
-
-const char* CErrorManager::getLastErrorString() const
-{
-	std::lock_guard<std::mutex> lock(m_managerGuard);
-	return (m_topError ? m_topError->getErrorString() : "");
-}
-
-ErrorType CErrorManager::getLastErrorType() const
-{
-	std::lock_guard<std::mutex> lock(m_managerGuard);
-	return (m_topError ? m_topError->getErrorType() : ErrorType::NoErrorFound);
-}
-
-}  // namespace Kernel
-}  // namespace OpenViBE
diff --git a/kernel/src/kernel/error/ovkCErrorManager.h b/kernel/src/kernel/error/ovkCErrorManager.h
deleted file mode 100644
index c7fbc03c5abf5de9eebb8321d937cb16cb98a571..0000000000000000000000000000000000000000
--- a/kernel/src/kernel/error/ovkCErrorManager.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*********************************************************************
-* Software License Agreement (AGPL-3 License)
-*
-* OpenViBE SDK Test Software
-* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
-* Copyright (C) Inria, 2015-2017,V1.0
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License version 3,
-* as published by the Free Software Foundation.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.
-* If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#pragma once
-
-#include <mutex>
-#include <memory>
-
-#include "../ovkTKernelObject.h"
-
-namespace OpenViBE {
-namespace Kernel {
-/**
- * \class CErrorManager
- * \author Charles Garraud (Inria)
- * \date 2016-07-13
- * \brief Error manager kernel default implementation
- */
-class CErrorManager final : public TKernelObject<IErrorManager>
-{
-public:
-
-	explicit CErrorManager(const IKernelContext& context) : TKernelObject<IErrorManager>(context), m_topError(nullptr) { }
-	~CErrorManager() override { this->releaseErrors(); }
-
-	void pushError(ErrorType type, const char* description) override { this->pushErrorAtLocation(type, description, "NoLocationInfo", 0); }
-	void pushErrorAtLocation(ErrorType type, const char* description, const char* filename, size_t line) override;
-	void releaseErrors() override;
-	bool hasError() const override;
-	const IError* getLastError() const override;
-	const char* getLastErrorString() const override;
-	ErrorType getLastErrorType() const override;
-
-	_IsDerivedFromClass_Final_(TKernelObject<IErrorManager>, OVK_ClassId_Kernel_Error_ErrorManager)
-
-private:
-
-	mutable std::mutex m_managerGuard;
-	std::unique_ptr<IError> m_topError;
-};
-}  // namespace Kernel
-}  // namespace OpenViBE
diff --git a/kernel/src/kernel/ovkCKernelContext.cpp b/kernel/src/kernel/ovkCKernelContext.cpp
index f1409ef7d81e8bea856f43f6f51820f051cfa671..79dc39bbec19668704d024885c5673ef1b417f7c 100755
--- a/kernel/src/kernel/ovkCKernelContext.cpp
+++ b/kernel/src/kernel/ovkCKernelContext.cpp
@@ -13,7 +13,6 @@
 #include "log/ovkCLogManager.h"
 #include "log/ovkCLogListenerConsole.h"
 #include "log/ovkCLogListenerFile.h"
-#include "error/ovkCErrorManager.h"
 
 #include <cassert>
 #include <string>
@@ -46,7 +45,7 @@ bool CKernelContext::initialize(const char* const* tokenList, size_t nToken)
 		initializationTokens[*key] = *value;
 	}
 
-	m_errorManager.reset(new CErrorManager(m_masterKernelCtx));
+	m_errorManager.reset(new CErrorManager());
 
 	m_kernelObjectFactory.reset(new CKernelObjectFactory(m_masterKernelCtx));
 
@@ -284,7 +283,7 @@ ILogManager& CKernelContext::getLogManager() const
 	return *m_logManager;
 }
 
-IErrorManager& CKernelContext::getErrorManager() const
+CErrorManager& CKernelContext::getErrorManager() const
 {
 	assert(m_errorManager);
 	return *m_errorManager;
diff --git a/kernel/src/kernel/ovkCKernelContext.h b/kernel/src/kernel/ovkCKernelContext.h
index eeaebe48a747a5210885db03ef748a852046a3b1..b63265de1c3055502256a6bf499863589a41d0f6 100755
--- a/kernel/src/kernel/ovkCKernelContext.h
+++ b/kernel/src/kernel/ovkCKernelContext.h
@@ -26,7 +26,7 @@ public:
 	IScenarioManager& getScenarioManager() const override;
 	ITypeManager& getTypeManager() const override;
 	ILogManager& getLogManager() const override;
-	IErrorManager& getErrorManager() const override;
+	CErrorManager& getErrorManager() const override;
 
 	_IsDerivedFromClass_Final_(IKernelContext, OVK_ClassId_Kernel_KernelContext)
 
@@ -47,7 +47,7 @@ private:
 	std::unique_ptr<IScenarioManager> m_scenarioManager;
 	std::unique_ptr<ITypeManager> m_typeManager;
 	std::unique_ptr<ILogManager> m_logManager;
-	std::unique_ptr<IErrorManager> m_errorManager;
+	std::unique_ptr<CErrorManager> m_errorManager;
 
 	CString m_applicationName;
 	CString m_configFile;
@@ -76,7 +76,7 @@ public:
 	void setScenarioManager(IScenarioManager* manager) { m_scenarioManager = manager; }
 	void setTypeManager(ITypeManager* manager) { m_typeManager = manager; }
 	void setLogManager(ILogManager* manager) { m_logManager = manager; }
-	void setErrorManager(IErrorManager* manager) { m_errorManager = manager; }
+	void setErrorManager(CErrorManager* manager) { m_errorManager = manager; }
 
 	IAlgorithmManager& getAlgorithmManager() const override { return m_algorithmManager ? *m_algorithmManager : m_kernelCtx.getAlgorithmManager(); }
 
@@ -93,7 +93,7 @@ public:
 	IScenarioManager& getScenarioManager() const override { return m_scenarioManager ? *m_scenarioManager : m_kernelCtx.getScenarioManager(); }
 	ITypeManager& getTypeManager() const override { return m_typeManager ? *m_typeManager : m_kernelCtx.getTypeManager(); }
 	ILogManager& getLogManager() const override { return m_logManager ? *m_logManager : m_kernelCtx.getLogManager(); }
-	IErrorManager& getErrorManager() const override { return m_errorManager ? *m_errorManager : m_kernelCtx.getErrorManager(); }
+	CErrorManager& getErrorManager() const override { return m_errorManager ? *m_errorManager : m_kernelCtx.getErrorManager(); }
 
 	_IsDerivedFromClass_Final_(IKernelContext, OVK_ClassId_Kernel_KernelContext)
 
@@ -110,7 +110,7 @@ protected:
 	mutable IScenarioManager* m_scenarioManager         = nullptr;
 	mutable ITypeManager* m_typeManager                 = nullptr;
 	mutable ILogManager* m_logManager                   = nullptr;
-	mutable IErrorManager* m_errorManager               = nullptr;
+	mutable CErrorManager* m_errorManager               = nullptr;
 };
 }  // namespace Kernel
 }  // namespace OpenViBE
diff --git a/kernel/src/kernel/ovkCObjectVisitorContext.cpp b/kernel/src/kernel/ovkCObjectVisitorContext.cpp
index e99e39c04fbf8f4771631d3783215f563f3a8a3b..ea74049eb8313ff3ea982a06c88126c4d81802bd 100644
--- a/kernel/src/kernel/ovkCObjectVisitorContext.cpp
+++ b/kernel/src/kernel/ovkCObjectVisitorContext.cpp
@@ -10,7 +10,7 @@ IAlgorithmManager& CObjectVisitorContext::getAlgorithmManager() const { return T
 IConfigurationManager& CObjectVisitorContext::getConfigurationManager() const { return TKernelObject<IObjectVisitorContext>::getConfigurationManager(); }
 ITypeManager& CObjectVisitorContext::getTypeManager() const { return TKernelObject<IObjectVisitorContext>::getTypeManager(); }
 ILogManager& CObjectVisitorContext::getLogManager() const { return TKernelObject<IObjectVisitorContext>::getLogManager(); }
-IErrorManager& CObjectVisitorContext::getErrorManager() const { return TKernelObject<IObjectVisitorContext>::getErrorManager(); }
+CErrorManager& CObjectVisitorContext::getErrorManager() const { return TKernelObject<IObjectVisitorContext>::getErrorManager(); }
 
 }  // namespace Kernel
 }  // namespace OpenViBE
diff --git a/kernel/src/kernel/ovkCObjectVisitorContext.h b/kernel/src/kernel/ovkCObjectVisitorContext.h
index 188ffe0abe0b275ccd75f64efb10416bef0ecdac..12cb01e3b60fb5daf909ea9d04a71a3526d375f8 100644
--- a/kernel/src/kernel/ovkCObjectVisitorContext.h
+++ b/kernel/src/kernel/ovkCObjectVisitorContext.h
@@ -14,7 +14,7 @@ public:
 	IConfigurationManager& getConfigurationManager() const override;
 	ITypeManager& getTypeManager() const override;
 	ILogManager& getLogManager() const override;
-	IErrorManager& getErrorManager() const override;
+	CErrorManager& getErrorManager() const override;
 
 	_IsDerivedFromClass_Final_(TKernelObject<IObjectVisitorContext>, OVK_ClassId_Kernel_ObjectVisitorContext)
 };
diff --git a/kernel/src/kernel/ovkCParameter.h b/kernel/src/kernel/ovkCParameter.h
index 1b620705c842b391ba4d7e06eced04547d543259..3298e0876a530b8c24c6c10d4bfb687b7b7bbcc8 100644
--- a/kernel/src/kernel/ovkCParameter.h
+++ b/kernel/src/kernel/ovkCParameter.h
@@ -72,7 +72,7 @@ _parameter_template_instance_object_(CIdentifierParameter, CIdentifier, CIdentif
 
 _parameter_template_instance_object_(CMatrixParameter, CMatrix, CMatrix*, OVK_ClassId_Kernel_MatrixParameter)
 
-_parameter_template_instance_object_(CStimulationSetParameter, CStimulationSet, IStimulationSet*, OVK_ClassId_Kernel_StimulationSetParameter)
+_parameter_template_instance_object_(CStimulationSetParameter, CStimulationSet, CStimulationSet*, OVK_ClassId_Kernel_StimulationSetParameter)
 
 _parameter_template_instance_object_(CMemoryBufferParameter, CMemoryBuffer, IMemoryBuffer*, OVK_ClassId_Kernel_MemoryBufferParameter)
 
diff --git a/kernel/src/kernel/ovkTKernelObject.h b/kernel/src/kernel/ovkTKernelObject.h
index e1c66a871dfbab47d3b3efa395b78aa21648946b..02a953bd165e604092aae86ce701c65f63cb9e52 100755
--- a/kernel/src/kernel/ovkTKernelObject.h
+++ b/kernel/src/kernel/ovkTKernelObject.h
@@ -27,7 +27,7 @@ public:
 	virtual IScenarioManager& getScenarioManager() const { return m_kernelCtx.getScenarioManager(); }
 	virtual ITypeManager& getTypeManager() const { return m_kernelCtx.getTypeManager(); }
 	virtual ILogManager& getLogManager() const { return m_kernelCtx.getLogManager(); }
-	virtual IErrorManager& getErrorManager() const { return m_kernelCtx.getErrorManager(); }
+	virtual CErrorManager& getErrorManager() const { return m_kernelCtx.getErrorManager(); }
 
 	_IsDerivedFromClass_(T, OVK_ClassId_Kernel_KernelObjectT)
 
diff --git a/kernel/src/kernel/player/ovkCPlayer.cpp b/kernel/src/kernel/player/ovkCPlayer.cpp
index 6840fdd4fca50597ebd9e48c72b1d03ebc3e9a17..dbae92ba2566d4c4bf0168714ec1ef7fe8a80d29 100644
--- a/kernel/src/kernel/player/ovkCPlayer.cpp
+++ b/kernel/src/kernel/player/ovkCPlayer.cpp
@@ -107,16 +107,15 @@ bool CPlayer::setScenario(const CIdentifier& scenarioID, const CNameValuePairLis
 	if (localConfigurationTokens != nullptr)
 	{
 		this->getLogManager() << LogLevel_Trace << "Player setScenario: add local configuration token from map.\n";
-		for (size_t i = 0; i < localConfigurationTokens->getSize(); ++i)
+		for (size_t i = 0; i < localConfigurationTokens->size(); ++i)
 		{
-			CString name;
-			CString value;
+			std::string name, value;
 			if (localConfigurationTokens->getValue(i, name, value))
 			{
 				this->getLogManager() << LogLevel_Debug << "Player setScenario: add local configuration token: [" << name << "] = [" << value << "].\n";
-				CIdentifier tokenID = m_runtimeConfigManager->lookUpConfigurationTokenIdentifier(name);
-				if (tokenID == CIdentifier::undefined()) { m_runtimeConfigManager->createConfigurationToken(name, value); }
-				else { m_runtimeConfigManager->setConfigurationTokenValue(tokenID, value); }
+				CIdentifier tokenID = m_runtimeConfigManager->lookUpConfigurationTokenIdentifier(name.c_str());
+				if (tokenID == CIdentifier::undefined()) { m_runtimeConfigManager->createConfigurationToken(name.c_str(), value.c_str()); }
+				else { m_runtimeConfigManager->setConfigurationTokenValue(tokenID, value.c_str()); }
 			}
 				// This should not happen
 			else
diff --git a/kernel/src/kernel/player/ovkCPlayerContext.h b/kernel/src/kernel/player/ovkCPlayerContext.h
index e961b9737431b38e91507c01295d699593f6664a..fb3458369a7ee7bd29392422f691d730742e5754 100644
--- a/kernel/src/kernel/player/ovkCPlayerContext.h
+++ b/kernel/src/kernel/player/ovkCPlayerContext.h
@@ -28,7 +28,7 @@ public:
 	IAlgorithmManager& getAlgorithmManager() const override { return m_algorithmManager; }
 	IConfigurationManager& getConfigurationManager() const override { return m_configManager; }
 	ILogManager& getLogManager() const override { return m_boxLogManager; }
-	IErrorManager& getErrorManager() const override { return m_errorManager; }
+	CErrorManager& getErrorManager() const override { return m_errorManager; }
 	IScenarioManager& getScenarioManager() const override { return m_scenarioManager; }
 	ITypeManager& getTypeManager() const override { return m_typeManager; }
 	bool canCreatePluginObject(const CIdentifier& pluginID) const override { return m_pluginManager.canCreatePluginObject(pluginID); }
@@ -44,7 +44,7 @@ private:
 	IAlgorithmManager& m_algorithmManager;
 	IConfigurationManager& m_configManager;
 	ILogManager& m_logManager;
-	IErrorManager& m_errorManager;
+	CErrorManager& m_errorManager;
 	IScenarioManager& m_scenarioManager;
 	ITypeManager& m_typeManager;
 	mutable CBoxAlgorithmLogManager m_boxLogManager;
diff --git a/kernel/src/kernel/scenario/ovkCBoxListenerContext.h b/kernel/src/kernel/scenario/ovkCBoxListenerContext.h
index b537c8c92e2760d972b3c0ea530646a5a67a9c41..d3c45eedd4c7e585a922c5b78891059cc53f249b 100755
--- a/kernel/src/kernel/scenario/ovkCBoxListenerContext.h
+++ b/kernel/src/kernel/scenario/ovkCBoxListenerContext.h
@@ -18,7 +18,7 @@ public:
 	IScenarioManager& getScenarioManager() const override { return this->getKernelContext().getScenarioManager(); }
 	ITypeManager& getTypeManager() const override { return this->getKernelContext().getTypeManager(); }
 	ILogManager& getLogManager() const override { return this->getKernelContext().getLogManager(); }
-	IErrorManager& getErrorManager() const override { return this->getKernelContext().getErrorManager(); }
+	CErrorManager& getErrorManager() const override { return this->getKernelContext().getErrorManager(); }
 	IConfigurationManager& getConfigurationManager() const override { return this->getKernelContext().getConfigurationManager(); }
 	IBox& getBox() const override { return m_box; }
 
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 57332f642f4d8617a2f2c435bc8090330ce04b46..66a9a9f56835fb53d11f2798cb0118fd7a6d3c55 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -1,4 +1,3 @@
-OV_SET_CUSTOM_DOCUMENTATION("ebml" "EBML parser and formater library" "src" "include")
 # Add all the subdirs as projects of the named branch
 OV_ADD_PROJECTS("MODULES")
 
diff --git a/modules/csv/CMakeLists.txt b/modules/csv/CMakeLists.txt
index e376404db84a32428d6d6c509719394e08ebabc4..4cb642eb197e9d1ee603139aa4251e6ccfb5278f 100644
--- a/modules/csv/CMakeLists.txt
+++ b/modules/csv/CMakeLists.txt
@@ -8,7 +8,11 @@ add_library(${PROJECT_NAME} SHARED ${SRC_FILES})
 
 target_link_libraries(${PROJECT_NAME}
                       openvibe-common
-                      openvibe-module-fs)
+                      openvibe-module-fs
+					  Boost::boost
+                      Boost::filesystem
+                      Boost::regex
+)
 
 target_include_directories(${PROJECT_NAME}
                            PRIVATE include/csv
@@ -25,10 +29,6 @@ target_compile_options(${PROJECT_NAME}
                        PUBLIC -DCSV_Shared 
 )
 
-include("FindThirdPartyBoost")
-include("FindThirdPartyBoost_FileSystem")
-include("FindThirdPartyBoost_Regex")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/modules/date/CMakeLists.txt b/modules/date/CMakeLists.txt
index f5331c556f21522266c86c696bc292d0b4d7da01..9a4e3ba4c5fd2957e778faeadb84a1979a1729db 100644
--- a/modules/date/CMakeLists.txt
+++ b/modules/date/CMakeLists.txt
@@ -18,7 +18,9 @@ include("FindSourceRCProperties")
 add_library(${PROJECT_NAME} SHARED ${SRC_FILES})
 
 target_link_libraries(${PROJECT_NAME}
-                      openvibe-common)
+                      openvibe-common
+                      Boost::boost
+)
 
 target_include_directories(${PROJECT_NAME}
                            PRIVATE include/date
@@ -35,7 +37,6 @@ target_compile_options(${PROJECT_NAME}
                        PUBLIC -DDate_Shared 
 )
 
-include("FindThirdPartyBoost")
 include("FindThirdPartyExpat")
 
 # ---------------------------------
diff --git a/modules/ebml/doc/FormatingEBMLStreams.dox b/modules/ebml/doc/FormatingEBMLStreams.dox
deleted file mode 100644
index 2edc692cf3a39073460d7009733e6fddc30fb6d5..0000000000000000000000000000000000000000
--- a/modules/ebml/doc/FormatingEBMLStreams.dox
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * \page Doc_FormatingEBMLStreams Formating EBML streams
- *
- * \section Doc_FormatingEBMLStreams_Introduction Introduction
- *
- * This page tries to teach how a user of this library should use
- * the writing functions in order to build and format an EBML
- * stream correctly. For those who don't know what EBML is,
- * it is basically a binary XML created and used by the matroska
- * developpers. The libmatroska is based on the libebml
- * implementation of these guys. Fore more details, please read 
- * the \ref Doc_WhatIsEBML page first and eventually visit the 
- * EBML web page at http://ebml.sourceforge.net/
- *
- * \section Doc_FormatingEBMLStreams_Concept Concepts
- *
- * The idea of this formating library is to transform the data
- * provided by the user application into EBML buffers. Those EBML
- * buffers are then given to a user callback object which know
- * what to do with the computed data (maybe write it to a file,
- * send it on a socket, log it in a console, whatever...)
- *
- * The library is divided into three main components :
- *  - The writer itself that does the formating stuff
- *  - An implementation of the callback object (the implementation
- *    is left to the user application developper)
- *  - An optionnal helper object that knows more on the
- *    content of the EBML stream.
- *
- * Here comes the organisation of the different modules and how
- * data go from one to another. Note that the user application
- * and the user callback object may share some information so the
- * callback object communicates with the application itself.
- *
- * \image html ebml_formating_concept.png "Concept"
- *
- * Here comes the UML class diagram, presenting the main classes
- * involved in the presented behavior.
- *
- * \image html ebml_formating_class.png "Class Diagram"
- *
- * See EBML::IWriter, EBML::IWriterCallback and EBML::IWriterHelper
- * for more details on each of these classes.
- *
- * \section Doc_FormatingEBMLStreams_SampleCode Sample code
- *
- * In this section, a sample of user application code is presented
- * that opens several child nodes and dumps the created stream
- * into a file for later use. This file can be parsed using
- * the sample code of the page named \ref Doc_ParsingEBMLStreams
- *
- * The callback object implementation looks something like this :
- *
- * \code
- * class CWriterCallback : public EBML::IWriterCallback
- * {
- * public:
- *   CWriterCallback(char* filename) { m_file=fopen(filename, "wb"); }
- *   virtual ~CWriterCallback() { if(m_file) fclose(m_file); }
- *   virtual void write(const void* buffer, const size_t size) { if(m_file) fwrite(buffer, size, 1, m_file); }
- *   FILE* m_file;
- * };
- * \endcode
- *
- * Then in the user application code, we can write the
- * initialisation this way :
- *
- * \code
- * CWriterCallback oCallback("test.ebml");
- * EBML::IWriter* pWriter=EBML::createWriter(oCallback);
- * EBML::IWriterHelper* pWriterHelper=EBML::createWriterHelper();
- * pWriterHelper->connect(pWriter);
- * \endcode
- *
- * The use of the EBML writer looks something like this :
- *
- * \code
- * pWriterHelper->openChild(EBML_Identifier_Header);
- *   pWriterHelper->openChild(EBML_Identifier_DocType);
- *     pWriterHelper->setStr("EBML basic sample");
- *   pWriterHelper->closeChild();
- *   pWriterHelper->openChild(EBML_Identifier_DocTypeVersion);
- *     pWriterHelper->setUInt(1);
- *   pWriterHelper->closeChild();
- * pWriterHelper->closeChild();
- * \endcode
- *
- * Finally, we have to release the objects and to clean memory :
- *
- * \code
- * pWriterHelper->disconnect();
- * pWriterHelper->release();
- * pWriter->release();
- * \endcode
- */
diff --git a/modules/ebml/doc/ParsingEBMLStreams.dox b/modules/ebml/doc/ParsingEBMLStreams.dox
deleted file mode 100644
index e47fc509cbf2ada587cc1fd852877372dfa72254..0000000000000000000000000000000000000000
--- a/modules/ebml/doc/ParsingEBMLStreams.dox
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * \page Doc_ParsingEBMLStreams Parsing EBML streams
- *
- * \section Doc_ParsingEBMLStreams_Introduction Introduction
- *
- * This page tries to teach how a user of this library should use
- * the reading functions in order to read and parse an EBML
- * stream correctly. For those who don't know what EBML is,
- * it is basically a binary XML created and used by the matroska
- * developpers. The libmatroska is based on the libebml
- * implementation of these guys. Fore more details, please read 
- * the \ref Doc_WhatIsEBML page first and eventually visit the 
- * EBML web page at http://ebml.sourceforge.net/
- *
- * \section Doc_ParsingEBMLStreams_Concept Concepts
- *
- * The idea of this parsing library is to transform the stream
- * data provided by the user application into understandable
- * EBML interpreted commands. Once the EBML nodes are found and
- * parsed, they are sent to a callback object that should know
- * what to do with them.
- *
- * The design of the parsing interface is closed to the one of
- * \c eXpat, an XML parser library (see http://expat.sourceforge.net
- * for more details on \c eXpat). Using such interface allows light
- * code and on-the-fly parsing, that means the parser does not
- * need to have all the data ready before starting the parsing
- * process... The data can arrive while the parsing is beeing
- * done.
- *
- * It is the responsability of the user application to read
- * the EBML stream from a file, a socket, a user input or
- * whatever, and then to send this to the parser...
- *
- * At least, the callback object may use a reader helper that
- * knows how to read standard EBML types such as integers,
- * floats, strings etc...
- *
- * The library is divided into three main components :
- *  - The reader itself that does the parsing stuffs
- *  - An implementation of the callback object (the implementation
- *    is left to the user application developper)
- *  - An optionnal helper object that knows more on the
- *    content of the EBML stream.
- *
- * Here comes the organisation of the different modules and how
- * data go from one to another. Note that the user application
- * and the user callback object may share some information so the
- * callback object communicates with the application itself.
- *
- * \image html ebml_parsing_concept.png "Concept"
- *
- * Here comes the UML class diagram, presenting the main classes
- * involved in the presented behavior.
- *
- * \image html ebml_parsing_class.png "Class Diagram"
- *
- * See EBML::IReader, EBML::IReaderCallback and EBML::IReaderHelper
- * for more details on each of these classes.
- *
- * \section Doc_ParsingEBMLStreams_SampleCode Sample code
- *
- * In this section, a sample of user application code is presented
- * that parses the sample file created in the page named :
- * \ref Doc_FormatingEBMLStreams
- *
- * The parsed value are printed in the console.
- *
- * The callback object looks something like this :
- *
- * \code
- * class CReaderCallback : public EBML::IReaderCallback
- * {
- * public:
- *   CReaderCallback()
- *   {
- *     m_helper=EBML::createReaderHelper();
- *   }
- *   virtual ~CReaderCallback()
- *   {
- *     if(m_helper) m_helper->release();
- *   }
- *   virtual bool isMasterChild(const EBML::CIdentifier& identifier)
- *   {
- *     if(identifier==EBML_Identifier_Header) return true;
- *     if(identifier==EBML_Identifier_DocType) return true;
- *     if(identifier==EBML_Identifier_DocTypeVersion) return true;
- *     return false;
- *   }
- *   virtual void openChild(const EBML::CIdentifier& identifier)
- *   {
- *     m_oCurrent=identifier;
- *   }
- *   virtual void processChildData(const void* buffer, const size_t size)
- *   {
- *     if(m_oCurrent==EBML_Identifier_DocType)
- *       std::cout << "Doc type:" << m_helper->getStr(buffer, size) << std::endl;
- *     if(m_oCurrent==EBML_Identifier_DocTypeVersion)
- *       std::cout << "Dox type version:" << m_helper->getUInt(buffer, size) << std::endl;
- *   }
- *   virtual void closeChild()
- *   {
- *   }
- *   EBML::IReaderHelper* m_helper;
- * };
- * \endcode
- *
- * Then in the user application code, we can write the
- * initialisation this way :
- *
- * \code
- * CReaderCallback oCallback;
- * EBML::IReader* pReader=EBML::createReader(oCallback);
- * \endcode
- *
- * Now suppose the user application got some data from the file
- * in a \c buffer of size \c size ; it is sent to the
- * parser this way :
- *
- * \code
- * pReader->processData(buffer, size);
- * \endcode
- *
- * Finally, don't forget to release the object and to clean memory :
- *
- * \code
- * pReader->release();
- * \endcode
- */
diff --git a/modules/ebml/doc/WhatIsEBML.dox b/modules/ebml/doc/WhatIsEBML.dox
deleted file mode 100644
index e276df634eb38d97740aa9505b7d052eaed425ad..0000000000000000000000000000000000000000
--- a/modules/ebml/doc/WhatIsEBML.dox
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * \page Doc_WhatIsEBML What is EBML
- *
- * This page tries to explain what EBML is and why it is usefull.
- *
- * - see http://ebml.sourceforge.net/ for more details
- * - see http://ebml.sourceforge.net/specs/ for specifications
- * - see http://www.matroska.org/technical/specs/ for even more details
- *
- * - check libebml for a sample implementation of EBML
- * - check libmatroska for a sample of library using libebml
- *   and a concrete use of EBML
- *
- * \todo Write more documentation on what EBML is
- */
diff --git a/modules/ebml/doc/ebml_formating_class.dia b/modules/ebml/doc/ebml_formating_class.dia
deleted file mode 100644
index 15b26003379bc93ac550617b73d9d491d045b723..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_formating_class.dia and /dev/null differ
diff --git a/modules/ebml/doc/ebml_formating_class.png b/modules/ebml/doc/ebml_formating_class.png
deleted file mode 100644
index 48bcda6b9d54824d66c9799990c0f98051d713df..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_formating_class.png and /dev/null differ
diff --git a/modules/ebml/doc/ebml_formating_concept.dia b/modules/ebml/doc/ebml_formating_concept.dia
deleted file mode 100644
index d3d126b2d821b24395af45ca5d10d59993e15255..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_formating_concept.dia and /dev/null differ
diff --git a/modules/ebml/doc/ebml_formating_concept.png b/modules/ebml/doc/ebml_formating_concept.png
deleted file mode 100644
index 5e0ba21736a3aba8491f1225bd8e13e274dda361..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_formating_concept.png and /dev/null differ
diff --git a/modules/ebml/doc/ebml_parsing_class.dia b/modules/ebml/doc/ebml_parsing_class.dia
deleted file mode 100644
index 71bcd48354d7e8e81981800a122c58880feab540..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_parsing_class.dia and /dev/null differ
diff --git a/modules/ebml/doc/ebml_parsing_class.png b/modules/ebml/doc/ebml_parsing_class.png
deleted file mode 100644
index 3f078dd7f1eecb59bdbae43c5ed1e6708ac3002f..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_parsing_class.png and /dev/null differ
diff --git a/modules/ebml/doc/ebml_parsing_concept.dia b/modules/ebml/doc/ebml_parsing_concept.dia
deleted file mode 100644
index 295bc998378f80633157d262a5b1b8a439936d12..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_parsing_concept.dia and /dev/null differ
diff --git a/modules/ebml/doc/ebml_parsing_concept.png b/modules/ebml/doc/ebml_parsing_concept.png
deleted file mode 100644
index a119fe1ef8faee5c03dc93f1555df02d579aa6d0..0000000000000000000000000000000000000000
Binary files a/modules/ebml/doc/ebml_parsing_concept.png and /dev/null differ
diff --git a/modules/fs/CMakeLists.txt b/modules/fs/CMakeLists.txt
index e9e1746aa4b178d33660436a9b7712b842fbc8a9..b856eb43d72997a0425a182eee8493374f49788c 100755
--- a/modules/fs/CMakeLists.txt
+++ b/modules/fs/CMakeLists.txt
@@ -7,7 +7,10 @@ include("FindSourceRCProperties")
 add_library(${PROJECT_NAME} SHARED ${SRC_FILES})
 
 target_link_libraries(${PROJECT_NAME}
-                      openvibe-common)
+                      openvibe-common
+					  Boost::boost
+					  Boost::filesystem
+)
 
 target_include_directories(${PROJECT_NAME}
                            PRIVATE include/fs 
@@ -24,9 +27,6 @@ target_compile_options(${PROJECT_NAME}
                        PUBLIC -DFS_Shared 
 )
 
-include("FindThirdPartyBoost")
-include("FindThirdPartyBoost_FileSystem")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/modules/fs/src/Files.cpp b/modules/fs/src/Files.cpp
index 5ce9a1e28c606f09b1bcaa88c3951e4805881728..b0e75ade0896833f90e50f8a52603a8c0bb1a149 100644
--- a/modules/fs/src/Files.cpp
+++ b/modules/fs/src/Files.cpp
@@ -22,7 +22,7 @@ namespace FS {
 
 //  * 2006-08-30 YRD - Portability note : using namespace FS confuses windows platform SDK because it defines itself a 'boolean' type. Thus the following define to force the use of FS::boolean !
 
-#if defined TARGET_HAS_Boost && BOOST_VERSION / 100 % 1000 >= 55
+#if BOOST_VERSION / 100 % 1000 >= 55
 /**
  * \brief Makes a recursive copy of source folder to target folder.
  *        Operation can fail in several cases:
@@ -337,7 +337,7 @@ bool Files::removeAll(const char* path)
 // old boost compliance
 // manage cases here
 
-#if defined TARGET_HAS_Boost && BOOST_VERSION / 100 % 1000 >= 55
+#if BOOST_VERSION / 100 % 1000 >= 55
 
 bool Files::copyFile(const char* srcFile, const char* dstPath)
 {
diff --git a/modules/system/CMakeLists.txt b/modules/system/CMakeLists.txt
index be67be36655f0f9f4a002be31f3273c209a42c68..2d1ead8bb8988f234168b70cfc403e2c3ef8a2a2 100755
--- a/modules/system/CMakeLists.txt
+++ b/modules/system/CMakeLists.txt
@@ -43,10 +43,12 @@ target_compile_options(${PROJECT_NAME}
 )
 
 if(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.0")
-    include("FindThirdPartyBoost")
-    OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION})
-    OV_LINK_BOOST_LIB("thread" ${OV_WIN32_BOOST_VERSION})
-    include("FindThirdPartyBoost_Chrono")
+    target_link_libraries(${PROJECT_NAME}
+                          Boost::boost
+                          Boost::system
+                          Boost::thread
+                          Boost::chrono
+    )
 endif()
 
 # ---------------------------------
diff --git a/modules/system/src/ovCTime.cpp b/modules/system/src/ovCTime.cpp
index a2227acc5dfc97c18faef15832af93f2a118283e..6bb7183211c457806eba0318398a121ec1437b0d 100644
--- a/modules/system/src/ovCTime.cpp
+++ b/modules/system/src/ovCTime.cpp
@@ -11,7 +11,7 @@
 // time handling strategy selection
 // \note With officialy supported compilers and required boost version
 //       it should never fallback in a OV_USE_SYSTEM case
-#if (defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono))
+#if (defined(_MSC_VER) && _MSC_VER <= 1800)
 
 #include <boost/chrono/config.hpp>
 
@@ -25,13 +25,13 @@ namespace Timelib = boost;
 #error "Please use OpenViBE recommended version of Boost"
 #endif // BOOST_CHRONO_HAS_CLOCK_STEADY
 
-#else // defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono)
+#else // defined(_MSC_VER) && _MSC_VER <= 1800
 
 #include <chrono>
 #include <thread>
 namespace Timelib = std;
 
-#endif // defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono)
+#endif // defined(_MSC_VER) && _MSC_VER <= 1800
 
 using internal_clock = Timelib::chrono::steady_clock;
 // using internal_clock = chrono::high_resolution_clock;
diff --git a/modules/xml/CMakeLists.txt b/modules/xml/CMakeLists.txt
index 4b5fc93d4365244188d93daf94423dd072182ab2..9ffe9db9fc4e6057d24b960ec0842b7609785b43 100644
--- a/modules/xml/CMakeLists.txt
+++ b/modules/xml/CMakeLists.txt
@@ -7,11 +7,14 @@ add_library(${PROJECT_NAME} SHARED ${SRC_FILES})
 
 target_link_libraries(${PROJECT_NAME}
                       openvibe-common
-                      openvibe-module-fs)
+                      openvibe-module-fs
+                      Boost::boost
+)
 
 target_include_directories(${PROJECT_NAME} 
                            PRIVATE include/xml
-                           PUBLIC include)
+                           PUBLIC include
+)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
                       VERSION ${PROJECT_VERSION}
@@ -23,8 +26,7 @@ target_compile_options(${PROJECT_NAME}
                        PRIVATE -DXML_Exports
                        PUBLIC -DXML_Shared 
 )
-    
-include("FindThirdPartyBoost")
+
 include("FindThirdPartyExpat")
 
 # ---------------------------------
diff --git a/modules/xml/src/IXMLNode.cpp b/modules/xml/src/IXMLNode.cpp
index c4877c507ee1d0aefbb596dbbc1ee7e57c7e57fa..83e2be1058667e7ab301a87b946069981fbedf04 100644
--- a/modules/xml/src/IXMLNode.cpp
+++ b/modules/xml/src/IXMLNode.cpp
@@ -5,6 +5,7 @@
 #include <stdexcept>
 #include <vector>
 #include <map>
+#include <algorithm>
 
 //This is to remove the warning on windows about strdup
 #if defined TARGET_OS_Windows
@@ -79,8 +80,14 @@ void IXMLNodeImpl::setPCData(const char* data)
 
 void IXMLNodeImpl::appendPCData(const char* data)
 {
-	m_pcData += data;
-	m_hasPCData = true;
+    std::string strData(data);
+    size_t nTabs = std::count(strData.begin(), strData.end(), '\t');
+
+    // Only add PC Data if it is not a newline feed, or tab(s).
+    if (strData.size() > nTabs && strData != "\n") {
+        m_pcData += data;
+        m_hasPCData = true;
+    }
 }
 
 IXMLNode* IXMLNodeImpl::getChildByName(const char* name) const
diff --git a/openvibe/include/openvibe/CIdentifier.hpp b/openvibe/include/openvibe/CIdentifier.hpp
index 34fc267897e7b0ba1fba6262c4325e8d62dd74a5..9555ed505073f8448bc446266be8d64f54ce431e 100644
--- a/openvibe/include/openvibe/CIdentifier.hpp
+++ b/openvibe/include/openvibe/CIdentifier.hpp
@@ -193,6 +193,8 @@ public:
 	/// <remarks> Use this function with care, identifiers should not be considered as integers.
 	/// Actually, the internal 64 bits representation may change, resulting in code port needs if you use this function.
 	/// Avoid this, this function keep previous compatibility with heavy name. </remarks>
+	/// \deprecated Use id() method instead.
+	OV_Deprecated("Use id() method instead.")
 	uint64_t toUInteger() const { return m_id; }
 
 	/// <summary> Creates a random identifier. </summary>
diff --git a/openvibe/include/openvibe/CMatrix.hpp b/openvibe/include/openvibe/CMatrix.hpp
index 4d35baa1d8cfd755d58247ff204747cb7a723162..6d80e450309fc5c43cac6ee62d20d91a1e851630 100644
--- a/openvibe/include/openvibe/CMatrix.hpp
+++ b/openvibe/include/openvibe/CMatrix.hpp
@@ -72,7 +72,7 @@ public:
 	/// <returns> The buffer. </returns>
 	double* getBuffer()
 	{
-		if (!m_buffer) { initBuffer(); }				// Initialize buffer if needed
+		if (!m_buffer) { initBuffer(); }	// Initialize buffer if needed
 		return m_buffer;
 	}
 
@@ -116,6 +116,27 @@ public:
 	/// <remarks> keep previous compatibility with heavy name. Avoid to used it, intended to be removed. </remakrs>
 	bool setDimensionLabel(const size_t dim, const size_t idx, const char* label) const { return setDimensionLabel(dim, idx, std::string(label)); }
 
+	/// <summary> Fill the matrix with the buffer. </summary>
+	/// <param name="buffer"> The buffer to copy. </param>
+	/// <param name="size"> The size of the buffer. </param>
+	/// <returns> <c>True</c> if the matrix is filled with buffer, <c>False</c> if the buffer size exceeds the matrix size. </returns>
+	/// <remarks> The buffer can contain any numeric type. The CMatrix class stores them as double. </remakrs>
+	template <class T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
+	bool setBuffer(const T* buffer, const size_t size)
+	{
+		if (!m_buffer) { initBuffer(); }				// Initialize buffer if needed
+		if (size > m_size) { return false; }
+		for (size_t i = 0; i < size; ++i) { m_buffer[i] = double(buffer[i]); }
+		return true;
+	}
+
+	/// <summary> Fill the matrix with the buffer. </summary>
+	/// <param name="buffer"> The buffer to copy. </param>
+	/// <returns> <c>True</c> if the matrix is filled with buffer, <c>False</c> if the buffer size exceeds the matrix size. </returns>
+	/// <remarks> The buffer can contain any numeric type. The CMatrix class stores them as double. </remakrs>
+	template <class T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
+	bool setBuffer(const std::vector<T>& buffer) { return setBuffer(buffer.data(), buffer.size()); }
+
 	//--------------------------------------------------
 	//------------------- Operators --------------------
 	//--------------------------------------------------
@@ -295,6 +316,8 @@ private:
 	std::vector<std::vector<std::string>>* m_dimLabels = nullptr;	///< Labels of all dimensions (pointer to avoid export warning C4251)
 };
 
-typedef CMatrix IMatrix;	// Keep previous compatibility. Avoid to used it, intended to be removed. 
+/// \deprecated Use the CMatrix class instead.
+OV_Deprecated("Use the CMatrix class instead")
+typedef CMatrix IMatrix;	///< Keep previous compatibility. Avoid to used it, intended to be removed. 
 
 }  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/CNameValuePairList.hpp b/openvibe/include/openvibe/CNameValuePairList.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b249ee2955b32e8e0c6f2e2d203db9cd87a3b04d
--- /dev/null
+++ b/openvibe/include/openvibe/CNameValuePairList.hpp
@@ -0,0 +1,214 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CNameValuePairList.hpp
+/// \brief OpenViBE Pair Name/Value List Class (It handles a hidden map associating string/keys to string/values).
+/// 
+/// This interface offers functionalities to handle a collection of OpenViBE stimulations.
+/// This collection basicaly consists in a list of stimulation information.
+/// Each stimulation has three information : an identifier, a date and a duration.
+/// \author  Vincent Delannoy (INRIA/IRISA).
+/// \version 1.0.
+/// \date 01/07/2008.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include <ov_common_defines.h>
+#include "ovCString.h"
+
+#include <map>
+#include <string>
+
+namespace OpenViBE {
+
+/// <summary> OpenViBE Pair Name/Value List Class (It handles a hidden map associating string/keys to string/values). </summary>
+/// <remarks> Implementation based on std::map<std::string, std::string>.  
+/// Map is a pointer to prevents potential compile/link errors when dynamically loading modules. </remarks>
+class OV_API CNameValuePairList
+{
+public:
+	//--------------------------------------------------
+	//------------ Constructor / Destructor ------------
+	//--------------------------------------------------
+
+	/// <summary> Default constructor of the <see cref="CNameValuePairList"/> class (Initializes the list). </summary>
+	CNameValuePairList() { m_map = new std::map<std::string, std::string>; }
+
+	/// <summary> Copy constructor of the <see cref="CNameValuePairList"/> class (Initializes the list). </summary>
+	/// <param name="pairs">The list to copy. </param>
+	CNameValuePairList(const CNameValuePairList& pairs) { m_map = new std::map<std::string, std::string>(*pairs.m_map); }
+
+	/// <summary> Destructor of the <see cref="CNameValuePairList"/> class (Releases the list). </summary>
+	~CNameValuePairList() { delete m_map; }
+
+	//--------------------------------------------------
+	//----------------- Getter/Setter ------------------
+	//--------------------------------------------------
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	void setValue(const std::string& name, const std::string& value) const { m_map->operator[](name) = value; }
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	void setValue(const std::string& name, const double& value) const { m_map->operator[](name) = std::to_string(value); }
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	void setValue(const std::string& name, const bool value) const { m_map->operator[](name) = (value ? std::string("1") : std::string("0")); }
+
+	/// <summary> Retrieve a string value from the list. </summary>
+	/// <param name="name"> Name whose value is to be retrieved. </param>
+	/// <param name="value"> String value to be retrieved from the list. </param>
+	/// <returns> <c>true</c> if value could be retrieved, <c>false</c> otherwise. </returns>
+	bool getValue(const std::string& name, std::string& value) const;
+
+	/// <summary> Retrieve a double value from the list. </summary>
+	/// <param name="name"> Name whose value is to be retrieved. </param>
+	/// <param name="value"> Double value to be retrieved from the list. </param>
+	/// <returns> <c>true</c> if value could be retrieved, <c>false</c> otherwise. </returns>
+	bool getValue(const std::string& name, double& value) const;
+
+	/// <summary> Retrieve a boolean value from the list.
+	/// 
+	/// In the current implementation a value evaluates to true if its string equals "1" and to false if it equals "0".</summary>
+	/// <param name="name"> Name whose value is to be retrieved. </param>
+	/// <param name="value"> boolean value to be retrieved from the list. </param>
+	/// <returns> <c>true</c> if value could be retrieved and evaluates to a boolean, <c>false</c> otherwise. </returns>
+	bool getValue(const std::string& name, bool& value) const;
+
+	/// <summary> Retrieve a value from the list. </summary>
+	/// <param name="index"> The index whose value is to be retrieved. </param>
+	/// <param name="name"> Name of the value stored in index. </param>
+	/// <param name="value"> Value stored in index. </param>
+	/// <returns> <c>true</c> if value could be retrieved, <c>false</c> otherwise. </returns>
+	bool getValue(const size_t index, std::string& name, std::string& value) const;
+
+	/// <summary> Retrieve the number of stored elements. </summary>
+	/// <returns> The number of stored elements. </returns>
+	size_t size() const { return m_map->size(); }
+
+	//-------------------------------------------------------
+	//---------------------- Operators ----------------------
+	//-------------------------------------------------------
+
+	/// <summary> Affectation operator (copy). </summary>
+	/// <param name="pairs">The list to copy. </param>
+	/// <returns> This list. </returns>
+	CNameValuePairList& operator=(const CNameValuePairList& pairs);
+
+	/// <summary> Display the Labels. </summary>
+	/// <param name="sep">	separator between value (by default tabulation). </param>
+	/// <returns> the Labels. </returns>
+	std::string str(const std::string& sep = "\t") const;
+
+	/// <summary> Override the ostream operator. </summary>
+	/// <param name="os">	The ostream. </param>
+	/// <param name="obj">	The object. </param>
+	/// <returns> Return the modified ostream. </returns>
+	friend std::ostream& operator<<(std::ostream& os, const CNameValuePairList& obj)
+	{
+		os << obj.str();
+		return os;
+	}
+
+	//--------------------------------------------------------
+	//---------------------- Deprecated ----------------------
+	//--------------------------------------------------------
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	/// <returns> <c>true</c> </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool setValue(const CString& name, const CString& value) const;
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	/// <returns> <false> if pointer is <c>nullptr</c>, <c>true</c> otherwise. </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool setValue(const CString& name, const char* value) const;
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	/// <returns> <c>true</c> </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool setValue(const CString& name, const double& value) const;
+
+	/// <summary> Insert a name/value pair. </summary>
+	/// <param name="name"> Name to add to the list. </param>
+	/// <param name="value"> Value to associate with the name. </param>
+	/// <returns> <c>true</c> </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool setValue(const CString& name, bool value) const;
+
+	/// <summary> Retrieve a string value from the list. </summary>
+	/// <param name="name"> Name whose value is to be retrieved. </param>
+	/// <param name="value"> String value to be retrieved from the list. </param>
+	/// <returns> <c>true</c> if value could be retrieved, <c>false</c> otherwise. </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool getValue(const CString& name, CString& value) const;
+
+	/// <summary> Retrieve a double value from the list. </summary>
+	/// <param name="name"> Name whose value is to be retrieved. </param>
+	/// <param name="value"> Double value to be retrieved from the list. </param>
+	/// <returns> <c>true</c> if value could be retrieved, <c>false</c> otherwise. </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool getValue(const CString& name, double& value) const;
+
+	/// <summary> Retrieve a boolean value from the list.
+	/// 
+	/// In the current implementation a value evaluates to true if its string equals "1" and to false if it equals "0".</summary>
+	/// <param name="name"> Name whose value is to be retrieved. </param>
+	/// <param name="value"> boolean value to be retrieved from the list. </param>
+	/// <returns> <c>true</c> if value could be retrieved and evaluates to a boolean, <c>false</c> otherwise. </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool getValue(const CString& name, bool& value) const;
+
+	/// <summary> Retrieve a value from the list. </summary>
+	/// <param name="index"> The index whose value is to be retrieved. </param>
+	/// <param name="name"> Name of the value stored in index. </param>
+	/// <param name="value"> Value stored in index. </param>
+	/// <returns> <c>true</c> if value could be retrieved, <c>false</c> otherwise. </returns>
+	/// \deprecated Use the same method with std::string parameter instead.
+	OV_Deprecated("Use the same method with std::string parameter instead.")
+	bool getValue(const size_t index, CString& name, CString& value) const;
+
+	/// <summary> Retrieve the number of stored elements. </summary>
+	/// <returns> The number of stored elements. </returns>
+	/// \deprecated Use size() method instead.
+	OV_Deprecated("Use size() method instead.")
+	size_t getSize() const { return m_map->size(); }
+
+protected:
+
+	std::map<std::string, std::string>* m_map = nullptr; ///< The list implementation
+};
+}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/CStimulationSet.hpp b/openvibe/include/openvibe/CStimulationSet.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..af59a4dce5526e48039612504fac698ac0312b67
--- /dev/null
+++ b/openvibe/include/openvibe/CStimulationSet.hpp
@@ -0,0 +1,301 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CStimulationSet.hpp
+/// \brief Basic standalone OpenViBE Stimulation Set implementation.
+/// 
+/// This interface offers functionalities to handle a collection of OpenViBE stimulations.
+/// This collection basicaly consists in a list of stimulation information.
+/// Each stimulation has three information : an identifier, a dateand a duration.
+/// \author  Yann Renard (INRIA/IRISA) & Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 08/11/2021.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+#pragma once
+
+#include "ovIObject.h"
+#include <vector>
+#include <sstream>
+
+namespace OpenViBE {
+/// <summary> OpenViBE StimulationSet Class. </summary>
+/// <seealso cref="IObject" />
+class OV_API CStimulationSet final : public IObject
+{
+public:
+	//--------------------------------------------------
+	//------------ Constructor / Destructor ------------
+	//--------------------------------------------------
+
+	CStimulationSet() { m_set = new std::vector<SStimulation>; }
+	~CStimulationSet() override { delete m_set; }
+
+	//--------------------------------------------------
+	//----------------- Getter/Setter ------------------
+	//--------------------------------------------------
+	
+	/// <summary> Clears this stimulation set removing every existing stimulation. </summary>
+	void clear() const { m_set->clear(); }
+
+	/// <summary> Clears this stimulation set removing every existing stimulation. </summary>
+	/// <return> Clears this stimulation set removing every existing stimulation. </return>
+	size_t size() const { return m_set->size(); }
+
+	/// <summary> Changes the stimulation count in this stimulation set. </summary>
+	/// <param name="n">the new number of stimulations. </param>
+	void resize(const size_t n) const { m_set->resize(n); }
+
+	/// <summary> Gets the identifier of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation which identifier has to be returned. </param>
+	/// <return> The identifier for the specified stimulation. </return>
+	uint64_t getId(const size_t index) const { return m_set->at(index).id; }
+
+	/// <summary> Gets the date of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation which date has to be returned. </param>
+	/// <return> the date for the specified stimulation. </return>
+	/// <remarks> The returned date is relative to the beginning of this stimulation set. </remarks>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	uint64_t getDate(const size_t index) const { return m_set->at(index).date; }
+
+	/// <summary> Gets the duration of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation which duration has to be returned. </param>
+	/// <return> the duration for the specified stimulation. </return>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	uint64_t getDuration(const size_t index) const { return m_set->at(index).duration; }
+
+	/// <summary> Changes the identifier of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation which id should be changed. </param>
+	/// <param name="id">the new id for the specified stimulation. </param>
+	void setId(const size_t index, const uint64_t id) const { m_set->at(index).id = id; }
+
+	/// <summary> Changes the date of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation which date should be changed. </param>
+	/// <param name="date">the new date for the specified stimulation. </param>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	void setDate(const size_t index, const uint64_t date) const { m_set->at(index).date = date; }
+
+	/// <summary> Changes the duration of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation which duration should be changed. </param>
+	/// <param name="duration">the new duration for the specified stimulation. </param>
+	/// <remarks> The returned date is relative to the beginning of this stimulation set. </remarks>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	void setDuration(const size_t index, const uint64_t duration) const { m_set->at(index).duration = duration; }
+
+	//--------------------------------------------------
+	//---------------------- Misc ----------------------
+	//--------------------------------------------------
+	/// <summary> Appends a stimulation to this stimulation set. </summary>
+	/// <param name="id">the identifier of the stimulation to append. </param>
+	/// <param name="date">the date of the stimulation. </param>
+	/// <param name="duration">the duration of the stimulation. </param>
+	void push_back(const uint64_t id, const uint64_t date, const uint64_t duration) const { m_set->push_back(SStimulation(id, date, duration)); }
+
+	/// <summary> Inserts a stimulation to this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation to insert. </param>
+	/// <param name="id"> The identifier of the stimulation. </param>
+	/// <param name="date"> The date of the stimulation. </param>
+	/// <param name="duration"> The duration of the stimulation. </param>
+	/// <remarks> Stimulation Set indexing changes after calling this function : stimulation(s) following the given index have their index incremented by 1. </remarks>
+	void insert(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) const
+	{
+		m_set->insert(m_set->begin() + index, SStimulation(id, date, duration));
+	}
+
+	/// <summary> Removes a stimulation from this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation to remove. </param>
+	/// <remarks> Stimulation Set indexing changes after calling this function : stimulation(s) following the given index have their index decremented by 1. </remarks>
+	void erase(const size_t index) const { m_set->erase(m_set->begin() + index); }
+
+	/// <summary> Shifts the dates of all stimulations in set. </summary>
+	/// <param name="shift"> The time shift. </param>
+	void shift(const uint64_t shift) const { for (auto& stim : *m_set) { stim.date += shift; } }
+
+	/// <summary> Copies the specified stimulation set. </summary>
+	/// <param name="set"> The stimulation set to copy. </param>
+	/// <param name="shift"> The time shift. </param>
+	void copy(const CStimulationSet& set, const uint64_t shift = 0) const
+	{
+		if (this == &set) { return; }
+		clear();
+		append(set, shift);
+	}
+
+	/// <summary> Appends the specified stimulation set. </summary>
+	/// <param name="set"> The stimulation set to append. </param>
+	/// <param name="shift"> The time shift. </param>
+	void append(const CStimulationSet& set, const uint64_t shift = 0) const
+	{
+		const size_t n = set.size();
+		for (size_t i = 0; i < n; ++i) { push_back(set.getId(i), set.getDate(i) + shift, set.getDuration(i)); }
+	}
+
+	/// <summary> Appends the stimulations that are in the specified time range. </summary>
+	/// <param name="set"> The stimulation set to append. </param>
+	/// <param name="startTime"> The start time. </param>
+	/// <param name="endTime"> The end time. </param>
+	/// <param name="shift"> The time shift. </param>
+	/// <remarks> The range includes start time, but excludes end time. The shift is applied after the selection. </remarks>
+	void appendRange(const CStimulationSet& set, const uint64_t startTime, const uint64_t endTime, const uint64_t shift = 0) const
+	{
+		const size_t n = set.size();
+		for (size_t i = 0; i < n; ++i) {
+			if (startTime <= set.getDate(i) && set.getDate(i) < endTime) { push_back(set.getId(i), set.getDate(i) + shift, set.getDuration(i)); }
+		}
+	}
+
+	/// <summary> Removes the stimulations that are in the specified time range. </summary>
+	/// <param name="startTime"> The start time. </param>
+	/// <param name="endTime"> The end time. </param>
+	/// <remarks> The range includes start time, but excludes end time. </remarks>
+	void removeRange(const uint64_t startTime, const uint64_t endTime) const
+	{
+		for (size_t i = 0; i < size(); ++i) { if (startTime <= getDate(i) && getDate(i) < endTime) { erase(i--); } }
+	}
+
+
+	/// <summary> Provides readable format of the stimulation set. </summary>
+	/// <returns> the Stimulation Set. </returns>
+	std::string str() const
+	{
+		std::stringstream ss;
+		ss.precision(10);
+		for (auto& stim : *m_set) { ss << "[" << stim.id << ", " << stim.date << ", " << stim.duration << "]" << std::endl; }
+		return ss.str();
+	}
+
+	/// <summary> Override the ostream operator. </summary>
+	/// <param name="os">	The ostream. </param>
+	/// <param name="obj">	The object. </param>
+	/// <returns> Return the modified ostream. </returns>
+	friend std::ostream& operator<<(std::ostream& os, const CStimulationSet& obj)
+	{
+		os << obj.str();
+		return os;
+	}
+
+	//--------------------------------------------------------
+	//---------------------- Deprecated ----------------------
+	//--------------------------------------------------------
+
+	/// <summary> Clears this stimulation set removing every existing stimulation. </summary>
+	/// <return> Clears this stimulation set removing every existing stimulation. </return>
+	/// \deprecated Use size() method instead (more standard naming style).
+	OV_Deprecated("Use size() method instead (more standard naming style).")
+	size_t getStimulationCount() const { return m_set->size(); }
+
+	/// <summary> Changes the stimulation count in this stimulation set. </summary>
+	/// <param name="n">the new number of stimulations. </param>
+	/// <remarks> Prefer use resize (more stl naming style). </remarks>
+	/// \deprecated Use resize() method instead (more standard naming style).
+	OV_Deprecated("Use resize() method instead (more standard naming style).")
+	void setStimulationCount(const size_t n) const { m_set->resize(n); }
+
+	/// <summary> Gets the identifier of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation which identifier has to be returned. </param>
+	/// <return> The identifier for the specified stimulation. </return>
+	/// \deprecated Use getId() method instead.
+	OV_Deprecated("Use getId() method instead.")
+	uint64_t getStimulationIdentifier(const size_t index) const { return m_set->at(index).id; }
+
+	/// <summary> Gets the date of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation which date has to be returned. </param>
+	/// <return> the date for the specified stimulation. </return>
+	/// <remarks> The returned date is relative to the beginning of this stimulation set. </remarks>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	/// \deprecated Use getDate() method instead.
+	OV_Deprecated("Use getDate() method instead.")
+	uint64_t getStimulationDate(const size_t index) const { return m_set->at(index).date; }
+
+	/// <summary> Gets the duration of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation which duration has to be returned. </param>
+	/// <return> the duration for the specified stimulation. </return>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	/// \deprecated Use getDuration() method instead.
+	OV_Deprecated("Use getDuration() method instead.")
+	uint64_t getStimulationDuration(const size_t index) const { return m_set->at(index).duration; }
+
+	/// <summary> Changes the identifier of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation which id should be changed. </param>
+	/// <param name="id">the new id for the specified stimulation. </param>
+	/// \deprecated Use setId() method instead.
+	OV_Deprecated("Use setId() method instead.")
+	void setStimulationIdentifier(const size_t index, const uint64_t id) const { m_set->at(index).id = id; }
+
+	/// <summary> Changes the date of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation which date should be changed. </param>
+	/// <param name="date">the new date for the specified stimulation. </param>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	/// \deprecated Use setDate() method instead.
+	OV_Deprecated("Use setDate() method instead.")
+	void setStimulationDate(const size_t index, const uint64_t date) const { m_set->at(index).date = date; }
+
+	/// <summary> Changes the duration of a specific stimulation in this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation which duration should be changed. </param>
+	/// <param name="duration">the new duration for the specified stimulation. </param>
+	/// <remarks> The returned date is relative to the beginning of this stimulation set. </remarks>
+	/// <remarks> Dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details. </remarks>
+	/// \deprecated Use setDuration() method instead.
+	OV_Deprecated("Use setDuration() method instead.")
+	void setStimulationDuration(const size_t index, const uint64_t duration) const { m_set->at(index).duration = duration; }
+
+	/// <summary> Appends a stimulation to this stimulation set. </summary>
+	/// <param name="id">the identifier of the stimulation to append. </param>
+	/// <param name="date">the date of the stimulation. </param>
+	/// <param name="duration">the duration of the stimulation. </param>
+	/// \deprecated Use push_back() method instead (more standard naming style).
+	OV_Deprecated("Use push_back() method instead (more standard naming style).")
+	void appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) const { m_set->push_back(SStimulation(id, date, duration)); }
+
+	/// <summary> Inserts a stimulation to this stimulation set. </summary>
+	/// <param name="index"> The index of the stimulation to insert. </param>
+	/// <param name="id"> The identifier of the stimulation. </param>
+	/// <param name="date"> The date of the stimulation. </param>
+	/// <param name="duration"> The duration of the stimulation. </param>
+	/// <remarks> Stimulation indexing change after call to this function : following stimulation(s) get one more indexed. </remarks>
+	/// \deprecated Use insert() method instead (more standard naming style).
+	OV_Deprecated("Use insert() method instead (more standard naming style).")
+	void insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) const
+	{
+		m_set->insert(m_set->begin() + index, SStimulation(id, date, duration));
+	}
+
+	/// <summary> Removes a stimulation from this stimulation set. </summary>
+	/// <param name="index">the index of the stimulation to remove. </param>
+	/// <remarks> Stimulation indexing change after call to this function : following stimulation(s) get one less indexed. </remarks>
+	/// \deprecated Use erase() method instead (more standard naming style)
+	OV_Deprecated("Use erase() method instead (more standard naming style)")
+	void removeStimulation(const size_t index) const { m_set->erase(m_set->begin() + index); }
+
+	_IsDerivedFromClass_Final_(IObject, OV_ClassId_StimulationSet)
+
+private:
+	struct SStimulation
+	{
+		explicit SStimulation(const uint64_t id = 0, const uint64_t date = 0, const uint64_t duration = 0)
+			: id(id), date(date), duration(duration) { }
+
+		uint64_t id = 0, date = 0, duration = 0;
+	};
+
+	std::vector<SStimulation>* m_set;
+};
+
+/// \deprecated Use CStimulationSet instead
+OV_Deprecated("Use CStimulationSet instead")
+typedef CStimulationSet IStimulationSet;	///< Keep previous compatibility. Avoid to used it, intended to be removed. 
+
+}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h b/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h
index 9bad7ceb5d707cf797a720335b43cc06e5e672d8..dac1b86eae28266aebfdb3edaf7298101b947f9f 100644
--- a/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h
+++ b/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h
@@ -51,7 +51,7 @@ public:
 	 * \warning The algorithm should not use this reference after it
 	 *          has finished its work, it could be deprecated.
 	 */
-	virtual IErrorManager& getErrorManager() const = 0;
+	virtual CErrorManager& getErrorManager() const = 0;
 	/**
 	 * \brief Gets a reference on the current type manager
 	 * \return a reference on the current type manager
diff --git a/openvibe/include/openvibe/kernel/error/CError.hpp b/openvibe/include/openvibe/kernel/error/CError.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4ce3b4d65c7569ffb42c86c1a7ab0d7843a5a5ec
--- /dev/null
+++ b/openvibe/include/openvibe/kernel/error/CError.hpp
@@ -0,0 +1,109 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CError.hpp
+/// \brief Error for Kernel implementation.
+///
+/// CError aims at providing information about an error occurring in the framework. 
+/// One specific concept here is the notion of nested errors.
+/// In a call stack, it can be interesting to catch a n - 1 level error and enhance it instead of rethrowing it directy unchanged.
+/// In this case, we say the level n - 1 error is nested into the level n error.
+/// 
+/// \author Charles Garraud (Inria) & Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 12/07/2016.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include "ErrorType.hpp"
+#include <ov_common_defines.h>
+#include <memory>
+
+namespace OpenViBE {
+namespace Kernel {
+
+/// <summary> Error for Kernel.
+///
+/// CError aims at providing information about an error occurring in the framework. 
+/// One specific concept here is the notion of nested errors.
+/// In a call stack, it can be interesting to catch a n - 1 level error and enhance it instead of rethrowing it directy unchanged.
+/// In this case, we say the level n - 1 error is nested into the level n error. </summary>
+class OV_API CError
+{
+public:
+
+	//--------------------------------------------------
+	//------------ Constructor / Destructor ------------
+	//--------------------------------------------------
+	/// <summary> Initializes a new instance of the <see cref="CError"/> class. </summary>
+	/// <param name="type"> The type. </param>
+	/// <param name="description"> The description. </param>
+	/// <param name="nestedError"> The nested error. </param>
+	/// <param name="filename"> The filename. </param>
+	/// <param name="line"> The line in the file. </param>
+	CError(const ErrorType type, const std::string& description, CError* nestedError, const std::string& filename, const size_t line)
+		: m_errorType(type), m_nestedError(new std::unique_ptr<CError>(nestedError)),
+		  m_description(new std::string(description)), m_location(new std::string(filename + ":" + std::to_string(line))) { }
+
+	/// <summary> Finalizes an instance of the <see cref="CError"/> class. </summary>
+	~CError()
+	{
+		delete m_nestedError;
+		delete m_description;
+		delete m_location;
+	}
+
+	/// <summary> Prohibits the constructor by copy. </summary>
+	CError(const CError&) = delete;
+
+	/// <summary> Prohibits the copy. </summary>
+	CError& operator=(const CError&) = delete;
+
+	//--------------------------------------------------
+	//----------------- Getter/Setter ------------------
+	//--------------------------------------------------
+	/// <summary> Retrieve error description. </summary>
+	/// <returns> The error description. </returns>
+	const char* getErrorString() const { return m_description->c_str(); }
+
+	/// <summary> Retrieve error location. </summary>
+	/// <returns> The error location with file:line format. </returns>
+	const char* getErrorLocation() const { return m_location->c_str(); }
+
+	/// <summary> Retrieve error type. </summary>
+	ErrorType getErrorType() const { return m_errorType; }
+
+	/// <summary> Retrieve nested error. </summary>
+	/// <returns> The nested error if there is one, nullptr otherwise. </returns>
+	/// <remarks>The error keeps the ownership of the nested error. Therefore the API consumer is not responsible for its life cycle / management</remarks>
+	const CError* getNestedError() const { return m_nestedError->get(); }
+
+private:
+
+	ErrorType m_errorType;					///< The error type <see cref="ErrorType"/>.
+	std::unique_ptr<CError>* m_nestedError;	///< keep an inheritance of errors (pointer for shared library).
+	std::string* m_description;				///< The error description (pointer for shared library).
+	std::string* m_location;				///< The error location (pointer for shared library).
+};
+
+/// \deprecated Use the CError class instead
+OV_Deprecated("Use the CError class instead")
+typedef CError IError;	///< Keep previous compatibility. Avoid to used it, intended to be removed.
+
+}  // namespace Kernel
+}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/error/CErrorManager.hpp b/openvibe/include/openvibe/kernel/error/CErrorManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..18247f1f84296b2366fc8d414c8d8a246a32ea7d
--- /dev/null
+++ b/openvibe/include/openvibe/kernel/error/CErrorManager.hpp
@@ -0,0 +1,120 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CErrorManager.hpp
+/// \brief Error manager kernel default implementation
+///
+/// This manager is reponsible for handling errors in the framework.
+/// Errors in the framework are considered as not acceptable behavior that can be detected and handled by the system.
+/// The concept of error is thus independant of warning or fatal crashes that must be handled separately.
+/// 
+/// \author Charles Garraud (Inria) & Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 13/07/2016.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include "CError.hpp"
+#include "ErrorType.hpp"
+
+#include <ov_common_defines.h>
+#include <mutex>
+#include <memory>
+
+namespace OpenViBE {
+namespace Kernel {
+
+/// <summary> Error manager kernel default implementation. </summary>
+class OV_API CErrorManager
+{
+public:
+
+	/// <summary> Initializes a new instance of the <see cref="CErrorManager" /> class. </summary>
+	CErrorManager() : m_managerGuard(new std::mutex), m_topError(new std::unique_ptr<CError>(nullptr)) { }
+
+	/// <summary> Finalizes an instance of the <see cref="CErrorManager" /> class. </summary>
+	~CErrorManager()
+	{
+		this->releaseErrors();
+		delete m_managerGuard;
+		delete m_topError;
+	}
+
+	/// <summary> Push error to the manager. </summary>
+	/// <param name="type"> The error type. </param>
+	/// <param name="description"> A self-explanatory description of the error. </param>
+	/// <param name="filename"> The source file where the error was detected. </param>
+	/// <param name="line"> The line number where the error was detected. </param>
+	/// <remarks> Errors already added to the manager will be nested in the newly added error. </remarks>
+	void pushError(const ErrorType type, const std::string& description, const std::string& filename = "NoLocationInfo", size_t line = 0) const;
+
+	/// <summary> Push error to the manager. </summary>
+	/// <param name="type"> The error type. </param>
+	/// <param name="description"> A self-explanatory description of the error. </param>
+	/// <remarks> Errors already added to the manager will be nested in the newly added error. </remarks>
+	/// \deprecated Use same method with std::string parameter instead.
+	OV_Deprecated("Use same method with std::string parameter instead.")
+	void pushError(const ErrorType type, const char* description) const { this->pushError(type, description, "NoLocationInfo", 0); }
+
+	/// <summary> Push error to the manager. </summary>
+	/// <param name="type"> The error type. </param>
+	/// <param name="description"> A self-explanatory description of the error. </param>
+	/// <param name="filename"> The source file where the error was detected. </param>
+	/// <param name="line"> The line number where the error was detected. </param>
+	/// <remarks> Errors already added to the manager will be nested in the newly added error. </remarks>
+	/// \deprecated Use the pushError() method with std::string parameter instead.
+	OV_Deprecated("Use the pushError() method with std::string parameter instead.")
+	void pushErrorAtLocation(const ErrorType type, const char* description, const char* filename, size_t line) const
+	{
+		this->pushError(type, description, filename, line);
+	}
+
+	/// <summary> Release manager errors.
+	///
+	/// Release last error added to the manager and potentially all the nested errors recursively. </summary>
+	/// <remarks> After this call, do not use pointers to CError retrieved before. It will lead to unexpected behavior mostly due to dangling pointers. </remarks>
+	void releaseErrors() const;
+
+	/// <summary> Check for existing errors in the manager. </summary>
+	/// <returns> <c>true</c> if manager contains errors, <c>false</c> otherwise. </returns>
+	bool hasError() const;
+
+	/// <summary> Get last error added to the manager. </summary>
+	/// <returns> The error if manager contains errors, <c>nullptr</c> otherwise. </returns>
+	const CError* getLastError() const;
+
+	/// <summary> Get description of last error added to the manager. </summary>
+	/// <returns> The description if manager contains errors, empty string otherwise. </returns>
+	const char* getLastErrorString() const;
+
+	/// <summary> Get type of last error added to the manager. </summary>
+	/// <returns> The type if manager contains error, <c>ErrorType::NoErrorFound</c> otherwise. </returns>
+	ErrorType getLastErrorType() const;
+
+private:
+
+	mutable std::mutex* m_managerGuard;		///< The mutex manager guard.
+	std::unique_ptr<CError>* m_topError;	///< The top error.
+};
+
+/// \deprecated Use the CErrorManager class instead
+OV_Deprecated("Use the CErrorManager class instead")
+typedef CErrorManager IErrorManager;	///< Keep previous compatibility. Avoid to used it, intended to be removed.
+
+}  // namespace Kernel
+}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/error/ErrorType.hpp b/openvibe/include/openvibe/kernel/error/ErrorType.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..824eb66a6443a5eb5c9e5d4641bed4ce1563e312
--- /dev/null
+++ b/openvibe/include/openvibe/kernel/error/ErrorType.hpp
@@ -0,0 +1,73 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file ErrorType.hpp
+/// \brief List of error types.
+/// \author Charles Garraud (Inria) & Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 13/07/2016.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+namespace OpenViBE {
+namespace Kernel {
+/// <summary> List of error types. </summary>
+enum class ErrorType
+{
+	// Misc
+	NoErrorFound = 0,				///< Used when no error occurs
+	Unknown = 1,					///< Unknown error
+	Internal = 2,					///< Used mainly for high-level errors generated by low-level errors
+	NotImplemented = 3,				///< Used when the body of an API call is not yet implemented
+	ExceptionCaught = 4,			///< Used to report an error related to a c++ expection caught in the system
+	BadCall = 5,					///< Used when an API call is incompatible with the current state
+	BadProcessing = 6,				///< Used when a processing/computation failed
+	BadVersion = 7,					///< Used for plugin or api version mismatch
+
+	// Value setting
+	BadValue = 10,					///< Used when an entity is given an invalid value
+	BadArgument = 11,				///< Used when a function is fed with invalid arguments
+	BadCast = 12,					///< Used when a cast failed
+	OutOfBound = 13,				///< Used for out of range value (specific case of BadValue/BadArguments)
+	Overflow = 14,					///< Used to report arithmetic overflow
+	BadParsing = 15,				///< Used to report data parsing error
+
+	// Alloc
+	BadAlloc = 20,					///< Used when an allocation failed
+	OutOfMemory = 21,				///< Used when the system is running out of memory (specific case of BadAlloc)
+
+	// Resource
+	ResourceNotFound = 30,			///< Used to report that a resource (logical or physical) was not found
+	BadResourceCreation = 31,		///< Used to report that a resource (logical or physical) could not be created
+
+	// IO
+	BadFileRead = 40,				///< Used when opening a file failed
+	BadFileWrite = 41,				///< Used when writing to a file failed
+	BadFileParsing = 42,			///< Used when reading succeeded but parsing of data within the file failed
+	BadNetworkConnection = 43,		///< Used when network connection failed
+	BadXMLSchemaValidation = 44,	///< Used when validation of xml files against xsd schema fails
+
+	// Config
+	BadConfig = 50,					///< Used when a given configuration state is erroneous
+	BadInput = 51,					///< Used when an input (box, algorithm) is missing, empty or has a wrong value
+	BadOutput = 52,					///< Used when an output (box, algorithm) is missing, empty or has a wrong value
+	BadTrigger = 53,				///< Used when an algorithm trigger has a wrong value
+	BadSetting = 54					///< Used when a box setting has a wrong value
+};
+}  // namespace Kernel
+}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/error/ovErrorType.h b/openvibe/include/openvibe/kernel/error/ovErrorType.h
deleted file mode 100644
index 7ab355fad45a1fd06ec3c030e0f3e3eccf646e82..0000000000000000000000000000000000000000
--- a/openvibe/include/openvibe/kernel/error/ovErrorType.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*********************************************************************
-* Software License Agreement (AGPL-3 License)
-*
-* OpenViBE SDK Test Software
-* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
-* Copyright (C) Inria, 2015-2017,V1.0
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License version 3,
-* as published by the Free Software Foundation.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.
-* If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#pragma once
-
-namespace OpenViBE {
-namespace Kernel {
-/**
- * \class ErrorType
- * \author Charles Garraud (Inria)
- * \date 2016-07-13
- * \brief List of error types
- * \ingroup Group_Error
- * \ingroup Group_Kernel
- */
-enum class ErrorType
-{
-	// Misc
-	NoErrorFound = 0, ///< Used when no error occurs */
-	Unknown = 1, ///< Unknown error */
-	Internal = 2, ///< Used mainly for high-level errors generated by low-level errors */
-	NotImplemented = 3, ///< Used when the body of an API call is not yet implemented */
-	ExceptionCaught = 4, ///< Used to report an error related to a c++ expection caught in the system */
-	BadCall = 5, ///< Used when an API call is incompatible with the current state */
-	BadProcessing = 6, ///< Used when a processing/computation failed */
-	BadVersion = 7, ///< Used for plugin or api version mismatch */
-	// Value setting
-	BadValue = 10, ///< Used when an entity is given an invalid value */
-	BadArgument = 11, ///< Used when a function is fed with invalid arguments */
-	BadCast = 12, ///< Used when a cast failed */
-	OutOfBound = 13, ///< Used for out of range value (specific case of BadValue/BadArguments) */
-	Overflow = 14, ///< Used to report arithmetic overflow */
-	BadParsing = 15, ///< Used to report data parsing error */
-	// Alloc
-	BadAlloc = 20, ///< Used when an allocation failed */
-	OutOfMemory = 21, ///< Used when the system is running out of memory (specific case of BadAlloc) */
-	// Resource
-	ResourceNotFound = 30, ///< Used to report that a resource (logical or physical) was not found */
-	BadResourceCreation = 31, ///< Used to report that a resource (logical or physical) could not be created */
-	// IO
-	BadFileRead = 40, ///< Used when opening a file failed */
-	BadFileWrite = 41, ///< Used when writing to a file failed */
-	BadFileParsing = 42, ///< Used when reading succeeded but parsing of data within the file failed */
-	BadNetworkConnection = 43, ///< Used when network connection failed */
-	BadXMLSchemaValidation = 44, ///< Used when validation of xml files against xsd schema fails */
-	// Config
-	BadConfig = 50, ///< Used when a given configuration state is erroneous */
-	BadInput = 51, ///< Used when an input (box, algorithm) is missing, empty or has a wrong value */
-	BadOutput = 52, ///< Used when an output (box, algorithm) is missing, empty or has a wrong value */
-	BadTrigger = 53, ///< Used when an algorithm trigger has a wrong value */
-	BadSetting = 54 ///< Used when a box setting has a wrong value */
-};
-}  // namespace Kernel
-}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/error/ovIError.h b/openvibe/include/openvibe/kernel/error/ovIError.h
deleted file mode 100644
index 762432ffe081d6a105fe5414eded54d2c5c20108..0000000000000000000000000000000000000000
--- a/openvibe/include/openvibe/kernel/error/ovIError.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*********************************************************************
-* Software License Agreement (AGPL-3 License)
-*
-* OpenViBE SDK Test Software
-* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
-* Copyright (C) Inria, 2015-2017,V1.0
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License version 3,
-* as published by the Free Software Foundation.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.
-* If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#pragma once
-
-#include "../ovIKernelObject.h"
-
-namespace OpenViBE {
-namespace Kernel {
-/**
- * \class IError
- * \author Charles Garraud (Inria)
- * \date 2016-07-12
- * \brief Interface for Kernel error implementation
- * \ingroup Group_Error
- * \ingroup Group_Kernel
- *
- * IError interface aims at providing information about an error
- * occurring in the framework. One specific concept here is the
- * notion of nested errors. In a call stack, it can be
- * interesting to catch a n-1 level error and enhance it instead
- * of rethrowing it directy unchanged. In this case, we say
- * the level n-1 error is nested into the level n error.
- */
-class OV_API IError : public IKernelObject
-{
-public:
-
-	IError() {}
-	~IError() override {}
-	IError(const IError&)            = delete;
-	IError& operator=(const IError&) = delete;
-
-	/**
-	 * \brief Retrieve error description
-	 */
-	virtual const char* getErrorString() const = 0;
-
-	/**
-	 * \brief Retrieve error location
-	 * \return the error location with file:line format
-	 */
-	virtual const char* getErrorLocation() const = 0;
-
-	/**
-	 * \brief Retrieve error type
-	 */
-	virtual ErrorType getErrorType() const = 0;
-
-	/**
-	 * \brief Retrieve nested error
-	 * \return the nested error if there is one, nullptr otherwise
-	 *
-	 * \warning The error keeps the ownership of the nested error.
-	 *          Therefore the API consumer is not responsible for its
-	 *          life cycle/management
-	 */
-	virtual const IError* getNestedError() const = 0;
-
-	_IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Error_Error)
-};
-}  // namespace Kernel
-}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/error/ovIErrorManager.h b/openvibe/include/openvibe/kernel/error/ovIErrorManager.h
deleted file mode 100644
index 2422bc4f8e5ffee5bd2eddde48c1f76bd32b2975..0000000000000000000000000000000000000000
--- a/openvibe/include/openvibe/kernel/error/ovIErrorManager.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*********************************************************************
-* Software License Agreement (AGPL-3 License)
-*
-* OpenViBE SDK Test Software
-* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
-* Copyright (C) Inria, 2015-2017,V1.0
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License version 3,
-* as published by the Free Software Foundation.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.
-* If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#pragma once
-
-#include "../ovIKernelObject.h"
-#include "ovErrorType.h"
-
-namespace OpenViBE {
-namespace Kernel {
-class IError;
-
-/**
- * \class IErrorManager
- * \author Charles Garraud (Inria)
- * \date 2016-07-12
- * \brief Interface for Kernel error handler implementation
- * \ingroup Group_Error
- * \ingroup Group_Kernel
- *
- * This manager is reponsible for handling errors in the framework.
- * Errors in the framework are considered as not acceptable behavior
- * that can be detected and handled by the system. The concept of error
- * is thus independant of warning or fatal crashes that must be handled
- * separately.
- */
-class OV_API IErrorManager : public IKernelObject
-{
-public:
-
-	/**
-	 * \brief Push error to the manager
-	 * \param type the error type
-	 * \param description a self-explanatory description message
-	 *
-	 * Errors already added to the manager will be nested in the
-	 * newly added error.
-	 */
-	virtual void pushError(ErrorType type, const char* description) = 0;
-
-	/**
-	 * \brief Push error with location information to the manager
-	 * \param type the error type
-	 * \param description a self-explanatory description of the error
-	 * \param filename the source file where the error was detected
-	 * \param line the line number where the error was detected
-	 *
-	 * Errors already added to the manager will be nested in the
-	 * newly added error.
-	 */
-	virtual void pushErrorAtLocation(ErrorType type, const char* description, const char* filename, size_t line) = 0;
-
-	/**
-	 * \brief Release manager errors
-	 *
-	 * Release last error added to the manager and potentially
-	 * all the nested errors recursively.
-	 *
-	 * \warning After this call, do not use pointers to IError retrieved
-	 *          before. It will lead to unexpected behavior mostly due
-	 *          to dangling pointers.
-	 */
-	virtual void releaseErrors() = 0;
-
-	/**
-	 * \brief Check for existing errors in the manager
-	 * \return true if manager contains errors, false otherwise
-	 */
-	virtual bool hasError() const = 0;
-
-	/**
-	 * \brief Get last error added to the manager
-	 * \return the error if manager contains errors, nullptr otherwise
-	 *
-	 * \warning The manager keeps the ownership of IError instances.
-	 *          Therefore the API consumer is not responsible for their
-	 *          life cycle/management and must use releaseErrors to
-	 *          release them.
-	 */
-	virtual const IError* getLastError() const = 0;
-
-	/**
-	 * \brief Get description of last error added to the manager
-	 * \return the description if manager contains errors, empty string otherwise
-	 */
-	virtual const char* getLastErrorString() const = 0;
-
-	/**
-	 * \brief Get type of last error added to the manager
-	 * \return the type if manager contains error, NoErrorFound otherwise
-	 */
-	virtual ErrorType getLastErrorType() const = 0;
-
-	_IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Error_ErrorManager)
-};
-}  // namespace Kernel
-}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/kernel/ovIKernelContext.h b/openvibe/include/openvibe/kernel/ovIKernelContext.h
index e18c01a7f945644cf5d26030e812b9910602fc61..245ae7271af3c13c6442147068ae39d212cf2dad 100755
--- a/openvibe/include/openvibe/kernel/ovIKernelContext.h
+++ b/openvibe/include/openvibe/kernel/ovIKernelContext.h
@@ -13,7 +13,7 @@ class IMetaboxManager;
 class IScenarioManager;
 class ITypeManager;
 class ILogManager;
-class IErrorManager;
+class CErrorManager;
 
 /**
  * \class IKernelContext
@@ -93,7 +93,7 @@ public:
 	 * \brief Gets a reference on the kernel's error manager
 	 * \return a reference on the kernel's error manager
 	 */
-	virtual IErrorManager& getErrorManager() const = 0;
+	virtual CErrorManager& getErrorManager() const = 0;
 
 
 	// backward compatibility
diff --git a/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h b/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h
index db62e168ce0b59a77f505b5799a9e59ee51bdff8..62c637f58b19f078de2f70134213d05733245d6d 100644
--- a/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h
+++ b/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h
@@ -39,7 +39,7 @@ public:
 	 * \brief Gets a reference on the current error manager
 	 * \return a reference on the current error manager
 	 */
-	virtual IErrorManager& getErrorManager() const = 0;
+	virtual CErrorManager& getErrorManager() const = 0;
 
 	_IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_ObjectVisitorContext)
 };
diff --git a/openvibe/include/openvibe/kernel/ovTParameterHandler.h b/openvibe/include/openvibe/kernel/ovTParameterHandler.h
index c9f63c12ab481c61308c957be0f61c91eb63d74f..a9859d1479eb5dc72cb109bc388042822be443ec 100644
--- a/openvibe/include/openvibe/kernel/ovTParameterHandler.h
+++ b/openvibe/include/openvibe/kernel/ovTParameterHandler.h
@@ -26,7 +26,7 @@ namespace Kernel {
  *  - for \c ParameterType_String : \c CString
  *  - for \c ParameterType_Identifier : \c CIdentifier
  *  - for \c ParameterType_Matrix : \c CMatrix*
- *  - for \c ParameterType_StimulationSet : \c IStimulationSet*
+ *  - for \c ParameterType_StimulationSet : \c CStimulationSet*
  *  - for \c ParameterType_MemoryBuffer : \c IMemoryBuffer*
  *  - for \c ParameterType_Object : \c IObject*
  *  - for \c ParameterType_Pointer : \c uint8_t*
diff --git a/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h b/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h
index 8e5a7cafdd1620b6de9a3e70b969935ab36b5b68..cee8ff28e2f7b0c34c4d4e0db6d4fdc4e3fd7af1 100644
--- a/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h
+++ b/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h
@@ -124,7 +124,7 @@ public:
 	 * \warning The plugin object should not use this reference after it
 	 *          has finished its work, it could be deprecated.
 	 */
-	virtual IErrorManager& getErrorManager() const = 0;
+	virtual CErrorManager& getErrorManager() const = 0;
 
 	/**
 	 * \brief Gets the current player's scenario manager
diff --git a/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h b/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h
index eab1d6d3b8a257b684e493af46ae8eb981aed50d..97ba9ff48f8a863d1a9c1e299f7e6437ce356731 100644
--- a/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h
+++ b/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h
@@ -7,7 +7,7 @@ namespace Kernel {
 class ILogManager;
 class ITypeManager;
 class IScenarioManager;
-class IErrorManager;
+class CErrorManager;
 class IConfigurationManager;
 
 /**
@@ -42,7 +42,7 @@ public:
 	 * \brief Gets the current error manager
 	 * \return a reference on the current error manager
 	 */
-	virtual IErrorManager& getErrorManager() const = 0;
+	virtual CErrorManager& getErrorManager() const = 0;
 	/**
 	 * \brief Gets the current configuration manager
 	 * \return a reference on the current configuration manager
diff --git a/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h b/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h
index b09da79449963d6aff14e6a028333ec02eb7a84f..b6bdac246587e166eaec6d274a5adf22bcb73db7 100755
--- a/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h
+++ b/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h
@@ -60,7 +60,7 @@ public:
 	 * \brief Gets a reference on the current error manager
 	 * \return a reference on the current error manager
 	 */
-	virtual IErrorManager& getErrorManager() const = 0;
+	virtual CErrorManager& getErrorManager() const = 0;
 
 	/**
 	 * \brief Gets a reference on the current configuration manager
diff --git a/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h b/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h
index 62b3ffd5e53371073b20c65f6b63c1dfc8e98159..e5fbf63c22cbf4a74d9339d2705fc289bfcd3201 100644
--- a/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h
+++ b/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h
@@ -3,7 +3,7 @@
 #include "../ovIKernelObject.h"
 
 namespace OpenViBE {
-class IStimulationSet;
+class CStimulationSet;
 
 namespace Kernel {
 
@@ -30,7 +30,7 @@ public:
 	virtual double* getBuffer() = 0;
 	virtual uint64_t getStimulationSetStartTime() = 0;
 	virtual uint64_t getStimulationSetEndTime() = 0;
-	virtual IStimulationSet& getStimulationSet() = 0;
+	virtual CStimulationSet& getStimulationSet() = 0;
 };
 }  // namespace Kernel
 }  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/ovAssert.h b/openvibe/include/openvibe/ovAssert.h
index 51feb72a88ef0f49d7d315736827faddd6ec90d2..554f2cd231f1435ea7546b2ad4227b742d192c06 100644
--- a/openvibe/include/openvibe/ovAssert.h
+++ b/openvibe/include/openvibe/ovAssert.h
@@ -131,7 +131,7 @@ do { \
  */
 #define OV_ERROR(description, type, returnValue, errorManager, logManager) \
 do { \
-	errorManager.pushErrorAtLocation(type, static_cast<const OpenViBE::ErrorStream&>(OpenViBE::ErrorStream() << description).str().c_str(), __FILE__, __LINE__ ); \
+	errorManager.pushError(type, static_cast<const OpenViBE::ErrorStream&>(OpenViBE::ErrorStream() << description).str().c_str(), __FILE__, __LINE__ ); \
 	OV_ERROR_LOG(description, type, __FILE__, __LINE__ , logManager); \
 	return returnValue; \
 } while (0)
diff --git a/openvibe/include/openvibe/ovCNameValuePairList.h b/openvibe/include/openvibe/ovCNameValuePairList.h
deleted file mode 100644
index c127b629f41b6d383b5e4ad254e177d84ea8812b..0000000000000000000000000000000000000000
--- a/openvibe/include/openvibe/ovCNameValuePairList.h
+++ /dev/null
@@ -1,139 +0,0 @@
-#pragma once
-
-#include "ov_defines.h"
-
-namespace OpenViBE {
-
-typedef struct CNameValuePairListImpl CNameValuePairListImpl;
-
-/**
- * \class CNameValuePairList
- * \author Vincent Delannoy (INRIA/IRISA)
- * \date 2008-07
- * \brief This class handles a list of name/value pairs.
- * It handles a (hidden) map associating string keys to string values.
- * \ingroup Group_Base
- *
- * This class avoids the need to include stl's map header file in the C++ interface,
- * thus preventing potential compile/link errors when dynamically loading modules.
- *
- * \note Implementation based on std::map<std::string, std::string>
- */
-class OV_API CNameValuePairList final
-{
-public:
-
-	/** \name Constructor / Destructor */
-	//@{
-
-	/**
-	 * \brief Default constructor
-	 *
-	 * Initializes the list.
-	 */
-	CNameValuePairList();
-	/**
-	 * \brief Copy constructor
-	 * \param pairs [in] : The list to copy
-	 *
-	 * Copies the contents of \c pairs into the new list.
-	 */
-	CNameValuePairList(const CNameValuePairList& pairs);
-	/**
-	 * \brief Destructor
-	 *
-	 * The destructor releases the std::map implementation !
-	 */
-	~CNameValuePairList();
-
-	//@}
-	/** \name Operators */
-	//@{
-
-	/**
-	 * \brief Affectation operator (copy)
-	 * \param pairs [in] : The list to copy
-	 * \return This list.
-	 */
-	CNameValuePairList& operator=(const CNameValuePairList& pairs);
-	//@}
-
-	/**
-	 * \brief Insert a name/value pair
-	 * \param [in] name Name to add to the list
-	 * \param [in] value Value to associate with the name
-	 * \return True if pair could be inserted, false otherwise
-	 */
-	bool setValue(const CString& name, const CString& value) const;
-
-	/**
-	 * \brief Insert a name/value pair
-	 * \param [in] name Name to add to the list
-	 * \param [in] value Value to associate with the name
-	 * \return True if pair could be inserted, false otherwise
-	 */
-	bool setValue(const CString& name, const char* value) const;
-
-	/**
-	 * \brief Insert a name/value pair where value is a double
-	 * \param [in] name Name to add to the list
-	 * \param [in] value Float64 value to associate with the name
-	 * \return True if pair could be inserted, false otherwise
-	 */
-	bool setValue(const CString& name, const double& value) const;
-
-	/**
-	 * \brief Insert a name/value pair where value is a boolean
-	 * \param [in] name Name to add to the list
-	 * \param [in] value Boolean value to associate with the name
-	 * \return True if pair could be inserted, false otherwise
-	 */
-	bool setValue(const CString& name, bool value) const;
-
-	/**
-	 * \brief Retrieve a value from the list
-	 * \param [in] name Name whose value is to be retrieved
-	 * \param [out] value Value to be retrieved from the list
-	 * \return True if value could be retrieved, false otherwise
-	 */
-	bool getValue(const CString& name, CString& value) const;
-
-	/**
-	 * \brief Retrieve a double value from the list
-	 * \param [in] name Name whose value is to be retrieved
-	 * \param [out] value Float64 value to be retrieved
-	 * \return True if a double value could be retrieved, false otherwise
-	 */
-	bool getValue(const CString& name, double& value) const;
-
-	/**
-	 * \brief Retrieve a boolean value from the list
-	 * In the current implementation a value evaluates to true if its string
-	 * equals "1" and to false if it equals "0".
-	 * \param name
-	 * \param value String to evaluate
-	 * \return True if string evaluates to a boolean, false otherwise
-	 */
-	bool getValue(const CString& name, bool& value) const;
-
-	/**
-	 * \brief Retrieve a value from the list
-	 * \param [in] index Index whose value is to be retrieved
-	 * \param [out] name Name of the value stored in rIndex
-	 * \param [out] value Value stored in rIndex
-	 * \return True if value could be retrieved, false otherwise
-	 */
-	bool getValue(const size_t index, CString& name, CString& value) const;
-
-
-	/**
-	 * \brief Retrieve the number of stored elements 
-	 * \return the number of stored elements
-	 */
-	size_t getSize() const;
-
-protected:
-
-	CNameValuePairListImpl* m_impl = nullptr; ///< The list implementation
-};
-}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/ovCStimulationSet.h b/openvibe/include/openvibe/ovCStimulationSet.h
deleted file mode 100644
index 0b9875e5d3e7bca56f0969b526fe981244494aca..0000000000000000000000000000000000000000
--- a/openvibe/include/openvibe/ovCStimulationSet.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#pragma once
-
-#include "ovIStimulationSet.h"
-
-namespace OpenViBE {
-/**
- * \class CStimulationSet
- * \author Yann Renard (INRIA/IRISA)
- * \date 2007-11-21
- * \brief Basic standalone OpenViBE stimulation set implementation
- * \ingroup Group_Base
- *
- * This class offers a basic standalone impementation of the IStimulationSet
- * interface. This class can be directly instanciated and used.
- *
- * Instances of this class use an internal implementation of the IStimulationSet
- * interface and redirect their calls to this implementation.
- */
-class OV_API CStimulationSet final : public IStimulationSet
-{
-public:
-
-	/** \name Constructors */
-	//@{
-
-	/**
-	 * \brief Default constructor
-	 *
-	 * This constructor builds the internal implementation of this stimulation set.
-	 */
-	CStimulationSet();
-	/**
-	 * \brief Destructor
-	 *
-	 * The internal implementation is released.
-	 */
-	~CStimulationSet() override { delete m_stimSet; }
-
-	//@}
-	void clear() override { m_stimSet->clear(); }
-	size_t getStimulationCount() const override { return m_stimSet->getStimulationCount(); }
-	uint64_t getStimulationIdentifier(const size_t index) const override { return m_stimSet->getStimulationIdentifier(index); }
-	uint64_t getStimulationDate(const size_t index) const override { return m_stimSet->getStimulationDate(index); }
-	uint64_t getStimulationDuration(const size_t index) const override { return m_stimSet->getStimulationDuration(index); }
-	bool setStimulationCount(const size_t n) override { return m_stimSet->setStimulationCount(n); }
-	bool setStimulationIdentifier(const size_t index, const uint64_t id) override { return m_stimSet->setStimulationIdentifier(index, id); }
-	bool setStimulationDate(const size_t index, const uint64_t date) override { return m_stimSet->setStimulationDate(index, date); }
-	bool setStimulationDuration(const size_t index, const uint64_t duration) override { return m_stimSet->setStimulationDuration(index, duration); }
-
-	size_t appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) override
-	{
-		return m_stimSet->appendStimulation(id, date, duration);
-	}
-
-	size_t insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) override
-	{
-		return m_stimSet->insertStimulation(index, id, date, duration);
-	}
-
-	bool removeStimulation(const size_t index) override { return m_stimSet->removeStimulation(index); }
-
-	_IsDerivedFromClass_Final_(IStimulationSet, OV_ClassId_StimulationSetBridge)
-
-private:
-
-	IStimulationSet* m_stimSet = nullptr; ///< Internal implementation
-};
-}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/ovIStimulationSet.h b/openvibe/include/openvibe/ovIStimulationSet.h
deleted file mode 100644
index 1ab73fa172fc669805bf3eb7ce3ef7468cedac2b..0000000000000000000000000000000000000000
--- a/openvibe/include/openvibe/ovIStimulationSet.h
+++ /dev/null
@@ -1,119 +0,0 @@
-#pragma once
-
-#include "ovIObject.h"
-
-namespace OpenViBE {
-/**
- * \class IStimulationSet
- * \author Yann Renard (INRIA/IRISA)
- * \date 2007-11-21
- * \brief Basic OpenViBE stimulation set interface
- *
- * This interface offers functionalities to handle a collection of OpenViBE stimulations.
- * This collection basicaly consists in a list of stimulation information. Each stimulation
- * has three information : an identifier, a date and a duration.
- *
- * OpenViBE provides an standalone implementation of this interface in CStimulationSet
- */
-
-class OV_API IStimulationSet : public IObject
-{
-public:
-
-	/**
-	 * \brief Clears this stimulation set removing every existing stimulation
-	 */
-	virtual void clear() = 0;
-	/**
-	 * \brief Gets the number of stimulations contained in this stimulation set
-	 * \return the number of stimulations contained in this stimulation set.
-	 */
-	virtual size_t getStimulationCount() const = 0;
-	/**
-	 * \brief Gets the identifier of a specific stimulation in this stimulation set
-	 * \param index [in] : the index of the stimulation which identifier has to be returned
-	 * \return the identifier for the specified stimulation.
-	 */
-	virtual uint64_t getStimulationIdentifier(const size_t index) const = 0;
-	/**
-	 * \brief Gets the date of a specific stimulation in this stimulation set
-	 * \param index [in] : the index of the stimulation which date has to be returned
-	 * \return the date for the specified stimulation.
-	 * \note the returned date is relative to the beginning of this stimulation set
-	 * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details
-	 */
-	virtual uint64_t getStimulationDate(const size_t index) const = 0;
-	/**
-	 * \brief Gets the duration of a specific stimulation in this stimulation set
-	 * \param index [in] : the index of the stimulation which duration has to be returned
-	 * \return the duration for the specified stimulation.
-	 * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details
-	 */
-	virtual uint64_t getStimulationDuration(const size_t index) const = 0;
-	/**
-	 * \brief Changes the stimulation count in this stimulation set
-	 * \param n [in] : the new number of stimulations
-	 * \return \e true in case of success.
-	 * \return \e false in case of error.
-	 */
-	virtual bool setStimulationCount(const size_t n) = 0;
-	/**
-	 * \brief Changes the identifier of a specific stimulation in this stimulation set
-	 * \param index [in] : the index of the stimulation which id should be changed
-	 * \param id [in] : the new id for the specified stimulation
-	 * \return \e true in case of success.
-	 * \return \e false in case of error.
-	 */
-	virtual bool setStimulationIdentifier(const size_t index, const uint64_t id) = 0;
-	/**
-	 * \brief Changes the date of a specific stimulation in this stimulation set
-	 * \param index [in] : the index of the stimulation which date should be changed
-	 * \param date [in] : the new date for the specified stimulation
-	 * \return \e true in case of success.
-	 * \return \e false in case of error.
-	 * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details
-	 */
-	virtual bool setStimulationDate(const size_t index, const uint64_t date) = 0;
-	/**
-	 * \brief Changes the duration of a specific stimulation in this stimulation set
-	 * \param index [in] : the index of the stimulation which duration should be changed
-	 * \param duration [in] : the new duration for the specified stimulation
-	 * \return \e true in case of success.
-	 * \return \e false in case of error.
-	 * \note the returned date is relative to the beginning of this stimulation set
-	 * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details
-	 */
-	virtual bool setStimulationDuration(const size_t index, const uint64_t duration) = 0;
-	/**
-	 * \brief Appends a stimulation to this stimulation set
-	 * \param id [in] : the identifier of the stimulation to append
-	 * \param date [in] : the date of the stimulation
-	 * \param duration [in] : the duration of the stimulation
-	 * \return the index of the appended stimulation in this stimulation set
-	 */
-	virtual size_t appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) = 0;
-	/**
-	 * \brief Inserts a stimulation to this stimulation set
-	 * \param index [in] : the index of the stimulation to insert
-	 * \param id [in] : the identifier of the stimulation
-	 * \param date [in] : the date of the stimulation
-	 * \param duration [in] : the duration of the stimulation
-	 * \return \e true in case of success
-	 * \return \e false in case of error
-	 * \warning stimulation indexing change after call to this function :
-	 *          following stimulation(s) get one more indexed.
-	 */
-	virtual size_t insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) = 0;
-	/**
-	 * \brief Removes a stimulation from this stimulation set
-	 * \param index [in] : the index of the stimulation to remove
-	 * \return \e true in case of success
-	 * \return \e false in case of error
-	 * \warning stimulation indexing change after call to this function :
-	 *          following stimulation(s) get one less indexed.
-	 */
-	virtual bool removeStimulation(const size_t index) = 0;
-
-	_IsDerivedFromClass_(IObject, OV_ClassId_StimulationSet)
-};
-}  // namespace OpenViBE
diff --git a/openvibe/include/openvibe/ov_all.h b/openvibe/include/openvibe/ov_all.h
index 3ee2dc884666b4d301944f0bc096888cf80fea1b..717e1f1a8c2922138939c41665764880f375504b 100755
--- a/openvibe/include/openvibe/ov_all.h
+++ b/openvibe/include/openvibe/ov_all.h
@@ -14,12 +14,11 @@
 #include "CIdentifier.hpp"
 #include "CTime.hpp"
 #include "ovCString.h"
-#include "ovCNameValuePairList.h"
+#include "CNameValuePairList.hpp"
 
 #include "CMatrix.hpp"
 
-#include "ovIStimulationSet.h"
-#include "ovCStimulationSet.h"
+#include "CStimulationSet.hpp"
 
 #include "ovIMemoryBuffer.h"
 #include "ovCMemoryBuffer.h"
@@ -62,9 +61,9 @@
 #include "kernel/log/ovILogManager.h"
 #include "kernel/log/ovILogListener.h"
 
-#include "kernel/error/ovIErrorManager.h"
-#include "kernel/error/ovIError.h"
-#include "kernel/error/ovErrorType.h"
+#include "kernel/error/CError.hpp"
+#include "kernel/error/CErrorManager.hpp"
+#include "kernel/error/ErrorType.hpp"
 
 #include "kernel/player/ovIBoxAlgorithmContext.h"
 #include "kernel/player/CMessageClock.hpp"
diff --git a/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h b/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h
index 4f49fab8aa154b4edb4473e3698571f8de4cc146..34ae9b9cc0175bc7c154f0e052da4eff5f388419 100644
--- a/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h
+++ b/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h
@@ -58,10 +58,6 @@ public:
 	 * the item can not be found by name, or an empty string
 	 * is returned, a default item will be displayed.
 	 *
-	 * \deprecated This method was used when visualisation was handled
-	 * within the Kernel. This is kept for backward compatibility. Such features
-	 * should now be handled at application level.
-	 *
 	 */
 	virtual CString getStockItemName() const { return CString(""); }
 
diff --git a/openvibe/src/CErrorManager.cpp b/openvibe/src/CErrorManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..82b844a41b0e5ecefd29df3dfa589f253cb513d4
--- /dev/null
+++ b/openvibe/src/CErrorManager.cpp
@@ -0,0 +1,75 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CErrorManager.cpp
+/// \brief Error manager kernel default implementation
+///
+/// This manager is reponsible for handling errors in the framework.
+/// Errors in the framework are considered as not acceptable behavior that can be detected and handled by the system.
+/// The concept of error is thus independant of warning or fatal crashes that must be handled separately.
+/// 
+/// \author Charles Garraud (Inria) & Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 13/07/2016.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#include <string>
+
+#include "kernel/error/CErrorManager.hpp"
+
+namespace OpenViBE {
+namespace Kernel {
+
+void CErrorManager::pushError(const ErrorType type, const std::string& description, const std::string& filename, size_t line) const
+{
+	std::lock_guard<std::mutex> lock(*m_managerGuard);
+	auto* const lastTopError = m_topError->release();
+	m_topError->reset(new CError(type, description, lastTopError, filename, line));
+}
+
+void CErrorManager::releaseErrors() const
+{
+	std::lock_guard<std::mutex> lock(*m_managerGuard);
+	m_topError->reset(nullptr);
+}
+
+bool CErrorManager::hasError() const
+{
+	std::lock_guard<std::mutex> lock(*m_managerGuard);
+	return (*m_topError != nullptr);
+}
+
+const CError* CErrorManager::getLastError() const
+{
+	std::lock_guard<std::mutex> lock(*m_managerGuard);
+	return m_topError->get();
+}
+
+const char* CErrorManager::getLastErrorString() const
+{
+	std::lock_guard<std::mutex> lock(*m_managerGuard);
+	return (*m_topError ? (*m_topError)->getErrorString() : "");
+}
+
+ErrorType CErrorManager::getLastErrorType() const
+{
+	std::lock_guard<std::mutex> lock(*m_managerGuard);
+	return (*m_topError ? (*m_topError)->getErrorType() : ErrorType::NoErrorFound);
+}
+
+}  // namespace Kernel
+}  // namespace OpenViBE
diff --git a/openvibe/src/CNameValuePairList.cpp b/openvibe/src/CNameValuePairList.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a6d70614ee56f511cbf38e2cd4ab3380ca5a6fb5
--- /dev/null
+++ b/openvibe/src/CNameValuePairList.cpp
@@ -0,0 +1,178 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CNameValuePairList.cpp
+/// \brief OpenViBE Pair Name/Value List Class (It handles a hidden map associating string/keys to string/values).
+/// 
+/// This interface offers functionalities to handle a collection of OpenViBE stimulations.
+/// This collection basicaly consists in a list of stimulation information.
+/// Each stimulation has three information : an identifier, a dateand a duration.
+/// \author  Vincent Delannoy (INRIA/IRISA).
+/// \version 1.0.
+/// \date 01/07/2008.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#include "CNameValuePairList.hpp"
+
+#include <map>
+#include <string>
+#include <sstream>
+
+namespace OpenViBE {
+//--------------------------------------------------
+//----------------- Getter/Setter ------------------
+//--------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const std::string& name, std::string& value) const
+{
+	if (m_map->find(name) == m_map->end()) { return false; }
+	value = m_map->at(name);
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const std::string& name, double& value) const
+{
+	if (m_map->find(name) == m_map->end()) { return false; }
+	double temp;
+
+	try { temp = std::stod(m_map->at(name)); }
+	catch (const std::exception&) { return false; }
+
+	value = temp;
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const std::string& name, bool& value) const
+{
+	if (m_map->find(name) == m_map->end()) { return false; }
+	const std::string str = m_map->at(name);
+	if (str == "0" || str == "FALSE" || str == "false") { value = false; }
+	else if (str == "1" || str == "TRUE" || str == "true") { value = true; }
+	else { return false; }
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const size_t index, std::string& name, std::string& value) const
+{
+	if (index >= this->size()) { return false; }
+	auto it = m_map->begin();
+	std::advance(it, index);
+	name  = it->first;
+	value = it->second;
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//-------------------------------------------------------
+//---------------------- Operators ----------------------
+//-------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+CNameValuePairList& CNameValuePairList::operator=(const CNameValuePairList& pairs)
+{
+	if (this != &pairs) { *m_map = *pairs.m_map; }// Deep Copy
+	return *this;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+std::string CNameValuePairList::str(const std::string& sep) const
+{
+	std::stringstream ss;
+	bool first = true;
+	for (const auto& pair : *m_map) {
+		ss << (first ? "" : sep) << "[" << pair.first << ", " << pair.second << "]";
+		first = false;
+	}
+	return ss.str();
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------
+//---------------------- Deprecated ----------------------
+//--------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::setValue(const CString& name, const CString& value) const
+{
+	setValue(std::string(name), value);
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::setValue(const CString& name, const char* value) const
+{
+	if (value == nullptr) { return false; }
+	setValue(std::string(name), std::string(value));
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::setValue(const CString& name, const double& value) const
+{
+	setValue(std::string(name), value);
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::setValue(const CString& name, const bool value) const
+{
+	setValue(std::string(name), value);
+	return true;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const CString& name, CString& value) const
+{
+	std::string out;
+	const bool res = getValue(std::string(name), out);
+	value          = out.c_str();
+	return res;
+}
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const CString& name, double& value) const { return getValue(std::string(name), value); }
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const CString& name, bool& value) const { return getValue(std::string(name), value); }
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+bool CNameValuePairList::getValue(const size_t index, CString& name, CString& value) const
+{
+	std::string outName, outValue;
+	const bool res = getValue(index, outName, outValue);
+	name           = outName.c_str();
+	value          = outValue.c_str();
+	return res;
+}
+//--------------------------------------------------------------------------------
+
+}  // namespace OpenViBE
diff --git a/openvibe/src/ovCNameValuePairList.cpp b/openvibe/src/ovCNameValuePairList.cpp
deleted file mode 100644
index c537e56635e6c7e0f6ee1f2d5f244cf73c6bf1f1..0000000000000000000000000000000000000000
--- a/openvibe/src/ovCNameValuePairList.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-#include "ovCString.h"
-#include "ovCNameValuePairList.h"
-
-#include <cstdio>
-#include <string>
-#include <map>
-
-namespace OpenViBE {
-
-struct CNameValuePairListImpl
-{
-	std::map<CString, CString> m_Map;
-};
-
-CNameValuePairList::CNameValuePairList() { m_impl = new CNameValuePairListImpl(); }
-
-CNameValuePairList::CNameValuePairList(const CNameValuePairList& pairs)
-{
-	m_impl        = new CNameValuePairListImpl();
-	m_impl->m_Map = pairs.m_impl->m_Map;
-}
-
-CNameValuePairList::~CNameValuePairList() { delete m_impl; }
-
-CNameValuePairList& CNameValuePairList::operator=(const CNameValuePairList& pairs)
-{
-	m_impl->m_Map = pairs.m_impl->m_Map;
-	return *this;
-}
-
-bool CNameValuePairList::setValue(const CString& name, const CString& value) const
-{
-	m_impl->m_Map[name] = value;
-	return true;
-}
-
-bool CNameValuePairList::setValue(const CString& name, const char* value) const
-{
-	if (value == nullptr) { return false; }
-	m_impl->m_Map[name] = value;
-	return true;
-}
-
-bool CNameValuePairList::setValue(const CString& name, const double& value) const
-{
-	m_impl->m_Map[name] = std::to_string(value).c_str();
-	return true;
-}
-
-bool CNameValuePairList::setValue(const CString& name, const bool value) const
-{
-	m_impl->m_Map[name] = value ? "1" : "0";
-	return true;
-}
-
-bool CNameValuePairList::getValue(const CString& name, CString& value) const
-{
-	if (m_impl->m_Map.find(name) == m_impl->m_Map.end()) { return false; }
-	value = m_impl->m_Map[name];
-	return true;
-}
-
-bool CNameValuePairList::getValue(const CString& name, double& value) const
-{
-	if (m_impl->m_Map.find(name) == m_impl->m_Map.end()) { return false; }
-	double temp;
-
-	try { temp = std::stod(m_impl->m_Map[name].toASCIIString()); }
-	catch (const std::exception&) { return false; }
-
-	value = temp;
-	return true;
-}
-
-bool CNameValuePairList::getValue(const CString& name, bool& value) const
-{
-	if (m_impl->m_Map.find(name) == m_impl->m_Map.end()) { return false; }
-	const CString str = m_impl->m_Map[name];
-	if (str == CString("0") || str == CString("FALSE") || str == CString("false"))
-	{
-		value = false;
-		return true;
-	}
-	if (str == CString("1") || str == CString("TRUE") || str == CString("true"))
-	{
-		value = true;
-		return true;
-	}
-	return false;
-}
-
-bool CNameValuePairList::getValue(const size_t index, CString& name, CString& value) const
-{
-	if (index >= this->getSize()) { return false; }
-	auto it = m_impl->m_Map.begin();
-	std::advance(it, index);
-	name  = it->first;
-	value = it->second;
-	return true;
-}
-
-size_t CNameValuePairList::getSize() const { return m_impl->m_Map.size(); }
-
-}  // namespace OpenViBE
diff --git a/openvibe/src/ovCStimulationSet.cpp b/openvibe/src/ovCStimulationSet.cpp
deleted file mode 100755
index 5b160631d9aa2962160254e66ec288faac7020d7..0000000000000000000000000000000000000000
--- a/openvibe/src/ovCStimulationSet.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#include "ovCStimulationSet.h"
-
-#include <vector>
-
-namespace OpenViBE {
-namespace {
-class CStimulation
-{
-public:
-
-	CStimulation() { }
-
-	CStimulation(const uint64_t id, const uint64_t date, const uint64_t duration)
-		: m_Id(id), m_Date(date), m_Duration(duration) { }
-
-	uint64_t m_Id       = 0;
-	uint64_t m_Date     = 0;
-	uint64_t m_Duration = 0;
-};
-
-class CStimulationSetImpl final : public IStimulationSet
-{
-public:
-	void clear() override { m_stimulations.clear(); }
-	size_t getStimulationCount() const override { return m_stimulations.size(); }
-	uint64_t getStimulationIdentifier(const size_t index) const override { return m_stimulations[index].m_Id; }
-	uint64_t getStimulationDate(const size_t index) const override { return m_stimulations[index].m_Date; }
-	uint64_t getStimulationDuration(const size_t index) const override { return m_stimulations[index].m_Duration; }
-	bool setStimulationCount(const size_t n) override;
-	bool setStimulationIdentifier(const size_t index, const uint64_t id) override;
-	bool setStimulationDate(const size_t index, const uint64_t date) override;
-	bool setStimulationDuration(const size_t index, const uint64_t duration) override;
-	size_t appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) override;
-	size_t insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) override;
-	bool removeStimulation(const size_t index) override;
-
-	_IsDerivedFromClass_Final_(IStimulationSet, OV_ClassId_StimulationSetImpl)
-
-private:
-
-	std::vector<CStimulation> m_stimulations;
-};
-}  // namespace
-
-// ________________________________________________________________________________________________________________
-//
-
-bool CStimulationSetImpl::setStimulationCount(const size_t n)
-{
-	m_stimulations.resize(size_t(n));
-	return true;
-}
-
-bool CStimulationSetImpl::setStimulationIdentifier(const size_t index, const uint64_t id)
-{
-	m_stimulations[size_t(index)].m_Id = id;
-	return true;
-}
-
-bool CStimulationSetImpl::setStimulationDate(const size_t index, const uint64_t date)
-{
-	m_stimulations[size_t(index)].m_Date = date;
-	return true;
-}
-
-bool CStimulationSetImpl::setStimulationDuration(const size_t index, const uint64_t duration)
-{
-	m_stimulations[size_t(index)].m_Duration = duration;
-	return true;
-}
-
-size_t CStimulationSetImpl::appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration)
-{
-	m_stimulations.push_back(CStimulation(id, date, duration));
-	return m_stimulations.size() - 1;
-}
-
-size_t CStimulationSetImpl::insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration)
-{
-	if (index > m_stimulations.size()) { return false; }
-	if (index == m_stimulations.size()) { m_stimulations.push_back(CStimulation(id, date, duration)); }
-	else { m_stimulations.insert(m_stimulations.begin() + size_t(index), CStimulation(id, date, duration)); }
-	return true;
-}
-
-bool CStimulationSetImpl::removeStimulation(const size_t index)
-{
-	if (index >= m_stimulations.size()) { return false; }
-	m_stimulations.erase(m_stimulations.begin() + size_t(index));
-	return true;
-}
-
-// ________________________________________________________________________________________________________________
-//
-
-CStimulationSet::CStimulationSet() { m_stimSet = new CStimulationSetImpl(); }
-
-}  // namespace OpenViBE
diff --git a/plugins/processing/classification/CMakeLists.txt b/plugins/processing/classification/CMakeLists.txt
index a60136443827b6ee2d5eeef8ab16c6147df331b2..d854e4c546ffe7fa8f9bfa9491a7386e3c2e9d79 100644
--- a/plugins/processing/classification/CMakeLists.txt
+++ b/plugins/processing/classification/CMakeLists.txt
@@ -12,7 +12,9 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-module-ebml
                       openvibe-module-system
                       openvibe-module-xml
-                      openvibe-module-fs)
+                      openvibe-module-fs
+                      Eigen3::Eigen
+)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
     VERSION ${PROJECT_VERSION}
@@ -22,7 +24,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
 
 add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 
-include("FindThirdPartyEigen")
 
 # ---------------------------------
 # Target macros
diff --git a/plugins/processing/classification/box-tutorials/classification-0-training.xml b/plugins/processing/classification/box-tutorials/classification-0-training.xml
index 45289fb3ab635f61f03d3ce44e17a27670be189c..53ee95c2c78a65708adc53651c4579060712beb8 100644
--- a/plugins/processing/classification/box-tutorials/classification-0-training.xml
+++ b/plugins/processing/classification/box-tutorials/classification-0-training.xml
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -428,7 +428,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -1779,11 +1779,11 @@ and so on.</Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>896.000000</Value>
+					<Value>896</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>512.000000</Value>
+					<Value>512</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
diff --git a/plugins/processing/classification/box-tutorials/classification-1-testing.xml b/plugins/processing/classification/box-tutorials/classification-1-testing.xml
index 006a381db3276a60cec15a5670eec02b59f1e880..40194e8e123d32f30941cde110a3f709b9e5446d 100644
--- a/plugins/processing/classification/box-tutorials/classification-1-testing.xml
+++ b/plugins/processing/classification/box-tutorials/classification-1-testing.xml
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -974,7 +974,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>96</Value>
+					<Value>176</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -1542,7 +1542,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>96</Value>
+					<Value>176</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -1601,7 +1601,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>48</Value>
+					<Value>112</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -1660,7 +1660,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>96</Value>
+					<Value>176</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -1719,7 +1719,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>128</Value>
+					<Value>240</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -2178,11 +2178,11 @@ transformations.</Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>784.000000</Value>
+					<Value>784</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>304.000000</Value>
+					<Value>304</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
@@ -2203,11 +2203,11 @@ from the lua chain. </Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>752.000000</Value>
+					<Value>752</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>800.000000</Value>
+					<Value>800</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
diff --git a/plugins/processing/classification/box-tutorials/classification-2-incremental.xml b/plugins/processing/classification/box-tutorials/classification-2-incremental.xml
index 282a89f2c8cdf06d81372cdca53c1c385991e133..fa7e7bc502723f389f0903af50bc84a11b3a9d02 100644
--- a/plugins/processing/classification/box-tutorials/classification-2-incremental.xml
+++ b/plugins/processing/classification/box-tutorials/classification-2-incremental.xml
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -343,7 +343,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Interstimulation interval (in sec)</Name>
 					<DefaultValue>1.0</DefaultValue>
-					<Value>2.0</Value>
+					<Value>2</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -714,7 +714,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -3136,11 +3136,11 @@ transformations.</Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>784.000000</Value>
+					<Value>784</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>304.000000</Value>
+					<Value>304</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
diff --git a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp
index 93cd9009fe817f99cecc55cea28b2672b17d4070..86f5f28f302423c10df6cd4ecc51f71e30f7f8a8 100644
--- a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp
+++ b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp
@@ -174,9 +174,9 @@ bool CBoxAlgorithmClassifierProcessor::process()
 		if (m_stimDecoder.isHeaderReceived()) { }
 		if (m_stimDecoder.isBufferReceived())
 		{
-			for (size_t j = 0; j < m_stimDecoder.getOutputStimulationSet()->getStimulationCount(); ++j)
+			for (size_t j = 0; j < m_stimDecoder.getOutputStimulationSet()->size(); ++j)
 			{
-				if (m_stimDecoder.getOutputStimulationSet()->getStimulationIdentifier(j) == OVTK_StimulationId_TrainCompleted)
+				if (m_stimDecoder.getOutputStimulationSet()->getId(j) == OVTK_StimulationId_TrainCompleted)
 				{
 					CString configFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0);
 					if (!loadClassifier(configFilename.toASCIIString())) { return false; }
@@ -211,12 +211,12 @@ bool CBoxAlgorithmClassifierProcessor::process()
 
 			Kernel::TParameterHandler<double> op_classificationState(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class));
 
-			IStimulationSet* set = m_labelsEncoder.getInputStimulationSet();
+			CStimulationSet* set = m_labelsEncoder.getInputStimulationSet();
 
-			set->setStimulationCount(1);
-			set->setStimulationIdentifier(0, m_stimulations[op_classificationState]);
-			set->setStimulationDate(0, endTime);
-			set->setStimulationDuration(0, 0);
+			set->resize(1);
+			set->setId(0, m_stimulations[op_classificationState]);
+			set->setDate(0, endTime);
+			set->setDuration(0, 0);
 
 			m_labelsEncoder.encodeBuffer();
 			m_hyperplanesEncoder.encodeBuffer();
diff --git a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp
index 42bc24e944cad97567243d2a530fbfe57bf49ff6..64654c55d5b348772f6bf472a19682f10a67e08b 100644
--- a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp
+++ b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp
@@ -238,17 +238,17 @@ bool CBoxAlgorithmClassifierTrainer::process()
 		}
 		if (m_stimDecoder.isBufferReceived())
 		{
-			const IStimulationSet* iStimulationSet = m_stimDecoder.getOutputStimulationSet();
-			IStimulationSet* oStimulationSet       = m_encoder.getInputStimulationSet();
+			const CStimulationSet* iStimulationSet = m_stimDecoder.getOutputStimulationSet();
+			CStimulationSet* oStimulationSet       = m_encoder.getInputStimulationSet();
 			oStimulationSet->clear();
 
-			for (size_t j = 0; j < iStimulationSet->getStimulationCount(); ++j)
+			for (size_t j = 0; j < iStimulationSet->size(); ++j)
 			{
-				if (iStimulationSet->getStimulationIdentifier(j) == m_trainStimulation)
+				if (iStimulationSet->getId(j) == m_trainStimulation)
 				{
 					startTrain        = true;
 					const uint64_t id = this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, "OVTK_StimulationId_TrainCompleted");
-					oStimulationSet->appendStimulation(id, iStimulationSet->getStimulationDate(j), 0);
+					oStimulationSet->push_back(id, iStimulationSet->getDate(j), 0);
 				}
 			}
 			m_encoder.encodeBuffer();
diff --git a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl
index 42d9bebdce9cc7e54ca234532d6e71876278f056..a5ab53fc044f784dd57fcf2e7d0d98c1b99743ca 100755
--- a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl
+++ b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl
@@ -41,14 +41,12 @@ public:
 
 	bool uninitialize() override
 	{
-		if (m_classifier)
-		{
+		if (m_classifier) {
 			m_classifier->uninitialize();
 			this->getAlgorithmManager().releaseAlgorithm(*m_classifier);
 			m_classifier = nullptr;
 		}
-		if (m_strategy)
-		{
+		if (m_strategy) {
 			m_strategy->uninitialize();
 			this->getAlgorithmManager().releaseAlgorithm(*m_strategy);
 			m_strategy = nullptr;
@@ -65,12 +63,6 @@ public:
 		return true;
 	}
 
-	//virtual bool onAlgorithmClassIdentifierChanged(Kernel::IBox &box)
-	//{
-	//this->initializedStrategy(box);
-	//return true;
-	//}
-
 	int getStrategySettingsCount(Kernel::IBox& box)
 	{
 		if (m_strategyAmountSettings < 0) { initializedStrategy(box); }	//The value have never been initialized
@@ -81,8 +73,7 @@ public:
 	{
 		box.setInputType(0, OV_TypeId_Stimulations);
 		box.setInputName(0, "Stimulations");
-		for (size_t i = 1; i < box.getInputCount(); ++i)
-		{
+		for (size_t i = 1; i < box.getInputCount(); ++i) {
 			box.setInputName(i, ("Features for class " + std::to_string(i)).c_str());
 			box.setInputType(i, OV_TypeId_FeatureVector);
 		}
@@ -108,8 +99,7 @@ public:
 		box.removeSetting(3 - 1 + getStrategySettingsCount(box) + index);
 
 		//Then rename the remains inputs in settings
-		for (size_t i = 1; i < box.getInputCount(); ++i)
-		{
+		for (size_t i = 1; i < box.getInputCount(); ++i) {
 			const std::string name = "Class " + std::to_string(i) + " label";
 			box.setSettingName(3 - 1 + getStrategySettingsCount(box) + i, name.c_str());
 		}
@@ -128,8 +118,7 @@ public:
 		if (settingName.find("Class ") == std::string::npos)//We haven't initialized the box so let's do it
 		{
 			//Now added Settings for classes
-			for (size_t i = 1; i < box.getInputCount(); ++i)
-			{
+			for (size_t i = 1; i < box.getInputCount(); ++i) {
 				const std::string name = "Class " + std::to_string(i) + " label";
 				std::stringstream stim;
 				stim.fill('0');
@@ -160,8 +149,7 @@ public:
 	bool updateDecision(Kernel::IBox& box)
 	{
 		const size_t i = getStrategyIndex() + 1;
-		if (m_strategyClassID == OVP_ClassId_Algorithm_ClassifierOneVsOne)
-		{
+		if (m_strategyClassID == OVP_ClassId_Algorithm_ClassifierOneVsOne) {
 			CString classifierName = "Unknown";
 			box.getSettingValue(getClassifierIndex(box), classifierName);
 			const CIdentifier typeID = this->getTypeManager().getEnumerationEntryValueFromName(
@@ -202,44 +190,35 @@ public:
 
 		box.getSettingValue(getStrategyIndex(), name);
 
-		const CIdentifier id = this->getTypeManager().getEnumerationEntryValueFromName(
-			OVTK_TypeId_ClassificationStrategy, name);
-		if (id != m_strategyClassID)
-		{
-			if (m_strategy)
-			{
+		const CIdentifier id = this->getTypeManager().getEnumerationEntryValueFromName(OVTK_TypeId_ClassificationStrategy, name);
+		if (id != m_strategyClassID) {
+			if (m_strategy) {
 				m_strategy->uninitialize();
 				this->getAlgorithmManager().releaseAlgorithm(*m_strategy);
 				m_strategy        = nullptr;
 				m_strategyClassID = CIdentifier::undefined();
 			}
-			if (id != CIdentifier::undefined())
-			{
+			if (id != CIdentifier::undefined()) {
 				m_strategy = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(id));
 				m_strategy->initialize();
 				m_strategyClassID = id;
 			}
 
-			for (size_t i = getStrategyIndex() + getStrategySettingsCount(box); i > getStrategyIndex(); --i)
-			{
-				DEBUG_PRINT(std::cout << "Remove pairing strategy setting at idx " << i-1 << "\n";)
+			for (size_t i = getStrategyIndex() + getStrategySettingsCount(box); i > getStrategyIndex(); --i) {
+				DEBUG_PRINT(std::cout << "Remove pairing strategy setting at idx " << i - 1 << "\n";)
 				box.removeSetting(i);
 			}
 			m_strategyAmountSettings = 0;
 		}
 		else { return true; }	//If we don't change the strategy we just have to return
 
-		if (m_strategy)
-		{
+		if (m_strategy) {
 			box.getSettingValue(getClassifierIndex(box), name);
 			const size_t i = getStrategyIndex() + 1;
-			if (m_strategyClassID == OVP_ClassId_Algorithm_ClassifierOneVsOne)
-			{
-				const CIdentifier typeID = this->getTypeManager().getEnumerationEntryValueFromName(
-					OVP_TypeId_OneVsOne_DecisionAlgorithms, name);
+			if (m_strategyClassID == OVP_ClassId_Algorithm_ClassifierOneVsOne) {
+				const CIdentifier typeID = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_OneVsOne_DecisionAlgorithms, name);
 				OV_ERROR_UNLESS_KRF(typeID != CIdentifier::undefined(),
-									"Unable to find Pairwise Decision for the algorithm [" << m_classifierClassID.str() << "]",
-									Kernel::ErrorType::BadConfig);
+									"Unable to find Pairwise Decision for the algorithm [" << m_classifierClassID.str() << "]", Kernel::ErrorType::BadConfig);
 
 				//As we just switch to this strategy, we take the default value set in the strategy to initialize the value
 				Kernel::IParameter* param = m_strategy->getInputParameter(OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType);
@@ -264,41 +243,35 @@ public:
 		CString name;
 		box.getSettingValue(getClassifierIndex(box), name);
 		CIdentifier id = this->getTypeManager().getEnumerationEntryValueFromName(OVTK_TypeId_ClassificationAlgorithm, name);
-		if (id != m_classifierClassID)
-		{
-			if (m_classifier)
-			{
+		if (id != m_classifierClassID) {
+			if (m_classifier) {
 				m_classifier->uninitialize();
 				this->getAlgorithmManager().releaseAlgorithm(*m_classifier);
 				m_classifier        = nullptr;
 				m_classifierClassID = CIdentifier::undefined();
 			}
-			if (id != CIdentifier::undefined())
-			{
+			if (id != CIdentifier::undefined()) {
 				m_classifier = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(id));
 				m_classifier->initialize();
 				m_classifierClassID = id;
 			}
 
 			//Disable the graphical refresh to avoid abusive redraw (not really a problem)
-			while (box.getSettingCount() >= m_customSettingBase + box.getInputCount() + getStrategySettingsCount(box))
-			{
+			while (box.getSettingCount() >= m_customSettingBase + box.getInputCount() + getStrategySettingsCount(box)) {
 				box.removeSetting(getClassifierIndex(box) + 1);
 			}
 		}
 		else { return true; }//If we don't change the algorithm we just have to return
 
-		if (m_classifier)
-		{
+		if (m_classifier) {
+			id       = CIdentifier::undefined();
 			size_t i = getClassifierIndex(box) + 1;
-			while ((id = m_classifier->getNextInputParameterIdentifier(id)) != CIdentifier::undefined())
-			{
+			while ((id = m_classifier->getNextInputParameterIdentifier(id)) != CIdentifier::undefined()) {
 				if ((id != OVTK_Algorithm_Classifier_InputParameterId_FeatureVector)
 					&& (id != OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet)
 					&& (id != OVTK_Algorithm_Classifier_InputParameterId_Config)
 					&& (id != OVTK_Algorithm_Classifier_InputParameterId_NClasses)
-					&& (id != OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter))
-				{
+					&& (id != OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)) {
 					CIdentifier typeID;
 					CString paramName         = m_classifier->getInputParameterName(id);
 					Kernel::IParameter* param = m_classifier->getInputParameter(id);
@@ -309,8 +282,7 @@ public:
 					Kernel::TParameterHandler<CString*> ip_sParameter(param);
 					std::string buffer;
 					bool valid = true;
-					switch (param->getType())
-					{
+					switch (param->getType()) {
 						case Kernel::ParameterType_Enumeration:
 							buffer = this->getTypeManager().getEnumerationEntryNameFromValue(param->getSubTypeIdentifier(), ip_uiParameter).toASCIIString();
 							typeID = param->getSubTypeIdentifier();
@@ -341,11 +313,10 @@ public:
 							break;
 					}
 
-					if (valid)
-					{
+					if (valid) {
 						// @FIXME argh, the -2 is a hard coding that the classifier trainer has 2 settings after the classifier setting... ouch
-						DEBUG_PRINT(std::cout << "Adding setting (case A) " << paramName << " : " << buffer << " to slot "
-							<< box.getSettingCount() - 2 << "\n";)
+						DEBUG_PRINT(
+							std::cout << "Adding setting (case A) " << paramName << " : " << buffer << " to slot " << box.getSettingCount() - 2 << "\n";)
 						box.addSetting(paramName, typeID, buffer.c_str(), box.getSettingCount() - 2);
 						i++;
 					}
@@ -362,9 +333,8 @@ public:
 
 protected:
 
-	CIdentifier m_classifierClassID = CIdentifier::undefined();
-	CIdentifier m_strategyClassID   =
-			0x0;	// CIdentifier::undefined() is already use, We initialize to an unused identifier in the strategy list
+	CIdentifier m_classifierClassID       = CIdentifier::undefined();
+	CIdentifier m_strategyClassID         = 0x0;	// CIdentifier::undefined() is already use, We initialize to an unused identifier in the strategy list
 	Kernel::IAlgorithmProxy* m_classifier = nullptr;
 	Kernel::IAlgorithmProxy* m_strategy   = nullptr;
 	const size_t m_customSettingBase      = 0;
diff --git a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp
index 9e4d7c6ada9478b557837decc8ede424ac1a1797..3ac2ec44137e0f75948e3b8e8d659611fef7c672 100644
--- a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp
+++ b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp
@@ -118,12 +118,12 @@ bool CBoxAlgorithmVotingClassifier::process()
 				}
 				else
 				{
-					for (size_t k = 0; k < input.op_stimSet->getStimulationCount(); ++k)
+					for (size_t k = 0; k < input.op_stimSet->size(); ++k)
 					{
-						const uint64_t id = input.op_stimSet->getStimulationIdentifier(k);
+						const uint64_t id = input.op_stimSet->getId(k);
 						if (id == m_targetClassLabel || id == m_nonTargetClassLabel || id == m_rejectClassLabel)
 						{
-							input.scores.push_back(std::pair<double, uint64_t>(id == m_targetClassLabel ? 1 : 0, input.op_stimSet->getStimulationDate(k)));
+							input.scores.push_back(std::pair<double, uint64_t>(id == m_targetClassLabel ? 1 : 0, input.op_stimSet->getDate(k)));
 						}
 					}
 				}
@@ -183,7 +183,7 @@ bool CBoxAlgorithmVotingClassifier::process()
 					<< this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, classLabel) << "\n";
 		}
 		m_classificationChoiceEncoder.getInputStimulationSet()->clear();
-		m_classificationChoiceEncoder.getInputStimulationSet()->appendStimulation(classLabel, time, 0);
+		m_classificationChoiceEncoder.getInputStimulationSet()->push_back(classLabel, time, 0);
 
 		m_classificationChoiceEncoder.encodeBuffer();
 		boxContext.markOutputAsReadyToSend(0, m_lastTime, time);
diff --git a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h
index dceaca87311d07da3aabc40bfe43fa58fe5e7617..f83576cec3acc1f15ca32730bd0b9470945dd705 100644
--- a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h
+++ b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h
@@ -35,7 +35,7 @@ private:
 	typedef struct
 	{
 		Toolkit::TDecoder<CBoxAlgorithmVotingClassifier>* decoder = nullptr;
-		Kernel::TParameterHandler<IStimulationSet*> op_stimSet;
+		Kernel::TParameterHandler<CStimulationSet*> op_stimSet;
 		Kernel::TParameterHandler<CMatrix*> op_matrix;
 		bool twoValueInput;
 		std::vector<std::pair<double, uint64_t>> scores;
@@ -44,7 +44,7 @@ private:
 	std::map<uint32_t, input_t> m_results;
 
 	Toolkit::TStimulationEncoder<CBoxAlgorithmVotingClassifier> m_classificationChoiceEncoder;
-	Kernel::TParameterHandler<const IStimulationSet*> ip_classificationChoiceStimSet;
+	Kernel::TParameterHandler<const CStimulationSet*> ip_classificationChoiceStimSet;
 
 	uint64_t m_lastTime = 0;
 	bool m_matrixBased  = false;
diff --git a/plugins/processing/data-generation/box-tutorials/time-signal.xml b/plugins/processing/data-generation/box-tutorials/time-signal.xml
index c6b274eb089b2b60962e700bb5f237d8b864cece..0a493eb6475ba88298662e238fb1c0790d1d0c16 100644
--- a/plugins/processing/data-generation/box-tutorials/time-signal.xml
+++ b/plugins/processing/data-generation/box-tutorials/time-signal.xml
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -49,11 +49,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>0</Value>
+					<Value>16</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>368</Value>
+					<Value>704</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -98,11 +98,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>-80</Value>
+					<Value>-32</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>368</Value>
+					<Value>704</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -170,7 +170,7 @@
 		</Attribute>
 		<Attribute>
 			<Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier>
-			<Value>1.0</Value>
+			<Value>1</Value>
 		</Attribute>
 		<Attribute>
 			<Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier>
diff --git a/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml b/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml
index 81d31300c3ed188ab9e75c75985ad81b7a129f11..e1d40da28dd9b4027b4bdf99046935f784bac4dd 100644
--- a/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml
+++ b/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -341,11 +341,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>736</Value>
+					<Value>752</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>160</Value>
+					<Value>208</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
diff --git a/plugins/processing/file-io/CMakeLists.txt b/plugins/processing/file-io/CMakeLists.txt
index 33402926c5d0d3ee7e9b7c2b8e60e2bacb604c88..869b431338aa83546bed6e98cc6ad94d5e0e2385 100755
--- a/plugins/processing/file-io/CMakeLists.txt
+++ b/plugins/processing/file-io/CMakeLists.txt
@@ -18,7 +18,9 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-module-csv
                       openvibe-module-ebml
                       openvibe-module-xml
-                      openvibe-module-fs)
+                      openvibe-module-fs
+                      Boost::boost
+)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
 	VERSION ${PROJECT_VERSION}
@@ -28,7 +30,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
 
 add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 
-include("FindThirdPartyBoost")
 include("FindThirdPartyXerces")
 
 # ---------------------------------
diff --git a/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs b/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs
index ed604551fee73f48da6bcd9d22c4a7747cc3e0da..bbed36f3d036bcac628c1167d884b140af212d1c 100644
--- a/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs
+++ b/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs
@@ -1,11 +1,88 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
 	<Boxes>
+		<Box>
+			<Identifier>(0x0000160a, 0x00006384)</Identifier>
+			<Name>Temporal Filter</Name>
+			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
+					<Name>Filter Type</Name>
+					<DefaultValue>Band Pass</DefaultValue>
+					<Value>Band Pass</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Filter Order</Name>
+					<DefaultValue>4</DefaultValue>
+					<Value>4</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>1</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>100</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>144</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>320</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x6a7c1e9b, 0x6b00b5c5)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
 		<Box>
 			<Identifier>(0x00004a40, 0x0000585c)</Identifier>
 			<Name>Continuous Oscilloscope</Name>
@@ -112,93 +189,6 @@
 				</Attribute>
 			</Attributes>
 		</Box>
-		<Box>
-			<Identifier>(0x00006ffa, 0x000071a0)</Identifier>
-			<Name>Temporal Filter</Name>
-			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
-			<Inputs>
-				<Input>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Input signal</Name>
-				</Input>
-			</Inputs>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output signal</Name>
-				</Output>
-			</Outputs>
-			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x2f2c606c, 0x8512ed68)</TypeIdentifier>
-					<Name>Filter Method</Name>
-					<DefaultValue>Butterworth</DefaultValue>
-					<Value>Butterworth</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-				<Setting>
-					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
-					<Name>Filter Type</Name>
-					<DefaultValue>Band Pass</DefaultValue>
-					<Value>Band Pass</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-				<Setting>
-					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
-					<Name>Filter Order</Name>
-					<DefaultValue>4</DefaultValue>
-					<Value>4</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-				<Setting>
-					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
-					<Name>Low Cut-off Frequency (Hz)</Name>
-					<DefaultValue>1</DefaultValue>
-					<Value>1</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-				<Setting>
-					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
-					<Name>High Cut-off Frequency (Hz)</Name>
-					<DefaultValue>40</DefaultValue>
-					<Value>100</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-				<Setting>
-					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
-					<Name>Band Pass Ripple (dB)</Name>
-					<DefaultValue>0.5</DefaultValue>
-					<Value>0.5</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>128</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>320</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0x27a4ceec, 0x876d6384)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>6</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
 		<Box>
 			<Identifier>(0x557489da, 0x7f18ab2b)</Identifier>
 			<Name>Generic stream reader</Name>
@@ -237,7 +227,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>352</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -267,9 +257,9 @@
 			</Target>
 		</Link>
 		<Link>
-			<Identifier>(0x00001785, 0x00002d8f)</Identifier>
+			<Identifier>(0x0000173a, 0x00007224)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00006ffa, 0x000071a0)</BoxIdentifier>
+				<BoxIdentifier>(0x0000160a, 0x00006384)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
@@ -278,13 +268,13 @@
 			</Target>
 		</Link>
 		<Link>
-			<Identifier>(0x000045ee, 0x000074b2)</Identifier>
+			<Identifier>(0x0000758d, 0x00005164)</Identifier>
 			<Source>
 				<BoxIdentifier>(0x557489da, 0x7f18ab2b)</BoxIdentifier>
 				<BoxOutputIndex>1</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00006ffa, 0x000071a0)</BoxIdentifier>
+				<BoxIdentifier>(0x0000160a, 0x00006384)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
 		</Link>
diff --git a/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileReader.cpp b/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileReader.cpp
index e0f255eaa30710fdd4dca3fede5923b4b6261a38..b146d35520139584098fba67a052ff561949e20c 100755
--- a/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileReader.cpp
+++ b/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileReader.cpp
@@ -310,7 +310,7 @@ bool CBoxAlgorithmOVCSVFileReader::processStimulation(const double startTime, co
 		OV_ERROR_UNLESS_KRF(boxContext.markOutputAsReadyToSend(1, 0, 0), "Failed to mark stimulation header as ready to send", Kernel::ErrorType::Internal);
 	}
 
-	IStimulationSet* stimulationSet = m_stimEncoder.getInputStimulationSet();
+	CStimulationSet* stimulationSet = m_stimEncoder.getInputStimulationSet();
 	stimulationSet->clear();
 
 	const uint64_t stimulationChunkStartTime = m_lastStimulationDate;
@@ -337,7 +337,7 @@ bool CBoxAlgorithmOVCSVFileReader::processStimulation(const double startTime, co
 
 			if (startTime <= stimulationDate && stimulationDate <= endTime)
 			{
-				stimulationSet->appendStimulation(it->id, CTime(it->date).time(), CTime(it->duration).time());
+				stimulationSet->push_back(it->id, CTime(it->date).time(), CTime(it->duration).time());
 				m_lastStimulationDate = CTime(it->date).time();
 			}
 			else
diff --git a/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileWriter.cpp b/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileWriter.cpp
index e32407a1c20a355dee10b1a993300a1195f45c99..c46ef7daf7f67d16c68b1231c59be0fa0ffaee2a 100755
--- a/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileWriter.cpp
+++ b/plugins/processing/file-io/src/box-algorithms/csv/CBoxAlgorithmOVCSVFileWriter.cpp
@@ -379,14 +379,14 @@ bool CBoxAlgorithmOVCSVFileWriter::processStimulation()
  		}
 		else if (m_stimDecoder.isBufferReceived())
 		{
-			const IStimulationSet* stimulationSet = m_stimDecoder.getOutputStimulationSet();
+			const CStimulationSet* stimulationSet = m_stimDecoder.getOutputStimulationSet();
 			// for each stimulation, get its informations
 
-			for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j)
+			for (size_t j = 0; j < stimulationSet->size(); ++j)
 			{
-				OV_ERROR_UNLESS_KRF(m_writerLib->addEvent({ stimulationSet->getStimulationIdentifier(j),
-										CTime(stimulationSet->getStimulationDate(j)).toSeconds(),
-										CTime(stimulationSet->getStimulationDuration(j)).toSeconds() }),
+				OV_ERROR_UNLESS_KRF(m_writerLib->addEvent({ stimulationSet->getId(j),
+										CTime(stimulationSet->getDate(j)).toSeconds(),
+										CTime(stimulationSet->getDuration(j)).toSeconds() }),
 									(CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" :
 										"Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal);
 			}
diff --git a/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp b/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp
index 9b09b56f60ddff9fc32ba0aeb0950edca27fde67..24dc722309a60e53a3fbd281befe04509f136428 100755
--- a/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp
+++ b/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp
@@ -309,7 +309,7 @@ bool CBoxAlgorithmCSVFileReader::processStimulation()
 		boxContext.markOutputAsReadyToSend(0, 0, 0);
 	}
 
-	IStimulationSet* ip_stimSet = static_cast<Toolkit::TStimulationEncoder<CBoxAlgorithmCSVFileReader>*>(m_encoder)->getInputStimulationSet();
+	CStimulationSet* ip_stimSet = static_cast<Toolkit::TStimulationEncoder<CBoxAlgorithmCSVFileReader>*>(m_encoder)->getInputStimulationSet();
 	ip_stimSet->clear();
 
 	for (size_t i = 0; i < m_dataMatrices.size(); ++i)
@@ -321,7 +321,7 @@ bool CBoxAlgorithmCSVFileReader::processStimulation()
 		const uint64_t id       = uint64_t(atof(m_dataMatrices[i][1].c_str()));
 		const uint64_t duration = CTime(atof(m_dataMatrices[i][2].c_str())).time();
 
-		ip_stimSet->appendStimulation(id, date, duration);
+		ip_stimSet->push_back(id, date, duration);
 	}
 
 	m_encoder->encodeBuffer();
diff --git a/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp b/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp
index 90652c746ff28f5b67c99ce4b56d4561fb896e7f..4a53de21e754b203d2f27caa30b3e2a5c0922053 100755
--- a/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp
+++ b/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp
@@ -13,10 +13,8 @@ bool CBoxAlgorithmCSVFileWriter::initialize()
 
 	m_separator = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1);
 
-	if (this->getTypeManager().isDerivedFromStream(m_typeID, OV_TypeId_StreamedMatrix))
-	{
-		if (m_typeID == OV_TypeId_Signal)
-		{
+	if (this->getTypeManager().isDerivedFromStream(m_typeID, OV_TypeId_StreamedMatrix)) {
+		if (m_typeID == OV_TypeId_Signal) {
 			m_decoder = new Toolkit::TSignalDecoder<CBoxAlgorithmCSVFileWriter>();
 			m_decoder->initialize(*this, 0);
 		}
@@ -25,24 +23,21 @@ bool CBoxAlgorithmCSVFileWriter::initialize()
 			// m_decoder=new Toolkit::TSpectrumDecoder < CBoxAlgorithmCSVFileWriter >();
 			// m_decoder->initialize(*this,0);
 			//}
-		else if (m_typeID == OV_TypeId_FeatureVector)
-		{
+		else if (m_typeID == OV_TypeId_FeatureVector) {
 			m_decoder = new Toolkit::TFeatureVectorDecoder<CBoxAlgorithmCSVFileWriter>();
 			m_decoder->initialize(*this, 0);
 		}
-		else
-		{
-			if (m_typeID != OV_TypeId_StreamedMatrix)
-			{
-				this->getLogManager() << Kernel::LogLevel_Info << "Input is a type derived from matrix that the box doesn't recognize, decoding as Streamed Matrix\n";
+		else {
+			if (m_typeID != OV_TypeId_StreamedMatrix) {
+				this->getLogManager() << Kernel::LogLevel_Info <<
+						"Input is a type derived from matrix that the box doesn't recognize, decoding as Streamed Matrix\n";
 			}
 			m_decoder = new Toolkit::TStreamedMatrixDecoder<CBoxAlgorithmCSVFileWriter>();
 			m_decoder->initialize(*this, 0);
 		}
 		m_realProcess = &CBoxAlgorithmCSVFileWriter::processStreamedMatrix;
 	}
-	else if (m_typeID == OV_TypeId_Stimulations)
-	{
+	else if (m_typeID == OV_TypeId_Stimulations) {
 		m_decoder = new Toolkit::TStimulationDecoder<CBoxAlgorithmCSVFileWriter>();
 		m_decoder->initialize(*this, 0);
 		m_realProcess = &CBoxAlgorithmCSVFileWriter::processStimulation;
@@ -61,8 +56,7 @@ bool CBoxAlgorithmCSVFileWriter::uninitialize()
 {
 	if (m_fileStream.is_open()) { m_fileStream.close(); }
 
-	if (m_decoder)
-	{
+	if (m_decoder) {
 		m_decoder->uninitialize();
 		delete m_decoder;
 	}
@@ -100,17 +94,14 @@ bool CBoxAlgorithmCSVFileWriter::process()
 bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 {
 	Kernel::IBoxIO& boxContext = this->getDynamicBoxContext();
-	for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i)
-	{
+	for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) {
 		const uint64_t tStart = boxContext.getInputChunkStartTime(0, i);
 		const uint64_t tEnd   = boxContext.getInputChunkEndTime(0, i);
 
 		m_decoder->decode(i);
 
-		if (m_decoder->isHeaderReceived())
-		{
-			if (!m_headerReceived)
-			{
+		if (m_decoder->isHeaderReceived()) {
+			if (!m_headerReceived) {
 				m_headerReceived = true;
 
 				const CMatrix* matrix = static_cast<Toolkit::TStreamedMatrixDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->getOutputMatrix();
@@ -118,29 +109,25 @@ bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 				OV_ERROR_UNLESS_KRF(matrix->getDimensionCount() == 1 || matrix->getDimensionCount() == 2,
 									"Invalid input matrix: must have 1 or 2 dimensions", Kernel::ErrorType::BadInput);
 
-				if (matrix->getDimensionCount() == 1 || m_typeID == OV_TypeId_FeatureVector)
-				{
+				if (matrix->getDimensionCount() == 1 || m_typeID == OV_TypeId_FeatureVector) {
 					// The matrix is a vector, make a matrix to represent it. This [n X 1] will get written as a single row due to transpose later
 					m_oMatrix.resize(matrix->getDimensionSize(0), 1);
 					for (size_t j = 0; j < matrix->getDimensionSize(0); ++j) { m_oMatrix.setDimensionLabel(0, j, matrix->getDimensionLabel(0, j)); }
 				}
-				else
-				{
+				else {
 					// As-is
 					m_oMatrix.copyDescription(*matrix);
 				}
 				// std::cout<<&m_Matrix<<" "<<&op_pMatrix<<"\n";
 				m_fileStream << "Time (s)";
-				for (size_t c = 0; c < m_oMatrix.getDimensionSize(0); ++c)
-				{
+				for (size_t c = 0; c < m_oMatrix.getDimensionSize(0); ++c) {
 					std::string label(m_oMatrix.getDimensionLabel(0, c));
 					while (label.length() > 0 && label[label.length() - 1] == ' ') { label.erase(label.length() - 1); }
 					m_fileStream << m_separator.toASCIIString() << label;
 				}
 
 				if (m_typeID == OV_TypeId_Signal) { m_fileStream << m_separator.toASCIIString() << "Sampling Rate"; }
-				else if (m_typeID == OV_TypeId_Spectrum)
-				{
+				else if (m_typeID == OV_TypeId_Spectrum) {
 					m_fileStream << m_separator << "Min frequency band";
 					m_fileStream << m_separator << "Max frequency band";
 				}
@@ -150,8 +137,7 @@ bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 			}
 			else { OV_ERROR_KRF("Multiple streamed matrix headers received", Kernel::ErrorType::BadInput); }
 		}
-		if (m_decoder->isBufferReceived())
-		{
+		if (m_decoder->isBufferReceived()) {
 			const CMatrix* matrix = static_cast<Toolkit::TStreamedMatrixDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->getOutputMatrix();
 
 			const size_t nChannel = m_oMatrix.getDimensionSize(0);
@@ -160,11 +146,9 @@ bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 			//this->getLogManager() << Kernel::LogLevel_Info << " dimsIn " << matrix->getDimensionSize(0) << "," << matrix->getDimensionSize(1) << "\n";
 			//this->getLogManager() << Kernel::LogLevel_Info << " dimsBuf " << m_oMatrix.getDimensionSize(0) << "," << m_oMatrix.getDimensionSize(1) << "\n";
 
-			for (size_t s = 0; s < nSample; ++s)
-			{
+			for (size_t s = 0; s < nSample; ++s) {
 				if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_FeatureVector) { m_fileStream << CTime(tStart).toSeconds(); }
-				else if (m_typeID == OV_TypeId_Signal)
-				{
+				else if (m_typeID == OV_TypeId_Signal) {
 					const uint64_t frequency = static_cast<Toolkit::TSignalDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->
 							getOutputSamplingRate();
 					const uint64_t timeOfNthSample = CTime(frequency, s).time(); // assuming chunk start is 0
@@ -175,10 +159,8 @@ bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 				else if (m_typeID == OV_TypeId_Spectrum) { m_fileStream << CTime(tEnd).toSeconds(); }
 				for (size_t c = 0; c < nChannel; ++c) { m_fileStream << m_separator.toASCIIString() << matrix->getBuffer()[c * nSample + s]; }
 
-				if (m_firstBuffer)
-				{
-					if (m_typeID == OV_TypeId_Signal)
-					{
+				if (m_firstBuffer) {
+					if (m_typeID == OV_TypeId_Signal) {
 						const uint64_t frequency = static_cast<Toolkit::TSignalDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->
 								getOutputSamplingRate();
 
@@ -186,8 +168,7 @@ bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 
 						m_firstBuffer = false;
 					}
-					else if (m_typeID == OV_TypeId_Spectrum)
-					{
+					else if (m_typeID == OV_TypeId_Spectrum) {
 						// This should not be supported anymore
 						// This is not the correct formula
 						const CMatrix* freq = static_cast<Toolkit::TSpectrumDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->
@@ -199,8 +180,7 @@ bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix()
 					}
 					else { }
 				}
-				else
-				{
+				else {
 					if (m_typeID == OV_TypeId_Signal) { m_fileStream << m_separator.toASCIIString(); }
 					else if (m_typeID == OV_TypeId_Spectrum) { m_fileStream << m_separator.toASCIIString() << m_separator.toASCIIString(); }
 					else { }
@@ -223,27 +203,22 @@ bool CBoxAlgorithmCSVFileWriter::processStimulation()
 {
 	Kernel::IBoxIO& boxContext = this->getDynamicBoxContext();
 
-	for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i)
-	{
+	for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) {
 		m_decoder->decode(i);
-		if (m_decoder->isHeaderReceived())
-		{
-			if (!m_headerReceived)
-			{
+		if (m_decoder->isHeaderReceived()) {
+			if (!m_headerReceived) {
 				m_headerReceived = true;
 				m_fileStream << "Time (s)" << m_separator.toASCIIString() << "Identifier" << m_separator.toASCIIString() << "Duration\n";
 			}
 			else { OV_ERROR_KRF("Multiple stimulation headers received", Kernel::ErrorType::BadInput); }
 		}
-		if (m_decoder->isBufferReceived())
-		{
-			const IStimulationSet* stimSet = static_cast<Toolkit::TStimulationDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->
+		if (m_decoder->isBufferReceived()) {
+			const CStimulationSet* stimSet = static_cast<Toolkit::TStimulationDecoder<CBoxAlgorithmCSVFileWriter>*>(m_decoder)->
 					getOutputStimulationSet();
-			for (size_t j = 0; j < stimSet->getStimulationCount(); ++j)
-			{
-				m_fileStream << CTime(stimSet->getStimulationDate(j)).toSeconds() << m_separator.toASCIIString()
-						<< stimSet->getStimulationIdentifier(j) << m_separator.toASCIIString()
-						<< CTime(stimSet->getStimulationDuration(j)).toSeconds() << "\n";
+			for (size_t j = 0; j < stimSet->size(); ++j) {
+				m_fileStream << CTime(stimSet->getDate(j)).toSeconds() << m_separator.toASCIIString()
+						<< stimSet->getId(j) << m_separator.toASCIIString()
+						<< CTime(stimSet->getDuration(j)).toSeconds() << "\n";
 			}
 		}
 		if (m_decoder->isEndReceived()) { }
diff --git a/plugins/processing/signal-processing/CMakeLists.txt b/plugins/processing/signal-processing/CMakeLists.txt
index 16733c553b9939cb9fbadc604e9567537d524aae..e2140f59b3a7deed5283b6ea51000c4fc6c820c4 100644
--- a/plugins/processing/signal-processing/CMakeLists.txt
+++ b/plugins/processing/signal-processing/CMakeLists.txt
@@ -14,7 +14,12 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-toolkit
                       openvibe-module-ebml
                       openvibe-module-system
-                      openvibe-module-fs)
+                      openvibe-module-fs
+                      Boost::boost
+                      Eigen3::Eigen
+)
+
+target_include_directories(${PROJECT_NAME} PRIVATE src)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
     VERSION ${PROJECT_VERSION}
@@ -24,9 +29,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
 
 add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 
-include("FindThirdPartyBoost")
-include("FindThirdPartyEigen")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs b/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs
index 41a7e68882fd21049c16acc90996a92f5d6ae6bb..fdb5a940999dd0eb3098abb160af0e00be8b9e0c 100644
--- a/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs
+++ b/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.2.99</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -88,11 +88,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>192</Value>
+					<Value>112</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>176</Value>
+					<Value>240</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -258,7 +258,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>304</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -463,10 +463,4 @@ a 4 channels sinusoidal signal</Text>
 			<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":678,"identifier":"(0x02b6d4f0, 0x103dc3fd)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":950},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1722ecef, 0x1695d0b2)","index":0,"name":"Default tab","parentIdentifier":"(0x02b6d4f0, 0x103dc3fd)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":463,"identifier":"(0x00004bd5, 0x00001389)","index":0,"maxDividerPosition":930,"name":"Horizontal split","parentIdentifier":"(0x1722ecef, 0x1695d0b2)","type":5},{"boxIdentifier":"(0x0000478e, 0x000023b0)","childCount":0,"identifier":"(0x00002c70, 0x000006ef)","index":0,"parentIdentifier":"(0x00004bd5, 0x00001389)","type":3},{"boxIdentifier":"(0x0000478e, 0x000023b1)","childCount":0,"identifier":"(0x000048d3, 0x0000443a)","index":1,"parentIdentifier":"(0x00004bd5, 0x00001389)","type":3}]</Data>
 		</Entry>
 	</Metadata>
-	<Attributes>
-		<Attribute>
-			<Identifier>(0x4c536d0a, 0xb23dc545)</Identifier>
-			<Value>channel-selector.mxs</Value>
-		</Attribute>
-	</Attributes>
-</OpenViBE-Scenario>
+</OpenViBE-Scenario>
\ No newline at end of file
diff --git a/plugins/processing/signal-processing/box-tutorials/crop.mxs b/plugins/processing/signal-processing/box-tutorials/crop.mxs
index 7fdff0f6aea704cd56b6a3fbcdfd35c19a9dfb20..735513cc34545878a719300d887466be805255bc 100644
--- a/plugins/processing/signal-processing/box-tutorials/crop.mxs
+++ b/plugins/processing/signal-processing/box-tutorials/crop.mxs
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.0.0</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -102,10 +102,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -144,21 +140,21 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Min crop value</Name>
 					<DefaultValue>-1</DefaultValue>
-					<Value>-3.000000</Value>
+					<Value>-3</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Max crop value</Name>
 					<DefaultValue>1</DefaultValue>
-					<Value>3.000000</Value>
+					<Value>3</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 			</Settings>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>224</Value>
+					<Value>240</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -210,7 +206,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>112</Value>
+					<Value>128</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -412,7 +408,7 @@ sinusoid in the [-4 +4] range.</Text>
 		<Entry>
 			<Identifier>(0x0000775c, 0x000078ff)</Identifier>
 			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
-			<Data>[{"boxIdentifier":"(0x00004a0e, 0x000044ab)","childCount":0,"identifier":"(0x000020ad, 0x000032d0)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x57071613, 0x5293bfef)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x38bf53e5, 0x226f5320)","index":0,"name":"Default tab","parentIdentifier":"(0x57071613, 0x5293bfef)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x5a0201c7, 0x2a9c34e2)","index":0,"name":"Empty","parentIdentifier":"(0x38bf53e5, 0x226f5320)","type":0}]</Data>
+			<Data>[{"boxIdentifier":"(0x00004a0e, 0x000044ab)","childCount":0,"identifier":"(0x000020ad, 0x000032d0)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x57071613, 0x5293bfef)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x38bf53e5, 0x226f5320)","index":0,"name":"Default tab","parentIdentifier":"(0x57071613, 0x5293bfef)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x5a0201c7, 0x2a9c34e2)","index":0,"name":"Empty","parentIdentifier":"(0x38bf53e5, 0x226f5320)","type":0}]</Data>
 		</Entry>
 	</Metadata>
 </OpenViBE-Scenario>
\ No newline at end of file
diff --git a/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs b/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs
index dcfc97eb3ae293fa2effc7b3c6b4a22e96944afd..d7922a105f8d959ae5ca422a6c3ec51b2670814d 100644
--- a/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs
+++ b/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs
@@ -1,7 +1,10 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.0.0</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
+	<Settings></Settings>
+	<Inputs></Inputs>
+	<Outputs></Outputs>
 	<Boxes>
 		<Box>
 			<Identifier>(0x0000007b, 0x00006015)</Identifier>
@@ -33,13 +36,9 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>208</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>336</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -53,10 +52,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>126</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -103,15 +98,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>176</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>224</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>768</Value>
+					<Value>752</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -125,10 +116,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>63</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -175,15 +162,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>176</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>224</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>912</Value>
+					<Value>896</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -197,10 +180,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>61</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -250,22 +229,14 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>96</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>544</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x9e5ca01e, 0x30a4d8c3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>72</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x004fd2ab)</Value>
@@ -302,13 +273,9 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>208</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>96</Value>
+					<Value>160</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -322,10 +289,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>61</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -346,7 +309,7 @@
 		</Box>
 		<Box>
 			<Identifier>(0x0000183a, 0x00001fb5)</Identifier>
-			<Name>y = x&#179;</Name>
+			<Name>y = x³</Name>
 			<AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier>
 			<Inputs>
 				<Input>
@@ -374,13 +337,9 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>208</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>192</Value>
+					<Value>272</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -394,10 +353,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>61</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -448,11 +403,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>336</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>304</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -470,10 +421,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>61</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -576,13 +523,9 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>304</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>64</Value>
+					<Value>128</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -592,10 +535,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>116</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -608,7 +547,7 @@
 		</Box>
 		<Box>
 			<Identifier>(0x00004ec9, 0x00005102)</Identifier>
-			<Name>Display: y = x&#179;</Name>
+			<Name>Display: y = x³</Name>
 			<AlgorithmClassIdentifier>(0x0842bcd1, 0xd53c1c89)</AlgorithmClassIdentifier>
 			<Inputs>
 				<Input>
@@ -690,13 +629,9 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>304</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>192</Value>
+					<Value>272</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -706,10 +641,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>116</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -804,13 +735,9 @@
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
 					<Value>304</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>336</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -820,10 +747,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>168</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -916,15 +839,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>256</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>304</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>544</Value>
+					<Value>608</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -934,10 +853,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>116</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -1030,15 +945,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>224</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>304</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>1056</Value>
+					<Value>1040</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -1048,10 +959,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>116</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -1144,11 +1051,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>448</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>384</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -1162,10 +1065,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>179</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -1258,11 +1157,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>448</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>384</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -1276,10 +1171,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>143</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>9</Value>
@@ -1322,11 +1213,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>336</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>49</Value>
+					<Value>304</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -1344,10 +1231,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>99</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -1378,24 +1261,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005101)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>239</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>96</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>275</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>56</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x000011f1, 0x00003a30)</Identifier>
@@ -1407,24 +1272,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005105)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>207</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>912</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>195</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>1048</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00001c5e, 0x000061dd)</Identifier>
@@ -1436,24 +1283,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005102)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>239</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>192</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>275</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>184</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x0000214e, 0x0000342e)</Identifier>
@@ -1465,24 +1294,6 @@
 				<BoxIdentifier>(0x00000e99, 0x000033ce)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>115</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>147</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>912</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00002734, 0x000072b2)</Identifier>
@@ -1494,24 +1305,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005104)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>207</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>768</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>227</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>536</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x000032c1, 0x00006af9)</Identifier>
@@ -1523,24 +1316,6 @@
 				<BoxIdentifier>(0x000004f0, 0x00002045)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>115</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>147</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>768</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x0000387c, 0x0000579d)</Identifier>
@@ -1552,24 +1327,6 @@
 				<BoxIdentifier>(0x000052a1, 0x00005411)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>207</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>768</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>307</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>744</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00004bcd, 0x0000198d)</Identifier>
@@ -1581,24 +1338,6 @@
 				<BoxIdentifier>(0x0000007b, 0x00006015)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>115</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>179</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>336</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00004d59, 0x00005943)</Identifier>
@@ -1610,24 +1349,6 @@
 				<BoxIdentifier>(0x0000183a, 0x00001fb5)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>115</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>179</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>192</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x0000504c, 0x00005ab1)</Identifier>
@@ -1639,24 +1360,6 @@
 				<BoxIdentifier>(0x000052a1, 0x00005411)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>207</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>912</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>307</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>759</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00005bc7, 0x00000def)</Identifier>
@@ -1668,24 +1371,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005107)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>367</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>928</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>419</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>920</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00005d3d, 0x000072b2)</Identifier>
@@ -1697,24 +1382,6 @@
 				<BoxIdentifier>(0x00001af6, 0x00003a73)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>207</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>912</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>307</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>935</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00005d98, 0x0000772f)</Identifier>
@@ -1726,24 +1393,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005106)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>367</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>752</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>419</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>744</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007299, 0x00005ae8)</Identifier>
@@ -1755,24 +1404,6 @@
 				<BoxIdentifier>(0x000013a6, 0x00004f67)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>115</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>179</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>96</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007987, 0x00007021)</Identifier>
@@ -1784,24 +1415,6 @@
 				<BoxIdentifier>(0x00001af6, 0x00003a73)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>207</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>768</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>307</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>920</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007cae, 0x000067d9)</Identifier>
@@ -1813,24 +1426,6 @@
 				<BoxIdentifier>(0x00004ec9, 0x00005103)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>239</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>336</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>275</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>328</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 	</Links>
 	<Comments>
@@ -1846,11 +1441,11 @@ for inputs 1 to 16 respectively.</Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>1088</Value>
+					<Value>1120</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>336</Value>
+					<Value>416</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
@@ -1861,7 +1456,7 @@ to perform mathematical operations</Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>224</Value>
+					<Value>288</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
@@ -1876,7 +1471,7 @@ that generates a constant increasing signal</Text>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>544</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
@@ -1892,11 +1487,11 @@ can be achieved using
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>560</Value>
+					<Value>752</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>336</Value>
+					<Value>464</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
@@ -1909,7 +1504,7 @@ These computations can be &lt;b&gt;logical&lt;/b&gt; or
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>544</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
@@ -1923,11 +1518,11 @@ These computations can be &lt;b&gt;logical&lt;/b&gt; or
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
-					<Value>544</Value>
+					<Value>528</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
-					<Value>512</Value>
+					<Value>560</Value>
 				</Attribute>
 			</Attributes>
 		</Comment>
@@ -1936,7 +1531,7 @@ These computations can be &lt;b&gt;logical&lt;/b&gt; or
 		<Entry>
 			<Identifier>(0x0000775c, 0x000078ff)</Identifier>
 			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
-			<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":3,"height":655,"identifier":"(0x000073b1, 0x00002780)","index":0,"name":"Simple DSP Tutorial","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1115},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000031ad, 0x00004908)","index":0,"name":"Polynomial","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007cf9, 0x0000288f)","index":1,"name":"Trigonometric","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003001, 0x00004366)","index":2,"name":"Compound","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":545,"identifier":"(0x0000037d, 0x0000518e)","index":0,"maxDividerPosition":1095,"name":"Horizontal split","parentIdentifier":"(0x000031ad, 0x00004908)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":399,"identifier":"(0x00007871, 0x00002897)","index":0,"maxDividerPosition":610,"name":"Vertical split","parentIdentifier":"(0x00007cf9, 0x0000288f)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":303,"identifier":"(0x00003022, 0x00005977)","index":0,"maxDividerPosition":610,"name":"Vertical split","parentIdentifier":"(0x00003001, 0x00004366)","type":4},{"boxIdentifier":"(0x00004ec9, 0x00005101)","childCount":0,"identifier":"(0x00006b56, 0x00004614)","index":0,"parentIdentifier":"(0x0000037d, 0x0000518e)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005102)","childCount":0,"identifier":"(0x00000cdd, 0x0000534a)","index":1,"parentIdentifier":"(0x0000037d, 0x0000518e)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":537,"identifier":"(0x00005868, 0x00004ede)","index":0,"maxDividerPosition":1079,"name":"Horizontal split","parentIdentifier":"(0x00007871, 0x00002897)","type":5},{"boxIdentifier":"(0x00004ec9, 0x00005103)","childCount":0,"identifier":"(0x0000335d, 0x00004277)","index":1,"parentIdentifier":"(0x00007871, 0x00002897)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005106)","childCount":0,"identifier":"(0x00004dcf, 0x00004355)","index":0,"parentIdentifier":"(0x00003022, 0x00005977)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005107)","childCount":0,"identifier":"(0x00005aa2, 0x00001c4e)","index":1,"parentIdentifier":"(0x00003022, 0x00005977)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005105)","childCount":0,"identifier":"(0x00005471, 0x000071ff)","index":0,"parentIdentifier":"(0x00005868, 0x00004ede)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005104)","childCount":0,"identifier":"(0x00002641, 0x00002c3c)","index":1,"parentIdentifier":"(0x00005868, 0x00004ede)","type":3}]</Data>
+			<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":3,"height":655,"identifier":"(0x000073b1, 0x00002780)","name":"Simple DSP Tutorial","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1115},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000031ad, 0x00004908)","index":0,"name":"Polynomial","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007cf9, 0x0000288f)","index":1,"name":"Trigonometric","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003001, 0x00004366)","index":2,"name":"Compound","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":545,"identifier":"(0x0000037d, 0x0000518e)","index":0,"maxDividerPosition":1095,"name":"Horizontal split","parentIdentifier":"(0x000031ad, 0x00004908)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":399,"identifier":"(0x00007871, 0x00002897)","index":0,"maxDividerPosition":610,"name":"Vertical split","parentIdentifier":"(0x00007cf9, 0x0000288f)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":303,"identifier":"(0x00003022, 0x00005977)","index":0,"maxDividerPosition":610,"name":"Vertical split","parentIdentifier":"(0x00003001, 0x00004366)","type":4},{"boxIdentifier":"(0x00004ec9, 0x00005101)","childCount":0,"identifier":"(0x00006b56, 0x00004614)","index":0,"parentIdentifier":"(0x0000037d, 0x0000518e)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005102)","childCount":0,"identifier":"(0x00000cdd, 0x0000534a)","index":1,"parentIdentifier":"(0x0000037d, 0x0000518e)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":537,"identifier":"(0x00005868, 0x00004ede)","index":0,"maxDividerPosition":1079,"name":"Horizontal split","parentIdentifier":"(0x00007871, 0x00002897)","type":5},{"boxIdentifier":"(0x00004ec9, 0x00005103)","childCount":0,"identifier":"(0x0000335d, 0x00004277)","index":1,"parentIdentifier":"(0x00007871, 0x00002897)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005106)","childCount":0,"identifier":"(0x00004dcf, 0x00004355)","index":0,"parentIdentifier":"(0x00003022, 0x00005977)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005107)","childCount":0,"identifier":"(0x00005aa2, 0x00001c4e)","index":1,"parentIdentifier":"(0x00003022, 0x00005977)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005105)","childCount":0,"identifier":"(0x00005471, 0x000071ff)","index":0,"parentIdentifier":"(0x00005868, 0x00004ede)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005104)","childCount":0,"identifier":"(0x00002641, 0x00002c3c)","index":1,"parentIdentifier":"(0x00005868, 0x00004ede)","type":3}]</Data>
 		</Entry>
 	</Metadata>
 </OpenViBE-Scenario>
\ No newline at end of file
diff --git a/plugins/processing/signal-processing/box-tutorials/temporal-filter.xml b/plugins/processing/signal-processing/box-tutorials/temporal-filter.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9d46c716bb28497383a149b94252565290edfeca
--- /dev/null
+++ b/plugins/processing/signal-processing/box-tutorials/temporal-filter.xml
@@ -0,0 +1,2502 @@
+<OpenViBE-Scenario>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
+	<Settings>
+		<Setting>
+			<Identifier>(0x88c276c3, 0x9c11c074)</Identifier>
+			<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+			<Name>PI</Name>
+			<DefaultValue>3.14</DefaultValue>
+			<Value>3.14159265359</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0x245720ef, 0xf875e436)</Identifier>
+			<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+			<Name>f1</Name>
+			<DefaultValue>1</DefaultValue>
+			<Value>1</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0xab2fe52d, 0x1990711b)</Identifier>
+			<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+			<Name>f2</Name>
+			<DefaultValue>2</DefaultValue>
+			<Value>2</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0x849a0a43, 0x0f61fc3e)</Identifier>
+			<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+			<Name>f3</Name>
+			<DefaultValue>3</DefaultValue>
+			<Value>3</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0x33633efe, 0x995f2b6a)</Identifier>
+			<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+			<Name>Order</Name>
+			<DefaultValue>10</DefaultValue>
+			<Value>4</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0x1402becd, 0x9336d52a)</Identifier>
+			<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+			<Name>Low Cut</Name>
+			<DefaultValue>0.5</DefaultValue>
+			<Value>0.9</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0xd4dfa4a1, 0x14b431e4)</Identifier>
+			<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+			<Name>High Cut</Name>
+			<DefaultValue>1.5</DefaultValue>
+			<Value>1.1</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0x99fd8800, 0x5e079d6f)</Identifier>
+			<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+			<Name>Display Scale</Name>
+			<DefaultValue>2</DefaultValue>
+			<Value>4</Value>
+		</Setting>
+		<Setting>
+			<Identifier>(0x77e4b83e, 0x3a6edb0c)</Identifier>
+			<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+			<Name>Time Scale</Name>
+			<DefaultValue>5</DefaultValue>
+			<Value>5</Value>
+		</Setting>
+	</Settings>
+	<Inputs></Inputs>
+	<Outputs></Outputs>
+	<Boxes>
+		<Box>
+			<Identifier>(0x0000005b, 0x000020ff)</Identifier>
+			<Name>Time signal</Name>
+			<AlgorithmClassIdentifier>(0x28a5e7ff, 0x530095de)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Generated signal</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Sampling frequency</Name>
+					<DefaultValue>512</DefaultValue>
+					<Value>512</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Generated epoch sample count</Name>
+					<DefaultValue>32</DefaultValue>
+					<Value>32</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>128</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>720</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x9e5ca01e, 0x30a4d8c3)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b07)</Identifier>
+			<Name>Raw</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>720</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b08)</Identifier>
+			<Name>Band Pass (approx F1)</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>608</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b09)</Identifier>
+			<Name>Band Stop (Approx F2 + F3)</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>944</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b0a)</Identifier>
+			<Name>High Pass (Approx Raw)</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1104</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b0b)</Identifier>
+			<Name>Low Pass (Approx F1)</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1248</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b0c)</Identifier>
+			<Name>Raw F1</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>288</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>640</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b0d)</Identifier>
+			<Name>Raw F2</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>288</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>720</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b0e)</Identifier>
+			<Name>Raw F3</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>288</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>800</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b0f)</Identifier>
+			<Name>Filtered F1</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>336</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b10)</Identifier>
+			<Name>Filtered F2</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>416</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b11)</Identifier>
+			<Name>Filtered F3</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>496</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000051cf, 0x00006b12)</Identifier>
+			<Name>Raw F2 + F3</Name>
+			<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Data</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
+					<Name>Channel Units</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
+					<Name>Display Mode</Name>
+					<DefaultValue>Scan</DefaultValue>
+					<Value>Scan</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
+					<Name>Auto vertical scale</Name>
+					<DefaultValue>Per channel</DefaultValue>
+					<Value>None</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Scale refresh interval (secs)</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>5</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Scale</Name>
+					<DefaultValue>100</DefaultValue>
+					<Value>$var{Display Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Vertical Offset</Name>
+					<DefaultValue>0</DefaultValue>
+					<Value>0</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Time Scale</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>$var{Time Scale}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Bottom ruler</Name>
+					<DefaultValue>true</DefaultValue>
+					<Value>true</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Left ruler</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Multiview</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>816</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x92c056a7, 0x2dc71aff)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>9</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>3</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00006909, 0x00001c2e)</Identifier>
+			<Name>F1</Name>
+			<AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - A</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
+					<Name>Equation</Name>
+					<DefaultValue>x</DefaultValue>
+					<Value>sin(2*$var{PI}*$var{f1}*x)</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>208</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>640</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x21889dc4, 0x1126497e)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00006909, 0x00001c2f)</Identifier>
+			<Name>Add</Name>
+			<AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - A</Name>
+				</Input>
+				<Input>
+					<Identifier>(0x8ae204fa, 0x6b1774f2)</Identifier>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - B</Name>
+				</Input>
+				<Input>
+					<Identifier>(0x5f6e0e0e, 0xbf892843)</Identifier>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - C</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
+					<Name>Equation</Name>
+					<DefaultValue>x</DefaultValue>
+					<Value>A+B+C</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>368</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>720</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x21889dc4, 0x1126497e)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00006909, 0x00001c30)</Identifier>
+			<Name>F2</Name>
+			<AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - A</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
+					<Name>Equation</Name>
+					<DefaultValue>x</DefaultValue>
+					<Value>sin(2*$var{PI}*$var{f2}*x)</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>208</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>720</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x21889dc4, 0x1126497e)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00006909, 0x00001c31)</Identifier>
+			<Name>F3</Name>
+			<AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - A</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
+					<Name>Equation</Name>
+					<DefaultValue>x</DefaultValue>
+					<Value>sin(2*$var{PI}*$var{f3}*x)</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>208</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>800</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x21889dc4, 0x1126497e)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00006909, 0x00001c32)</Identifier>
+			<Name>Add</Name>
+			<AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - A</Name>
+				</Input>
+				<Input>
+					<Identifier>(0x8ae204fa, 0x6b1774f2)</Identifier>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input - B</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
+					<Name>Equation</Name>
+					<DefaultValue>x</DefaultValue>
+					<Value>A+B</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>368</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>816</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x21889dc4, 0x1126497e)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00007014, 0x00004f39)</Identifier>
+			<Name>Band Pass F1</Name>
+			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
+					<Name>Filter Type</Name>
+					<DefaultValue>Band Pass</DefaultValue>
+					<Value>Band Pass</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Filter Order</Name>
+					<DefaultValue>4</DefaultValue>
+					<Value>$var{Order}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>$var{Low Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>$var{High Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>464</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>608</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x6a7c1e9b, 0x6b00b5c5)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00007014, 0x00004f3a)</Identifier>
+			<Name>Band Stop F1</Name>
+			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
+					<Name>Filter Type</Name>
+					<DefaultValue>Band Pass</DefaultValue>
+					<Value>Band Stop</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Filter Order</Name>
+					<DefaultValue>4</DefaultValue>
+					<Value>$var{Order}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>$var{Low Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>$var{High Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>464</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>944</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x6a7c1e9b, 0x6b00b5c5)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00007014, 0x00004f3b)</Identifier>
+			<Name>High Pass F1</Name>
+			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
+					<Name>Filter Type</Name>
+					<DefaultValue>Band Pass</DefaultValue>
+					<Value>High Pass</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Filter Order</Name>
+					<DefaultValue>4</DefaultValue>
+					<Value>$var{Order}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>$var{Low Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>$var{High Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>464</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1104</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x6a7c1e9b, 0x6b00b5c5)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00007014, 0x00004f3c)</Identifier>
+			<Name>Low Pass F1</Name>
+			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
+					<Name>Filter Type</Name>
+					<DefaultValue>Band Pass</DefaultValue>
+					<Value>Low Pass</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Filter Order</Name>
+					<DefaultValue>4</DefaultValue>
+					<Value>$var{Order}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>$var{Low Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>$var{High Cut}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>464</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1248</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x6a7c1e9b, 0x6b00b5c5)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00007014, 0x00004f3d)</Identifier>
+			<Name>Multi Band Pass</Name>
+			<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal</Name>
+				</Output>
+				<Output>
+					<Identifier>(0xfc018519, 0xbf936f86)</Identifier>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal 2</Name>
+				</Output>
+				<Output>
+					<Identifier>(0x0e67be44, 0x13691221)</Identifier>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output signal 3</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
+					<Name>Filter Type</Name>
+					<DefaultValue>Band Pass</DefaultValue>
+					<Value>Band Pass</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Filter Order</Name>
+					<DefaultValue>4</DefaultValue>
+					<Value>$var{Order}</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>0.9</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>1.1</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency 2 (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>1.9</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency 2 (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>2.1</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Low Cut-off Frequency 3 (Hz)</Name>
+					<DefaultValue>1</DefaultValue>
+					<Value>2.9</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>High Cut-off Frequency 3 (Hz)</Name>
+					<DefaultValue>40</DefaultValue>
+					<Value>3.1</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>464</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>400</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x6a7c1e9b, 0x6b00b5c5)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+	</Boxes>
+	<Links>
+		<Link>
+			<Identifier>(0x0000053e, 0x00000865)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f3d)</BoxIdentifier>
+				<BoxOutputIdentifier>(0x0e67be44, 0x13691221)</BoxOutputIdentifier>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b11)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00000895, 0x00001325)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00007014, 0x00004f3a)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00000fa5, 0x0000756d)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f3d)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b0f)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00001c2a, 0x00004bd7)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b07)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00001cf8, 0x00000fac)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f3d)</BoxIdentifier>
+				<BoxOutputIdentifier>(0xfc018519, 0xbf936f86)</BoxOutputIdentifier>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b10)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x0000272a, 0x000039fc)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x0000005b, 0x000020ff)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c31)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x000027ed, 0x000026af)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00007014, 0x00004f3d)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00002ba2, 0x000074ee)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c30)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b0d)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00002c89, 0x00000f3d)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c31)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c32)</BoxIdentifier>
+				<BoxInputIdentifier>(0x8ae204fa, 0x6b1774f2)</BoxInputIdentifier>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00002d03, 0x000015ad)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c32)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b12)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00002e2c, 0x00005fde)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x0000005b, 0x000020ff)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c2e)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00004183, 0x00003edd)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00007014, 0x00004f39)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00004afb, 0x00000fbd)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c30)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c32)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00004dc5, 0x0000667b)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00007014, 0x00004f3b)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x0000544e, 0x00006109)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f3a)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b09)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x0000544e, 0x0000610a)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f3c)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b0b)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00005607, 0x00007caa)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c30)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxInputIdentifier>(0x8ae204fa, 0x6b1774f2)</BoxInputIdentifier>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00005782, 0x00005185)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2e)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00005b9a, 0x00007bae)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f39)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b08)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00005b9a, 0x00007baf)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00007014, 0x00004f3b)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b0a)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x0000645f, 0x0000135c)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00007014, 0x00004f3c)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00006ea8, 0x00006e16)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c2e)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b0c)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x0000748c, 0x0000183d)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x0000005b, 0x000020ff)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c30)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00007cb6, 0x0000625e)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c31)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000051cf, 0x00006b0e)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00007d11, 0x00000e5c)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006909, 0x00001c31)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00006909, 0x00001c2f)</BoxIdentifier>
+				<BoxInputIdentifier>(0x5f6e0e0e, 0xbf892843)</BoxInputIdentifier>
+			</Target>
+		</Link>
+	</Links>
+	<Comments>
+		<Comment>
+			<Identifier>(0x000053c0, 0x00007cc3)</Identifier>
+			<Text>Simple Input With 3 frequency sinus with F1, F2, F3
+y = sin(2*pi*f)</Text>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
+					<Value>1056</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
+					<Value>176</Value>
+				</Attribute>
+			</Attributes>
+		</Comment>
+	</Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x00005305, 0x00001f45)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":685,"identifier":"(0x00003479, 0x000017e5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":884},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004d3c, 0x0000615d)","index":0,"name":"Default tab","parentIdentifier":"(0x00003479, 0x000017e5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":588,"identifier":"(0x00000b05, 0x0000630e)","index":0,"maxDividerPosition":875,"name":"Horizontal split","parentIdentifier":"(0x00004d3c, 0x0000615d)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":284,"identifier":"(0x00000d0a, 0x00007fd5)","index":0,"maxDividerPosition":572,"name":"Horizontal split","parentIdentifier":"(0x00000b05, 0x0000630e)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":310,"identifier":"(0x00005bb2, 0x0000113d)","index":1,"maxDividerPosition":624,"name":"Vertical split","parentIdentifier":"(0x00000b05, 0x0000630e)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":302,"identifier":"(0x000041e0, 0x00005586)","index":0,"maxDividerPosition":608,"name":"Vertical split","parentIdentifier":"(0x00000d0a, 0x00007fd5)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":302,"identifier":"(0x00005ff9, 0x00002b31)","index":1,"maxDividerPosition":608,"name":"Vertical split","parentIdentifier":"(0x00000d0a, 0x00007fd5)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":145,"identifier":"(0x00000bf0, 0x00007013)","index":0,"maxDividerPosition":294,"name":"Vertical split","parentIdentifier":"(0x00005bb2, 0x0000113d)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":144,"identifier":"(0x00001a3f, 0x000049b7)","index":1,"maxDividerPosition":293,"name":"Vertical split","parentIdentifier":"(0x00005bb2, 0x0000113d)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":141,"identifier":"(0x00003ec7, 0x000018ee)","index":0,"maxDividerPosition":286,"name":"Vertical split","parentIdentifier":"(0x000041e0, 0x00005586)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":140,"identifier":"(0x00001108, 0x0000555c)","index":1,"maxDividerPosition":285,"name":"Vertical split","parentIdentifier":"(0x000041e0, 0x00005586)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":141,"identifier":"(0x00006ecf, 0x0000630c)","index":0,"maxDividerPosition":286,"name":"Vertical split","parentIdentifier":"(0x00005ff9, 0x00002b31)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":140,"identifier":"(0x00000709, 0x000079b0)","index":1,"maxDividerPosition":285,"name":"Vertical split","parentIdentifier":"(0x00005ff9, 0x00002b31)","type":4},{"boxIdentifier":"(0x000051cf, 0x00006b0f)","childCount":0,"identifier":"(0x00000dfe, 0x000068e2)","index":0,"parentIdentifier":"(0x00000bf0, 0x00007013)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b10)","childCount":0,"identifier":"(0x00007660, 0x00007f74)","index":1,"parentIdentifier":"(0x00000bf0, 0x00007013)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b11)","childCount":0,"identifier":"(0x00002135, 0x00002d30)","index":0,"parentIdentifier":"(0x00001a3f, 0x000049b7)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b12)","childCount":0,"identifier":"(0x0000210b, 0x00003ffa)","index":1,"parentIdentifier":"(0x00001a3f, 0x000049b7)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b08)","childCount":0,"identifier":"(0x0000005b, 0x00002f6c)","index":0,"parentIdentifier":"(0x00003ec7, 0x000018ee)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b09)","childCount":0,"identifier":"(0x00003450, 0x00006393)","index":1,"parentIdentifier":"(0x00003ec7, 0x000018ee)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b0a)","childCount":0,"identifier":"(0x0000044e, 0x00003aa9)","index":0,"parentIdentifier":"(0x00001108, 0x0000555c)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b0b)","childCount":0,"identifier":"(0x00005242, 0x000045f0)","index":1,"parentIdentifier":"(0x00001108, 0x0000555c)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b0c)","childCount":0,"identifier":"(0x0000346e, 0x00003ede)","index":0,"parentIdentifier":"(0x00006ecf, 0x0000630c)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b0d)","childCount":0,"identifier":"(0x000015ae, 0x00004523)","index":1,"parentIdentifier":"(0x00006ecf, 0x0000630c)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b0e)","childCount":0,"identifier":"(0x00000100, 0x000065e7)","index":0,"parentIdentifier":"(0x00000709, 0x000079b0)","type":3},{"boxIdentifier":"(0x000051cf, 0x00006b07)","childCount":0,"identifier":"(0x00002e0d, 0x00001d5e)","index":1,"parentIdentifier":"(0x00000709, 0x000079b0)","type":3}]</Data>
+		</Entry>
+	</Metadata>
+</OpenViBE-Scenario>
\ No newline at end of file
diff --git a/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part b/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part
index f6d0fde745e3f79daba007b717628ee8cdb16616..5c7fd4b9a7285a86d86e551703ba50a716a54e5d 100644
--- a/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part
+++ b/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part
@@ -6,8 +6,9 @@ Detailed description
 __________________________________________________________________
 
  * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Description|
- This plugin is used to filter the input signal. This plugin allows the selection of the kinf of filter (Butterworth, Chebyshev, Yule-Walker),
- the kind of filter (low-pass, high-pass, band-pass, band-stop), the low or/and the high edge of the filter, and the passband ripple for the Chebyshev filter.
+ This plugin is used to filter the input signal. This plugin uses the Butterworth filter,
+ allow the selection of the filter type (low-pass, high-pass, band-pass, band-stop) and the low or/and the high edge of the filter.
+ Outputs can be added to apply a filter on the signal with the same type and order but on different frequencies.
  * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Description|
 __________________________________________________________________
 
@@ -40,30 +41,23 @@ __________________________________________________________________
  * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Settings|
 
  * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting1|
- Select the name of filter between Butterworth, Chebyshev and Yule-Walker.
+ Select the kind of filter between low-pass, high-pass, band-pass, band-stop.
  * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting1|
 
  * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting2|
- Select the kind of filter between low-pass, high-pass, band-pass, band-stop.
+ Order \f$ n \f$ of the filter, with \f$ n \geq 1 \f$.
  * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting2|
 
  * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting3|
- Order \f$ n \f$ of the filter, with \f$ n \geq 1 \f$.
- * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting3|
-
- * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting4|
  Low cut-off frequency  \f$ f_1 > 0 \f$ for high-pass, band-pass and band-stop filters (not used with low-pass filter).
  Low cut-off frequency can not be above Nyquist-Shannon criteria (half of the sampling rate).
- * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting4|
+ * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting3|
 
- * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting5|
+ * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting4|
  High cut-off frequency  \f$ f_2 > 0 \f$ for low-pass, band-pass and band-stop filters (not used with high-pass filter). For band-pass and band-stop filters, \f$ f_1 < f_2 \f$.
  High cut-off frequency can not be above Nyquist-Shannon criteria (half of the sampling rate).
- * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting5|
+ * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting4|
 
- * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting6|
- If Chebyshev filter is selected, pass band ripple in dB is a necessary information.
- * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting6|
 __________________________________________________________________
 
 Examples description
diff --git a/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst b/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst
index addddc1863a7c837f7980cee352e35d0ad0d5e24..9056acb8d0421f0f932d7327a79a90a9eef2c8b7 100644
--- a/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst
+++ b/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst
@@ -71,7 +71,7 @@ Settings
 
    "Epoch duration (in sec)", "Float", "1"
    "Epoch offset (in sec)", "Float", "0.5"
-   "Stimulation to epoch from", "Stimulation", "OVTK_StimulationId_Label_00"
+   "Stimulation 1", "Stimulation", "OVTK_StimulationId_Label_00"
 
 Epoch duration (in sec)
 ~~~~~~~~~~~~~~~~~~~~~~~
@@ -89,7 +89,7 @@ offset is less than 0, then the signal selection starts *before* the actual
 stimulation. Refer to :ref:`Doc_BoxAlgorithm_StimulationBasedEpoching_Miscellaneous` for
 more detailed examples
 
-Stimulation to epoch from
+Stimulation 1
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
 This setting defines the stimulation identifier which should trigger
diff --git a/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h b/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h
index 459449164d8acf43e35f16b83aee89fe22057197..1b11e66303c8e6810442b23be050a22317ae0f95 100644
--- a/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h
+++ b/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h b/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h
index d42dc4c0f057759f6d3764f2d2b31b4cc101d183..e618e648fb3dad7b6a583eb73e1121f44746dc2e 100644
--- a/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h
+++ b/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h
@@ -7,7 +7,7 @@
 
 #if defined TARGET_HAS_ThirdPartyEIGEN
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.cpp b/plugins/processing/signal-processing/src/box-algorithms/CBoxXDAWNTrainer.cpp
old mode 100755
new mode 100644
similarity index 58%
rename from plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.cpp
rename to plugins/processing/signal-processing/src/box-algorithms/CBoxXDAWNTrainer.cpp
index 64b3da75f50b57db73e8bad315d35bff94bc5bf3..410a30a0dd60cc7f03ffda71dcb32371541708cd
--- a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.cpp
+++ b/plugins/processing/signal-processing/src/box-algorithms/CBoxXDAWNTrainer.cpp
@@ -1,30 +1,54 @@
-#include "ovpCBoxAlgorithmXDAWNTrainer.h"
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CBoxXDAWNTrainer.cpp
+/// \brief Class of the box XDAWN Trainer.
+/// \author Yann Renard (Mensia Technologies SA).
+/// \version 1.0.
+/// \copyright (C) 2022 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+#include "CBoxXDAWNTrainer.hpp"
 
 #include "fs/Files.h"
 
 #include <cstdio>
+#include <fstream>
 #include <iostream>
 
 namespace OpenViBE {
 namespace Plugins {
 namespace SignalProcessing {
 
-CBoxAlgorithmXDAWNTrainer::CBoxAlgorithmXDAWNTrainer() {}
+//--------------------------------------------------------------------------------
+CBoxXDAWNTrainer::CBoxXDAWNTrainer() {}
+//--------------------------------------------------------------------------------
 
-bool CBoxAlgorithmXDAWNTrainer::initialize()
+//--------------------------------------------------------------------------------
+bool CBoxXDAWNTrainer::initialize()
 {
 	m_trainStimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0);
-	m_filterFilename     = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1);
+	m_filename           = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)).toASCIIString();
 
-	OV_ERROR_UNLESS_KRF(m_filterFilename.length() != 0, "The filter filename is empty.\n", Kernel::ErrorType::BadSetting);
+	OV_ERROR_UNLESS_KRF(m_filename.length() != 0, "The filter filename is empty.\n", Kernel::ErrorType::BadSetting);
 
-	if (FS::Files::fileExists(m_filterFilename))
-	{
-		FILE* file = FS::Files::open(m_filterFilename, "wt");
-
-		OV_ERROR_UNLESS_KRF(file != nullptr, "The filter file exists but cannot be used.\n", Kernel::ErrorType::BadFileRead);
-
-		fclose(file);
+	if (FS::Files::fileExists(m_filename.c_str())) {
+		std::ofstream file;
+		file.open(m_filename, std::ios_base::out | std::ios_base::trunc);
+		OV_ERROR_UNLESS_KRF(file.is_open(), "The filter file exists but cannot be used.\n", Kernel::ErrorType::BadFileRead);
+		file.close();
 	}
 
 	const int filterDimension = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2);
@@ -43,8 +67,10 @@ bool CBoxAlgorithmXDAWNTrainer::initialize()
 
 	return true;
 }
+//--------------------------------------------------------------------------------
 
-bool CBoxAlgorithmXDAWNTrainer::uninitialize()
+//--------------------------------------------------------------------------------
+bool CBoxXDAWNTrainer::uninitialize()
 {
 	m_stimDecoder.uninitialize();
 	m_signalDecoder[0].uninitialize();
@@ -53,38 +79,38 @@ bool CBoxAlgorithmXDAWNTrainer::uninitialize()
 
 	return true;
 }
+//--------------------------------------------------------------------------------
 
-bool CBoxAlgorithmXDAWNTrainer::processInput(const size_t index)
+//--------------------------------------------------------------------------------
+bool CBoxXDAWNTrainer::processInput(const size_t index)
 {
 	if (index == 0) { this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); }
 
 	return true;
 }
+//--------------------------------------------------------------------------------
 
-bool CBoxAlgorithmXDAWNTrainer::process()
+//--------------------------------------------------------------------------------
+bool CBoxXDAWNTrainer::process()
 {
 	Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext();
 
 	bool train = false;
 
-	for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(0); ++i)
-	{
+	for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(0); ++i) {
 		m_stimEncoder.getInputStimulationSet()->clear();
 		m_stimDecoder.decode(i);
 
 		if (m_stimDecoder.isHeaderReceived()) { m_stimEncoder.encodeHeader(); }
-		if (m_stimDecoder.isBufferReceived())
-		{
-			for (size_t j = 0; j < m_stimDecoder.getOutputStimulationSet()->getStimulationCount(); ++j)
-			{
-				const uint64_t stimulationId = m_stimDecoder.getOutputStimulationSet()->getStimulationIdentifier(j);
+		if (m_stimDecoder.isBufferReceived()) {
+			for (size_t j = 0; j < m_stimDecoder.getOutputStimulationSet()->size(); ++j) {
+				const uint64_t stimulationId = m_stimDecoder.getOutputStimulationSet()->getId(j);
 
-				if (stimulationId == m_trainStimulationID)
-				{
+				if (stimulationId == m_trainStimulationID) {
 					train = true;
 
-					m_stimEncoder.getInputStimulationSet()->appendStimulation(
-						OVTK_StimulationId_TrainCompleted, m_stimDecoder.getOutputStimulationSet()->getStimulationDate(j), 0);
+					m_stimEncoder.getInputStimulationSet()->push_back(
+						OVTK_StimulationId_TrainCompleted, m_stimDecoder.getOutputStimulationSet()->getDate(j), 0);
 				}
 			}
 
@@ -95,8 +121,7 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 		dynamicBoxContext.markOutputAsReadyToSend(0, dynamicBoxContext.getInputChunkStartTime(0, i), dynamicBoxContext.getInputChunkEndTime(0, i));
 	}
 
-	if (train)
-	{
+	if (train) {
 		std::vector<size_t> erpSampleIndexes;
 		std::array<Eigen::MatrixXd, 2> X; // X[0] is session matrix, X[1] is averaged ERP
 		std::array<Eigen::MatrixXd, 2> C; // Covariance matrices
@@ -107,13 +132,11 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 
 		// Decodes input signals
 
-		for (size_t j = 0; j < 2; ++j)
-		{
+		for (size_t j = 0; j < 2; ++j) {
 			n[j] = 0;
 
-			for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(j + 1); ++i)
-			{
-				Toolkit::TSignalDecoder<CBoxAlgorithmXDAWNTrainer>& decoder = m_signalDecoder[j];
+			for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(j + 1); ++i) {
+				Toolkit::TSignalDecoder<CBoxXDAWNTrainer>& decoder = m_signalDecoder[j];
 				decoder.decode(i);
 
 				CMatrix* matrix       = decoder.getOutputMatrix();
@@ -121,12 +144,12 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 				const size_t nSample  = matrix->getDimensionSize(1);
 				const size_t sampling = size_t(decoder.getOutputSamplingRate());
 
-				if (decoder.isHeaderReceived())
-				{
+				if (decoder.isHeaderReceived()) {
 					OV_ERROR_UNLESS_KRF(sampling > 0, "Input sampling frequency is equal to 0. Plugin can not process.\n", Kernel::ErrorType::OutOfBound);
 					OV_ERROR_UNLESS_KRF(nChannel > 0, "For condition " << j + 1 << " got no channel in signal stream.\n", Kernel::ErrorType::OutOfBound);
 					OV_ERROR_UNLESS_KRF(nSample > 0, "For condition " << j + 1 << " got no samples in signal stream.\n", Kernel::ErrorType::OutOfBound);
-					OV_ERROR_UNLESS_KRF(m_filterDim <= nChannel, "The filter dimension must not be superior than the channel count.\n", Kernel::ErrorType::OutOfBound);
+					OV_ERROR_UNLESS_KRF(m_filterDim <= nChannel, "The filter dimension must not be superior than the channel count.\n",
+										Kernel::ErrorType::OutOfBound);
 
 					if (!n[0]) // Initialize signal buffer (X[0]) only when receiving input signal header.
 					{
@@ -138,13 +161,11 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 					}
 				}
 
-				if (decoder.isBufferReceived())
-				{
+				if (decoder.isBufferReceived()) {
 					Eigen::MatrixXd A = Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(
 						matrix->getBuffer(), nChannel, nSample);
 
-					switch (j)
-					{
+					switch (j) {
 						case 0: // Session							
 							X[j].block(0, n[j] * A.cols(), A.rows(), A.cols()) = A;
 							break;
@@ -175,8 +196,7 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 
 			OV_ERROR_UNLESS_KRF(n[j] != 0, "Did not have input signal for condition " << j + 1 << "\n", Kernel::ErrorType::BadValue);
 
-			switch (j)
-			{
+			switch (j) {
 				case 0: // Session
 					break;
 
@@ -216,13 +236,11 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 
 		const Eigen::GeneralizedSelfAdjointEigenSolver<Eigen::MatrixXd> eigenSolver(C[0].selfadjointView<Eigen::Lower>(), C[1].selfadjointView<Eigen::Lower>());
 
-		if (eigenSolver.info() != Eigen::Success)
-		{
+		if (eigenSolver.info() != Eigen::Success) {
 			const enum Eigen::ComputationInfo error = eigenSolver.info();
 			const char* errorMessage                = "unknown";
 
-			switch (error)
-			{
+			switch (error) {
 				case Eigen::NumericalIssue: errorMessage = "Numerical issue";
 					break;
 				case Eigen::NoConvergence: errorMessage = "No convergence";
@@ -245,37 +263,44 @@ bool CBoxAlgorithmXDAWNTrainer::process()
 		vectorsMapper.block(0, 0, m_filterDim, nChannel) = eigenSolver.eigenvectors().block(0, 0, nChannel, m_filterDim).transpose();
 
 		// Saves filters
+		if (!saveFilter(eigenVectors, nChannel)) { return false; }
+		this->getLogManager() << Kernel::LogLevel_Info << "Training finished and saved to [" << m_filename << "]!\n";
+	}
 
-		FILE* file = FS::Files::open(m_filterFilename.toASCIIString(), "wt");
-
-		OV_ERROR_UNLESS_KRF(file != nullptr, "Could not open file [" << m_filterFilename << "] for writing.\n", Kernel::ErrorType::BadFileWrite);
-
-		if (m_saveAsBoxConfig)
-		{
-			fprintf(file, "<OpenViBE-SettingsOverride>\n");
-			fprintf(file, "\t<SettingValue>");
-
-			for (size_t i = 0; i < eigenVectors.getBufferElementCount(); ++i) { fprintf(file, "%e ", eigenVectors.getBuffer()[i]); }
+	return true;
+}
+//--------------------------------------------------------------------------------
 
-			fprintf(file, "</SettingValue>\n");
-			fprintf(file, "\t<SettingValue>%zu</SettingValue>\n", m_filterDim);
-			fprintf(file, "\t<SettingValue>%zu</SettingValue>\n", nChannel);
-			fprintf(file, "\t<SettingValue></SettingValue>\n");
-			fprintf(file, "</OpenViBE-SettingsOverride>");
-		}
-		else
-		{
-			OV_ERROR_UNLESS_KRF(Toolkit::Matrix::saveToTextFile(eigenVectors, m_filterFilename),
-								"Unable to save to [" << m_filterFilename << "]\n", Kernel::ErrorType::BadFileWrite);
+//--------------------------------------------------------------------------------
+bool CBoxXDAWNTrainer::saveFilter(const CMatrix& m, const size_t nChannel)
+{
+	if (m_saveAsBoxConfig) {
+		std::ofstream file;
+		file.open(m_filename, std::ios_base::out | std::ios_base::trunc);
+		if (!file.is_open()) {
+			getLogManager() << Kernel::LogLevel_Error << "The file [" << m_filename << "] could not be opened for writing...";
+			return false;
 		}
 
-		OV_WARNING_UNLESS_K(fclose(file) == 0, "Could not close file[" << m_filterFilename << "].\n");
-
-		this->getLogManager() << Kernel::LogLevel_Info << "Training finished and saved to [" << m_filterFilename << "]!\n";
+		file << "<OpenViBE-SettingsOverride>" << std::endl;
+		file << "\t<SettingValue>";
+		for (size_t i = 0; i < m.getBufferElementCount(); ++i) { file << std::scientific << m.getBuffer()[i] << " "; }
+		file << "</SettingValue>" << std::endl;
+		file << "\t<SettingValue>" << m_filterDim << "</SettingValue>" << std::endl;
+		file << "\t<SettingValue>" << nChannel << "</SettingValue>" << std::endl;
+		file << "\t<SettingValue></SettingValue>" << std::endl;
+		file << "</OpenViBE-SettingsOverride>";
+		file.close();
+	}
+	else {
+		if (!m.toTextFile(m_filename)) {
+			getLogManager() << Kernel::LogLevel_Error << "Unable to save to [" << m_filename << "]\n";
+			return false;
+		}
 	}
-
 	return true;
 }
+//--------------------------------------------------------------------------------
 
 }  // namespace SignalProcessing
 }  // namespace Plugins
diff --git a/plugins/processing/signal-processing/src/box-algorithms/CBoxXDAWNTrainer.hpp b/plugins/processing/signal-processing/src/box-algorithms/CBoxXDAWNTrainer.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..1189a53e0b9973bf1079e302238902c045453cd0
--- /dev/null
+++ b/plugins/processing/signal-processing/src/box-algorithms/CBoxXDAWNTrainer.hpp
@@ -0,0 +1,102 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CBoxXDAWNTrainer.hpp
+/// \brief Class of the box XDAWN Trainer.
+/// \author Yann Renard (Mensia Technologies SA).
+/// \version 1.0.
+/// \copyright (C) 2022 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+#pragma once
+
+#include "defines.hpp"
+#include <openvibe/ov_all.h>
+#include <toolkit/ovtk_all.h>
+
+#include <Eigen/Eigen>
+#include <array>
+
+typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatrixXdRowMajor;
+
+namespace OpenViBE {
+namespace Plugins {
+namespace SignalProcessing {
+/// <summary> The class CBoxXDAWNTrainer describes the box XDAWN Trainer. </summary>
+class CBoxXDAWNTrainer final : public Toolkit::TBoxAlgorithm<IBoxAlgorithm>
+{
+public:
+	CBoxXDAWNTrainer();
+	void release() override { delete this; }
+	bool initialize() override;
+	bool uninitialize() override;
+	bool processInput(const size_t index) override;
+	bool process() override;
+
+	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer)
+
+protected:
+
+	Toolkit::TStimulationDecoder<CBoxXDAWNTrainer> m_stimDecoder;
+	std::array<Toolkit::TSignalDecoder<CBoxXDAWNTrainer>, 2> m_signalDecoder;
+	Toolkit::TStimulationEncoder<CBoxXDAWNTrainer> m_stimEncoder;
+
+	uint64_t m_trainStimulationID = 0;
+	std::string m_filename;
+	size_t m_filterDim     = 0;
+	bool m_saveAsBoxConfig = false;
+
+	bool saveFilter(const CMatrix& m, const size_t nChannel);
+};
+
+/// <summary> Descriptor of the box XDAWN Trainer. </summary>
+class CBoxXDAWNTrainerDesc final : public IBoxAlgorithmDesc
+{
+public:
+	void release() override {}
+	CString getName() const override { return "xDAWN Trainer"; }
+	CString getAuthorName() const override { return "Yann Renard"; }
+	CString getAuthorCompanyName() const override { return "Mensia Technologies SA"; }
+	CString getShortDescription() const override { return "Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300"; }
+	CString getDetailedDescription() const override { return "Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300"; }
+	CString getCategory() const override { return "Signal processing/Spatial Filtering"; }
+	CString getVersion() const override { return "1.0"; }
+	CString getSoftwareComponent() const override { return "openvibe-sdk"; }
+	CString getAddedSoftwareVersion() const override { return "0.0.0"; }
+	CString getUpdatedSoftwareVersion() const override { return "0.0.0"; }
+	CString getStockItemName() const override { return "gtk-zoom-100"; }
+	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer; }
+	IPluginObject* create() override { return new CBoxXDAWNTrainer; }
+
+	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
+	{
+		prototype.addInput("Stimulations", OV_TypeId_Stimulations);
+		prototype.addInput("Session signal", OV_TypeId_Signal);
+		prototype.addInput("Evoked potential epochs", OV_TypeId_Signal);
+
+		prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations);
+
+		prototype.addSetting("Train stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Train");
+		prototype.addSetting("Spatial filter configuration", OV_TypeId_Filename, "${Player_ScenarioDirectory}/config.xml");
+		prototype.addSetting("Filter dimension", OV_TypeId_Integer, "4");
+		prototype.addSetting("Save as box config", OV_TypeId_Boolean, "true");
+		return true;
+	}
+
+	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainerDesc)
+};
+}  // namespace SignalProcessing
+}  // namespace Plugins
+}  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h
index 723dc5b6456b26ade6b40ee1ea62c1190bc86bd9..2129dd3c90c580393d817940c790b2fa6cc7f208 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h
index 1f6b694f649b9e212a3756d47b22375312a4ad1b..03949bfa92dbf7783c9cce5be843e1a88b2a061a 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h
index 56e248361c0bc7dd23010ccd346e247f2d6151d6..82af23db1ceec16367745a8810320f73506f8836 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h
index 845657a0ab7192a6f9b20b71c93684f47c275042..0faa708a2871aacac417045ea25c4e56d414b690 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 
 namespace OpenViBE {
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h
index d783de47d6af1a1b79f2d141030384185f5733c9..877c4ee92ab2b48f445a6ced7af8b9c25d81f3e3 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 
 namespace OpenViBE {
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h
index 61abccbc1b3aad0f34dadfc6540dc8f6f83fd97d..89f2ba84653e407da820294a9674d07267be4d6f 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h
index 84aef69f20faa960da8ce92cf4132e1d8f212265..cd4ea4aafb9ec231ecdb4fc8cbea508b93713e1d 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp
index fcf1ef0bc0ac999985e8db4145a282a9df88fbf2..c00b313122cda180063f34fba0a7d8fc25ed88f1 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp
@@ -153,14 +153,14 @@ bool CBoxAlgorithmZeroCrossingDetector::process()
 					{
 						// negative ZC : positive-to-negative
 						oBuffer0[k + j * nSample] = -1;
-						m_encoder1.getInputStimulationSet()->appendStimulation(m_stimId2, stimulationDate, 0);
+						m_encoder1.getInputStimulationSet()->push_back(m_stimId2, stimulationDate, 0);
 						m_states[j] = -1;
 					}
 					else if ((m_states[j] == -1) && (signals[k] < m_hysteresis) && (signals[k + 1] > m_hysteresis))
 					{
 						// positive ZC : negative-to-positive
 						oBuffer0[k + j * nSample] = 1;
-						m_encoder1.getInputStimulationSet()->appendStimulation(m_stimId1, stimulationDate, 0);
+						m_encoder1.getInputStimulationSet()->push_back(m_stimId1, stimulationDate, 0);
 						m_states[j] = 1;
 
 						// for the rythm estimation
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h
index f7054a6a78d0d6c5165cfe518e2fd59fee925013..9f8cc723eaf67ab6cc86b52d02d8d413fdf09ff4 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h
@@ -20,7 +20,7 @@
  */
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp b/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp
index 038840b6c0b9762d98e202dd8b0e94546e705ae9..6d77195d675f2cb9813e0dd3668da2378f1501f6 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp
+++ b/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp
@@ -13,15 +13,23 @@ static const int OUTPUT_SIGNAL_IDX      = 0;
 
 bool CBoxAlgorithmStimulationBasedEpoching::initialize()
 {
+	//Number of Cues:
+	m_numberOfStimulations = getStaticBoxContext().getSettingCount() - NON_CUE_SETTINGS_COUNT + 1;
+
 	m_epochDurationInSeconds = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0);
 	const double epochOffset = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1);
-	m_stimulationID          = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2);
 
 	m_epochDuration = CTime(m_epochDurationInSeconds).time();
 
 	const int epochOffsetSign = (epochOffset > 0) - (epochOffset < 0);
 	m_epochOffset             = epochOffsetSign * int64_t(CTime(std::fabs(epochOffset)).time());
 
+	//Stimulation IDs
+	m_stimulationIDs.resize(m_numberOfStimulations);
+	for (size_t i = 0; i < m_numberOfStimulations; ++i) {
+		m_stimulationIDs[i] = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), NON_CUE_SETTINGS_COUNT - 1 + i);
+	}
+
 	m_lastReceivedStimulationDate   = 0;
 	m_lastStimulationChunkStartTime = 0;
 	m_lastSignalChunkEndTime        = 0;
@@ -64,15 +72,13 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 {
 	Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext();
 
-	for (size_t chunk = 0; chunk < boxCtx.getInputChunkCount(INPUT_SIGNAL_IDX); ++chunk)
-	{
+	for (size_t chunk = 0; chunk < boxCtx.getInputChunkCount(INPUT_SIGNAL_IDX); ++chunk) {
 		OV_ERROR_UNLESS_KRF(m_signalDecoder.decode(chunk), "Failed to decode chunk", Kernel::ErrorType::Internal);
 		CMatrix* iMatrix         = m_signalDecoder.getOutputMatrix();
 		uint64_t iChunkStartTime = boxCtx.getInputChunkStartTime(INPUT_SIGNAL_IDX, chunk);
 		uint64_t iChunkEndTime   = boxCtx.getInputChunkEndTime(INPUT_SIGNAL_IDX, chunk);
 
-		if (m_signalDecoder.isHeaderReceived())
-		{
+		if (m_signalDecoder.isHeaderReceived()) {
 			CMatrix* oMatrix = m_encoder.getInputMatrix();
 
 			m_nChannel              = iMatrix->getDimensionSize(0);
@@ -91,8 +97,7 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 			boxCtx.markOutputAsReadyToSend(OUTPUT_SIGNAL_IDX, 0, 0);
 		}
 
-		if (m_signalDecoder.isBufferReceived())
-		{
+		if (m_signalDecoder.isBufferReceived()) {
 			OV_ERROR_UNLESS_KRF((iChunkStartTime >= m_lastSignalChunkEndTime), "Stimulation Based Epoching can not work on overlapping signal",
 								Kernel::ErrorType::Internal);
 			// Cache the signal data
@@ -102,33 +107,28 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 			m_lastSignalChunkEndTime = iChunkEndTime;
 		}
 
-		if (m_signalDecoder.isEndReceived())
-		{
+		if (m_signalDecoder.isEndReceived()) {
 			m_encoder.encodeEnd();
 			boxCtx.markOutputAsReadyToSend(OUTPUT_SIGNAL_IDX, iChunkStartTime, iChunkEndTime);
 		}
 	}
 
-	for (size_t chunk = 0; chunk < boxCtx.getInputChunkCount(INPUT_STIMULATIONS_IDX); ++chunk)
-	{
+	for (size_t chunk = 0; chunk < boxCtx.getInputChunkCount(INPUT_STIMULATIONS_IDX); ++chunk) {
 		m_stimDecoder.decode(chunk);
 		// We only handle buffers and ignore stimulation headers and ends
-		if (m_stimDecoder.isBufferReceived())
-		{
-			for (size_t stimulation = 0; stimulation < m_stimDecoder.getOutputStimulationSet()->getStimulationCount(); ++stimulation)
-			{
-				if (m_stimDecoder.getOutputStimulationSet()->getStimulationIdentifier(stimulation) == m_stimulationID)
-				{
+		if (m_stimDecoder.isBufferReceived()) {
+			for (size_t stimulation = 0; stimulation < m_stimDecoder.getOutputStimulationSet()->size(); ++stimulation) {
+				if (isWatchedStimulation(m_stimDecoder.getOutputStimulationSet()->getId(stimulation))) {
 					// Stimulations are put into cache, we ignore stimulations that would produce output chunks with negative start date (after applying the offset)
-					uint64_t date = m_stimDecoder.getOutputStimulationSet()->getStimulationDate(stimulation);
-					if (date < m_lastReceivedStimulationDate)
-					{
+					const uint64_t date = m_stimDecoder.getOutputStimulationSet()->getDate(stimulation);
+					if (date < m_lastReceivedStimulationDate) {
 						OV_WARNING_K(
 							"Skipping stimulation (received at date " << CTime(date) << ") that predates an already received stimulation (at date "
 							<< CTime(m_lastReceivedStimulationDate) << ")");
 					}
-					else if (int64_t(date) + m_epochOffset >= 0)
-					{
+					else if (int64_t(date) + m_epochOffset >= 0 && date > m_lastReceivedStimulationDate) {
+						// Create epoch only if it is complete (at beginning of signal).
+						// Create only one epoch for several stims that are at exactly the same date.
 						m_receivedStimulations.push_back(date);
 						m_lastReceivedStimulationDate = date;
 					}
@@ -141,22 +141,19 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 	// Process the received stimulations
 	uint64_t lastProcessedStimDate = 0;
 
-	for (const auto& stimDate : m_receivedStimulations)
-	{
+	for (const auto& stimDate : m_receivedStimulations) {
 		const uint64_t epochStartTime = uint64_t(int64_t(stimDate) + m_epochOffset);
 
 		// No cache available
 		if (m_cachedChunks.empty()) { break; }
 		// During normal functioning only chunks that will no longer be useful are deprecated, this is to avoid failure in case of a bug
-		if (m_cachedChunks.front().startTime > epochStartTime)
-		{
+		if (m_cachedChunks.front().startTime > epochStartTime) {
 			OV_WARNING_K("Skipped creating an epoch on a timespan with no signal. The input signal probably contains non-contiguous chunks.");
 			break;
 		}
 
 		// We only process stimulations for which we have received enough signal to create an epoch
-		if (m_lastSignalChunkEndTime >= epochStartTime + m_epochDuration)
-		{
+		if (m_lastSignalChunkEndTime >= epochStartTime + m_epochDuration) {
 			auto* oBuffer     = m_encoder.getInputMatrix()->getBuffer();
 			size_t oBufferIdx = 0;
 			size_t idx        = 0;
@@ -165,8 +162,7 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 			auto tEnd   = m_cachedChunks[idx].endTime;
 
 			// Find the first chunk that contains data interesting for the sent epoch
-			while (tStart > epochStartTime || tEnd < epochStartTime)
-			{
+			while (tStart > epochStartTime || tEnd < epochStartTime) {
 				idx += 1;
 				if (idx == m_cachedChunks.size()) { break; }
 				tStart = m_cachedChunks[idx].startTime;
@@ -174,12 +170,10 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 			}
 
 			// If we have found a chunk that contains samples in the current epoch
-			if (idx != m_cachedChunks.size())
-			{
+			if (idx != m_cachedChunks.size()) {
 				uint64_t iBufferIdx = CTime(epochStartTime - tStart).toSampleCount(m_sampling);
 
-				while (oBufferIdx < m_nSampleCountOutputEpoch)
-				{
+				while (oBufferIdx < m_nSampleCountOutputEpoch) {
 					const auto oTime = epochStartTime + CTime(m_sampling, oBufferIdx).time();
 
 					// If we handle non-dyadic sampling rates then we do not have a guarantee that all chunks will be
@@ -187,8 +181,7 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 					// whether a sample is in them or not. This wiggle room will be of half of the sample duration
 					// on each side.
 					const uint64_t timeTolerance = CTime(m_sampling, 1).time() / 2;
-					if (iBufferIdx == m_nSamplePerInputBuffer)
-					{
+					if (iBufferIdx == m_nSamplePerInputBuffer) {
 						// advance to beginning of the next cached chunk
 						idx += 1;
 						if (idx == m_cachedChunks.size()) { break; }
@@ -199,11 +192,9 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 						// Case of non-consecutive chunks
 						if (tStart > oTime + timeTolerance) { break; }
 					}
-					else if (tStart <= oTime + timeTolerance && oTime <= tEnd + timeTolerance)
-					{
+					else if (tStart <= oTime + timeTolerance && oTime <= tEnd + timeTolerance) {
 						const auto& iBuffer = m_cachedChunks[idx].matrix->getBuffer();
-						for (size_t channel = 0; channel < m_nChannel; ++channel)
-						{
+						for (size_t channel = 0; channel < m_nChannel; ++channel) {
 							oBuffer[channel * m_nSampleCountOutputEpoch + oBufferIdx] = iBuffer[channel * m_nSamplePerInputBuffer + iBufferIdx];
 						}
 						oBufferIdx += 1;
@@ -214,8 +205,7 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 			}
 
 			// If the epoch is not complete (due to holes in signal)
-			if (oBufferIdx == m_nSampleCountOutputEpoch)
-			{
+			if (oBufferIdx == m_nSampleCountOutputEpoch) {
 				m_encoder.encodeBuffer();
 				boxCtx.markOutputAsReadyToSend(OUTPUT_SIGNAL_IDX, epochStartTime, epochStartTime + m_epochDuration);
 			}
@@ -237,8 +227,7 @@ bool CBoxAlgorithmStimulationBasedEpoching::process()
 	const uint64_t lastUsefulChunkEndTime = m_receivedStimulations.empty() ? m_lastStimulationChunkStartTime : m_receivedStimulations.front();
 
 	auto cutoffTime = int64_t(lastUsefulChunkEndTime) + m_epochOffset;
-	if (cutoffTime > 0)
-	{
+	if (cutoffTime > 0) {
 		m_cachedChunks.erase(std::remove_if(m_cachedChunks.begin(), m_cachedChunks.end(), [cutoffTime](const SCachedChunk& chunk)
 		{
 			return chunk.endTime < uint64_t(cutoffTime);
diff --git a/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h b/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h
index 916f7179b3c7ba2ac7b5a6d4809174e6ba32b2de..b9a009c2634745e214c0c60845013661d064fda6 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h
@@ -1,9 +1,11 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
+#include <iostream>
+#include <iomanip>
 #include <deque>
 #include <memory>
 
@@ -22,12 +24,26 @@ public:
 
 	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_StimulationBasedEpoching)
 
+	static const size_t NON_CUE_SETTINGS_COUNT = 3; // duration + offset + first stimulation
+
 private:
 	Toolkit::TSignalDecoder<CBoxAlgorithmStimulationBasedEpoching> m_signalDecoder;
 	Toolkit::TStimulationDecoder<CBoxAlgorithmStimulationBasedEpoching> m_stimDecoder;
 	Toolkit::TSignalEncoder<CBoxAlgorithmStimulationBasedEpoching> m_encoder;
 
-	uint64_t m_stimulationID        = 0;
+	bool isWatchedStimulation(const uint64_t& stim) const
+	{
+		for (const auto& id : m_stimulationIDs) {
+			if (id == stim) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	size_t m_numberOfStimulations = 1;
+	std::vector<uint64_t> m_stimulationIDs;
+
 	double m_epochDurationInSeconds = 0;
 	uint64_t m_epochDuration        = 0;
 	int64_t m_epochOffset           = 0;
@@ -67,6 +83,48 @@ private:
 	std::deque<SCachedChunk> m_cachedChunks;
 };
 
+class CBoxAlgorithmStimulationBasedEpochingListener final : public Toolkit::TBoxListener<IBoxListener>
+{
+public:
+
+	bool onSettingAdded(Kernel::IBox& box, const size_t index) override
+	{
+		const size_t previousCues = index - CBoxAlgorithmStimulationBasedEpoching::NON_CUE_SETTINGS_COUNT;
+		const size_t cueNumber    = previousCues + 1;
+
+		std::stringstream ss;
+		ss << std::setfill('0') << std::setw(2) << cueNumber;
+
+		const std::string value = "OVTK_StimulationId_Label_" + ss.str();
+		box.setSettingDefaultValue(index, value.c_str());
+		box.setSettingValue(index, value.c_str());
+
+		checkSettingNames(box);
+		return true;
+	}
+
+	bool onSettingRemoved(Kernel::IBox& box, const size_t index) override
+	{
+		checkSettingNames(box);
+		return true;
+	}
+
+	_IsDerivedFromClass_Final_(Toolkit::TBoxListener<IBoxListener>, OV_UndefinedIdentifier)
+
+private:
+
+	// This function is used to make sure the setting names and types are correct
+	bool checkSettingNames(Kernel::IBox& box) const
+	{
+		for (size_t i = CBoxAlgorithmStimulationBasedEpoching::NON_CUE_SETTINGS_COUNT; i < box.getSettingCount(); ++i) {
+			const std::string idx = std::to_string(i - 1);
+			box.setSettingName(i, ("Stimulation " + idx).c_str());
+			box.setSettingType(i, OV_TypeId_Stimulation);
+		}
+		return true;
+	}
+};
+
 class CBoxAlgorithmStimulationBasedEpochingDesc final : public IBoxAlgorithmDesc
 {
 public:
@@ -86,6 +144,7 @@ public:
 	CString getUpdatedSoftwareVersion() const override { return "0.1.0"; }
 	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationBasedEpoching; }
 	IPluginObject* create() override { return new CBoxAlgorithmStimulationBasedEpoching; }
+	IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationBasedEpochingListener; }
 	CString getStockItemName() const override { return "gtk-cut"; }
 
 	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
@@ -97,14 +156,14 @@ public:
 
 		prototype.addSetting("Epoch duration (in sec)", OV_TypeId_Float, "1");
 		prototype.addSetting("Epoch offset (in sec)", OV_TypeId_Float, "0.5");
-		prototype.addSetting("Stimulation to epoch from", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00");
+		prototype.addSetting("Stimulation 1", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00");
+		prototype.addFlag(Kernel::BoxFlag_CanAddSetting);
 
 		return true;
 	}
 
 	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationBasedEpochingDesc)
 };
-
 }  // namespace SignalProcessing
 }  // namespace Plugins
 }  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h b/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h
index 16c15958f857b8bd855d9e7c3d5e58184b41d493..c85b12fcc7328dfd08fbe12f827c040cc507f58c 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 
 namespace OpenViBE {
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/CBoxAlgorithmTemporalFilter.cpp b/plugins/processing/signal-processing/src/box-algorithms/filters/CBoxAlgorithmTemporalFilter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..aef1afb8dac0326708edf8dc7f2eb19604cac723
--- /dev/null
+++ b/plugins/processing/signal-processing/src/box-algorithms/filters/CBoxAlgorithmTemporalFilter.cpp
@@ -0,0 +1,227 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CBoxAlgorithmTemporalFilter.cpp
+/// \brief Class of the box Temporal Filter.
+/// \author Thibaut Monseigne (Inria).
+/// \version 2.0.
+/// \date 14/10/2021
+/// \copyright (C) 2020 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#include "CBoxAlgorithmTemporalFilter.hpp"
+
+namespace OpenViBE {
+namespace Plugins {
+namespace SignalProcessing {
+
+//--------------------------------------------------------------------------------
+// Filter Definition
+typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::BandPass<32>, 1, Dsp::DirectFormII> CButterworthBandPass;
+typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::BandStop<32>, 1, Dsp::DirectFormII> CButterworthBandStop;
+typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::HighPass<32>, 1, Dsp::DirectFormII> CButterworthHighPass;
+typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::LowPass<32>, 1, Dsp::DirectFormII> CButterworthLowPass;
+
+//--------------------------------------------------------------------------------
+void CBoxAlgorithmTemporalFilter::setParameter(const size_t id)
+{
+	m_parameters[id][1] = double(m_order);
+	switch (m_type) {
+		case EFilterType::BandPass:
+		case EFilterType::BandStop:
+			m_parameters[id][2] = 0.5 * (m_frenquencies[id][1] + m_frenquencies[id][0]);
+			m_parameters[id][3] = 1.0 * (m_frenquencies[id][1] - m_frenquencies[id][0]);
+			break;
+		case EFilterType::HighPass:
+			m_parameters[id][2] = m_frenquencies[id][0];
+			break;
+		case EFilterType::LowPass:
+			m_parameters[id][2] = m_frenquencies[id][1];
+			break;
+		default: ;
+	}
+}
+
+//--------------------------------------------------------------------------------
+std::shared_ptr<Dsp::Filter> CBoxAlgorithmTemporalFilter::createFilter(const size_t nSmooth) const
+{
+	switch (m_type) {
+		case EFilterType::BandPass: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthBandPass>(int(nSmooth)));
+		case EFilterType::BandStop: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthBandStop>(int(nSmooth)));
+		case EFilterType::HighPass: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthHighPass>(int(nSmooth)));
+		case EFilterType::LowPass: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthLowPass>(int(nSmooth)));
+		default: return nullptr;
+	}
+}
+
+
+//--------------------------------------------------------------------------------
+bool CBoxAlgorithmTemporalFilter::initialize()
+{
+	m_nOutput = this->getStaticBoxContext().getOutputCount();
+	// Resizes
+	m_encoders.resize(m_nOutput);
+	m_oMatrix.resize(m_nOutput);
+	m_frenquencies.resize(m_nOutput);
+	m_parameters.resize(m_nOutput);
+	m_filters.resize(m_nOutput);
+
+	// Input/outputs
+	m_decoder.initialize(*this, 0);
+	for (size_t i = 0; i < m_nOutput; ++i) {
+		m_encoders[i].initialize(*this, i);
+		m_encoders[i].getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate());
+		m_oMatrix[i] = m_encoders[i].getInputMatrix();
+	}
+
+	// Settings
+	m_type  = EFilterType(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)));	// cast Needed to uint before enum
+	m_order = size_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1));
+	OV_ERROR_UNLESS_KRF(m_order >= 1, "Invalid filter order [" << m_order << "] (expected value >= 1)", Kernel::ErrorType::BadSetting);
+
+	for (size_t i = 0; i < m_nOutput; ++i) {
+		// Get Settings
+		m_frenquencies[i].push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2 + i * 2));
+		m_frenquencies[i].push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3 + i * 2));
+		// Setting Validation
+		OV_ERROR_UNLESS_KRF(m_frenquencies[i][0] > 0 || m_type!= EFilterType::LowPass,
+							"Invalid low cut-off frequency [" << m_frenquencies[i][0] << "] (expected value > 0 for Low Pass)", Kernel::ErrorType::BadSetting);
+		OV_ERROR_UNLESS_KRF(m_frenquencies[i][0] >= 0, "Invalid low cut-off frequency [" << m_frenquencies[i][0] << "] (expected value >= 0)",
+							Kernel::ErrorType::BadSetting);
+		OV_ERROR_UNLESS_KRF(m_frenquencies[i][1] > 0, "Invalid high cut-off frequency [" << m_frenquencies[i][1] << "] (expected value > 0)",
+							Kernel::ErrorType::BadSetting);
+		OV_ERROR_UNLESS_KRF(m_frenquencies[i][0] <= m_frenquencies[i][1],
+							"Invalid cut-off frequencies [" << m_frenquencies[i][0] << "," << m_frenquencies[i][1] <<
+							"] (expected low frequency <= high frequency)", Kernel::ErrorType::BadSetting);
+		// Create Default Parameter
+		setParameter(i);
+	}
+
+	// Log
+	std::string msg = "Temporal Filter with " + toString(m_type) + " filter with order of " + std::to_string(m_order) + "\n";
+	for (size_t i = 0; i < m_nOutput; ++i) {
+		msg += "\tFrequency " + std::to_string(i + 1) + ": [" + std::to_string(m_frenquencies[i][0]) + ", " + std::to_string(m_frenquencies[i][1]) + "]\n";
+	}
+	this->getLogManager() << Kernel::LogLevel_Trace << msg;
+
+	return true;
+}
+
+//--------------------------------------------------------------------------------
+bool CBoxAlgorithmTemporalFilter::uninitialize()
+{
+	m_decoder.uninitialize();
+	for (auto& encoder : m_encoders) { encoder.uninitialize(); }
+	m_encoders.clear();
+	m_oMatrix.clear();
+	m_frenquencies.clear();
+	m_parameters.clear();
+	m_filters.clear();
+	m_firstSamples.clear();
+	return true;
+}
+
+//--------------------------------------------------------------------------------
+bool CBoxAlgorithmTemporalFilter::processInput(const size_t /*index*/)
+{
+	this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess();
+	return true;
+}
+
+//--------------------------------------------------------------------------------
+bool CBoxAlgorithmTemporalFilter::process()
+{
+	Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext();
+
+	for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) {
+		m_decoder.decode(i);
+
+		const uint64_t start  = boxCtx.getInputChunkStartTime(0, i);
+		const uint64_t end    = boxCtx.getInputChunkEndTime(0, i);
+		const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0);
+		const size_t nSample  = m_decoder.getOutputMatrix()->getDimensionSize(1);
+
+		if (m_decoder.isHeaderReceived()) {
+			const size_t frequency = m_decoder.getOutputSamplingRate();
+			const size_t nSmooth   = 100 * frequency;
+
+			for (size_t j = 0; j < m_nOutput; ++j) {
+				// Validation
+				if (m_type != EFilterType::LowPass) { // verification for high-pass, band-pass and band-stop filters
+					OV_ERROR_UNLESS_KRF(m_frenquencies[j][0] <= frequency * 0.5,
+										"Invalid low cut-off frequency [" << m_frenquencies[j][0] <<
+										"] (expected value must meet nyquist criteria for sampling rate "
+										<< frequency << ")", Kernel::ErrorType::BadConfig);
+				}
+				if (m_type != EFilterType::HighPass) { // verification for low-pass, band-pass and band-stop filters
+					OV_ERROR_UNLESS_KRF(m_frenquencies[j][1] <= frequency * 0.5,
+										"Invalid high cut-off frequency [" << m_frenquencies[j][1] <<
+										"] (expected value must meet nyquist criteria for sampling rate "
+										<< frequency << ")", Kernel::ErrorType::BadConfig);
+				}
+
+				// Filters
+				m_filters[j].clear();
+				m_parameters[j][0] = double(frequency);
+				for (size_t c = 0; c < nChannel; ++c) {
+					std::shared_ptr<Dsp::Filter> filter = createFilter(nSmooth);
+					filter->setParams(m_parameters[j]);
+					m_filters[j].push_back(filter);
+				}
+
+				// Matrix
+				m_oMatrix[j]->copyDescription(*m_decoder.getOutputMatrix());
+				// Encode Header
+				m_encoders[j].encodeHeader();
+			}
+		}
+		if (m_decoder.isBufferReceived()) {
+			double* input = m_decoder.getOutputMatrix()->getBuffer();
+
+			//"french cook" to reduce transient for bandpass and highpass filters
+			if (m_firstSamples.empty()) {
+				m_firstSamples.resize(nChannel, 0); //initialization to 0
+				if (m_type == EFilterType::BandPass || m_type == EFilterType::HighPass) {
+					for (size_t c = 0; c < nChannel; ++c) {
+						m_firstSamples[c] = input[c * nSample]; //first value of the signal = DC offset
+					}
+				}
+			}
+
+			// Apply Filter
+			for (size_t j = 0; j < m_nOutput; ++j) {
+				double* output = m_oMatrix[j]->getBuffer();
+				for (size_t c = 0; c < nChannel; ++c) {
+					//for bandpass and highpass filters, suppression of the value m_firstSamples = DC offset
+					//otherwise, no treatment, since m_firstSamples = 0
+					for (size_t k = 0; k < nSample; ++k) { output[k] = input[k + c * nSample] - m_firstSamples[c]; }
+
+					if (m_filters[j][c]) { m_filters[j][c]->process(int(nSample), &output); }
+					output += nSample;
+				}
+				m_encoders[j].encodeBuffer();
+			}
+		}
+		if (m_decoder.isEndReceived()) { for (auto& encoder : m_encoders) { encoder.encodeEnd(); } }
+		for (size_t j = 0; j < m_nOutput; ++j) { boxCtx.markOutputAsReadyToSend(j, start, end); }
+	}
+
+	return true;
+}
+
+}  // namespace SignalProcessing
+}  // namespace Plugins
+}  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/CBoxAlgorithmTemporalFilter.hpp b/plugins/processing/signal-processing/src/box-algorithms/filters/CBoxAlgorithmTemporalFilter.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b6c9534fa980addd6cb2e2b67bbf7e1a3b03d89e
--- /dev/null
+++ b/plugins/processing/signal-processing/src/box-algorithms/filters/CBoxAlgorithmTemporalFilter.hpp
@@ -0,0 +1,164 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CBoxAlgorithmTemporalFilter.hpp
+/// \brief Class of the box Temporal Filter.
+/// \author Thibaut Monseigne (Inria).
+/// \version 2.0.
+/// \date 14/10/2021
+/// \copyright (C) 2020 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include "defines.hpp"
+#include <openvibe/ov_all.h>
+#include <toolkit/ovtk_all.h>
+
+#include <memory>
+#include <dsp-filters/Dsp.h>
+
+namespace OpenViBE {
+namespace Plugins {
+namespace SignalProcessing {
+//--------------------------------------------------------------------------------
+/// <summary>	The class CBoxAlgorithmTemporalFilter describes the box Temporal Filter. </summary>
+class CBoxAlgorithmTemporalFilter final : public Toolkit::TBoxAlgorithm<IBoxAlgorithm>
+{
+public:
+	void release() override { delete this; }
+	bool initialize() override;
+	bool uninitialize() override;
+	bool processInput(const size_t index) override;
+	bool process() override;
+
+	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_TemporalFilter)
+
+private:
+
+	Toolkit::TSignalDecoder<CBoxAlgorithmTemporalFilter> m_decoder;					///< Decoder for input.
+	std::vector<Toolkit::TSignalEncoder<CBoxAlgorithmTemporalFilter>> m_encoders;	///< Encoders for outputs.
+	std::vector<CMatrix*> m_oMatrix;												///< Matrix links with outputs (avoid to relink at each process).
+
+	size_t m_nOutput   = 0;															///< Number of outputs.
+	EFilterType m_type = EFilterType::BandPass;										///< Type of the filters.
+	size_t m_order     = 0;															///< Order of the filters.
+
+	std::vector<std::vector<double>> m_frenquencies;								///< List of frequencies for each outputs (Low and High).
+	std::vector<Dsp::Params> m_parameters;											///< List of parameters for each outputs.
+	std::vector<std::vector<std::shared_ptr<Dsp::Filter>>> m_filters;				///< List of filters for each outputs and each channels.
+
+	std::vector<double> m_firstSamples;												///< First sample of each channel.
+
+	/// <summary> Sets the filter parameters depending on the Filter type. </summary>
+	/// <param name="id">The identifier of the filter (one filter per output).</param>
+	void setParameter(const size_t id);
+
+	/// <summary> Creates the filter of the dsp filter library. </summary>
+	/// <param name="nSmooth">The smooth of the filter (100*frequency of the signal).</param>
+	/// <returns> The pointer of the filter (the object is destroyed when no object have his address (or use delete)). </returns>
+	std::shared_ptr<Dsp::Filter> createFilter(const size_t nSmooth) const;
+};
+
+//--------------------------------------------------------------------------------
+/// <summary> Listener of the box Temporal Filter. </summary>
+class CBoxAlgorithmTemporalFilterListener final : public Toolkit::TBoxListener<IBoxListener>
+{
+public:
+
+	bool onOutputAdded(Kernel::IBox& box, const size_t index) override
+	{
+		box.setOutputType(index, OV_TypeId_Signal);
+		box.setOutputName(index, ("Output signal " + std::to_string(index + 1)).c_str());
+		changeSettings(box, true);
+		return true;
+	}
+
+	bool onOutputRemoved(Kernel::IBox& box, const size_t index) override
+	{
+		renameOutputs(box);
+		changeSettings(box, false);
+		return true;
+	}
+
+	bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override { return true; }
+
+	void renameOutputs(Kernel::IBox& box) const
+	{
+		for (size_t i = 1; i < box.getOutputCount(); ++i) { box.setOutputName(i, ("Output " + std::to_string(i + 1)).c_str()); }
+	}
+
+	void changeSettings(Kernel::IBox& box, bool add) const
+	{
+		const size_t idx = 2 + 2 * (box.getOutputCount() - 1); // First Setting Idx to Add
+		if (add) {
+			box.addSetting(settingName(true, box.getOutputCount()).c_str(), OV_TypeId_Float, "1", idx);
+			box.addSetting(settingName(false, box.getOutputCount()).c_str(), OV_TypeId_Float, "40", idx + 1);
+		}
+		else {
+			box.removeSetting(idx + 2);
+			box.removeSetting(idx + 2);
+		}
+	}
+
+	std::string settingName(const bool low, const size_t i) const
+	{
+		return std::string(low ? "Low" : "High") + " Cut-off Frequency " + std::to_string(i) + " (Hz)";
+	}
+
+	_IsDerivedFromClass_Final_(Toolkit::TBoxListener<IBoxListener>, CIdentifier::undefined())
+};
+
+//--------------------------------------------------------------------------------
+class CBoxAlgorithmTemporalFilterDesc final : public IBoxAlgorithmDesc
+{
+public:
+	void release() override { }
+	CString getName() const override { return "Temporal Filter"; }
+	CString getAuthorName() const override { return "Yann Renard & Laurent Bonnet, Thibaut Monseigne"; }
+	CString getAuthorCompanyName() const override { return "Mensia Technologies SA, Inria"; }
+	CString getShortDescription() const override { return "Temporal filtering based on various one-way IIR filter designs"; }
+	CString getDetailedDescription() const override { return "Applies a temporal filter, based on various one-way IIR filter designs, to the input stream."; }
+	CString getCategory() const override { return "Signal processing/Temporal Filtering"; }
+	CString getVersion() const override { return "2.0"; }
+	CString getSoftwareComponent() const override { return "openvibe-sdk"; }
+	CString getAddedSoftwareVersion() const override { return "0.0.0"; }
+	CString getUpdatedSoftwareVersion() const override { return "0.0.0"; }
+
+	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TemporalFilter; }
+	IPluginObject* create() override { return new CBoxAlgorithmTemporalFilter; }
+
+	IBoxListener* createBoxListener() const override { return new CBoxAlgorithmTemporalFilterListener; }
+	void releaseBoxListener(IBoxListener* listener) const override { delete listener; }
+
+	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
+	{
+		prototype.addInput("Input signal", OV_TypeId_Signal);
+		prototype.addOutput("Output signal", OV_TypeId_Signal);
+		prototype.addSetting("Filter Type", OVP_TypeId_FilterType, toString(EFilterType::BandPass).c_str());
+		prototype.addSetting("Filter Order", OV_TypeId_Integer, "4");
+		prototype.addSetting("Low Cut-off Frequency (Hz)", OV_TypeId_Float, "1");
+		prototype.addSetting("High Cut-off Frequency (Hz)", OV_TypeId_Float, "40");
+		prototype.addFlag(Kernel::BoxFlag_CanAddOutput);
+
+		return true;
+	}
+
+	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TemporalFilterDesc)
+};
+}  // namespace SignalProcessing
+}  // namespace Plugins
+}  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h
index 47752b5cdea05b37d0d649a763d4533e88010208..e32b3a5320d6b1b9afa0f55ce9a4ae4cd459461f 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp
index f93ab7fddb722533fc54348cdf91ce75149c40a3..047e978366a847c71c0b48dd0f3d0eec7ed9a6b5 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp
+++ b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp
@@ -247,12 +247,12 @@ bool CBoxAlgorithmRegularizedCSPTrainer::process()
 		}
 		if (m_stimDecoder.isBufferReceived())
 		{
-			const Kernel::TParameterHandler<IStimulationSet*> stimSet(m_stimDecoder.getOutputStimulationSet());
-			for (size_t j = 0; j < stimSet->getStimulationCount(); ++j)
+			const Kernel::TParameterHandler<CStimulationSet*> stimSet(m_stimDecoder.getOutputStimulationSet());
+			for (size_t j = 0; j < stimSet->size(); ++j)
 			{
-				if (stimSet->getStimulationIdentifier(j) == m_stimID)
+				if (stimSet->getId(j) == m_stimID)
 				{
-					date        = stimSet->getStimulationDate(stimSet->getStimulationCount() - 1);
+					date        = stimSet->getDate(stimSet->size() - 1);
 					startTime   = boxContext.getInputChunkStartTime(0, i);
 					endTime     = boxContext.getInputChunkEndTime(0, i);
 					shouldTrain = true;
@@ -378,7 +378,7 @@ bool CBoxAlgorithmRegularizedCSPTrainer::process()
 		}
 
 		m_encoder.getInputStimulationSet()->clear();
-		m_encoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_TrainCompleted, date, 0);
+		m_encoder.getInputStimulationSet()->push_back(OVTK_StimulationId_TrainCompleted, date, 0);
 		m_encoder.encodeBuffer();
 
 		boxContext.markOutputAsReadyToSend(0, startTime, endTime);
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h
index 7e404d6a154e37247e3062e641736e16a42ec1f3..428873e30608d02204f65c03c0f88f31431ade0c 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h
@@ -2,7 +2,7 @@
 
 #if defined TARGET_HAS_ThirdPartyEIGEN
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h
index 3cabdcdbad7805515b3ae1ae527f132b323fb4ed..d65fc42fd66c2cd185662eb1be335d1c101601ad 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.cpp b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.cpp
deleted file mode 100644
index 3581f45c5cebd337f38fca5b75de91cd3a89df6f..0000000000000000000000000000000000000000
--- a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.cpp
+++ /dev/null
@@ -1,333 +0,0 @@
-#include "ovpCBoxAlgorithmTemporalFilter.h"
-
-namespace OpenViBE {
-namespace Plugins {
-namespace SignalProcessing {
-
-namespace {
-typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::BandPass<32>, 1, Dsp::DirectFormII> CButterworthBandPass;
-typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::BandStop<32>, 1, Dsp::DirectFormII> CButterworthBandStop;
-typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::HighPass<32>, 1, Dsp::DirectFormII> CButterworthHighPass;
-typedef Dsp::SmoothedFilterDesign<Dsp::Butterworth::Design::LowPass<32>, 1, Dsp::DirectFormII> CButterworthLowPass;
-
-std::shared_ptr<Dsp::Filter> createButterworthFilter(const EFilterType type, const size_t nSmooth)
-{
-	switch (type)
-	{
-		case EFilterType::BandPass: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthBandPass>(int(nSmooth)));
-		case EFilterType::BandStop: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthBandStop>(int(nSmooth)));
-		case EFilterType::HighPass: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthHighPass>(int(nSmooth)));
-		case EFilterType::LowPass: return std::static_pointer_cast<Dsp::Filter>(std::make_shared<CButterworthLowPass>(int(nSmooth)));
-		default: return nullptr;
-	}
-}
-
-bool getButterworthParameters(Dsp::Params& parameters, const size_t frequency, const EFilterType type, const size_t order,
-							  const double lowCut, const double highCut, const double /*ripple*/)
-{
-	parameters[0] = double(frequency);
-	parameters[1] = double(order);
-	switch (type)
-	{
-		case EFilterType::BandPass:
-		case EFilterType::BandStop:
-			parameters[2] = .5 * (highCut + lowCut);
-			parameters[3] = 1. * (highCut - lowCut);
-			break;
-		case EFilterType::HighPass:
-			parameters[2] = lowCut;
-			break;
-		case EFilterType::LowPass:
-			parameters[2] = highCut;
-			break;
-		default:
-			return false;
-	}
-	return true;
-}
-
-/*
-typedef Dsp::SmoothedFilterDesign<Dsp::ChebyshevI::Design::BandPass<4>, 1, Dsp::DirectFormII> CChebyshevBandPass;
-typedef Dsp::SmoothedFilterDesign<Dsp::ChebyshevI::Design::BandStop<4>, 1, Dsp::DirectFormII> CChebyshevBandStop;
-typedef Dsp::SmoothedFilterDesign<Dsp::ChebyshevI::Design::HighPass<4>, 1, Dsp::DirectFormII> CChebyshevHighPass;
-typedef Dsp::SmoothedFilterDesign<Dsp::ChebyshevI::Design::LowPass<4>, 1, Dsp::DirectFormII> CChebyshevLowPass;
-	std::shared_ptr < Dsp::Filter > createChebishevFilter(size_t type, size_t nSmooth)
-	{
-		switch(type)
-		{
-			case EFilterType::BandPass: return std::shared_ptr < Dsp::Filter >(new CChebyshevBandPass(int(nSmooth)));
-			case EFilterType::BandStop: return std::shared_ptr < Dsp::Filter >(new CChebyshevBandStop(int(nSmooth)));
-			case EFilterType::HighPass: return std::shared_ptr < Dsp::Filter >(new CChebyshevHighPass(int(nSmooth)));
-			case EFilterType::LowPass: return std::shared_ptr < Dsp::Filter >(new CChebyshevLowPass(int(nSmooth)));
-			default:
-				break;
-		}
-		return NULL;
-	}
-
-	bool getChebishevParameters(Dsp::Params& params, size_t type, size_t sampling, size_t order, double lowCut, double highCut, double ripple)
-	{
-		params[0]=int(sampling);
-		params[1]=int(order);
-		switch(type)
-		{
-			case EFilterType::BandPass:
-			case EFilterType::BandStop:
-				params[2]=.5*(highCut+lowCut);
-				params[3]=1.*(highCut-lowCut);
-				params[4]=ripple;
-				break;
-			case EFilterType::HighPass:
-				params[2]=highCut; // TO CHECK : lowCut ?
-				params[3]=ripple;
-				break;
-			case EFilterType::LowPass:
-				params[2]=highCut;
-				params[3]=lowCut;  // TO CHECK : ripple ?
-				break;
-			default:
-				return false;
-		}
-		return true;
-	}
-	*/
-
-typedef bool (*fpGetParameters_t)(Dsp::Params& params, size_t sampling, EFilterType type, size_t order, double lowCut, double highCut, double ripple);
-typedef std::shared_ptr<Dsp::Filter> (*fpCreateFilter_t)(EFilterType type, size_t nSmooth);
-}  // namespace
-
-bool CBoxAlgorithmTemporalFilter::initialize()
-{
-	m_method            = EFilterMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)));	// cast Needed for x32
-	m_type              = EFilterType(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)));	// cast Needed for x32
-	const int64_t order = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2);
-	m_lowCut            = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3);
-	m_highCut           = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4);
-
-	OV_ERROR_UNLESS_KRF(order >= 1, "Invalid filter order [" << order << "] (expected value >= 1)", Kernel::ErrorType::BadSetting);
-
-	m_order = size_t(order);
-
-	if (m_type == EFilterType::LowPass)
-	{
-		OV_ERROR_UNLESS_KRF(m_highCut > 0, "Invalid high cut-off frequency [" << m_highCut << "] (expected value > 0)", Kernel::ErrorType::BadSetting);
-	}
-	else if (m_type == EFilterType::HighPass)
-	{
-		OV_ERROR_UNLESS_KRF(m_lowCut > 0, "Invalid low cut-off frequency [" << m_lowCut << "] (expected value > 0)", Kernel::ErrorType::BadSetting);
-	}
-	else if (m_type == EFilterType::BandPass || m_type == EFilterType::BandStop)
-	{
-		OV_ERROR_UNLESS_KRF(m_lowCut >= 0, "Invalid low cut-off frequency [" << m_lowCut << "] (expected value >= 0)", Kernel::ErrorType::BadSetting);
-		OV_ERROR_UNLESS_KRF(m_highCut > 0, "Invalid high cut-off frequency [" << m_highCut << "] (expected value > 0)", Kernel::ErrorType::BadSetting);
-		OV_ERROR_UNLESS_KRF(m_highCut > m_lowCut,
-							"Invalid cut-off frequencies [" << m_lowCut << "," << m_highCut << "] (expected low frequency < high frequency)",
-							Kernel::ErrorType::BadSetting);
-	}
-	else { OV_ERROR_KRF("Invalid filter type", Kernel::ErrorType::BadSetting); }
-
-	m_decoder.initialize(*this, 0);
-	m_encoder.initialize(*this, 0);
-
-	m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate());
-	m_encoder.getInputMatrix().setReferenceTarget(m_decoder.getOutputMatrix());
-
-	return true;
-}
-
-bool CBoxAlgorithmTemporalFilter::uninitialize()
-{
-	m_decoder.uninitialize();
-	m_encoder.uninitialize();
-
-	return true;
-}
-
-bool CBoxAlgorithmTemporalFilter::processInput(const size_t /*index*/)
-{
-	this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess();
-	return true;
-}
-
-bool CBoxAlgorithmTemporalFilter::process()
-{
-	Kernel::IBoxIO& boxContext = this->getDynamicBoxContext();
-	size_t j;
-
-	for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i)
-	{
-		m_decoder.decode(i);
-
-		const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0);
-		const size_t nSample  = m_decoder.getOutputMatrix()->getDimensionSize(1);
-
-		if (m_decoder.isHeaderReceived())
-		{
-			if (m_type != EFilterType::LowPass) // verification for high-pass, band-pass and band-stop filters
-			{
-				OV_ERROR_UNLESS_KRF(m_lowCut <= m_decoder.getOutputSamplingRate()*.5,
-									"Invalid low cut-off frequency [" << m_lowCut << "] (expected value must meet nyquist criteria for sampling rate "
-									<< m_decoder.getOutputSamplingRate() << ")", Kernel::ErrorType::BadConfig);
-			}
-			if (m_type != EFilterType::HighPass) // verification for low-pass, band-pass and band-stop filters
-			{
-				OV_ERROR_UNLESS_KRF(m_highCut <= m_decoder.getOutputSamplingRate()*.5,
-									"Invalid high cut-off frequency [" << m_highCut << "] (expected value must meet nyquist criteria for sampling rate "
-									<< m_decoder.getOutputSamplingRate() << ")", Kernel::ErrorType::BadConfig);
-			}
-
-			m_filters.clear();
-			//m_vFilter2.clear();
-
-			fpGetParameters_t fpGetParameters;
-			fpCreateFilter_t fpCreateFilter;
-			if (m_method == EFilterMethod::Butterworth) // Butterworth
-			{
-				fpGetParameters = getButterworthParameters;
-				fpCreateFilter  = createButterworthFilter;
-			}
-			else if (m_method == EFilterMethod::Chebyshev) // Chebyshev
-			{
-				OV_ERROR_KRF("Chebyshev method not implemented", Kernel::ErrorType::NotImplemented);
-				//fpGetParameters = getChebishevParameters;
-				//fpCreateFilter = createChebishevFilter;
-			}
-			else if (m_method == EFilterMethod::YuleWalker) // YuleWalker
-			{
-				OV_ERROR_KRF("YuleWalker method not implemented", Kernel::ErrorType::NotImplemented);
-				//fpGetParameters = getYuleWalkerParameters;
-				//fpCreateFilter = createYuleWalkerFilter;
-			}
-			else { OV_ERROR_KRF("Invalid filter method", Kernel::ErrorType::BadSetting); }
-
-			if (m_type == EFilterType::HighPass)
-			{
-				this->getLogManager() << Kernel::LogLevel_Debug << "Low cut frequency of the High pass filter : " << m_lowCut << "Hz\n";
-			}
-			if (m_type == EFilterType::LowPass)
-			{
-				this->getLogManager() << Kernel::LogLevel_Debug << "High cut frequency of the Low pass filter : " << m_highCut << "Hz\n";
-			}
-
-			const size_t frequency = m_decoder.getOutputSamplingRate();
-			const size_t nSmooth   = 100 * frequency;
-			Dsp::Params params;
-			(*fpGetParameters)(params, frequency, m_type, m_order, m_lowCut, m_highCut, m_ripple);
-
-			for (j = 0; j < nChannel; ++j)
-			{
-				std::shared_ptr<Dsp::Filter> filter = (*fpCreateFilter)(m_type, nSmooth);
-				filter->setParams(params);
-				m_filters.push_back(filter);
-				/*std::shared_ptr < Dsp::Filter > filter2=(*fpCreateFilter)(m_type, nSmoothingSample);
-				l_pFilter2->setParams(filterParameters);
-				m_vFilter2.push_back(filter2);*/
-			}
-
-			m_encoder.encodeHeader();
-		}
-		if (m_decoder.isBufferReceived())
-		{
-			double* buffer = m_decoder.getOutputMatrix()->getBuffer();
-
-			//"french cook" to reduce transient for bandpass and highpass filters
-			if (m_firstSamples.empty())
-			{
-				m_firstSamples.resize(nChannel, 0); //initialization to 0
-				if (m_type == EFilterType::BandPass || m_type == EFilterType::HighPass)
-				{
-					for (j = 0; j < nChannel; ++j)
-					{
-						m_firstSamples[j] = buffer[j * nSample]; //first value of the signal = DC offset
-					}
-				}
-			}
-
-			for (j = 0; j < nChannel; ++j)
-			{
-				//for bandpass and highpass filters, suppression of the value m_firstSamples = DC offset
-				//otherwise, no treatment, since m_firstSamples = 0
-				for (size_t k = 0; k < nSample; ++k) { buffer[k] -= m_firstSamples[j]; }
-
-				if (m_filters[j]) { m_filters[j]->process(int(nSample), &buffer); }
-				buffer += nSample;
-			}
-			m_encoder.encodeBuffer();
-		}
-		if (m_decoder.isEndReceived()) { m_encoder.encodeEnd(); }
-		boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i));
-	}
-
-	return true;
-}
-
-/*
-//zero-phase filtering, with two different filters
-void CBoxAlgorithmTemporalFilter::filtfilt2(std::shared_ptr < Dsp::Filter > pFilter1, std::shared_ptr < Dsp::Filter > pFilter2, size_t SampleCount, double* buffer)
-{
-	size_t j;
-
-	//1rst filtering
-	pFilter1->process(SampleCount, &buffer);
-
-	//reversal of the buffer
-	for (j=0; j<SampleCount/2; ++j)
-	{
-		double temporalVar = buffer[j];
-		buffer[j] = buffer[SampleCount-1-j];
-		buffer[SampleCount-1-j] = temporalVar;
-	}
-
-	//2nd filtering
-	pFilter2->process(SampleCount, &buffer);
-
-	//reversal of the buffer
-	for (j=0; j<SampleCount/2; ++j)
-	{
-		double temporalVar = buffer[j];
-		buffer[j] = buffer[SampleCount-1-j];
-		buffer[SampleCount-1-j] = temporalVar;
-	}
-}
-
-//zero-phase filtering, with mirror signals on the edges
-void CBoxAlgorithmTemporalFilter::filtfilt2mirror (Dsp::Filter* pFilter1, Dsp::Filter* pFilter2, size_t SampleCount, double* buffer)
-{
-	size_t j;
-
-	//construction of mirror signals
-	size_t transientLength = std::min( 3*(pFilter1->getPoleZeros().size()-1), SampleCount/2 );
-	std::vector<double> tmp;
-	tmp.resize(SampleCount+2*transientLength);
-
-	for (j=0; j<transientLength; ++j)
-	{
-		tmp[j] = 2*buffer[0]-buffer[transientLength-j];
-	}
-	for (j=0; j<SampleCount; ++j)
-	{
-		tmp[j+transientLength] = buffer[j];
-	}
-	for (j=0; j<transientLength; ++j)
-	{
-		tmp[j+transientLength+SampleCount] = 2*buffer[SampleCount-1]-buffer[SampleCount-1-j-1];
-	}
-	SampleCount+=2*transientLength;
-
-	double* res;
-	res = &tmp[0];
-
-	//zero-phase filtering
-	filtfilt2 (pFilter1, pFilter2, SampleCount, res);
-
-	//central part of the buffer
-	for (j=0; j<SampleCount-2*transientLength; ++j)
-	{
-		buffer[j] = res[j+transientLength];
-	}
-}
-*/
-
-}  // namespace SignalProcessing
-}  // namespace Plugins
-}  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.h b/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.h
deleted file mode 100644
index 6957cfd19a60675767fffced358e60d43859707b..0000000000000000000000000000000000000000
--- a/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#pragma once
-
-#include "../../ovp_defines.h"
-#include <openvibe/ov_all.h>
-#include <toolkit/ovtk_all.h>
-
-#include <memory>
-#include <dsp-filters/Dsp.h>
-
-namespace OpenViBE {
-namespace Plugins {
-namespace SignalProcessing {
-class CBoxAlgorithmTemporalFilter final : public Toolkit::TBoxAlgorithm<IBoxAlgorithm>
-{
-public:
-	void release() override { delete this; }
-	bool initialize() override;
-	bool uninitialize() override;
-	bool processInput(const size_t index) override;
-	bool process() override;
-
-	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_TemporalFilter)
-
-protected:
-
-	Toolkit::TSignalDecoder<CBoxAlgorithmTemporalFilter> m_decoder;
-	Toolkit::TSignalEncoder<CBoxAlgorithmTemporalFilter> m_encoder;
-
-
-	EFilterMethod m_method = EFilterMethod::Butterworth;
-	EFilterType m_type     = EFilterType::BandPass;
-	size_t m_order         = 0;
-
-	double m_lowCut  = 0;
-	double m_highCut = 0;
-	double m_ripple  = 0; // for Chebyshev
-
-	std::vector<std::shared_ptr<Dsp::Filter>> m_filters;
-	//std::vector < std::shared_ptr < Dsp::Filter > > m_filters;
-
-	std::vector<double> m_firstSamples;
-};
-
-class CBoxAlgorithmTemporalFilterDesc final : public IBoxAlgorithmDesc
-{
-public:
-	void release() override { }
-	CString getName() const override { return CString("Temporal Filter"); }
-	CString getAuthorName() const override { return CString("Yann Renard & Laurent Bonnet"); }
-	CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); }
-
-	CString getShortDescription() const override { return CString("Temporal filtering based on various one-way IIR filter designs"); }
-
-	CString getDetailedDescription() const override
-	{
-		return CString("Applies a temporal filter, based on various one-way IIR filter designs, to the input stream.");
-	}
-
-	CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); }
-	CString getVersion() const override { return CString("1.1"); }
-	CString getSoftwareComponent() const override { return CString("openvibe-sdk"); }
-	CString getAddedSoftwareVersion() const override { return CString("0.0.0"); }
-	CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); }
-	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TemporalFilter; }
-	IPluginObject* create() override { return new CBoxAlgorithmTemporalFilter; }
-
-	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
-	{
-		prototype.addInput("Input signal", OV_TypeId_Signal);
-		prototype.addOutput("Output signal", OV_TypeId_Signal);
-		prototype.addSetting("Filter Method", OVP_TypeId_FilterMethod, "Butterworth");
-		prototype.addSetting("Filter Type", OVP_TypeId_FilterType, "Band Pass");
-		prototype.addSetting("Filter Order", OV_TypeId_Integer, "4");
-		prototype.addSetting("Low Cut-off Frequency (Hz)", OV_TypeId_Float, "1");
-		prototype.addSetting("High Cut-off Frequency (Hz)", OV_TypeId_Float, "40");
-		prototype.addSetting("Band Pass Ripple (dB)", OV_TypeId_Float, "0.5");
-
-		return true;
-	}
-
-	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TemporalFilterDesc)
-};
-}  // namespace SignalProcessing
-}  // namespace Plugins
-}  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h
index 46c683b5f7533ef844b68998f273ae53e6b6f211..b2e81a7cee62b9c0cb10562c3402f7bb202db745 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 
 #include <string>
diff --git a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h
index 9d7396a7683daef7855f4cd3032268f8b8fbfd5e..ecce22f1c188e6179cf5d2fd1fb94bd2d8bb58b0 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 #include "../ovpCSimpleDSP/ovpCEquationParser.h"
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h
index 970caa7cebf0141baf7ec3b29815437f41533920..b80401d5d003e9fcb3d64b946724e109fc45fe5d 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 
 #include <vector>
diff --git a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h
deleted file mode 100755
index 9fd49ff5732d6d96bb30ae1e2b6319df819c8f53..0000000000000000000000000000000000000000
--- a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#pragma once
-
-#include "../ovp_defines.h"
-#include <openvibe/ov_all.h>
-#include <toolkit/ovtk_all.h>
-
-#include <Eigen/Eigen>
-#include <array>
-
-typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatrixXdRowMajor;
-
-namespace OpenViBE {
-namespace Plugins {
-namespace SignalProcessing {
-class CBoxAlgorithmXDAWNTrainer final : public Toolkit::TBoxAlgorithm<IBoxAlgorithm>
-{
-public:
-	CBoxAlgorithmXDAWNTrainer();
-	void release() override { delete this; }
-	bool initialize() override;
-	bool uninitialize() override;
-	bool processInput(const size_t index) override;
-	bool process() override;
-
-	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer)
-
-protected:
-
-	Toolkit::TStimulationDecoder<CBoxAlgorithmXDAWNTrainer> m_stimDecoder;
-	std::array<Toolkit::TSignalDecoder<CBoxAlgorithmXDAWNTrainer>, 2> m_signalDecoder;
-	Toolkit::TStimulationEncoder<CBoxAlgorithmXDAWNTrainer> m_stimEncoder;
-
-	uint64_t m_trainStimulationID = 0;
-	CString m_filterFilename;
-	size_t m_filterDim     = 0;
-	bool m_saveAsBoxConfig = false;
-};
-
-class CBoxAlgorithmXDAWNTrainerDesc final : public IBoxAlgorithmDesc
-{
-public:
-	void release() override {}
-	CString getName() const override { return CString("xDAWN Trainer"); }
-	CString getAuthorName() const override { return CString("Yann Renard"); }
-	CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); }
-
-	CString getShortDescription() const override { return CString("Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300"); }
-
-	CString getDetailedDescription() const override
-	{
-		return CString("Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300");
-	}
-
-	CString getCategory() const override { return CString("Signal processing/Spatial Filtering"); }
-	CString getVersion() const override { return CString("1.0"); }
-	CString getSoftwareComponent() const override { return CString("openvibe-sdk"); }
-	CString getAddedSoftwareVersion() const override { return CString("0.0.0"); }
-	CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); }
-	CString getStockItemName() const override { return CString("gtk-zoom-100"); }
-	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer; }
-	IPluginObject* create() override { return new CBoxAlgorithmXDAWNTrainer; }
-
-	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
-	{
-		prototype.addInput("Stimulations", OV_TypeId_Stimulations);
-		prototype.addInput("Session signal", OV_TypeId_Signal);
-		prototype.addInput("Evoked potential epochs", OV_TypeId_Signal);
-
-		prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations);
-
-		prototype.addSetting("Train stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Train");
-		prototype.addSetting("Spatial filter configuration", OV_TypeId_Filename, "");
-		prototype.addSetting("Filter dimension", OV_TypeId_Integer, "4");
-		prototype.addSetting("Save as box config", OV_TypeId_Boolean, "true");
-		return true;
-	}
-
-	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainerDesc)
-};
-}  // namespace SignalProcessing
-}  // namespace Plugins
-}  // namespace OpenViBE
diff --git a/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h b/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h
index 078776717f12d638b7706c6bd3924e29d0b714c2..eb4e26f61ad06a517b9a5b56b490250e9e8422b2 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 #include "ovCResampler.h"
diff --git a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h
index a2247f5dff2e157f564c54aa8b956a2491ec92a4..b1c9c4a254bf5695da12f80197af4b35523988e0 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 #include <wavelib/header/wavelib.h>
 #include <array>
diff --git a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h
index 0c13572e1b5271d0584ce1d8655a7cd9436f319d..e26d0fc6712b54283f1293a0c9bb0a7b933e7264 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h
index bba4c63987de1003fed4f309de0c2c52c4330530..ee0b1d9aadf8f7ec588a3fb9d3172db1324fba04 100755
--- a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <toolkit/ovtk_all.h>
 
 namespace OpenViBE {
diff --git a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h
index fda88730562ac1c225e0275ad962ecb3f2ab148f..e2b0cd2a77b6a4a1d157144b0ee33229480c6ce7 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../../ovp_defines.h"
+#include "defines.hpp"
 #include <openvibe/ov_all.h>
 #include <toolkit/ovtk_all.h>
 #include <vector>
diff --git a/plugins/processing/signal-processing/src/ovp_defines.h b/plugins/processing/signal-processing/src/defines.hpp
similarity index 84%
rename from plugins/processing/signal-processing/src/ovp_defines.h
rename to plugins/processing/signal-processing/src/defines.hpp
index 030a25299578e644451c830dde95982db283b3c5..95e0bd7d910046693c4b42ba39ce9460b01195b8 100644
--- a/plugins/processing/signal-processing/src/ovp_defines.h
+++ b/plugins/processing/signal-processing/src/defines.hpp
@@ -1,4 +1,5 @@
 #pragma once
+#include <string>
 
 // Boxes
 //---------------------------------------------------------------------------------------------------
@@ -65,24 +66,58 @@
 #define OVP_TypeId_SelectionMethod								OpenViBE::CIdentifier(0x3BCF9E67, 0x0C23994D)
 #define OVP_TypeId_MatchMethod									OpenViBE::CIdentifier(0x666F25E9, 0x3E5738D6)
 #define OVP_TypeId_WindowMethod									OpenViBE::CIdentifier(0x0A430FE4, 0x4F318280)
-#include <string>
 
-enum class EFilterMethod { Butterworth, Chebyshev, YuleWalker };
 
+//enum class EFilterMethod { Butterworth, Chebyshev, YuleWalker };
+
+//--------------------------------------------------------------------------------
 enum class EFilterType { LowPass, BandPass, HighPass, BandStop };
 
+/// <summary>	Convert filter type to string. </summary>
+/// <param name="type">	The Filter type. </param>
+/// <returns>	<c>std::string</c> </returns>
+inline std::string toString(const EFilterType type)
+{
+	switch (type) {
+		case EFilterType::BandPass: return "Band Pass";
+		case EFilterType::BandStop: return "Band Stop";
+		case EFilterType::HighPass: return "High Pass";
+		case EFilterType::LowPass: return "Low Pass";
+		default: return "Invalid Filter Type";
+	}
+}
+
+/// <summary>	Convert string to filter type. </summary>
+/// <param name="type">	The Filter type. </param>
+/// <returns>	<see cref="EFilterType"/> </returns>
+inline EFilterType StringToFilterType(const std::string& type)
+{
+	if (type == "Band Pass") { return EFilterType::BandPass; }
+	if (type == "Band Stop") { return EFilterType::BandStop; }
+	if (type == "High Pass") { return EFilterType::HighPass; }
+	if (type == "Low Pass") { return EFilterType::LowPass; }
+	return EFilterType::BandPass;
+}
+
+//--------------------------------------------------------------------------------
 enum class EUpdateMethod { ChunkAverage, Incremental };
 
+//--------------------------------------------------------------------------------
 enum class EEpochAverageMethod { Moving, MovingImmediate, Block, Cumulative };
 
+//--------------------------------------------------------------------------------
 enum class EContinuousWaveletType { Morlet, Paul, DOG };
 
+//--------------------------------------------------------------------------------
 enum class ECropMethod { Min, Max, MinMax };
 
+//--------------------------------------------------------------------------------
 enum class ESelectionMethod { Select, Reject, Select_EEG };
 
+//--------------------------------------------------------------------------------
 enum class EMatchMethod { Name, Index, Smart };
 
+//--------------------------------------------------------------------------------
 enum class EWindowMethod { None, Hamming, Hanning, Hann, Blackman, Triangular, SquareRoot };
 
 // Global defines
diff --git a/plugins/processing/signal-processing/src/ovp_main.cpp b/plugins/processing/signal-processing/src/main.cpp
old mode 100755
new mode 100644
similarity index 88%
rename from plugins/processing/signal-processing/src/ovp_main.cpp
rename to plugins/processing/signal-processing/src/main.cpp
index e46f52144ba748744848805db6f5ed45f0188c87..087ddd63dd7826fdfd58708bfb1afe252fe7cc85
--- a/plugins/processing/signal-processing/src/ovp_main.cpp
+++ b/plugins/processing/signal-processing/src/main.cpp
@@ -12,7 +12,7 @@
 #include "box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h"
 #include "box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h"
 #include "box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h"
-#include "box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.h"
+#include "box-algorithms/filters/CBoxAlgorithmTemporalFilter.hpp"
 
 #include "box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h"
 #include "algorithms/basic/ovpCAlgorithmOnlineCovariance.h"
@@ -27,7 +27,7 @@
 #include "box-algorithms/ovpCBoxAlgorithmSimpleDSP.h"
 #include "box-algorithms/ovpCBoxAlgorithmSignalAverage.h"
 #include "box-algorithms/ovpCBoxAlgorithmWindowing.h"
-#include "box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h"
+#include "box-algorithms/CBoxXDAWNTrainer.hpp"
 
 namespace OpenViBE {
 namespace Plugins {
@@ -58,21 +58,16 @@ OVP_Declare_Begin()
 
 
 	// Temporal filter
-	context.getTypeManager().registerEnumerationType(OVP_TypeId_FilterMethod, "Filter method");
-	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Butterworth", size_t(EFilterMethod::Butterworth));
-	// context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Chebishev", size_t(EFilterMethod::Chebyshev));
-	// context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Yule Walked", size_t(EFilterMethod::YuleWalker));
-
 	context.getTypeManager().registerEnumerationType(OVP_TypeId_FilterType, "Filter type");
-	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Low Pass", size_t(EFilterType::LowPass));
-	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "High Pass", size_t(EFilterType::HighPass));
-	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Band Pass", size_t(EFilterType::BandPass));
-	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Band Stop", size_t(EFilterType::BandStop));
+	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, toString(EFilterType::BandPass).c_str(), size_t(EFilterType::BandPass));
+	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, toString(EFilterType::BandStop).c_str(), size_t(EFilterType::BandStop));
+	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, toString(EFilterType::HighPass).c_str(), size_t(EFilterType::HighPass));
+	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, toString(EFilterType::LowPass).c_str(), size_t(EFilterType::LowPass));
 
 	OVP_Declare_New(CAlgorithmMatrixAverageDesc)
 
-	OVP_Declare_New(CBoxAlgorithmIdentityDesc);
-	OVP_Declare_New(CBoxAlgorithmTimeBasedEpochingDesc);
+	OVP_Declare_New(CBoxAlgorithmIdentityDesc)
+	OVP_Declare_New(CBoxAlgorithmTimeBasedEpochingDesc)
 	OVP_Declare_New(CBoxAlgorithmChannelRenameDesc)
 	OVP_Declare_New(CBoxAlgorithmChannelSelectorDesc)
 	OVP_Declare_New(CBoxAlgorithmReferenceChannelDesc)
@@ -125,7 +120,7 @@ OVP_Declare_Begin()
 	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Triangular", size_t(EWindowMethod::Triangular));
 	context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Square root", size_t(EWindowMethod::SquareRoot));
 
-	OVP_Declare_New(CBoxAlgorithmXDAWNTrainerDesc);
+	OVP_Declare_New(CBoxXDAWNTrainerDesc);
 
 OVP_Declare_End()
 
diff --git a/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h b/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h
index 0cba7d4afe65afec2f2e3c336f8dbee5c892d8ca..be17f1285954fade77200abbb33f962302be9c8b 100644
--- a/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h
+++ b/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../ovp_defines.h"
+#include "defines.hpp"
 
 #include "ovpCEquationParserGrammar.h"
 #include "ovpCEquationParser.h"
diff --git a/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h b/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h
index 5735641a05343ed3db8899ed0f4053b5b19cb8ba..82ffa87680b72b9ee3bea0894ffae92f85428808 100644
--- a/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h
+++ b/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../ovp_defines.h"
+#include "defines.hpp"
 
 #include "ovpCEquationParserGrammar.h"
 #include "ovpCAbstractTree.h"
diff --git a/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h b/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h
index 29ba580f83d3df005e67578df5a36a7aea46acea..87365c410e57cc6cba5410b3c10cf686af99400e 100644
--- a/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h
+++ b/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "../ovp_defines.h"
+#include "defines.hpp"
 
 #include <toolkit/ovtk_all.h>
 
diff --git a/plugins/processing/stimulation/CMakeLists.txt b/plugins/processing/stimulation/CMakeLists.txt
index ce940c5d2d253e536e79e0e2d6a608a41ced14bb..42fead7179da5bfb758a30d61cd7776390696e83 100755
--- a/plugins/processing/stimulation/CMakeLists.txt
+++ b/plugins/processing/stimulation/CMakeLists.txt
@@ -11,7 +11,9 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-toolkit
                       openvibe-module-ebml
                       openvibe-module-system
-                      openvibe-module-fs)
+                      openvibe-module-fs
+                      Boost::boost
+)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
     VERSION ${PROJECT_VERSION}
@@ -21,8 +23,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
     
 add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 
-include("FindThirdPartyBoost")
-
 # ---------------------------------
 # Finds standard library winmm
 # Adds library to target
@@ -51,3 +51,5 @@ install(TARGETS ${PROJECT_NAME}
         RUNTIME DESTINATION ${DIST_BINDIR}
         LIBRARY DESTINATION ${DIST_LIBDIR}
         ARCHIVE DESTINATION ${DIST_LIBDIR})
+
+install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials)
diff --git a/plugins/processing/stimulation/box-tutorials/stimulation-multiplexer.xml b/plugins/processing/stimulation/box-tutorials/stimulation-multiplexer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e467c22356dc4bd81dd01cc435da60d11523e746
--- /dev/null
+++ b/plugins/processing/stimulation/box-tutorials/stimulation-multiplexer.xml
@@ -0,0 +1,363 @@
+<OpenViBE-Scenario>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
+	<Settings></Settings>
+	<Inputs></Inputs>
+	<Outputs></Outputs>
+	<Boxes>
+		<Box>
+			<Identifier>(0x000046ff, 0x00004b04)</Identifier>
+			<Name>Clock stimulator</Name>
+			<AlgorithmClassIdentifier>(0x4f756d3f, 0x29ff0b96)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Generated stimulations</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Interstimulation interval (in sec)</Name>
+					<DefaultValue>1.0</DefaultValue>
+					<Value>1</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
+					<Name>Stimulation</Name>
+					<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
+					<Value>OVTK_StimulationId_Label_00</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>480</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>912</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x27b3ee3c, 0xc50527e6)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000046ff, 0x00004b05)</Identifier>
+			<Name>Clock stimulator</Name>
+			<AlgorithmClassIdentifier>(0x4f756d3f, 0x29ff0b96)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Generated stimulations</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
+					<Name>Interstimulation interval (in sec)</Name>
+					<DefaultValue>1.0</DefaultValue>
+					<Value>2</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
+					<Name>Stimulation</Name>
+					<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
+					<Value>OVTK_StimulationId_Label_01</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>480</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1072</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x27b3ee3c, 0xc50527e6)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000050a2, 0x00006fea)</Identifier>
+			<Name>Player Controller</Name>
+			<AlgorithmClassIdentifier>(0x5f426dce, 0x08456e13)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
+					<Name>Stimulation name</Name>
+					<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
+					<Value>OVTK_StimulationId_Label_00</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0xcc14d8d6, 0xf27ecb73)</TypeIdentifier>
+					<Name>Action to perform</Name>
+					<DefaultValue>Pause</DefaultValue>
+					<Value>Stop</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1216</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x568d148e, 0x650792b3)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00005426, 0x00000594)</Identifier>
+			<Name>Stimulation multiplexer</Name>
+			<AlgorithmClassIdentifier>(0x07db4efa, 0x472b0938)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Input stimulations 1</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Input stimulations 2</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Multiplexed stimulations</Name>
+				</Output>
+			</Outputs>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>560</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>992</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xe7af82cd, 0x14edb4d4)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x00006d4d, 0x00002b7a)</Identifier>
+			<Name>Timeout</Name>
+			<AlgorithmClassIdentifier>(0x24fcd292, 0x5c8f6aa8)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x544a003e, 0x6dcba5f6)</TypeIdentifier>
+					<Name>Input Stream</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Output Stimulations</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Timeout delay</Name>
+					<DefaultValue>5</DefaultValue>
+					<Value>3</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
+					<Name>Output Stimulation</Name>
+					<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
+					<Value>OVTK_StimulationId_Label_00</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>480</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>1216</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x1eaee00e, 0xdb05d34e)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000074d1, 0x00004cc9)</Identifier>
+			<Name>Stimulation listener</Name>
+			<AlgorithmClassIdentifier>(0x65731e1d, 0x47de5276)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulation stream 1</Name>
+				</Input>
+			</Inputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0xa88b3667, 0x0871638c)</TypeIdentifier>
+					<Name>Log level to use</Name>
+					<DefaultValue>Information</DefaultValue>
+					<Value>Information</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>624</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>992</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xf451ad91, 0x14c75f86)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xfba64161, 0x65304e21)</Identifier>
+					<Value></Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+	</Boxes>
+	<Links>
+		<Link>
+			<Identifier>(0x00001a0a, 0x00000328)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00005426, 0x00000594)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000074d1, 0x00004cc9)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00005109, 0x00004361)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x00006d4d, 0x00002b7a)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000050a2, 0x00006fea)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00006795, 0x000051bd)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x000046ff, 0x00004b05)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00005426, 0x00000594)</BoxIdentifier>
+				<BoxInputIndex>1</BoxInputIndex>
+			</Target>
+		</Link>
+		<Link>
+			<Identifier>(0x00006f24, 0x0000593d)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x000046ff, 0x00004b04)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x00005426, 0x00000594)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
+		</Link>
+	</Links>
+	<Comments></Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x0000659a, 0x00007c80)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000529f, 0x00003113)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006575, 0x0000318a)","index":0,"name":"Default tab","parentIdentifier":"(0x0000529f, 0x00003113)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004845, 0x00002f1f)","index":0,"name":"Empty","parentIdentifier":"(0x00006575, 0x0000318a)","type":0}]</Data>
+		</Entry>
+	</Metadata>
+</OpenViBE-Scenario>
\ No newline at end of file
diff --git a/plugins/processing/stimulation/src/box-algorithms/CBoxStimulationMultiplexer.cpp b/plugins/processing/stimulation/src/box-algorithms/CBoxStimulationMultiplexer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9cbdea1d8ac00bad9bf6cdd4715aea8d13a0a839
--- /dev/null
+++ b/plugins/processing/stimulation/src/box-algorithms/CBoxStimulationMultiplexer.cpp
@@ -0,0 +1,124 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CBoxStimulationMultiplexer.hpp
+/// \brief Class of the box that merges several stimulation streams into one.
+/// \author Yann Renard (INRIA/IRISA).
+/// \version 1.1.
+/// \date 19/07/2013
+/// \copyright (C) 2022 Inria
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#include "CBoxStimulationMultiplexer.hpp"
+
+namespace OpenViBE {
+namespace Plugins {
+namespace Stimulation {
+
+
+bool CBoxStimulationMultiplexer::initialize()
+{
+	const size_t nInput = this->getStaticBoxContext().getInputCount();
+
+	m_decoders.resize(nInput);
+	size_t index = 0;
+	for (auto& stimulationDecoder : m_decoders) {
+		stimulationDecoder.initialize(*this, index);
+		index += 1;
+	}
+
+	m_encoder.initialize(*this, 0);
+
+	m_decoderEndTimes = std::vector<uint64_t>(nInput, 0ULL);
+
+	m_lastStartTime   = 0;
+	m_lastEndTime     = 0;
+	m_wasHeaderSent   = false;
+
+	return true;
+}
+
+bool CBoxStimulationMultiplexer::uninitialize()
+{
+	for (auto& decoder : m_decoders) { decoder.uninitialize(); }
+	m_encoder.uninitialize();
+	return true;
+}
+
+bool CBoxStimulationMultiplexer::processInput(const size_t /*index*/)
+{
+	this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess();
+	return true;
+}
+
+bool CBoxStimulationMultiplexer::process()
+{
+	Kernel::IBoxIO& boxCtxt = this->getDynamicBoxContext();
+	const size_t nInput     = this->getStaticBoxContext().getInputCount();
+
+	if (!m_wasHeaderSent) {
+		m_encoder.encodeHeader();
+		boxCtxt.markOutputAsReadyToSend(0, m_lastEndTime, m_lastEndTime);
+		m_wasHeaderSent = true;
+	}
+
+	uint64_t earliestReceivedEndTime = 0xffffffffffffffffULL;
+
+	for (size_t i = 0; i < nInput; ++i) {
+		for (size_t chunk = 0; chunk < boxCtxt.getInputChunkCount(i); ++chunk) {
+			m_decoders[i].decode(chunk);
+
+			if (m_decoders[i].isBufferReceived()) {
+				for (size_t stim = 0; stim < m_decoders[i].getOutputStimulationSet()->size(); ++stim) {
+					m_stimulations.insert(std::make_pair(m_decoders[i].getOutputStimulationSet()->getDate(stim),
+														 std::make_tuple(
+															 m_decoders[i].getOutputStimulationSet()->getId(stim),
+															 m_decoders[i].getOutputStimulationSet()->getDate(stim),
+															 m_decoders[i].getOutputStimulationSet()->getDuration(stim))));
+				}
+			}
+
+			m_decoderEndTimes[i] = boxCtxt.getInputChunkEndTime(i, chunk);
+		}
+
+		if (earliestReceivedEndTime > m_decoderEndTimes[i]) { earliestReceivedEndTime = m_decoderEndTimes[i]; }
+	}
+
+	if (earliestReceivedEndTime >= m_lastEndTime) {
+		m_encoder.getInputStimulationSet()->clear();
+
+		for (auto stim = m_stimulations.begin(); stim != m_stimulations.end();) {
+			if (stim->first <= earliestReceivedEndTime) {
+				m_encoder.getInputStimulationSet()->push_back(std::get<0>(stim->second), std::get<1>(stim->second), std::get<2>(stim->second));
+				stim = m_stimulations.erase(stim);
+			}
+			else { ++stim; }
+		}
+
+		m_encoder.encodeBuffer();
+
+		boxCtxt.markOutputAsReadyToSend(0, m_lastEndTime, earliestReceivedEndTime);
+
+		m_lastStartTime = m_lastEndTime;
+		m_lastEndTime   = earliestReceivedEndTime;
+	}
+
+	return true;
+}
+
+}  // namespace Stimulation
+}  // namespace Plugins
+}  // namespace OpenViBE
diff --git a/plugins/processing/stimulation/src/box-algorithms/CBoxStimulationMultiplexer.hpp b/plugins/processing/stimulation/src/box-algorithms/CBoxStimulationMultiplexer.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..2b4c8d79b3b8b17296be8a00fd0facc2edb371ad
--- /dev/null
+++ b/plugins/processing/stimulation/src/box-algorithms/CBoxStimulationMultiplexer.hpp
@@ -0,0 +1,130 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CBoxStimulationMultiplexer.hpp
+/// \brief Class of the box that merges several stimulation streams into one.
+/// \author Yann Renard (INRIA/IRISA).
+/// \version 1.1.
+/// \date 19/07/2013
+/// \copyright (C) 2022 Inria
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include "../ovp_defines.h"
+#include <openvibe/ov_all.h>
+#include <toolkit/ovtk_all.h>
+#include <vector>
+#include <map>
+
+namespace OpenViBE {
+namespace Plugins {
+namespace Stimulation {
+
+/// <summary> The class CBoxStimulationMultiplexer describes the box that merges several stimulation streams into one. </summary>
+class CBoxStimulationMultiplexer final : public Toolkit::TBoxAlgorithm<IBoxAlgorithm>
+{
+public:
+
+	void release() override { delete this; }
+
+	bool initialize() override;
+	bool uninitialize() override;
+	bool processInput(const size_t index) override;
+	bool process() override;
+
+	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_StimulationMultiplexer)
+
+private:
+
+	std::vector<Toolkit::TStimulationDecoder<CBoxStimulationMultiplexer>> m_decoders;
+	Toolkit::TStimulationEncoder<CBoxStimulationMultiplexer> m_encoder;
+
+	std::vector<uint64_t> m_decoderEndTimes;
+
+	uint64_t m_lastStartTime = 0;
+	uint64_t m_lastEndTime   = 0;
+	bool m_wasHeaderSent     = false;
+
+	std::multimap<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> m_stimulations;
+};
+
+/// <summary> Listener of the box Stimulation multiplexer. </summary>
+class CBoxStimulationMultiplexerListener final : public Toolkit::TBoxListener<IBoxListener>
+{
+public:
+
+	bool check(Kernel::IBox& box) const
+	{
+		for (size_t input = 0; input < box.getInputCount(); ++input) {
+			box.setInputName(input, ("Input stimulations " + std::to_string(input + 1)).c_str());
+			box.setInputType(input, OV_TypeId_Stimulations);
+		}
+
+		return true;
+	}
+
+	bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); }
+	bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); }
+
+	_IsDerivedFromClass_Final_(Toolkit::TBoxListener<IBoxListener>, CIdentifier::undefined())
+};
+
+/// <summary> Descriptor of the box Stimulation multiplexer. </summary>
+class CBoxStimulationMultiplexerDesc final : public IBoxAlgorithmDesc
+{
+public:
+
+	void release() override { }
+
+	CString getName() const override { return "Stimulation multiplexer"; }
+	CString getAuthorName() const override { return "Yann Renard"; }
+	CString getAuthorCompanyName() const override { return "INRIA/IRISA"; }
+	CString getShortDescription() const override { return "Merges several stimulation streams into one."; }
+
+	CString getDetailedDescription() const override
+	{
+		return
+				"The stimulations are ordered according to their start date. Thus each time all the input have chunks covering a period of time, a new output chunk is sent. This box may eventually produce output chunk reflecting a different duration depending on the inputs.";
+	}
+
+	CString getCategory() const override { return "Streaming"; }
+	CString getVersion() const override { return "1.1"; }
+	CString getStockItemName() const override { return "gtk-sort-ascending"; }
+	CString getSoftwareComponent() const override { return "openvibe-sdk"; }
+	CString getAddedSoftwareVersion() const override { return "0.0.0"; }
+	CString getUpdatedSoftwareVersion() const override { return "0.0.0"; }
+
+	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationMultiplexer; }
+	IPluginObject* create() override { return new CBoxStimulationMultiplexer; }
+	IBoxListener* createBoxListener() const override { return new CBoxStimulationMultiplexerListener; }
+	void releaseBoxListener(IBoxListener* listener) const override { delete listener; }
+
+	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
+	{
+		prototype.addInput("Input stimulations 1", OV_TypeId_Stimulations);
+		prototype.addInput("Input stimulations 2", OV_TypeId_Stimulations);
+		prototype.addOutput("Multiplexed stimulations", OV_TypeId_Stimulations);
+		prototype.addFlag(Kernel::BoxFlag_CanAddInput);
+		prototype.addInputSupport(OV_TypeId_Stimulations);
+		return true;
+	}
+
+	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationMultiplexerDesc)
+};
+}  // namespace Stimulation
+}  // namespace Plugins
+}  // namespace OpenViBE
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp
index 4364da05dc17838fd8a6f050716c441fff9313a9..72442004f887385e0647f90debc1c1b157542035 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp
@@ -45,13 +45,13 @@ bool CBoxAlgorithmClockStimulator::process()
 	const uint64_t currentTime = getPlayerContext().getCurrentTime();
 
 	CStimulationSet stimulationSet;
-	stimulationSet.setStimulationCount(0);
+	stimulationSet.resize(0);
 
 	while (CTime(double(m_nSentStimulation + 1) * m_stimulationInterval).time() < currentTime)
 	{
 		m_nSentStimulation += 1;
 		m_lastStimulationDate = CTime(double(m_nSentStimulation) * m_stimulationInterval).time();
-		stimulationSet.appendStimulation(m_stimulationID, m_lastStimulationDate, 0);
+		stimulationSet.push_back(m_stimulationID, m_lastStimulationDate, 0);
 	}
 
 	if (currentTime == 0)
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp
index 57cc2549dd0b590398c97817a156de24a9a1d4f7..bc5b63574b5c3523d6bd3f4b70ddb7ab6b4f45d8 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp
@@ -50,10 +50,10 @@ bool CBoxAlgorithmPlayerController::process()
 		if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { }
 		if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer))
 		{
-			IStimulationSet* stimSet = op_stimulationSet;
-			for (size_t j = 0; j < stimSet->getStimulationCount(); ++j)
+			CStimulationSet* stimSet = op_stimulationSet;
+			for (size_t j = 0; j < stimSet->size(); ++j)
 			{
-				if (stimSet->getStimulationIdentifier(j) == m_stimulationID)
+				if (stimSet->getId(j) == m_stimulationID)
 				{
 					this->getLogManager() << Kernel::LogLevel_Trace << "Received stimulation ["
 							<< this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, m_stimulationID) << "] causing action ["
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h
index 906dd787742a798d34e71160c72da05aa009891c..fde5b31ce1207ccf836d3df0256e59e6f28aedf8 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h
@@ -22,7 +22,7 @@ protected:
 
 	Kernel::IAlgorithmProxy* m_decoder = nullptr;
 	Kernel::TParameterHandler<const IMemoryBuffer*> ip_buffer;
-	Kernel::TParameterHandler<IStimulationSet*> op_stimulationSet;
+	Kernel::TParameterHandler<CStimulationSet*> op_stimulationSet;
 
 	uint64_t m_stimulationID = 0;
 	uint64_t m_actionID      = 0;
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.cpp b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.cpp
deleted file mode 100644
index ded4ced7efd62b8716e3a271e478803f168be433..0000000000000000000000000000000000000000
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#include "ovpCBoxAlgorithmStimulationMultiplexer.h"
-
-namespace OpenViBE {
-namespace Plugins {
-namespace Stimulation {
-
-
-bool CBoxAlgorithmStimulationMultiplexer::initialize()
-{
-	const Kernel::IBox& staticBoxContext = this->getStaticBoxContext();
-
-	m_decoders.resize(staticBoxContext.getInputCount());
-	size_t index = 0;
-	for (auto& stimulationDecoder : m_decoders)
-	{
-		stimulationDecoder.initialize(*this, index);
-		index += 1;
-	}
-
-	m_encoder.initialize(*this, 0);
-
-	m_decoderEndTimes = std::vector<uint64_t>(staticBoxContext.getInputCount(), 0ULL);
-
-	m_lastStartTime = 0;
-	m_lastEndTime   = 0;
-	m_wasHeaderSent = false;
-
-	return true;
-}
-
-bool CBoxAlgorithmStimulationMultiplexer::uninitialize()
-{
-	for (auto& stimulationDecoder : m_decoders) { stimulationDecoder.uninitialize(); }
-
-	m_encoder.uninitialize();
-
-	return true;
-}
-
-bool CBoxAlgorithmStimulationMultiplexer::processInput(const size_t /*index*/)
-{
-	this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess();
-	return true;
-}
-
-bool CBoxAlgorithmStimulationMultiplexer::process()
-{
-	const Kernel::IBox& staticBoxContext = this->getStaticBoxContext();
-	Kernel::IBoxIO& dynamicBoxContext    = this->getDynamicBoxContext();
-
-	if (!m_wasHeaderSent)
-	{
-		m_encoder.encodeHeader();
-		dynamicBoxContext.markOutputAsReadyToSend(0, m_lastEndTime, m_lastEndTime);
-		m_wasHeaderSent = true;
-	}
-
-	uint64_t earliestReceivedChunkEndTime = 0xffffffffffffffffULL;
-
-	for (size_t input = 0; input < staticBoxContext.getInputCount(); ++input)
-	{
-		for (size_t chunk = 0; chunk < dynamicBoxContext.getInputChunkCount(input); ++chunk)
-		{
-			m_decoders[input].decode(chunk);
-
-			if (m_decoders[input].isBufferReceived())
-			{
-				for (size_t stimulation = 0; stimulation < m_decoders[input].getOutputStimulationSet()->getStimulationCount(); ++stimulation)
-				{
-					m_stimulations.insert(std::make_pair(m_decoders[input].getOutputStimulationSet()->getStimulationDate(stimulation),
-														 std::make_tuple(
-															 m_decoders[input].getOutputStimulationSet()->getStimulationIdentifier(stimulation),
-															 m_decoders[input].getOutputStimulationSet()->getStimulationDate(stimulation),
-															 m_decoders[input].getOutputStimulationSet()->getStimulationDuration(stimulation))));
-				}
-			}
-
-			m_decoderEndTimes[input] = dynamicBoxContext.getInputChunkEndTime(input, chunk);
-		}
-
-		if (earliestReceivedChunkEndTime > m_decoderEndTimes[input]) { earliestReceivedChunkEndTime = m_decoderEndTimes[input]; }
-	}
-
-	if (earliestReceivedChunkEndTime >= m_lastEndTime)
-	{
-		m_encoder.getInputStimulationSet()->clear();
-
-		for (auto stimulation = m_stimulations.begin(); stimulation != m_stimulations.end();)
-		{
-			if (stimulation->first < earliestReceivedChunkEndTime)
-			{
-				m_encoder.getInputStimulationSet()->appendStimulation(std::get<0>(stimulation->second), std::get<1>(stimulation->second),
-																	  std::get<2>(stimulation->second));
-				stimulation = m_stimulations.erase(stimulation);
-			}
-			else { ++stimulation; }
-		}
-
-		m_encoder.encodeBuffer();
-
-		dynamicBoxContext.markOutputAsReadyToSend(0, m_lastEndTime, earliestReceivedChunkEndTime);
-
-		m_lastStartTime = m_lastEndTime;
-		m_lastEndTime   = earliestReceivedChunkEndTime;
-	}
-
-	return true;
-}
-
-}  // namespace Stimulation
-}  // namespace Plugins
-}  // namespace OpenViBE
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h
deleted file mode 100644
index 921a4624002649791b6cfdb237c65b9dcfc4054b..0000000000000000000000000000000000000000
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h
+++ /dev/null
@@ -1,103 +0,0 @@
-#pragma once
-
-#include "../ovp_defines.h"
-#include <openvibe/ov_all.h>
-#include <toolkit/ovtk_all.h>
-#include <vector>
-#include <map>
-
-namespace OpenViBE {
-namespace Plugins {
-namespace Stimulation {
-class CBoxAlgorithmStimulationMultiplexer final : public Toolkit::TBoxAlgorithm<IBoxAlgorithm>
-{
-public:
-
-	void release() override { delete this; }
-
-	bool initialize() override;
-	bool uninitialize() override;
-	bool processInput(const size_t index) override;
-	bool process() override;
-
-	_IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_StimulationMultiplexer)
-
-private:
-
-	std::vector<Toolkit::TStimulationDecoder<CBoxAlgorithmStimulationMultiplexer>> m_decoders;
-	Toolkit::TStimulationEncoder<CBoxAlgorithmStimulationMultiplexer> m_encoder;
-
-	std::vector<uint64_t> m_decoderEndTimes;
-
-	uint64_t m_lastStartTime = 0;
-	uint64_t m_lastEndTime   = 0;
-	bool m_wasHeaderSent     = false;
-
-	std::multimap<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> m_stimulations;
-};
-
-class CBoxAlgorithmStimulationMultiplexerListener final : public Toolkit::TBoxListener<IBoxListener>
-{
-public:
-
-	bool check(Kernel::IBox& box) const
-	{
-		for (size_t input = 0; input < box.getInputCount(); ++input)
-		{
-			box.setInputName(input, ("Input stimulations " + std::to_string(input + 1)).c_str());
-			box.setInputType(input, OV_TypeId_Stimulations);
-		}
-
-		return true;
-	}
-
-	bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); }
-	bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); }
-
-	_IsDerivedFromClass_Final_(Toolkit::TBoxListener<IBoxListener>, CIdentifier::undefined())
-};
-
-class CBoxAlgorithmStimulationMultiplexerDesc final : public IBoxAlgorithmDesc
-{
-public:
-
-	void release() override { }
-
-	CString getName() const override { return CString("Stimulation multiplexer"); }
-	CString getAuthorName() const override { return CString("Yann Renard"); }
-	CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); }
-	CString getShortDescription() const override { return CString("Merges several stimulation streams into one."); }
-
-	CString getDetailedDescription() const override
-	{
-		return CString(
-			"The stimulations are ordered according to their start date. Thus each time all the input have chunks covering a period of time, a new output chunk is sent. This box may eventually produce output chunk reflecting a different duration depending on the inputs.");
-	}
-
-	CString getCategory() const override { return CString("Streaming"); }
-	CString getVersion() const override { return CString("1.1"); }
-	CString getStockItemName() const override { return CString("gtk-sort-ascending"); }
-	CString getSoftwareComponent() const override { return CString("openvibe-sdk"); }
-	CString getAddedSoftwareVersion() const override { return CString("0.0.0"); }
-	CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); }
-
-	CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationMultiplexer; }
-	IPluginObject* create() override { return new CBoxAlgorithmStimulationMultiplexer; }
-	IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationMultiplexerListener; }
-	void releaseBoxListener(IBoxListener* listener) const override { delete listener; }
-
-	bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
-	{
-		prototype.addInput("Input stimulations 1", OV_TypeId_Stimulations);
-		prototype.addInput("Input stimulations 2", OV_TypeId_Stimulations);
-		prototype.addOutput("Multiplexed stimulations", OV_TypeId_Stimulations);
-		prototype.addFlag(Kernel::BoxFlag_CanAddInput);
-		prototype.addInputSupport(OV_TypeId_Stimulations);
-		return true;
-	}
-
-	_IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationMultiplexerDesc)
-};
-}  // namespace Stimulation
-}  // namespace Plugins
-}  // namespace OpenViBE
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp
index 9438dc128064470b0d329760bf3e043d03270bc3..30d343b4867a5f05a9ef5ec93d73b2e6f2a2b0b2 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp
@@ -70,7 +70,7 @@ bool CBoxAlgorithmStimulationVoter::process()
 {
 	Kernel::IBoxIO& boxContext = this->getDynamicBoxContext();
 
-	Kernel::TParameterHandler<IStimulationSet*> ip_stimSet(m_encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet));
+	Kernel::TParameterHandler<CStimulationSet*> ip_stimSet(m_encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet));
 	Kernel::TParameterHandler<IMemoryBuffer*> op_buffer(m_encoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer));
 	op_buffer = boxContext.getOutputChunk(0);
 
@@ -83,10 +83,10 @@ bool CBoxAlgorithmStimulationVoter::process()
 		if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { }
 		if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer))
 		{
-			for (size_t k = 0; k < op_stimulationSet->getStimulationCount(); ++k)
+			for (size_t k = 0; k < op_stimulationSet->size(); ++k)
 			{
-				uint64_t stimulationId   = op_stimulationSet->getStimulationIdentifier(k);
-				uint64_t stimulationDate = op_stimulationSet->getStimulationDate(k);
+				uint64_t stimulationId   = op_stimulationSet->getId(k);
+				uint64_t stimulationDate = op_stimulationSet->getDate(k);
 				m_latestStimulusDate     = std::max(m_latestStimulusDate, stimulationDate);
 				if (CTime(m_latestStimulusDate - stimulationDate).toSeconds() <= m_timeWindow)
 				{
@@ -192,8 +192,8 @@ bool CBoxAlgorithmStimulationVoter::process()
 
 		this->getLogManager() << Kernel::LogLevel_Debug << "Appending winning stimulus " << resultClassLabel << " at " << timeStamp << " (" << maxVotes << " votes)\n";
 
-		ip_stimSet->setStimulationCount(0);
-		ip_stimSet->appendStimulation(resultClassLabel, timeStamp, 0);
+		ip_stimSet->resize(0);
+		ip_stimSet->push_back(resultClassLabel, timeStamp, 0);
 		m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer);
 		boxContext.markOutputAsReadyToSend(0, m_lastTime, currentTime);
 		m_lastTime = currentTime;
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h
index a9b6f0ef35b1d72fd6d29a91b0d355de601fa156..77bce81e4abf1d397524dbed9ddaf325bb690a11 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h
@@ -35,7 +35,7 @@ private:
 	Kernel::IAlgorithmProxy* m_encoder = nullptr;
 	Kernel::IAlgorithmProxy* m_decoder = nullptr;
 	Kernel::TParameterHandler<const IMemoryBuffer*> ip_buffer;
-	Kernel::TParameterHandler<IStimulationSet*> op_stimulationSet;
+	Kernel::TParameterHandler<CStimulationSet*> op_stimulationSet;
 
 	std::deque<std::pair<uint64_t, uint64_t>> m_oStimulusDeque; // <label,time>
 
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp
index efdd394ea6f70d38dfef95c73c221f92d30c1a55..c67056bb19a945eb2b1d6470aea675efad7eb6cb 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp
@@ -65,14 +65,14 @@ bool CBoxAlgorithmStreamEndDetector::process()
 		m_isHeaderSent = true;
 	}
 
-	IStimulationSet* stimulationSet = m_encoder.getInputStimulationSet();
+	CStimulationSet* stimulationSet = m_encoder.getInputStimulationSet();
 	stimulationSet->clear();
 
 
 	// If the timeout is reached we send the stimulation on the output 0
 	if (m_endState == EEndState::EndReceived)
 	{
-		stimulationSet->appendStimulation(m_stimulationID, m_endDate, 0);
+		stimulationSet->push_back(m_stimulationID, m_endDate, 0);
 		m_endState = EEndState::StimulationSent;
 	}
 
diff --git a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp
index 8a7bf45aa5c9197ef35a3bbe1f558f818f173850..98479baff39b5e7e9aa2b286bae44aa36fa5f9a0 100644
--- a/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp
+++ b/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp
@@ -80,7 +80,7 @@ bool CBoxAlgorithmTimeout::process()
 		m_isHeaderSent = true;
 	}
 
-	IStimulationSet* stimSet = m_encoder.getInputStimulationSet();
+	CStimulationSet* stimSet = m_encoder.getInputStimulationSet();
 	stimSet->clear();
 
 	const uint64_t date = this->getPlayerContext().getCurrentTime();
@@ -88,7 +88,7 @@ bool CBoxAlgorithmTimeout::process()
 	// If the timeout is reached we send the stimulation on the output 0
 	if (m_timeoutState == ETimeoutState::Occurred)
 	{
-		stimSet->appendStimulation(m_stimulationToSend, date, 0);
+		stimSet->push_back(m_stimulationToSend, date, 0);
 		m_timeoutState = ETimeoutState::Sent;
 	}
 
diff --git a/plugins/processing/stimulation/src/ovp_main.cpp b/plugins/processing/stimulation/src/ovp_main.cpp
index 30ae97f6aa3b3a77fc990be384e226107c634b27..1784fc47def6f91ad0d33554f063a381b9eb7776 100644
--- a/plugins/processing/stimulation/src/ovp_main.cpp
+++ b/plugins/processing/stimulation/src/ovp_main.cpp
@@ -3,7 +3,7 @@
 #include "box-algorithms/ovpCBoxAlgorithmClockStimulator.h"
 #include "box-algorithms/ovpCBoxAlgorithmPlayerController.h"
 
-#include "box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h"
+#include "box-algorithms/CBoxStimulationMultiplexer.hpp"
 #include "box-algorithms/ovpCBoxAlgorithmStimulationVoter.h"
 
 #include "box-algorithms/ovpCBoxAlgorithmStreamEndDetector.h"
@@ -22,7 +22,7 @@ OVP_Declare_Begin()
 
 	OVP_Declare_New(CBoxAlgorithmClockStimulatorDesc);
 	OVP_Declare_New(CBoxAlgorithmPlayerControllerDesc);
-	OVP_Declare_New(CBoxAlgorithmStimulationMultiplexerDesc);
+	OVP_Declare_New(CBoxStimulationMultiplexerDesc);
 
 	OVP_Declare_New(CBoxAlgorithmStreamEndDetectorDesc);
 	OVP_Declare_New(CBoxAlgorithmTimeoutDesc);
diff --git a/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp b/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp
index fea72b38e053fe49bafff6c0cb6d9ad92e6ad497..607d34fea9c834d5990ed7e9298185355b016093 100644
--- a/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp
+++ b/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp
@@ -63,20 +63,20 @@ void CStimulationDecoder::processChildData(const void* buffer, const size_t size
 	{
 		if (top == OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations)
 		{
-			op_stimulationSet->setStimulationCount(m_readerHelper->getUInt(buffer, size));
+			op_stimulationSet->resize(m_readerHelper->getUInt(buffer, size));
 			m_stimulationIdx = 0;
 		}
 		if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_ID)
 		{
-			op_stimulationSet->setStimulationIdentifier(m_stimulationIdx, m_readerHelper->getUInt(buffer, size));
+			op_stimulationSet->setId(m_stimulationIdx, m_readerHelper->getUInt(buffer, size));
 		}
 		if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Date)
 		{
-			op_stimulationSet->setStimulationDate(m_stimulationIdx, m_readerHelper->getUInt(buffer, size));
+			op_stimulationSet->setDate(m_stimulationIdx, m_readerHelper->getUInt(buffer, size));
 		}
 		if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration)
 		{
-			op_stimulationSet->setStimulationDuration(m_stimulationIdx, m_readerHelper->getUInt(buffer, size));
+			op_stimulationSet->setDuration(m_stimulationIdx, m_readerHelper->getUInt(buffer, size));
 		}
 	}
 	else { CEBMLBaseDecoder::processChildData(buffer, size); }
diff --git a/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h b/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h
index 80114b0a20b52450eccf6c15525df578f567b8f7..143ab9782a51904186d693f07df7efcf6e5db3aa 100644
--- a/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h
+++ b/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h
@@ -24,7 +24,7 @@ public:
 
 protected:
 
-	Kernel::TParameterHandler<IStimulationSet*> op_stimulationSet;
+	Kernel::TParameterHandler<CStimulationSet*> op_stimulationSet;
 
 private:
 
diff --git a/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp b/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp
index 0f6a54b6edfd51e1512c82781eec86ffe222600e..a6ea1c9228298c8d9becbf6994388fc88607778d 100644
--- a/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp
+++ b/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp
@@ -40,7 +40,7 @@ bool CMasterAcquisitionEncoder::initialize()
 	Kernel::TParameterHandler<uint64_t> ip_subjectGender(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender));
 	Kernel::TParameterHandler<CMatrix*> ip_pMatrix(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix));
 	Kernel::TParameterHandler<uint64_t> ip_sampling(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling));
-	Kernel::TParameterHandler<IStimulationSet*> ip_stimSet(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet));
+	Kernel::TParameterHandler<CStimulationSet*> ip_stimSet(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet));
 	Kernel::TParameterHandler<uint64_t> ip_bufferDuration(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration));
 	Kernel::TParameterHandler<IMemoryBuffer*> op_buffer(this->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer));
 	Kernel::TParameterHandler<CMatrix*> ip_channelLocalisationMaster(
@@ -91,7 +91,7 @@ bool CMasterAcquisitionEncoder::initialize()
 
 	// Declares parameter handlers for sub-algorithm stimulation
 
-	Kernel::TParameterHandler<IStimulationSet*> ip_stimulationStimulationSet(
+	Kernel::TParameterHandler<CStimulationSet*> ip_stimulationStimulationSet(
 		m_stimulationStreamEncoder->getInputParameter(OVP_Algorithm_StimulationEncoder_InputParameterId_StimulationSet));
 	Kernel::TParameterHandler<IMemoryBuffer*> op_stimulationMemoryBuffer(
 		m_stimulationStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer));
diff --git a/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp b/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp
index a8b3c4880864fbb7369a35e8ff06fbcd60fa01d6..19031a5fc43342dd0925c4ac7157fe54cd483fcc 100644
--- a/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp
+++ b/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp
@@ -23,23 +23,23 @@ bool CStimulationEncoder::uninitialize()
 
 bool CStimulationEncoder::processBuffer()
 {
-	IStimulationSet* stimulationSet = ip_stimSet;
+	CStimulationSet* stimulationSet = ip_stimSet;
 
 	m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation);
 	m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations);
-	m_writerHelper->setUInt(stimulationSet->getStimulationCount());
+	m_writerHelper->setUInt(stimulationSet->size());
 	m_writerHelper->closeChild();
-	for (size_t i = 0; i < stimulationSet->getStimulationCount(); ++i)
+	for (size_t i = 0; i < stimulationSet->size(); ++i)
 	{
 		m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation);
 		m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation_ID);
-		m_writerHelper->setUInt(stimulationSet->getStimulationIdentifier(i));
+		m_writerHelper->setUInt(stimulationSet->getId(i));
 		m_writerHelper->closeChild();
 		m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation_Date);
-		m_writerHelper->setUInt(stimulationSet->getStimulationDate(i));
+		m_writerHelper->setUInt(stimulationSet->getDate(i));
 		m_writerHelper->closeChild();
 		m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration);
-		m_writerHelper->setUInt(stimulationSet->getStimulationDuration(i));
+		m_writerHelper->setUInt(stimulationSet->getDuration(i));
 		m_writerHelper->closeChild();
 		m_writerHelper->closeChild();
 	}
diff --git a/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h b/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h
index d03f960099e1e0579b9a13162558424a9016db03..9202ce1f9840616d1edccf6206253a50ee9dd71c 100644
--- a/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h
+++ b/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h
@@ -18,7 +18,7 @@ public:
 
 protected:
 
-	Kernel::TParameterHandler<IStimulationSet*> ip_stimSet;
+	Kernel::TParameterHandler<CStimulationSet*> ip_stimSet;
 };
 
 class CStimulationEncoderDesc final : public CEBMLBaseEncoderDesc
diff --git a/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp b/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp
index 6252ed57881b37475454738f20d6be4ce24df1d8..6d635c1515511e59265bf5325e0edc09d8b32f64 100755
--- a/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp
+++ b/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp
@@ -27,17 +27,17 @@ static std::stringstream print(CMatrix& matrix)
 	return ss;
 }
 
-static std::stringstream print(IStimulationSet& stimSet)
+static std::stringstream print(CStimulationSet& stimSet)
 {
 	std::stringstream ss;
 	ss << "Stimulation set :\n";
-	ss << " | Number of elements : " << stimSet.getStimulationCount() << "\n";
-	for (size_t i = 0; i < stimSet.getStimulationCount(); ++i)
+	ss << " | Number of elements : " << stimSet.size() << "\n";
+	for (size_t i = 0; i < stimSet.size(); ++i)
 	{
 		ss << " |   Stimulation " << i << " : "
-				<< "id = " << stimSet.getStimulationIdentifier(i) << " "
-				<< "date = " << stimSet.getStimulationDate(i) << " "
-				<< "duration = " << stimSet.getStimulationDuration(i) << "\n";
+				<< "id = " << stimSet.getId(i) << " "
+				<< "date = " << stimSet.getDate(i) << " "
+				<< "duration = " << stimSet.getDuration(i) << "\n";
 	}
 	return ss;
 }
@@ -113,7 +113,7 @@ bool CDecoderAlgorithmTest::process()
 			if (m_decoder[i]->isOutputTriggerActive(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedBuffer))
 			{
 				{
-					Kernel::TParameterHandler<IStimulationSet*>
+					Kernel::TParameterHandler<CStimulationSet*>
 							handler(m_decoder[i]->getOutputParameter(OVP_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet));
 					if (handler.exists()) { getLogManager() << Kernel::LogLevel_Warning << print(*handler).str() << "\n"; }
 				}
diff --git a/plugins/processing/streaming/box-tutorials/signal-merger.mxs b/plugins/processing/streaming/box-tutorials/signal-merger.mxs
index 0f8acd692b218124abbf511104329c7534f9a33a..c270e715f2bf96fd62ef2398ad246ebf6780dfd5 100644
--- a/plugins/processing/streaming/box-tutorials/signal-merger.mxs
+++ b/plugins/processing/streaming/box-tutorials/signal-merger.mxs
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.0.0</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -39,10 +39,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x990c5a68, 0x0d4024a3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -86,11 +82,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>112</Value>
+					<Value>176</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>336</Value>
+					<Value>288</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -248,11 +244,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>112</Value>
+					<Value>176</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>160</Value>
+					<Value>192</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -309,7 +305,7 @@
 		<Entry>
 			<Identifier>(0x0000775c, 0x000078ff)</Identifier>
 			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
-			<Data>[{"boxIdentifier":"(0x00004baf, 0x0000758e)","childCount":0,"identifier":"(0x000040b5, 0x00003ea5)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007db6, 0x00005d30)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000010e4, 0x00001956)","index":0,"name":"Default tab","parentIdentifier":"(0x00007db6, 0x00005d30)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004cdd, 0x00003e61)","index":0,"name":"Empty","parentIdentifier":"(0x000010e4, 0x00001956)","type":0}]</Data>
+			<Data>[{"boxIdentifier":"(0x00004baf, 0x0000758e)","childCount":0,"identifier":"(0x000040b5, 0x00003ea5)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007db6, 0x00005d30)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000010e4, 0x00001956)","index":0,"name":"Default tab","parentIdentifier":"(0x00007db6, 0x00005d30)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004cdd, 0x00003e61)","index":0,"name":"Empty","parentIdentifier":"(0x000010e4, 0x00001956)","type":0}]</Data>
 		</Entry>
 	</Metadata>
 </OpenViBE-Scenario>
\ No newline at end of file
diff --git a/plugins/processing/tools/box-tutorials/external-processing-filter.mxs b/plugins/processing/tools/box-tutorials/external-processing-filter.mxs
index b79e1b6ff5726d726920ac0396115110555e98cf..7bc40b3dc8bf2930df3576ede86dfcd08106fae4 100644
--- a/plugins/processing/tools/box-tutorials/external-processing-filter.mxs
+++ b/plugins/processing/tools/box-tutorials/external-processing-filter.mxs
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.4.99</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -17,7 +17,7 @@
 				</Input>
 				<Input>
 					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>New input</Name>
+					<Name>New input(1)</Name>
 				</Input>
 			</Inputs>
 			<Outputs>
@@ -27,7 +27,7 @@
 				</Output>
 				<Output>
 					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>New output</Name>
+					<Name>New output(1)</Name>
 				</Output>
 			</Outputs>
 			<Settings>
@@ -259,7 +259,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Interstimulation interval (in sec)</Name>
 					<DefaultValue>1.0</DefaultValue>
-					<Value>1.0</Value>
+					<Value>1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -273,7 +273,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>80</Value>
+					<Value>96</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/plugins/processing/tools/box-tutorials/external-processing-generator.mxs b/plugins/processing/tools/box-tutorials/external-processing-generator.mxs
index f32797b4378b2c06fbbb0e10752776ce5921d280..104829f06984d93e6c6e98141400c0e61df1e6c9 100644
--- a/plugins/processing/tools/box-tutorials/external-processing-generator.mxs
+++ b/plugins/processing/tools/box-tutorials/external-processing-generator.mxs
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.4.99</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
diff --git a/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp b/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp
index 9cd801c88b832795e8b3ccc193f26a200967e6b5..458542e8e933a20636b69dfc17037a87c6367fc6 100644
--- a/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp
+++ b/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp
@@ -309,7 +309,7 @@ bool CBoxAlgorithmExternalProcessing::process()
 					maybeStimulationDecoder->second.decode(j, false); // The input will be marked as deprecated later
 
 					// Cache empty chunks, we will send them when a stimulation or a signal chunk arrives
-					if (maybeStimulationDecoder->second.getOutputStimulationSet()->getStimulationCount() == 0)
+					if (maybeStimulationDecoder->second.getOutputStimulationSet()->size() == 0)
 					{
 						m_packetHistory.emplace(startTime, endTime, i, ebml);
 						OV_FATAL_UNLESS_K(boxCtx.markInputAsDeprecated(i, j), "Failed to mark input as deprecated", Kernel::ErrorType::Internal);
diff --git a/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp b/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp
index c60a44b8f1794471b8cf18d0cb071b7edc706b34..3d2109c80e2fc852348425e1d6278546c73aac8f 100644
--- a/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp
+++ b/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp
@@ -47,23 +47,23 @@ bool CBoxAlgorithmStimulationListener::process()
 			if (m_stimulationDecoders[i]->isHeaderReceived()) { }
 			if (m_stimulationDecoders[i]->isBufferReceived())
 			{
-				const IStimulationSet* stimSet = m_stimulationDecoders[i]->getOutputStimulationSet();
+				const CStimulationSet* stimSet = m_stimulationDecoders[i]->getOutputStimulationSet();
 
 				CString inputName;
 				staticboxCtx.getInputName(i, inputName);
-				for (size_t k = 0; k < stimSet->getStimulationCount(); ++k)
+				for (size_t k = 0; k < stimSet->size(); ++k)
 				{
 					this->getLogManager() << m_logLevel
 							<< "For input " << i << " with name " << inputName
-							<< " got stimulation " << stimSet->getStimulationIdentifier(k)
-							<< "[" << getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimSet->getStimulationIdentifier(k)) << "]"
-							<< " at date " << CTime(stimSet->getStimulationDate(k))
-							<< " and duration " << CTime(stimSet->getStimulationDuration(k)) << "\n";
+							<< " got stimulation " << stimSet->getId(k)
+							<< "[" << getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimSet->getId(k)) << "]"
+							<< " at date " << CTime(stimSet->getDate(k))
+							<< " and duration " << CTime(stimSet->getDuration(k)) << "\n";
 
 					OV_WARNING_UNLESS_K(
-						stimSet->getStimulationDate(k) >= boxCtx.getInputChunkStartTime(i, j)
-						&& stimSet->getStimulationDate(k) <= boxCtx.getInputChunkEndTime(i, j),
-						"Invalid out of range date [" << CTime(stimSet->getStimulationDate(k)) << "] (expected value between ["
+						stimSet->getDate(k) >= boxCtx.getInputChunkStartTime(i, j)
+						&& stimSet->getDate(k) <= boxCtx.getInputChunkEndTime(i, j),
+						"Invalid out of range date [" << CTime(stimSet->getDate(k)) << "] (expected value between ["
 						<< CTime(boxCtx.getInputChunkStartTime(i, j)) << "] and [" << CTime(boxCtx.getInputChunkEndTime(i, j)) << "])");
 				}
 			}
diff --git a/plugins/processing/tools/test/matrix-validity-test.xml b/plugins/processing/tools/test/matrix-validity-test.xml
index ed6abf5de45254bbb689ab1e3f30041a335b8708..ddaa9b256348f21ead6cac7482906814e7c7f1b9 100644
--- a/plugins/processing/tools/test/matrix-validity-test.xml
+++ b/plugins/processing/tools/test/matrix-validity-test.xml
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings>
 		<Setting>
 			<Identifier>(0x460057cc, 0xfaa7362d)</Identifier>
@@ -131,7 +131,7 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x00003e6a, 0x00004b24)</Identifier>
+			<Identifier>(0x000035ab, 0x00003bb4)</Identifier>
 			<Name>CSV File Writer</Name>
 			<AlgorithmClassIdentifier>(0x428375e8, 0x325f2db9)</AlgorithmClassIdentifier>
 			<Inputs>
@@ -185,7 +185,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xee4b6d30, 0x788aed29)</Value>
+					<Value>(0xc33e47e0, 0x70e5f31b)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
@@ -366,35 +366,35 @@
 	</Boxes>
 	<Links>
 		<Link>
-			<Identifier>(0x00000c57, 0x00001eb3)</Identifier>
+			<Identifier>(0x00000585, 0x00003c98)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00004e4d, 0x000039e9)</BoxIdentifier>
+				<BoxIdentifier>(0x000003fa, 0x00002132)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x000003fa, 0x00002132)</BoxIdentifier>
+				<BoxIdentifier>(0x000035ab, 0x00003bb4)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
 		</Link>
 		<Link>
-			<Identifier>(0x0000337a, 0x0000449a)</Identifier>
+			<Identifier>(0x00000c57, 0x00001eb3)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00000d10, 0x00007eaa)</BoxIdentifier>
+				<BoxIdentifier>(0x00004e4d, 0x000039e9)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00004e4d, 0x000039e9)</BoxIdentifier>
+				<BoxIdentifier>(0x000003fa, 0x00002132)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
 		</Link>
 		<Link>
-			<Identifier>(0x0000651e, 0x000040fc)</Identifier>
+			<Identifier>(0x0000337a, 0x0000449a)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x000003fa, 0x00002132)</BoxIdentifier>
+				<BoxIdentifier>(0x00000d10, 0x00007eaa)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00003e6a, 0x00004b24)</BoxIdentifier>
+				<BoxIdentifier>(0x00004e4d, 0x000039e9)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
 		</Link>
diff --git a/scripts/linux-dep-helpers/linux-compile-cmake.pl b/scripts/linux-dep-helpers/linux-compile-cmake.pl
deleted file mode 100755
index 9d120ae103afbbbf135107710d38ef362b5935d4..0000000000000000000000000000000000000000
--- a/scripts/linux-dep-helpers/linux-compile-cmake.pl
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/perl
-
-# Intended to be run from linux-install_dependencies.pl which defines the dependencies_dir variable.
-# 
-# Variables are wrt that parent scope
-#
-
-use strict;
-use warnings;
-use Getopt::Long;
-
-use English;
-use FindBin;
-use File::Copy;
-use File::Spec;
-
-# Version of CMake to install if needed (latest as of 08/2020)
-my $version_major = 3;
-my $version_minor = 18;
-my $version_patch = 1;
-
-# Minimum version needed for the project.
-# 3.12 for FindPython functionalities.
-my $minimum_major = 3;
-my $minimum_minor = 15;
-
-my $install_dir = $dependencies_dir;
-
-# Updating path with potentially installed cmake before looking for it.
-if ("$dependencies_dir/cmake") {
-  print "Found cmake folder in deps\n";
-  my $path = $ENV{'PATH'};
-  $path = "$dependencies_dir/cmake/bin:$path";
-  $ENV{'PATH'} = $path;
-  #system("PATH=$dependencies_dir/cmake/bin:$PATH")
-}
-
-# Checking for CMake presence
-my $major_found = 0;
-my $minor_found = 0;
-
-if (`which cmake`) {
-  `cmake --version` =~ /.*(\d)\.(\d\d)\.*/;
-
-  print "cmake version found: $1.$2\n";
-
-  $major_found = $1;
-  $minor_found = $2;
-}
-
-# Minimum cmake version required for the project: 3.12
-if (int($major_found) < $minimum_major || int($minor_found) < $minimum_minor) {
-
-  my $old_dir = Cwd::getcwd();
-
-  my $cmake_archive = "cmake-${version_major}.${version_minor}.${version_patch}.tar.gz";
-  my $cmake_folder = "cmake-${version_major}.${version_minor}.${version_patch}";
-
-  print "CMake version too low. Installing newer one in $install_dir\n";
-
-  if (! -d $install_dir) {
-    mkdir($install_dir) or die("Failed to create directory [$install_dir]");
-  }
-
-  # Download
-  print "Downloading ${cmake_archive}\n";
-  system("wget http://www.cmake.org/files/v${version_major}.${version_minor}/${cmake_archive}") == 0
-    or die "Could not download the CMake sources - err $?";
-
-  # Extract
-  system("tar -xzf ${cmake_archive}") == 0
-    or die ("Could not extract the CMake archive - err $?");
-
-  # Configure, compile and install
-  chdir $cmake_folder;
-  system("./configure --prefix=$install_dir/cmake") == 0
-    or die("Failed to configure for cmake - err $?");
-  system("make install") == 0
-    or die ("Failed make install cmake - err $?");
-
-  # Go back to previous folder
-  chdir $old_dir;
-
-  #Clear
-  system("rm -r ${cmake_archive} ${cmake_folder}") == 0
-    or die ("Failed to clear after install - err $?");
-
-}
-
diff --git a/scripts/linux-dep-helpers/linux-compile-eigen.pl b/scripts/linux-dep-helpers/linux-compile-eigen.pl
deleted file mode 100755
index 0386908fdc29105ca42383b933938a9b9d1cbfe1..0000000000000000000000000000000000000000
--- a/scripts/linux-dep-helpers/linux-compile-eigen.pl
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/perl
-
-# Intended to be run from linux-install_dependencies.pl
-# 
-# Variables are wrt that parent scope
-#
-
-# Installation of packages not available in the apt database or PPA
-# Eigen installation
-if (!$no_install && $distribution eq 'Ubuntu 16.04') {
-  # Install eigen 3.2.9 from source if it is not already
-  # This is because Ubuntu 16.04 has a beta version of the Eigen package by default
-  # and it does not work
-  if (-e "/usr/local/include/eigen3") {
-    print STDERR "Warning: eigen3 is already installed in /usr/local\n";
-  } else {
-    my $old_dir = Cwd::getcwd();
-
-    my $eigen_build_folder = $dependencies_dir . "/eigen-build";
-    my $eigen_extracted_folder = $eigen_build_folder . "/eigen-eigen-dc6cfdf9bcec";
-
-    if (! -e $dependencies_dir) {
-      mkdir($dependencies_dir) or die("Failed to create directory [$dependencies_dir]");
-    }
-    if (! -e $eigen_build_folder) {
-      mkdir($eigen_build_folder) or die("Failed to create directory [$eigen_build_folder]");
-    }
-
-    chdir $eigen_build_folder;
-
-    if (! -e "3.2.9.tar.bz2") {
-      system('wget "http://bitbucket.org/eigen/eigen/get/3.2.9.tar.bz2"');
-      ($CHILD_ERROR != 0) and die ("Could not download the Eigen sources [$CHILD_ERROR]");
-    }
-    if (! -e $eigen_extracted_folder) {
-      system('tar -xjf "3.2.9.tar.bz2"');
-      ($CHILD_ERROR != 0) and die ("Could not extract the eigen archive");
-    }
-
-    chdir $eigen_extracted_folder;
-    mkdir $eigen_extracted_folder . "/build" or die ("Failed to create directory [$eigen_extracted_folder/build]");
-    chdir $eigen_extracted_folder . "/build";
-
-    system("cmake ..");
-    ($CHILD_ERROR != 0) and die("Failed to run CMake for Eigen [$CHILD_ERROR]");
-
-    system("sudo make install");
-    ($CHILD_ERROR != 0) and die("Failed install Eigen [$CHILD_ERROR]");
-
-    # Go back to the scripts folder
-    chdir $old_dir;
-  }
-}
diff --git a/scripts/linux-dep-helpers/linux-compile-gtest.pl b/scripts/linux-dep-helpers/linux-compile-gtest.pl
deleted file mode 100755
index e88fae513a64e6d314983facd786914e936a7024..0000000000000000000000000000000000000000
--- a/scripts/linux-dep-helpers/linux-compile-gtest.pl
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/perl
-
-# Intended to be run from linux-install_dependencies.pl
-# 
-# Variables are wrt that parent scope
-#
-
-if (!$no_gtest) {
-  my $old_dir = Cwd::getcwd();
-
-  my $gtest_build_folder = $dependencies_dir . "/gtest-build";	
-  my $gtest_lib_folder = $dependencies_dir . "/libgtest/";	
-  if (! -e $dependencies_dir) {
-    mkdir($dependencies_dir) or die("Failed to create directory [$dependencies_dir]");
-  }
-  if (! -e $gtest_build_folder) {
-    mkdir($gtest_build_folder) or die("Failed to create directory [$gtest_build_folder]");
-  }
-  if (! -e $gtest_lib_folder) {
-    mkdir($gtest_lib_folder) or die("Failed to create directory [$gtest_lib_folder]");
-  }
-
-  # build gtest
-  chdir $gtest_build_folder;
-  system("cmake -GNinja /usr/src/gtest");
-  system("ninja all");
-  system("rm CMakeCache.txt");
-  my @lib_files = glob "*.a";
-
-  foreach my $lib_cur (@lib_files) {
-    copy($lib_cur, $gtest_lib_folder) or die "Could not copy lib $lib_cur $!\n";
-  }
-  chdir $old_dir;
-
-}
-
diff --git a/scripts/linux-dependencies-fedora.txt b/scripts/linux-dependencies-fedora.txt
index 31f0dba13edffc0ad791c831271d321b28330ab0..8738e4961fe86a1db6d5e17b6a63973cd2a39ef5 100644
--- a/scripts/linux-dependencies-fedora.txt
+++ b/scripts/linux-dependencies-fedora.txt
@@ -4,8 +4,6 @@ gcc
 gcc-c++
 expat-devel
 openssl-devel
-boost-devel
 ninja-build
 zziplib-devel
 xerces-c-devel
-gtest-devel
diff --git a/scripts/linux-dependencies-ubuntu1404.txt b/scripts/linux-dependencies-ubuntu1404.txt
index d7c120a5d9be81cb29d534db4dad0b5fa81c9a20..75d043ec7c031a9ae1b48d9f45137ba28263bec0 100644
--- a/scripts/linux-dependencies-ubuntu1404.txt
+++ b/scripts/linux-dependencies-ubuntu1404.txt
@@ -4,13 +4,6 @@ gcc
 g++
 libexpat1-dev
 libncurses5-dev
-libeigen3-dev
-libboost-dev
-libboost-thread-dev
-libboost-regex-dev
-libboost-chrono-dev
-libboost-filesystem1.54-dev
 ninja-build
 libzzip-dev
 libxerces-c-dev
-libgtest-dev
diff --git a/scripts/linux-dependencies-ubuntu16_plus.txt b/scripts/linux-dependencies-ubuntu16_plus.txt
index 6d269ce130a2ae61b309420b6b915befcfd1ee6e..ee33a4cf6bc3fe5b49ac66ce098b26e3b8936ab9 100644
--- a/scripts/linux-dependencies-ubuntu16_plus.txt
+++ b/scripts/linux-dependencies-ubuntu16_plus.txt
@@ -5,12 +5,6 @@ g++
 libssl-dev
 libexpat1-dev
 libncurses5-dev
-libboost-dev
-libboost-thread-dev
-libboost-regex-dev
-libboost-chrono-dev
-libboost-filesystem-dev
 ninja-build
 libzzip-dev
 libxerces-c-dev
-libgtest-dev
diff --git a/scripts/linux-install_dependencies.pl b/scripts/linux-install_dependencies.pl
index 172da8013277679cc95cf393071111e34be55dd8..fd193de61c17db5205dcbbda9ed066cc4df18c02 100755
--- a/scripts/linux-install_dependencies.pl
+++ b/scripts/linux-install_dependencies.pl
@@ -85,7 +85,7 @@ my $add_repository_command  = '';
 
 my $os_release = `cat /etc/os-release`;
 # Check for NAME= and VERSION_ID=
-# Take into account distros placing quotes around values
+# Take into account distros placing quotes around value
 my ($lsb_distributor, $lsb_release) = ($os_release =~ m/NAME=["'\`]*([a-zA-Z]+).*VERSION_ID=["'\`]*([0-9.]+)/s);
 
 if ($lsb_distributor =~ 'Ubuntu') {
@@ -99,13 +99,8 @@ if ($lsb_distributor =~ 'Ubuntu') {
       $add_repository_command  = 'sudo add-apt-repository universe';
     }
   }
+  $distribution = 'Ubuntu ' . $lsb_release;
 
-  if ($lsb_release =~ '14.04'
-      || $lsb_release =~ '16.04'
-      || $lsb_release =~ '18.04'
-      || $lsb_release =~ '19.10') {
-    $distribution = 'Ubuntu ' . $lsb_release;
-  }
 } elsif ($lsb_distributor =~ 'Fedora') {
   if (!$no_install) {
     if ($assume_yes) {
@@ -114,7 +109,7 @@ if ($lsb_distributor =~ 'Ubuntu') {
       $package_install_command = 'sudo dnf install';
     }
   }
-  $distribution = 'Fedora';
+  $distribution = 'Fedora' . $lsb_release;
 }
 
 $distribution eq $unsupported_distribution and die('This distribution is unsupported');
@@ -138,11 +133,13 @@ closedir($dir_handle);
 
 my $pkg_file = "";
 
-if ($distribution eq 'Ubuntu 14.04') {
-  $pkg_file = "$manifest_dir/linux-dependencies-ubuntu1404.txt";
-} elsif ($distribution =~ 'Ubuntu') {
-  $pkg_file = "$manifest_dir/linux-dependencies-ubuntu16_plus.txt";
-} elsif ($distribution eq 'Fedora') {
+if ($distribution =~ 'Ubuntu') {
+  if (int($lsb_release) <= '14') {
+    $pkg_file = "$manifest_dir/linux-dependencies-ubuntu1404.txt";
+  } else {
+    $pkg_file = "$manifest_dir/linux-dependencies-ubuntu16_plus.txt";
+  }
+} elsif ($distribution =~ 'Fedora') {
   $pkg_file = "$manifest_dir/linux-dependencies-fedora.txt";
 }
 
diff --git a/scripts/windows-build-tools.txt b/scripts/windows-build-tools.txt
index e4a7a946c346656cf84c1ca6f2890cdea953d916..fe0ded822d5b8cd6ce0479e71fa3cf277e332b18 100644
--- a/scripts/windows-build-tools.txt
+++ b/scripts/windows-build-tools.txt
@@ -1,2 +1 @@
-build/windows/cmake-3.18.0.zip;cmake;3.18.0
 build/windows/ninja-1.4.0.zip;ninja;1.4.0
diff --git a/scripts/windows-dependencies-x64.txt b/scripts/windows-dependencies-x64.txt
index 917e8ff7b661b0474f5466fe637a9522f9701374..35a2474b2b8cadefe00e117fb81a641fee5f1bbe 100644
--- a/scripts/windows-dependencies-x64.txt
+++ b/scripts/windows-dependencies-x64.txt
@@ -1,7 +1,4 @@
-build/windows/boost_1.58_x64_vc120_dev.zip;boost;1.58
-build/windows/eigen-3.3.7.zip;eigen;3.3.7
 build/windows/expat_2.1.0.1_x64_vc120_dev.zip;expat;2.1.0.1
-build/windows/gtest_1.7.0_x64_vc120_dev.zip;gtest;1.7.0
 build/windows/pthread_2.9.1_x64_vc120_dev.zip;pthread;2.9.1
 build/windows/xerces-c_3.1.3_x64_vc120_dev.zip;xerces-c;3.1.3
 build/windows/vcredist_x64_vc120.zip;vcredist;1.0
diff --git a/scripts/windows-dependencies-x86.txt b/scripts/windows-dependencies-x86.txt
index e99cf78b695772061ad5494f782f862876938857..ec11389c9c75a855adaa1a2f0d7aad01e5ecf79b 100644
--- a/scripts/windows-dependencies-x86.txt
+++ b/scripts/windows-dependencies-x86.txt
@@ -1,7 +1,4 @@
-build/windows/boost_1.58_x86_vc120_dev.zip;boost;1.58
-build/windows/eigen-3.3.7.zip;eigen;3.3.7
 build/windows/expat_2.1.0.1_x86_vc120_dev.zip;expat;2.1.0.1
-build/windows/gtest_1.7.0_x86_vc120_dev.zip;gtest;1.7.0
 build/windows/pthread_2.9.1_x86_vc120_dev.zip;pthread;2.9.1
 build/windows/xerces-c_3.1.3_x86_vc120_dev.zip;xerces-c;3.1.3
 build/windows/vcredist_x86_vc120.zip;vcredist;1.0
diff --git a/toolkit/CMakeLists.txt b/toolkit/CMakeLists.txt
index 7c49bb28374c69d33831857e50ff3bd102346af7..c6973b08270a0db6f17a13342c4ef7f914ac4839 100644
--- a/toolkit/CMakeLists.txt
+++ b/toolkit/CMakeLists.txt
@@ -39,7 +39,9 @@ target_link_libraries(${PROJECT_NAME}
                       openvibe-common
                       openvibe-module-ebml
                       openvibe-module-xml
-                      openvibe-module-fs)
+                      openvibe-module-fs
+					  Boost::filesystem
+)
 
 add_dependencies(${PROJECT_NAME} openvibe-generate-stimulation-file)
 
@@ -66,9 +68,6 @@ target_include_directories(${PROJECT_NAME}
 
 add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines)
 
-# ---------------------------------
-include("FindThirdPartyBoost_FileSystem")
-
 # ---------------------------------
 # Target macros
 # Defines target operating system, architecture and compiler
diff --git a/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h b/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h
index 9bd5b10f2fbc9806f9ed7fc2f65e7b5f2204e1c2..4da811d694e1b7998aeaf221a6cb3445ebc9af7e 100644
--- a/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h
+++ b/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h
@@ -47,7 +47,7 @@ protected:
 	virtual Kernel::IConfigurationManager& getConfigurationManager() { return m_algorithmCtx->getConfigurationManager(); } // should never be null
 	virtual Kernel::IAlgorithmManager& getAlgorithmManager() { return m_algorithmCtx->getAlgorithmManager(); } // should never be null
 	virtual Kernel::ILogManager& getLogManager() { return m_algorithmCtx->getLogManager(); } // should never be null
-	virtual Kernel::IErrorManager& getErrorManager() { return m_algorithmCtx->getErrorManager(); } // should never be null
+	virtual Kernel::CErrorManager& getErrorManager() { return m_algorithmCtx->getErrorManager(); } // should never be null
 	virtual Kernel::ITypeManager& getTypeManager() { return m_algorithmCtx->getTypeManager(); } // should never be null
 
 	virtual CIdentifier getNextInputParameterIdentifier(const CIdentifier& rPreviousInputParameterIdentifier) const
diff --git a/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h b/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h
index a275100b4cf408347db38486bdc641debd8634d2..2ba0e179a4d263414273517ba927a429be8d7024 100755
--- a/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h
+++ b/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h
@@ -74,7 +74,7 @@ public:
 	virtual Kernel::IAlgorithmManager& getAlgorithmManager() { return getPlayerContext().getAlgorithmManager(); }
 	virtual Kernel::IConfigurationManager& getConfigurationManager() { return getPlayerContext().getConfigurationManager(); }
 	virtual Kernel::ILogManager& getLogManager() { return getPlayerContext().getLogManager(); }
-	virtual Kernel::IErrorManager& getErrorManager() { return getPlayerContext().getErrorManager(); }
+	virtual Kernel::CErrorManager& getErrorManager() { return getPlayerContext().getErrorManager(); }
 	virtual Kernel::IScenarioManager& getScenarioManager() { return getPlayerContext().getScenarioManager(); }
 	virtual Kernel::ITypeManager& getTypeManager() { return getPlayerContext().getTypeManager(); }
 
@@ -216,7 +216,7 @@ protected:
 
 	private:
 		Kernel::ILogManager& m_logManager;
-		Kernel::IErrorManager& m_errorManager;
+		Kernel::CErrorManager& m_errorManager;
 		Kernel::ITypeManager& m_typeManager;
 		Kernel::IConfigurationManager& m_configManager;
 		CString m_settingValue;
@@ -334,7 +334,7 @@ public:
 	virtual Kernel::IScenarioManager& getScenarioManager() const { return m_boxListenerCtx->getScenarioManager(); }
 	virtual Kernel::ITypeManager& getTypeManager() const { return m_boxListenerCtx->getTypeManager(); }
 	virtual Kernel::ILogManager& getLogManager() const { return m_boxListenerCtx->getLogManager(); }
-	virtual Kernel::IErrorManager& getErrorManager() const { return m_boxListenerCtx->getErrorManager(); }
+	virtual Kernel::CErrorManager& getErrorManager() const { return m_boxListenerCtx->getErrorManager(); }
 	virtual Kernel::IConfigurationManager& getConfigurationManager() const { return m_boxListenerCtx->getConfigurationManager(); }
 
 	virtual Kernel::IScenario& getScenario() const { return m_boxListenerCtx->getScenario(); }
diff --git a/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h b/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h
index f72dce1179654acca73345183136b91e95174041..0f8cdfd9c21ae228e94dba98bbdcba0966a196b2 100644
--- a/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h
+++ b/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h
@@ -27,7 +27,7 @@ public:
 	virtual void setSampleBuffer(const double* buffer);
 
 	// Stimulation input reader callback
-	virtual void setStimulationCount(size_t /*count*/) {}
+	virtual void resize(size_t /*count*/) {}
 	virtual void setStimulation(const size_t index, uint64_t identifier, uint64_t date);
 
 	// What should be implemented by the derived class
diff --git a/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h b/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h
index 0e2a8ca3062bfb898108a8a03ad8161d31337025..fed42187a1e7fe0b68b66751068b9f37cf82a75c 100644
--- a/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h
+++ b/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h
@@ -13,7 +13,7 @@ class TStimulationDecoderLocal : public T
 {
 protected:
 
-	Kernel::TParameterHandler<IStimulationSet*> m_oStimulationSet;
+	Kernel::TParameterHandler<CStimulationSet*> m_oStimulationSet;
 
 	using T::m_codec;
 	using T::m_boxAlgorithm;
@@ -46,7 +46,7 @@ public:
 		return true;
 	}
 
-	Kernel::TParameterHandler<IStimulationSet*>& getOutputStimulationSet() { return m_oStimulationSet; }
+	Kernel::TParameterHandler<CStimulationSet*>& getOutputStimulationSet() { return m_oStimulationSet; }
 
 	virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader); }
 	virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer); }
diff --git a/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h b/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h
index b78a31e7e9f051f86785dc8493f047c4c219729f..676d74341a965e763b73ad05967ddc068e3f55b3 100644
--- a/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h
+++ b/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h
@@ -13,7 +13,7 @@ class TStimulationEncoderLocal : public T
 {
 protected:
 
-	Kernel::TParameterHandler<IStimulationSet*> m_iStimulationSet;
+	Kernel::TParameterHandler<CStimulationSet*> m_iStimulationSet;
 
 	using T::m_codec;
 	using T::m_boxAlgorithm;
@@ -46,7 +46,7 @@ public:
 		return true;
 	}
 
-	Kernel::TParameterHandler<IStimulationSet*>& getInputStimulationSet() { return m_iStimulationSet; }
+	Kernel::TParameterHandler<CStimulationSet*>& getInputStimulationSet() { return m_iStimulationSet; }
 
 protected:
 	bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); }
diff --git a/toolkit/include/toolkit/tools/ovtkMatrix.h b/toolkit/include/toolkit/tools/ovtkMatrix.h
index d468fc3679fb8f8815056030482a7cbf313e34f5..cd8c5768d29d72d1de6ac9ec13ecd5bdc3353747 100644
--- a/toolkit/include/toolkit/tools/ovtkMatrix.h
+++ b/toolkit/include/toolkit/tools/ovtkMatrix.h
@@ -12,21 +12,43 @@ OVTK_API bool saveToTextFile(const CMatrix& matrix, const CString& filename, con
 OVTK_API bool loadFromTextFile(CMatrix& matrix, const CString& filename);
 
 //@todo All is useless now. Avoid to used it, intended to be removed.  
+/// \deprecated Use the CMatrix class copy() method instead.
+OV_Deprecated("Use the CMatrix class copy() method instead.")
 OVTK_API bool copy(CMatrix& dst, const CMatrix& src);
+/// \deprecated Use the CMatrix class copyDescription() method instead.
+OV_Deprecated("Use the CMatrix class copyDescription() method instead.")
 OVTK_API bool copyDescription(CMatrix& dst, const CMatrix& src);
+/// \deprecated Use the CMatrix class copyContent() method instead.
+OV_Deprecated("Use the CMatrix class copyContent() method instead.")
 OVTK_API bool copyContent(CMatrix& dst, const CMatrix& src);
+/// \deprecated Use the CMatrix class resetBuffer() method instead.
+OV_Deprecated("Use the CMatrix class resetBuffer() method instead.")
 OVTK_API bool clearContent(CMatrix& matrix);															//(resetBuffer)
+/// \deprecated Use the CMatrix class isDescriptionEqual() method instead.
+OV_Deprecated("Use the CMatrix class isDescriptionEqual() method instead.")
 OVTK_API bool isDescriptionSimilar(const CMatrix& src1, const CMatrix& src2, bool checkLabels = true);	//(isDescriptionEqual)
+/// \deprecated Use the CMatrix class isBufferEqual() method instead.
+OV_Deprecated("Use the CMatrix class isBufferEqual() method instead.")
 OVTK_API bool isContentSimilar(const CMatrix& src1, const CMatrix& src2);								//(isBufferEqual)
+/// \deprecated Use the CMatrix class isBufferValid() method instead.
+OV_Deprecated("Use the CMatrix class isBufferValid() method instead.")
 OVTK_API bool isContentValid(const CMatrix& src, const bool checkNotANumber = true, const bool checkInfinity = true);	//(isBufferValid)
 }  // namespace Matrix
 
 //@todo All is useless now. Avoid to used it, intended to be removed. 
 namespace MatrixManipulation {
-inline bool copy(CMatrix& dst, const CMatrix& src) { return Matrix::copy(dst, src); }
-inline bool copyDescription(CMatrix& dst, const CMatrix& src) { return Matrix::copyDescription(dst, src); }
-inline bool copyContent(CMatrix& dst, const CMatrix& src) { return Matrix::copyContent(dst, src); }
-inline bool clearContent(CMatrix& rMatrix) { return Matrix::clearContent(rMatrix); }
+/// \deprecated Use the CMatrix class copy() method instead.
+OV_Deprecated("Use the CMatrix class copy() method instead.")
+inline bool copy(CMatrix& dst, const CMatrix& src);
+/// \deprecated Use the CMatrix class copyDescription() method instead.
+OV_Deprecated("Use the CMatrix class copyDescription() method instead.")
+inline bool copyDescription(CMatrix& dst, const CMatrix& src);
+/// \deprecated Use the CMatrix class copyContent() method instead.
+OV_Deprecated("Use the CMatrix class copyContent() method instead.")
+inline bool copyContent(CMatrix& dst, const CMatrix& src);
+/// \deprecated Use the CMatrix class clearContent() method instead.
+OV_Deprecated("Use the CMatrix class clearContent() method instead.")
+inline bool clearContent(CMatrix& matrix);
 }  // namespace MatrixManipulation
 }  // namespace Toolkit
 }  // namespace OpenViBE
diff --git a/toolkit/include/toolkit/tools/ovtkStimulationSet.h b/toolkit/include/toolkit/tools/ovtkStimulationSet.h
index c291d8f2fb1f82ff7bdcb0c7695e6b119bb8ef79..fce1af66565d91714b6624a3a6dfa947a6236da0 100644
--- a/toolkit/include/toolkit/tools/ovtkStimulationSet.h
+++ b/toolkit/include/toolkit/tools/ovtkStimulationSet.h
@@ -5,11 +5,22 @@
 namespace OpenViBE {
 namespace Toolkit {
 namespace StimulationSet {
-OVTK_API bool shift(IStimulationSet& stimSet, uint64_t timeShift);
-OVTK_API bool copy(IStimulationSet& dst, const IStimulationSet& src, uint64_t timeShift = 0);
-OVTK_API bool append(IStimulationSet& dst, const IStimulationSet& src, uint64_t timeShift = 0);
-OVTK_API bool appendRange(IStimulationSet& dst, const IStimulationSet& src, uint64_t srcStartTime, uint64_t srcEndTime, uint64_t timeShift = 0);
-OVTK_API bool removeRange(IStimulationSet& stimSet, uint64_t startTime, uint64_t endTime);
+//@todo All is useless now. Avoid to used it, intended to be removed.  
+/// \deprecated Use the CStimulationSet class shift() method instead.
+OV_Deprecated("Use the CStimulationSet class shift() method instead.")
+OVTK_API bool shift(CStimulationSet& stimSet, uint64_t timeShift);
+/// \deprecated Use the CStimulationSet class copy() method instead.
+OV_Deprecated("Use the CStimulationSet class copy() method instead.")
+OVTK_API bool copy(CStimulationSet& dst, const CStimulationSet& src, uint64_t timeShift = 0);
+/// \deprecated Use the CStimulationSet class append() method instead.
+OV_Deprecated("Use the CStimulationSet class append() method instead.")
+OVTK_API bool append(CStimulationSet& dst, const CStimulationSet& src, uint64_t timeShift = 0);
+/// \deprecated Use the CStimulationSet class appendRange() method instead.
+OV_Deprecated("Use the CStimulationSet class appendRange() method instead.")
+OVTK_API bool appendRange(CStimulationSet& dst, const CStimulationSet& src, uint64_t srcStartTime, uint64_t srcEndTime, uint64_t timeShift = 0);
+/// \deprecated Use the CStimulationSet class removeRange() method instead.
+OV_Deprecated("Use the CStimulationSet class removeRange() method instead.")
+OVTK_API bool removeRange(CStimulationSet& stimSet, uint64_t startTime, uint64_t endTime);
 }  // namespace StimulationSet
 }  // namespace Toolkit
 }  // namespace OpenViBE
diff --git a/toolkit/src/tools/ovtkMatrix.cpp b/toolkit/src/tools/ovtkMatrix.cpp
index 5ddcf0e0f5da190ea07502df6b53b8902628dd8a..ec6e94cb883db85a4952816c4fa84a2116bb8ba2 100644
--- a/toolkit/src/tools/ovtkMatrix.cpp
+++ b/toolkit/src/tools/ovtkMatrix.cpp
@@ -54,8 +54,7 @@ bool fromString(CMatrix& matrix, const CString& str)
 	//current quote-delimited string
 	std::string curString;
 
-	do
-	{
+	do {
 		//read current line
 		std::getline(buffer, what, CONSTANT_EOL);
 
@@ -72,10 +71,8 @@ bool fromString(CMatrix& matrix, const CString& str)
 		auto it = what.begin();
 
 		//parse current line
-		while (it != what.end())
-		{
-			switch (status)
-			{
+		while (it != what.end()) {
+			switch (status) {
 					//initial parsing status
 				case EParsingStatus::Nothing:
 
@@ -92,23 +89,20 @@ bool fromString(CMatrix& matrix, const CString& str)
 					//comments starting
 					if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; }	//ignore rest of line by skipping to last character
 						//new dimension opened
-					else if (*it == CONSTANT_LEFT_SQUARE_BRACKET)
-					{
+					else if (*it == CONSTANT_LEFT_SQUARE_BRACKET) {
 						dimSize.resize(dimSize.size() + 1);					//increment dimension count
 						curDimIdx++;										//update current dimension index
 						status = EParsingStatus::ParsingHeaderDimension;	//update status
 					}
 						//finished parsing header
-					else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET)
-					{
+					else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) {
 						if (dimSize.empty()) { return false; }	//ensure at least one dimension was found
 						matrix.resize(dimSize);					//resize matrix
 						nValue.resize(matrix.getDimensionCount());
 
 						// set labels now that we know the matrix size
 						size_t idx = 0;
-						for (size_t i = 0; i < matrix.getDimensionCount(); ++i)
-						{
+						for (size_t i = 0; i < matrix.getDimensionCount(); ++i) {
 							for (size_t j = 0; j < matrix.getDimensionSize(i); ++j) { matrix.setDimensionLabel(i, j, labels[idx++].c_str()); }
 						}
 
@@ -125,8 +119,7 @@ bool fromString(CMatrix& matrix, const CString& str)
 					//comments starting
 					if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; }	//ignore rest of line by skipping to last character
 						//new label found
-					else if (*it == CONSTANT_DOUBLE_QUOTE)
-					{
+					else if (*it == CONSTANT_DOUBLE_QUOTE) {
 						//new element found in current dimension
 						dimSize[curDimIdx]++;
 						//update status
@@ -141,8 +134,7 @@ bool fromString(CMatrix& matrix, const CString& str)
 				case EParsingStatus::ParsingHeaderLabel:
 
 					//found '"' char not preceded by escape char : end of label reached
-					if (*it == CONSTANT_DOUBLE_QUOTE && *(it - 1) != '\\')
-					{
+					if (*it == CONSTANT_DOUBLE_QUOTE && *(it - 1) != '\\') {
 						// We can only attach the label later after we know the size
 						labels.push_back(curString);
 
@@ -163,8 +155,7 @@ bool fromString(CMatrix& matrix, const CString& str)
 					//comments starting
 					if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; }	//ignore rest of line by skipping to last character
 						//going down one dimension
-					else if (*it == CONSTANT_LEFT_SQUARE_BRACKET)
-					{
+					else if (*it == CONSTANT_LEFT_SQUARE_BRACKET) {
 						//update dimension index
 						curDimIdx++;
 						//ensure dimension count remains in allocated range
@@ -175,11 +166,9 @@ bool fromString(CMatrix& matrix, const CString& str)
 						if (curDimIdx < matrix.getDimensionCount() - 1) { nValue[curDimIdx]++; }
 					}
 						//going up one dimension
-					else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET)
-					{
+					else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) {
 						//if we are not in innermost dimension
-						if (curDimIdx < matrix.getDimensionCount() - 1)
-						{
+						if (curDimIdx < matrix.getDimensionCount() - 1) {
 							//ensure the right number of values was parsed in lower dimension
 							if (nValue[curDimIdx + 1] != matrix.getDimensionSize(curDimIdx + 1)) { return false; }
 							//reset values count of lower dimension to 0
@@ -192,11 +181,9 @@ bool fromString(CMatrix& matrix, const CString& str)
 						curDimIdx--;
 					}
 						//non whitespace character found
-					else if (!std::isspace(*it, locale))
-					{
+					else if (!std::isspace(*it, locale)) {
 						//if we are in innermost dimension, assume a value is starting here
-						if (curDimIdx == matrix.getDimensionCount() - 1)
-						{
+						if (curDimIdx == matrix.getDimensionCount() - 1) {
 							//ensure values parsed so far in current dimension doesn't exceed current dimension size
 							if (nValue.back() == matrix.getDimensionSize(curDimIdx)) { return false; }
 
@@ -217,11 +204,9 @@ bool fromString(CMatrix& matrix, const CString& str)
 				case EParsingStatus::ParsingBufferValue:
 
 					//values end at first whitespace character or ']' character
-					if (std::isspace(*it, locale) == true || *it == CONSTANT_RIGHT_SQUARE_BRACKET)
-					{
+					if (std::isspace(*it, locale) == true || *it == CONSTANT_RIGHT_SQUARE_BRACKET) {
 						//if dimension closing bracket is found
-						if (*it == CONSTANT_RIGHT_SQUARE_BRACKET)
-						{
+						if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) {
 							//move back iterator by one character so that closing bracket is taken into account in EParsingStatus::ParsingBuffer case
 							--it;
 						}
@@ -265,8 +250,7 @@ bool fromString(CMatrix& matrix, const CString& str)
 bool dumpMatrixBuffer(const CMatrix& matrix, std::stringstream& buffer, const size_t index1, size_t& index2)
 {
 	//are we in innermost dimension?
-	if (index1 == matrix.getDimensionCount() - 1)
-	{
+	if (index1 == matrix.getDimensionCount() - 1) {
 		//dimension start
 		for (size_t j = 0; j < index1; ++j) { buffer << CONSTANT_TAB; }
 		buffer << CONSTANT_LEFT_SQUARE_BRACKET;
@@ -277,11 +261,9 @@ bool dumpMatrixBuffer(const CMatrix& matrix, std::stringstream& buffer, const si
 		//dimension end
 		buffer << CONSTANT_SPACE << CONSTANT_RIGHT_SQUARE_BRACKET << CONSTANT_EOL;
 	}
-	else
-	{
+	else {
 		//dump all entries in current dimension
-		for (size_t i = 0; i < matrix.getDimensionSize(index1); ++i)
-		{
+		for (size_t i = 0; i < matrix.getDimensionSize(index1); ++i) {
 			//dimension start
 			for (size_t j = 0; j < index1; ++j) { buffer << CONSTANT_TAB; }
 			buffer << CONSTANT_LEFT_SQUARE_BRACKET << CONSTANT_EOL;
@@ -310,12 +292,10 @@ bool toString(const CMatrix& matrix, CString& str, const size_t precision /* = 6
 	buffer << CONSTANT_LEFT_SQUARE_BRACKET << CONSTANT_EOL;
 
 	//dump labels for each dimension
-	for (size_t i = 0; i < matrix.getDimensionCount(); ++i)
-	{
+	for (size_t i = 0; i < matrix.getDimensionCount(); ++i) {
 		buffer << CONSTANT_TAB << CONSTANT_LEFT_SQUARE_BRACKET;
 
-		for (size_t j = 0; j < matrix.getDimensionSize(i); ++j)
-		{
+		for (size_t j = 0; j < matrix.getDimensionSize(i); ++j) {
 			buffer << CONSTANT_SPACE << CONSTANT_DOUBLE_QUOTE << matrix.getDimensionLabel(i, j) << CONSTANT_DOUBLE_QUOTE;
 		}
 
@@ -413,5 +393,38 @@ bool isContentSimilar(const CMatrix& src1, const CMatrix& src2)
 bool isContentValid(const CMatrix& src, const bool checkNotANumber, const bool checkInfinity) { return src.isBufferValid(checkNotANumber, checkInfinity); }
 
 }  // namespace Matrix
+
+namespace MatrixManipulation {
+
+bool copy(CMatrix& dst, const CMatrix& src)
+{
+	if (&dst == &src) { return true; }
+	dst.copy(src);
+	return true;
+}
+
+bool copyDescription(CMatrix& dst, const CMatrix& src)
+{
+	if (&dst == &src) { return true; }
+	dst.copyDescription(src);
+	return true;
+}
+
+bool copyContent(CMatrix& dst, const CMatrix& src)
+{
+	if (&dst == &src) { return true; }
+	const size_t nElementIn  = src.getBufferElementCount();
+	const size_t nElementOut = dst.getBufferElementCount();
+	if (nElementOut != nElementIn) { return false; }
+	dst.copyContent(src);
+	return true;
+}
+bool clearContent(CMatrix& matrix)
+{
+	matrix.resetBuffer();
+	return true;
+}
+
+}  // namespace MatrixManipulation
 }  // namespace Toolkit
 }  // namespace OpenViBE
diff --git a/toolkit/src/tools/ovtkStimulationSet.cpp b/toolkit/src/tools/ovtkStimulationSet.cpp
index 81bb66e51024ee0c48477b46b97b2ec0532d3368..4210f116c82665c56a83a9af0dcb56a83390bc43 100644
--- a/toolkit/src/tools/ovtkStimulationSet.cpp
+++ b/toolkit/src/tools/ovtkStimulationSet.cpp
@@ -4,49 +4,41 @@ namespace OpenViBE {
 namespace Toolkit {
 namespace StimulationSet {
 
-bool shift(IStimulationSet& stimSet, const uint64_t timeShift)
+bool shift(CStimulationSet& stimSet, const uint64_t timeShift)
 {
-	const size_t count = stimSet.getStimulationCount();
-	for (size_t i = 0; i < count; ++i) { stimSet.setStimulationDate(i, stimSet.getStimulationDate(i) + timeShift); }
+	const size_t count = stimSet.size();
+	for (size_t i = 0; i < count; ++i) { stimSet.setDate(i, stimSet.getDate(i) + timeShift); }
 	return true;
 }
 
-bool copy(IStimulationSet& dst, const IStimulationSet& src, const uint64_t timeShift)
+bool copy(CStimulationSet& dst, const CStimulationSet& src, const uint64_t timeShift)
 {
-	dst.clear();
-	return append(dst, src, timeShift);
+	dst.copy(src, timeShift);
+	return true;
 }
 
-bool append(IStimulationSet& dst, const IStimulationSet& src, const uint64_t timeShift)
+bool append(CStimulationSet& dst, const CStimulationSet& src, const uint64_t timeShift)
 {
-	const size_t count = src.getStimulationCount();
-	for (size_t i = 0; i < count; ++i)
-	{
-		dst.appendStimulation(src.getStimulationIdentifier(i), src.getStimulationDate(i) + timeShift, src.getStimulationDuration(i));
-	}
+	const size_t count = src.size();
+	for (size_t i = 0; i < count; ++i) { dst.push_back(src.getId(i), src.getDate(i) + timeShift, src.getDuration(i)); }
 	return true;
 }
 
-bool appendRange(IStimulationSet& dst, const IStimulationSet& src, const uint64_t srcStartTime, const uint64_t srcEndTime, const uint64_t timeShift)
+bool appendRange(CStimulationSet& dst, const CStimulationSet& src, const uint64_t srcStartTime, const uint64_t srcEndTime, const uint64_t timeShift)
 {
-	const size_t count = src.getStimulationCount();
-	for (size_t i = 0; i < count; ++i)
-	{
-		const uint64_t date = src.getStimulationDate(i);
-		if (srcStartTime <= date && date < srcEndTime)
-		{
-			dst.appendStimulation(src.getStimulationIdentifier(i), src.getStimulationDate(i) + timeShift, src.getStimulationDuration(i));
-		}
+	const size_t count = src.size();
+	for (size_t i = 0; i < count; ++i) {
+		const uint64_t date = src.getDate(i);
+		if (srcStartTime <= date && date < srcEndTime) { dst.push_back(src.getId(i), src.getDate(i) + timeShift, src.getDuration(i)); }
 	}
 	return true;
 }
 
-bool removeRange(IStimulationSet& stimSet, const uint64_t startTime, const uint64_t endTime)
+bool removeRange(CStimulationSet& stimSet, const uint64_t startTime, const uint64_t endTime)
 {
-	for (size_t i = 0; i < stimSet.getStimulationCount(); ++i)
-	{
-		const uint64_t date = stimSet.getStimulationDate(i);
-		if (startTime <= date && date < endTime) { stimSet.removeStimulation(i--); }
+	for (size_t i = 0; i < stimSet.size(); ++i) {
+		const uint64_t date = stimSet.getDate(i);
+		if (startTime <= date && date < endTime) { stimSet.erase(i--); }
 	}
 	return true;
 }
diff --git a/unit-test/CMakeLists.txt b/unit-test/CMakeLists.txt
index 2087f3e6193db25e910eadbfb54b0d37c64ab57a..1a6bec2714438444ce10f12b4aa641c3e04140ad 100755
--- a/unit-test/CMakeLists.txt
+++ b/unit-test/CMakeLists.txt
@@ -16,22 +16,6 @@ endif()
 set(OVT_CMAKE_DIR ${OV_BASE_DIR}/cmake-modules)
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${OVT_CMAKE_DIR})
 
-# Modify library prefixes and suffixes to comply to Windows or Linux naming
-if(WIN32)
-	SET(CMAKE_FIND_LIBRARY_PREFIXES "")
-	SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
-elseif(APPLE)
-	SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
-	SET(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".a")
-else()
-	SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
-	SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
-endif()
-
-set(GTEST_ROOT ${LIST_DEPENDENCIES_PATH}/${CMAKE_FIND_LIBRARY_PREFIXES}gtest)
-find_package(GTest REQUIRED)
-include_directories(${GTEST_INCLUDE_DIRS})
-
 # --------------------
 # Test configuration
 # --------------------
@@ -103,5 +87,4 @@ add_subdirectory(openvibe-module-xml)
 add_subdirectory(openvibe-module-socket)
 add_subdirectory(openvibe-module-system)
 add_subdirectory(openvibe-toolkit)
-add_subdirectory(openvibe-kernel)
 add_subdirectory(openvibe-plugin-stream-codecs)
diff --git a/unit-test/openvibe-kernel/CMakeLists.txt b/unit-test/openvibe-kernel/CMakeLists.txt
deleted file mode 100755
index 9e9b4b90d9d1e198d226f74434a453a2c71325cc..0000000000000000000000000000000000000000
--- a/unit-test/openvibe-kernel/CMakeLists.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-#######################################################################
-# Software License Agreement (AGPL-3 License)
-#
-# OpenViBE SDK Test Software
-# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
-# Copyright (C) Inria, 2015-2017,V1.0
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License version 3,
-# as published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.
-# If not, see <http://www.gnu.org/licenses/>.
-#######################################################################
-
-project(openvibe-kernel-test VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION})
-
-# ---------------------------------
-# Target macros
-# Defines target operating system, architecture and compiler
-# ---------------------------------
-SET_BUILD_PLATFORM()
-
-# ----------------------
-# Configure test target
-# ----------------------
-
-# Test that needs to called with parameters
-set(TEST_WITH_PARAM
-	urErrorManagerTest.cpp
-)
-
-# Test that needs to called without parameters
-set(TEST_NO_PARAM
-)
-
-# Create test sources list
-# This macro auto-generate ${PROJECT_NAME}.cpp
-# in the build tree. ${PROJECT_NAME}.cpp is
-# the test driver called by ctest to run
-# the different tests added to this target.
-create_test_sourcelist (Tests
-	${PROJECT_NAME}.cpp
-	${TEST_WITH_PARAM}
-	${TEST_NO_PARAM}
-	)
-
-add_executable(${PROJECT_NAME} ${Tests})
-
-set_target_properties(${PROJECT_NAME} PROPERTIES
-                      FOLDER ${TESTS_FOLDER})
-
-target_link_libraries(${PROJECT_NAME}
-                      openvibe
-                      openvibe-common
-                      ${OVT_UNIT_TOOLKIT_LIB}
-                      ${GTEST_BOTH_LIBRARIES}
-                      ${OV_LIBS})
-
-# Add test without parameter to driver
-foreach(test ${TEST_NO_PARAM})
-	get_filename_component(TName ${test} NAME_WE)
-	add_test(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName})
-endforeach()
-
-# Add test with parameter to driver
-add_test(NAME urErrorManagerTest COMMAND ${PROJECT_NAME} urErrorManagerTest "${OVT_OPENVIBE_DATA}/kernel/openvibe.conf")
diff --git a/unit-test/openvibe-kernel/urErrorManagerTest.cpp b/unit-test/openvibe-kernel/urErrorManagerTest.cpp
deleted file mode 100755
index 444870e7c679f2fd5676abb80f4bc653c64eb950..0000000000000000000000000000000000000000
--- a/unit-test/openvibe-kernel/urErrorManagerTest.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-#include <iostream>
-
-#include "gtest/gtest.h"
-
-#include "ovtAssert.h"
-#include "ovtTestFixtureCommon.h"
-
-// DO NOT USE a global Test::ScopedTest<Test::SKernelFixture> variable here
-// because it causes a bug due to plugins global descriptors beeing destroyed before the kernel context.
-OpenViBE::Kernel::IKernelContext* context = nullptr;
-
-TEST(error_manager_test_case, test_init)
-{
-	// here we use assert because we want to fail directly
-	// in order to avoid a segfault
-	ASSERT_TRUE(context != nullptr);
-
-	auto& errorManager = context->getErrorManager();
-
-	// check manager is correctly initialized
-	EXPECT_FALSE(errorManager.hasError());
-	EXPECT_TRUE(errorManager.getLastError() == nullptr);
-	EXPECT_TRUE(std::string(errorManager.getLastErrorString()).empty());
-	EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::NoErrorFound);
-
-	EXPECT_NO_THROW(errorManager.releaseErrors());
-}
-
-TEST(error_manager_test_case, test_push)
-{
-	// here we use assert because we want to fail directly
-	// in order to avoid a segfault
-	ASSERT_TRUE(context != nullptr);
-
-	auto& errorManager = context->getErrorManager();
-
-	// push an error
-	errorManager.pushError(OpenViBE::Kernel::ErrorType::Overflow, "An integer overflow error occurred");
-
-	EXPECT_TRUE(errorManager.hasError());
-	EXPECT_STREQ(errorManager.getLastErrorString(), "An integer overflow error occurred");
-	EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::Overflow);
-
-	// test match error features returned direclty by manager match error features
-	auto error = errorManager.getLastError();
-
-	ASSERT_TRUE(error != nullptr);
-	EXPECT_STREQ(error->getErrorString(), "An integer overflow error occurred");
-	EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::Overflow);
-	EXPECT_STREQ(error->getErrorLocation(), "NoLocationInfo:0");
-	EXPECT_TRUE(error->getNestedError() == nullptr);
-
-	// push another error
-	errorManager.pushErrorAtLocation(OpenViBE::Kernel::ErrorType::BadAlloc, "Memory allocation failed", "urErrorManagerTest.cpp", 64);
-
-	// test top error has changed
-	EXPECT_STREQ(errorManager.getLastErrorString(), "Memory allocation failed");
-	EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::BadAlloc);
-
-	error = errorManager.getLastError();
-	ASSERT_TRUE(error != nullptr);
-	EXPECT_STREQ(error->getErrorString(), "Memory allocation failed");
-	EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::BadAlloc);
-	EXPECT_STREQ(error->getErrorLocation(), "urErrorManagerTest.cpp:64");
-
-	auto nestedError = error->getNestedError();
-	ASSERT_TRUE(nestedError != nullptr);
-	EXPECT_STREQ(nestedError->getErrorString(), "An integer overflow error occurred");
-	EXPECT_EQ(nestedError->getErrorType(), OpenViBE::Kernel::ErrorType::Overflow);
-	EXPECT_STREQ(nestedError->getErrorLocation(), "NoLocationInfo:0");
-	EXPECT_TRUE(nestedError->getNestedError() == nullptr);
-}
-
-TEST(error_manager_test_case, test_release)
-{
-	// here we use assert because we want to fail directly
-	// in order to avoid a segfault
-	ASSERT_TRUE(context != nullptr);
-
-	auto& errorManager = context->getErrorManager();
-	errorManager.releaseErrors();
-
-	// check manager is correctly released
-	EXPECT_FALSE(errorManager.hasError());
-	EXPECT_TRUE(errorManager.getLastError() == nullptr);
-	EXPECT_TRUE(std::string(errorManager.getLastErrorString()).empty());
-	EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::NoErrorFound);
-
-	// add an error after release
-	errorManager.pushErrorAtLocation(OpenViBE::Kernel::ErrorType::ResourceNotFound, "File not found on system", "urErrorManagerTest.cpp", 93);
-
-	EXPECT_TRUE(errorManager.hasError());
-	EXPECT_STREQ(errorManager.getLastErrorString(), "File not found on system");
-	EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::ResourceNotFound);
-
-	auto error = errorManager.getLastError();
-
-	ASSERT_TRUE(error != nullptr);
-	EXPECT_STREQ(error->getErrorString(), "File not found on system");
-	EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::ResourceNotFound);
-	EXPECT_STREQ(error->getErrorLocation(), "urErrorManagerTest.cpp:93");
-	EXPECT_TRUE(error->getNestedError() == nullptr);
-}
-
-TEST(error_manager_test_case, test_stress_push)
-{
-	// here we use assert because we want to fail directly
-	// in order to avoid a segfault
-	ASSERT_TRUE(context != nullptr);
-
-	auto& errorManager = context->getErrorManager();
-
-	errorManager.releaseErrors();
-	const size_t expectedErrorCount = 10;
-	for (size_t i = 0; i < expectedErrorCount; ++i) { errorManager.pushError(OpenViBE::Kernel::ErrorType::Unknown, "Error"); }
-
-	size_t errorCount = 0;
-	auto error        = errorManager.getLastError();
-	while (error)
-	{
-		errorCount++;
-		error = error->getNestedError();
-	}
-
-	EXPECT_EQ(errorCount, expectedErrorCount);
-}
-
-int urErrorManagerTest(int argc, char* argv[])
-{
-	OVT_ASSERT(argc >= 2, "Failure retrieve test parameters");
-
-	OpenViBE::Test::ScopedTest<OpenViBE::Test::SKernelFixture> fixture;
-	fixture->setConfigFile(argv[1]);
-
-	context = fixture->context;
-
-	testing::InitGoogleTest(&argc, argv);
-	::testing::GTEST_FLAG(filter) = "error_manager_test_case.*";
-	return RUN_ALL_TESTS();
-}
diff --git a/unit-test/openvibe-module-csv/CMakeLists.txt b/unit-test/openvibe-module-csv/CMakeLists.txt
index 0004f3b032b40698be58b7843504a52f22b08902..6f1c19aacb98ab74df06a9133dd78e70a503a1bb 100755
--- a/unit-test/openvibe-module-csv/CMakeLists.txt
+++ b/unit-test/openvibe-module-csv/CMakeLists.txt
@@ -38,8 +38,7 @@ set(TEST_WITH_PARAM
 )
 
 # Test that needs to called without parameters
-set(TEST_NO_PARAM
-)
+set(TEST_NO_PARAM)
 
 # Create test sources list
 # This macro auto-generate ${PROJECT_NAME}.cpp
@@ -50,16 +49,18 @@ create_test_sourcelist (Tests
 	${PROJECT_NAME}.cpp
 	${TEST_WITH_PARAM}
 	${TEST_NO_PARAM}
-	)
+)
 
 add_executable(${PROJECT_NAME} ${Tests})
 
 target_link_libraries(${PROJECT_NAME}
-                      openvibe
-                      openvibe-module-csv 
-                      ${OVT_UNIT_TOOLKIT_LIB}
-                      ${GTEST_BOTH_LIBRARIES}
-                      ${OV_LIBS} ${OV_MODULE_CSV})
+					  openvibe
+					  openvibe-module-csv
+					  ${OVT_UNIT_TOOLKIT_LIB}
+					  ${OV_LIBS} ${OV_MODULE_CSV}
+					  GTest::GTest
+					  GTest::Main
+)
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
                       FOLDER ${TESTS_FOLDER})
diff --git a/unit-test/openvibe-module-fs/CMakeLists.txt b/unit-test/openvibe-module-fs/CMakeLists.txt
index e4662da1b599b268bc3636732a654129f1f52198..bd12097d123ba6644c96e6e1428be874ac328546 100755
--- a/unit-test/openvibe-module-fs/CMakeLists.txt
+++ b/unit-test/openvibe-module-fs/CMakeLists.txt
@@ -28,12 +28,15 @@ SET_BUILD_PLATFORM()
 
 add_executable(${PROJECT_NAME} uoFilesTestUTF.cpp)
 
-target_link_libraries(${PROJECT_NAME} 
-                      ${GTEST_BOTH_LIBRARIES}
-                      openvibe
-                      openvibe-common
-                      openvibe-module-fs
-                      openvibe-test-unit-toolkit
+target_link_libraries(${PROJECT_NAME}
+					  openvibe
+					  openvibe-common
+					  openvibe-module-fs
+					  openvibe-test-unit-toolkit
+					  Boost::boost
+					  Boost::filesystem
+					  GTest::GTest
+					  GTest::Main
 )
 
 set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER})	# Place project in folder unit-test (for some IDE)
@@ -41,9 +44,6 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER})	# Place pro
 add_definitions("-DDATA_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/data\"")
 add_definitions("-DTMP_DIR=\"${OVT_TEST_TEMPORARY_DIR}\"")
 
-include("FindThirdPartyBoost")
-include("FindThirdPartyBoost_FileSystem")
-
 add_test(NAME uoFSTestUTF COMMAND ${PROJECT_NAME})
 
 #######################################################################
diff --git a/unit-test/openvibe-module-system/CMakeLists.txt b/unit-test/openvibe-module-system/CMakeLists.txt
index 3758cc65b4efa75635ab88543fda6744b0e280f4..99c1a45f7452b67bccf208f31f59439cbb106dd7 100755
--- a/unit-test/openvibe-module-system/CMakeLists.txt
+++ b/unit-test/openvibe-module-system/CMakeLists.txt
@@ -55,11 +55,13 @@ create_test_sourcelist(Tests
 add_executable(${PROJECT_NAME} ${Tests})
 
 target_link_libraries(${PROJECT_NAME}
-                      ${GTEST_BOTH_LIBRARIES}
-                      openvibe
-                      openvibe-common
-                      openvibe-module-system
-                      openvibe-test-unit-toolkit)
+					  openvibe
+					  openvibe-common
+					  openvibe-module-system
+					  openvibe-test-unit-toolkit
+					  GTest::GTest
+					  GTest::Main
+)
 
 set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER})
 
diff --git a/unit-test/openvibe-module-xml/CMakeLists.txt b/unit-test/openvibe-module-xml/CMakeLists.txt
index 82125a2fc4b3f3f7b659753e25522e48dcf16fa0..128768f57afd30dbf48f0b62e06d1217a4b16c8e 100755
--- a/unit-test/openvibe-module-xml/CMakeLists.txt
+++ b/unit-test/openvibe-module-xml/CMakeLists.txt
@@ -18,19 +18,19 @@
 # along with this program.
 # If not, see <http://www.gnu.org/licenses/>.
 #######################################################################
-
 function(SETUP_TEST)
 	SET_BUILD_PLATFORM()
 
 	target_link_libraries(${PROJECT_NAME}
-                          ${GTEST_BOTH_LIBRARIES}
-                          openvibe
-                          openvibe-common
-                          openvibe-module-xml
-                          openvibe-module-fs)
-	
-	include("FindThirdPartyBoost")
-	include("FindThirdPartyBoost_FileSystem")
+						  openvibe
+						  openvibe-common
+						  openvibe-module-xml
+						  openvibe-module-fs
+						  Boost::boost
+						  Boost::filesystem
+						  GTest::GTest
+						  GTest::Main
+	)
 	
 	set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER})	# Place project in folder unit-test (for some IDE)
 
diff --git a/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt b/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt
index e3a851250aac894ccc59d1c8cefec6fe330863c9..107e2f594dab4b371bbd03dc151a9a737596e40c 100755
--- a/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt
+++ b/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt
@@ -24,9 +24,11 @@ function(SETUP_TEST)
 	SET_BUILD_PLATFORM()
 
 	target_link_libraries(${PROJECT_NAME}
-                          ${GTEST_BOTH_LIBRARIES}
-                          openvibe
-                          openvibe-common)
+						  openvibe
+						  openvibe-common
+						  GTest::GTest
+						  GTest::Main
+	)
 endfunction()
 
 project(openvibe-plugin-stream-codecs-test VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION})
diff --git a/unit-test/openvibe-toolkit/CMakeLists.txt b/unit-test/openvibe-toolkit/CMakeLists.txt
index 5c13ec6becde9d71c93c871f3c7425b9ff475e15..fd007f8a058990565367e4aafefc0e0a76d6f461 100755
--- a/unit-test/openvibe-toolkit/CMakeLists.txt
+++ b/unit-test/openvibe-toolkit/CMakeLists.txt
@@ -58,12 +58,14 @@ create_test_sourcelist(Tests
 add_executable(${PROJECT_NAME} ${Tests})
 
 target_link_libraries(${PROJECT_NAME}
-                      ${GTEST_BOTH_LIBRARIES}
-                      openvibe
-                      openvibe-common
-                      openvibe-module-system
-                      openvibe-toolkit
-                      openvibe-test-unit-toolkit)
+					  openvibe
+					  openvibe-common
+					  openvibe-module-system
+					  openvibe-toolkit
+					  openvibe-test-unit-toolkit
+					  GTest::GTest
+					  GTest::Main
+)
 
 SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER})
 
diff --git a/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs b/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs
index 753a12c0ec59a000088695b735665ee5c2021926..f6f2f18e406f8bfe67ee8361d5fe00180114f694 100755
--- a/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs
+++ b/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs
@@ -115,7 +115,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Interstimulation interval (in sec)</Name>
 					<DefaultValue>1.0</DefaultValue>
-					<Value>1.0</Value>
+					<Value>1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
diff --git a/unit-test/ov-base/CErrorManagerTest.hpp b/unit-test/ov-base/CErrorManagerTest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..1285dfc3b95ba19bdd925472b7a02a311f6a2750
--- /dev/null
+++ b/unit-test/ov-base/CErrorManagerTest.hpp
@@ -0,0 +1,135 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CErrorManagerTests.hpp
+/// \brief Test Definitions for OpenViBE CErrorManager Class.
+/// \author Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 08/11/2021.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+#include <gtest/gtest.h>
+#include <openvibe/kernel/error/CErrorManager.hpp>
+
+
+// DO NOT USE a global Test::ScopedTest<Test::SKernelFixture> variable here
+// because it causes a bug due to plugins global descriptors beeing destroyed before the kernel context.
+
+
+//---------------------------------------------------------------------------------------------------
+class CErrorManager_Tests : public testing::Test
+{
+protected:
+	OpenViBE::Kernel::CErrorManager m_errorManager;
+};
+
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CErrorManager_Tests, Init)
+{
+	// check manager is correctly initialized
+	EXPECT_FALSE(m_errorManager.hasError());
+	EXPECT_TRUE(m_errorManager.getLastError() == nullptr);
+	EXPECT_TRUE(std::string(m_errorManager.getLastErrorString()).empty());
+	EXPECT_EQ(m_errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::NoErrorFound);
+	EXPECT_NO_THROW(m_errorManager.releaseErrors());
+}
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CErrorManager_Tests, Push)
+{
+	// push an error
+	m_errorManager.pushError(OpenViBE::Kernel::ErrorType::Overflow, std::string("An integer overflow error occurred"));
+
+	EXPECT_TRUE(m_errorManager.hasError());
+	EXPECT_STREQ(m_errorManager.getLastErrorString(), "An integer overflow error occurred");
+	EXPECT_EQ(m_errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::Overflow);
+
+	// test match error features returned direclty by manager match error features
+	const auto* error = m_errorManager.getLastError();
+
+	ASSERT_TRUE(error != nullptr);
+	EXPECT_STREQ(error->getErrorString(), "An integer overflow error occurred");
+	EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::Overflow);
+	EXPECT_STREQ(error->getErrorLocation(), "NoLocationInfo:0");
+	EXPECT_TRUE(error->getNestedError() == nullptr);
+
+	// push another error
+	m_errorManager.pushError(OpenViBE::Kernel::ErrorType::BadAlloc, "Memory allocation failed", "urErrorManagerTest.cpp", 64);
+
+	// test top error has changed
+	EXPECT_STREQ(m_errorManager.getLastErrorString(), "Memory allocation failed");
+	EXPECT_EQ(m_errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::BadAlloc);
+
+	error = m_errorManager.getLastError();
+	ASSERT_TRUE(error != nullptr);
+	EXPECT_STREQ(error->getErrorString(), "Memory allocation failed");
+	EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::BadAlloc);
+	EXPECT_STREQ(error->getErrorLocation(), "urErrorManagerTest.cpp:64");
+
+	const auto* const nestedError = error->getNestedError();
+	ASSERT_TRUE(nestedError != nullptr);
+	EXPECT_STREQ(nestedError->getErrorString(), "An integer overflow error occurred");
+	EXPECT_EQ(nestedError->getErrorType(), OpenViBE::Kernel::ErrorType::Overflow);
+	EXPECT_STREQ(nestedError->getErrorLocation(), "NoLocationInfo:0");
+	EXPECT_TRUE(nestedError->getNestedError() == nullptr);
+}
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CErrorManager_Tests, Release)
+{
+	m_errorManager.releaseErrors();
+
+	// check manager is correctly released
+	EXPECT_FALSE(m_errorManager.hasError());
+	EXPECT_TRUE(m_errorManager.getLastError() == nullptr);
+	EXPECT_TRUE(std::string(m_errorManager.getLastErrorString()).empty());
+	EXPECT_EQ(m_errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::NoErrorFound);
+
+	// add an error after release
+	m_errorManager.pushError(OpenViBE::Kernel::ErrorType::ResourceNotFound, "File not found on system", "urErrorManagerTest.cpp", 93);
+
+	EXPECT_TRUE(m_errorManager.hasError());
+	EXPECT_STREQ(m_errorManager.getLastErrorString(), "File not found on system");
+	EXPECT_EQ(m_errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::ResourceNotFound);
+
+	const auto* error = m_errorManager.getLastError();
+
+	ASSERT_TRUE(error != nullptr);
+	EXPECT_STREQ(error->getErrorString(), "File not found on system");
+	EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::ResourceNotFound);
+	EXPECT_STREQ(error->getErrorLocation(), "urErrorManagerTest.cpp:93");
+	EXPECT_TRUE(error->getNestedError() == nullptr);
+}
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CErrorManager_Tests, StressPush)
+{
+	m_errorManager.releaseErrors();
+	const size_t expectedErrorCount = 10;
+	for (size_t i = 0; i < expectedErrorCount; ++i) { m_errorManager.pushError(OpenViBE::Kernel::ErrorType::Unknown, std::string("Error")); }
+
+	size_t errorCount = 0;
+	const auto* error = m_errorManager.getLastError();
+	while (error) {
+		errorCount++;
+		error = error->getNestedError();
+	}
+
+	EXPECT_EQ(errorCount, expectedErrorCount);
+}
diff --git a/unit-test/ov-base/CIdentifierTest.hpp b/unit-test/ov-base/CIdentifierTest.hpp
index c3767248ae0d9c91862a52837dc82f94566f9356..59376094d3ae7ad069b0f12b105d80919bc90049 100644
--- a/unit-test/ov-base/CIdentifierTest.hpp
+++ b/unit-test/ov-base/CIdentifierTest.hpp
@@ -1,11 +1,24 @@
 ///-------------------------------------------------------------------------------------------------
 /// 
-/// \file CIdentifierTest.hpp
+/// \file CIdentifierTests.hpp
 /// \brief Test Definitions for OpenViBE Identifier Class.
 /// \author Thibaut Monseigne (Inria).
 /// \version 1.0.
 /// \date 23/06/2020.
-/// \copyright <a href="https://choosealicense.com/licenses/agpl-3.0/">GNU Affero General Public License v3.0</a>.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
 /// 
 ///-------------------------------------------------------------------------------------------------
 
diff --git a/unit-test/ov-base/CMakeLists.txt b/unit-test/ov-base/CMakeLists.txt
index 327e2b50bec928734cc4cb4c21adf7cc8474d402..064fb36323ed365352bd8755a56c0f2c25131c18 100644
--- a/unit-test/ov-base/CMakeLists.txt
+++ b/unit-test/ov-base/CMakeLists.txt
@@ -11,9 +11,11 @@ file(GLOB_RECURSE SRC_FILES *.cpp *.hpp)
 add_executable(${PROJECT_NAME} ${SRC_FILES})
 
 target_link_libraries(${PROJECT_NAME}
-                      ${GTEST_BOTH_LIBRARIES}
-                      openvibe
-                      openvibe-common)
+					  openvibe
+					  openvibe-common
+					  GTest::GTest
+					  GTest::Main
+)
 
 set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER})  # Place project in folder unit-test (for some IDE)
 
diff --git a/unit-test/ov-base/CMatrixTest.hpp b/unit-test/ov-base/CMatrixTest.hpp
index 42c1e8001a69fef2f0096fcab4a8278612ced050..f60891cc2834f77deff5bdfe6d2f2cc267d3dd26 100644
--- a/unit-test/ov-base/CMatrixTest.hpp
+++ b/unit-test/ov-base/CMatrixTest.hpp
@@ -1,11 +1,24 @@
 ///-------------------------------------------------------------------------------------------------
 /// 
-/// \file CMatrixTest.hpp
+/// \file CMatrixTests.hpp
 /// \brief Test Definitions for OpenViBE Matrix Class.
 /// \author Thibaut Monseigne (Inria).
 /// \version 1.0.
 /// \date 11/05/2020.
-/// \copyright <a href="https://choosealicense.com/licenses/agpl-3.0/">GNU Affero General Public License v3.0</a>.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
 /// 
 ///-------------------------------------------------------------------------------------------------
 
@@ -122,6 +135,23 @@ TEST_F(CMatrix_Tests, Operators)
 }
 //---------------------------------------------------------------------------------------------------
 
+//---------------------------------------------------------------------------------------------------
+TEST_F(CMatrix_Tests, SetBuffer)
+{
+	OpenViBE::CMatrix res(1, 2);
+	std::vector<double> buffer = { 10, 20 };
+	EXPECT_TRUE(res.setBuffer(buffer)) << "setBuffer function fail.";
+	EXPECT_TRUE(AlmostEqual(10, res.getBuffer()[0])) << "Matrix 1st value isn't 10.";
+	EXPECT_TRUE(AlmostEqual(20, res.getBuffer()[1])) << "Matrix 2nd value isn't 20.";
+
+	buffer = { 1, 2, 3 };
+	EXPECT_FALSE(res.setBuffer(buffer)) << "setBuffer function must fail with bad input.";
+	EXPECT_TRUE(res.setBuffer(buffer.data(),1)) << "setBuffer function fail.";
+	EXPECT_TRUE(AlmostEqual(1, res.getBuffer()[0])) << "Matrix 1st value isn't 1.";
+	EXPECT_TRUE(AlmostEqual(20, res.getBuffer()[1])) << "Matrix 2nd value isn't 20.";
+}
+//---------------------------------------------------------------------------------------------------
+
 //---------------------------------------------------------------------------------------------------
 TEST_F(CMatrix_Tests, Resize)
 {
diff --git a/unit-test/ov-base/CNameValuePairListTest.hpp b/unit-test/ov-base/CNameValuePairListTest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..e745bf92d8009cbf2455d1ab8e31647b7152949a
--- /dev/null
+++ b/unit-test/ov-base/CNameValuePairListTest.hpp
@@ -0,0 +1,80 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CNameValuePairListTest.hpp
+/// \brief Test Definitions for OpenViBE Name/Value Pair List Class.
+/// \author Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 24/11/2021.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include <gtest/gtest.h>
+#include <openvibe/CNameValuePairList.hpp>
+
+//---------------------------------------------------------------------------------------------------
+class CNameValuePairList_Tests : public testing::Test
+{
+protected:
+	OpenViBE::CNameValuePairList m_list;
+
+	const std::string m_sValue = "String Value", m_dValue = "Double Value", m_bValue = "Boolean Value";
+
+	void SetUp() override
+	{
+		m_list.setValue(m_sValue, std::string("string"));
+		m_list.setValue(m_dValue, 72.14);
+		m_list.setValue(m_bValue, true);
+	}
+};
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CNameValuePairList_Tests, Constructor)
+{
+	const OpenViBE::CNameValuePairList res;
+	ASSERT_TRUE(0 == res.size()) << "Default constructor doesn't have a size of 0.";
+	ASSERT_TRUE(3 == m_list.size()) << "Setup Name/Value Pair List doesn't have 3 values.";
+
+	std::string s;
+	double d = 0;
+	bool b   = false;
+	ASSERT_FALSE(m_list.getValue(std::string("false value"), s)) << "Setup Name/Value Pair List have false value.";
+	ASSERT_TRUE(m_list.getValue(m_sValue, s)) << "Setup Name/Value Pair List Haven't String value.";
+	ASSERT_TRUE(m_list.getValue(m_dValue, d)) << "Setup Name/Value Pair List Haven't Double value.";
+	ASSERT_TRUE(m_list.getValue(m_bValue, b)) << "Setup Name/Value Pair List Haven't Boolean value.";
+
+	ASSERT_TRUE(s == "string") << "Setup Name/Value Pair List String value doesn't match : " << s << " instead string";
+	ASSERT_TRUE(std::abs(d - 72.14) < OV_EPSILON) << "Setup Name/Value Pair List Double value doesn't match : " << d << " instead 72.14";
+	ASSERT_TRUE(b == true) << "Setup Name/Value Pair List Boolean value doesn't match : " << b << " instead true";
+
+	// Take count of the order of map.
+	std::string name0, name1, name2, value0, value1, value2;
+	ASSERT_TRUE(m_list.getValue(0, name0, value0)) << "Setup Name/Value Pair List Haven't Value 0.";
+	ASSERT_TRUE(m_list.getValue(1, name1, value1)) << "Setup Name/Value Pair List Haven't Value 1.";
+	ASSERT_TRUE(m_list.getValue(2, name2, value2)) << "Setup Name/Value Pair List Haven't Value 2.";
+
+	ASSERT_TRUE(name0 == m_bValue) << "Setup Name/Value Pair List name 0 doesn't match : " << name0 << " instead " << m_bValue;
+	ASSERT_TRUE(name1 == m_dValue) << "Setup Name/Value Pair List name 1 doesn't match : " << name1 << " instead " << m_dValue;
+	ASSERT_TRUE(name2 == m_sValue) << "Setup Name/Value Pair List name 2 doesn't match : " << name2 << " instead " << m_sValue;
+
+	ASSERT_TRUE(value0 == "1") << "Setup Name/Value Pair List value 0 doesn't match : " << value0 << " instead 1";
+	ASSERT_TRUE(std::abs(std::stod(value1) - 72.14) < OV_EPSILON) << "Setup Name/Value Pair List value 1 doesn't match : " << value1 << " instead 72.14";
+	ASSERT_TRUE(value2 == "string") << "Setup Name/Value Pair List value 2 doesn't match : " << value2 << " instead string";
+
+	std::cout << m_list;
+}
diff --git a/unit-test/ov-base/CStimulationSetTest.hpp b/unit-test/ov-base/CStimulationSetTest.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..19ea5681bc9245222f2e352a240bf4bc8c06d641
--- /dev/null
+++ b/unit-test/ov-base/CStimulationSetTest.hpp
@@ -0,0 +1,130 @@
+///-------------------------------------------------------------------------------------------------
+/// 
+/// \file CStimulationSetTests.hpp
+/// \brief Test Definitions for OpenViBE Stimulation Set Class.
+/// \author Thibaut Monseigne (Inria).
+/// \version 1.0.
+/// \date 08/11/2021.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+/// 
+///-------------------------------------------------------------------------------------------------
+
+#pragma once
+
+#include <gtest/gtest.h>
+#include <openvibe/CStimulationSet.hpp>
+
+//---------------------------------------------------------------------------------------------------
+class CStimulationSet_Tests : public testing::Test
+{
+protected:
+	OpenViBE::CStimulationSet m_set;
+
+	void SetUp() override
+	{
+		m_set.push_back(0, 1, 2);
+		m_set.push_back(3, 4, 5);
+		m_set.push_back(6, 7, 8);
+		// [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
+	}
+};
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CStimulationSet_Tests, Constructor)
+{
+	const OpenViBE::CStimulationSet res;
+
+	// [[0, 1, 2], [9, 10, 11], [3, 4, 5], [6, 7, 8]]
+	ASSERT_EQ(0, res.size()) << "Default constructor doesn't have a size of 0.";
+	ASSERT_EQ(3, m_set.size()) << "Setup Stimulation Set doesn't have 3 values.";
+	ASSERT_EQ(0, m_set.getId(0)) << "Setup Stimulation Set 1rst Stimulation Id isn't 0.";
+	ASSERT_EQ(1, m_set.getDate(0)) << "Setup Stimulation Set 1rst Stimulation Date isn't 1.";
+	ASSERT_EQ(2, m_set.getDuration(0)) << "Setup Stimulation Set 1rst Stimulation Duration isn't 2.";
+	ASSERT_EQ(3, m_set.getId(1)) << "Setup Stimulation Set 2nd Stimulation Id isn't 3.";
+	ASSERT_EQ(4, m_set.getDate(1)) << "Setup Stimulation Set 2nd Stimulation Date isn't 4.";
+	ASSERT_EQ(5, m_set.getDuration(1)) << "Setup Stimulation Set 2nd Stimulation Duration isn't 5.";
+	ASSERT_EQ(6, m_set.getId(2)) << "Setup Stimulation Set 3rd Stimulation Id isn't 6.";
+	ASSERT_EQ(7, m_set.getDate(2)) << "Setup Stimulation Set 3rd Stimulation Date isn't 7.";
+	ASSERT_EQ(8, m_set.getDuration(2)) << "Setup Stimulation Set 3rd Stimulation Duration isn't 8.";
+	std::cout << m_set;
+}
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CStimulationSet_Tests, Accessor)
+{
+	OpenViBE::CStimulationSet res;
+	res.resize(3);
+	res.setId(0, m_set.getId(0));
+	res.setDate(0, m_set.getDate(0));
+	res.setDuration(0, m_set.getDuration(0));
+	res.setId(1, m_set.getId(1));
+	res.setDate(1, m_set.getDate(1));
+	res.setDuration(2, m_set.getDuration(2));
+	res.setId(2, m_set.getId(2));
+	res.setDate(2, m_set.getDate(2));
+	res.setDuration(1, m_set.getDuration(1));
+
+	// [[0, 1, 2], [9, 10, 11], [3, 4, 5], [6, 7, 8]]
+	ASSERT_EQ(res.size(), m_set.size()) << "Stimulation Set size are not equals.";
+	ASSERT_EQ(res.getId(0), m_set.getId(0)) << "Stimulation Set 1rst Stimulation Id are not equals.";
+	ASSERT_EQ(res.getDate(0), m_set.getDate(0)) << "Stimulation Set 1rst Stimulation Date are not equals.";
+	ASSERT_EQ(res.getDuration(0), m_set.getDuration(0)) << "Stimulation Set 1rst Stimulation Duration are not equals.";
+	ASSERT_EQ(res.getId(1), m_set.getId(1)) << "Stimulation Set 2nd Stimulation Id are not equals.";
+	ASSERT_EQ(res.getDate(1), m_set.getDate(1)) << "Stimulation Set 2nd Stimulation Date are not equals.";
+	ASSERT_EQ(res.getDuration(1), m_set.getDuration(1)) << "Stimulation Set 2nd Stimulation Duration are not equals.";
+	ASSERT_EQ(res.getId(2), m_set.getId(2)) << "Stimulation Set 3rd Stimulation Id are not equals.";
+	ASSERT_EQ(res.getDate(2), m_set.getDate(2)) << "Stimulation Set 3rd Stimulation Date are not equals.";
+	ASSERT_EQ(res.getDuration(2), m_set.getDuration(2)) << "Stimulation Set 3rd Stimulation Duration are not equals.";
+}
+
+//---------------------------------------------------------------------------------------------------
+TEST_F(CStimulationSet_Tests, Manipulation)
+{
+	const OpenViBE::CStimulationSet res;
+	res.copy(m_set);				// [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
+	ASSERT_EQ(3, res.size()) << "Stimulation Set doesn't have 3 values.";
+
+	res.insert(1, 9, 10, 11);		// [[0, 1, 2], [9, 10, 11], [3, 4, 5], [6, 7, 8]]
+	ASSERT_EQ(4, res.size()) << "Stimulation Set doesn't have 4 values.";
+	ASSERT_EQ(9, res.getId(1)) << "Inserted Stimulation Id isn't 9.";
+	ASSERT_EQ(10, res.getDate(1)) << "Inserted Stimulation Date isn't 10.";
+	ASSERT_EQ(11, res.getDuration(1)) << "Inserted Stimulation Duration isn't 11.";
+
+	res.erase(2);					// [[0, 1, 2], [9, 10, 11], [6, 7, 8]]
+	ASSERT_EQ(3, res.size()) << "Stimulation Set doesn't have 3 values.";
+	ASSERT_EQ(6, res.getId(2)) << "After remove Stimulation Id isn't 6.";
+	ASSERT_EQ(7, res.getDate(2)) << "After remove Stimulation Date isn't 7.";
+	ASSERT_EQ(8, res.getDuration(2)) << "After remove Stimulation Duration isn't 8.";
+
+	res.append(res, 10);			// [[0, 1, 2], [9, 10, 11], [6, 7, 8], [0, 11, 2], [9, 20, 11], [6, 17, 8]]
+	ASSERT_EQ(6, res.size()) << "Stimulation Set doesn't have 6 values.";
+	ASSERT_EQ(11, res.getDate(3)) << "After append Stimulation Date isn't 11.";
+	ASSERT_EQ(20, res.getDate(4)) << "After append Stimulation Date isn't 20.";
+	ASSERT_EQ(17, res.getDate(5)) << "After append Stimulation Date isn't 17.";
+
+	res.appendRange(res, 18, 22);	// [[0, 1, 2], [9, 10, 11], [6, 7, 8], [0, 11, 2], [9, 20, 11], [6, 17, 8], [9, 20, 11]]
+	ASSERT_EQ(7, res.size()) << "Stimulation Set doesn't have 7 values.";
+	ASSERT_EQ(20, res.getDate(6)) << "After append Stimulation Date isn't 20.";
+
+	res.removeRange(0, 11);			// [[0, 11, 2], [9, 20, 11], [6, 17, 8], [9, 20, 11]]
+	ASSERT_EQ(4, res.size()) << "Stimulation Set doesn't have 4 values.";
+
+	res.shift(1);					// [[0, 12, 2], [9, 21, 11], [6, 18, 8], [9, 21, 11]]
+	ASSERT_EQ(12, res.getDate(0)) << "After append Stimulation Date isn't 12.";
+	ASSERT_EQ(21, res.getDate(1)) << "After append Stimulation Date isn't 21.";
+	ASSERT_EQ(18, res.getDate(2)) << "After append Stimulation Date isn't 18.";
+	ASSERT_EQ(21, res.getDate(3)) << "After append Stimulation Date isn't 21.";
+}
diff --git a/unit-test/ov-base/CTimeTest.hpp b/unit-test/ov-base/CTimeTest.hpp
index e2d769d7be442036c6d726a11676b09fff8bce42..6b935e8633ec6e54045d15b1a7ee11e01008b5d8 100644
--- a/unit-test/ov-base/CTimeTest.hpp
+++ b/unit-test/ov-base/CTimeTest.hpp
@@ -1,11 +1,24 @@
 ///-------------------------------------------------------------------------------------------------
 /// 
-/// \file CMatrixTest.hpp
-/// \brief Test Definitions for OpenViBE Matrix Class.
+/// \file CTimeTests.hpp
+/// \brief Test Definitions for OpenViBE CTime Class.
 /// \author Thibaut Monseigne (Inria).
 /// \version 1.0.
 /// \date 11/05/2020.
-/// \copyright <a href="https://choosealicense.com/licenses/agpl-3.0/">GNU Affero General Public License v3.0</a>.
+/// \copyright (C) 2021 INRIA
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License as published
+/// by the Free Software Foundation, either version 3 of the License, or
+/// (at your option) any later version.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.  If not, see <https://www.gnu.org/licenses/>.
 /// 
 ///-------------------------------------------------------------------------------------------------
 
diff --git a/unit-test/ov-base/main.cpp b/unit-test/ov-base/main.cpp
index 1ecef6e5e7514b1d049227a0b9b263ccce909f57..901c2ffa0b75e54f91038323c192ea5d2c897930 100644
--- a/unit-test/ov-base/main.cpp
+++ b/unit-test/ov-base/main.cpp
@@ -4,11 +4,13 @@
 #include "CMatrixTest.hpp"
 #include "CTimeTest.hpp"
 #include "CIdentifierTest.hpp"
+#include "CStimulationSetTest.hpp"
+#include "CNameValuePairListTest.hpp"
+#include "CErrorManagerTest.hpp"
 
 int main(int argc, char* argv[])
 {
-	try
-	{
+	try {
 		testing::InitGoogleTest(&argc, argv);
 		return RUN_ALL_TESTS();
 	}
diff --git a/validation-test/openvibe-classification-lda/LDA-Classification.xml.in b/validation-test/openvibe-classification-lda/LDA-Classification.xml.in
index 4419ef04f2bc5b25401e2b6f61bc8328f9322406..64cc34844c8ce3e66501f64cd3a6f2d8be4bd47a 100755
--- a/validation-test/openvibe-classification-lda/LDA-Classification.xml.in
+++ b/validation-test/openvibe-classification-lda/LDA-Classification.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,15 +32,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>240</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>768.000000</Value>
+					<Value>736</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -50,10 +46,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xf37b8e7a, 0x1bc33e4e)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>136</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0025dffa)</Value>
@@ -73,90 +65,114 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x00001a52, 0x00005314)</Identifier>
-			<Name>CSV File Writer</Name>
-			<AlgorithmClassIdentifier>(0x428375e8, 0x325f2db9)</AlgorithmClassIdentifier>
-			<Inputs>
-				<Input>
+			<Identifier>(0x0000491d, 0x00005a04)</Identifier>
+			<Name>Time signal</Name>
+			<AlgorithmClassIdentifier>(0x28a5e7ff, 0x530095de)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
 					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Input stream</Name>
-				</Input>
-				<Input>
-					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>Stimulations stream</Name>
-				</Input>
-			</Inputs>
+					<Name>Generated signal</Name>
+				</Output>
+			</Outputs>
 			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue>record-[$core{date}-$core{time}].csv</DefaultValue>
-					<Value>@OVT_TEST_TEMPORARY_DIR@/after-classification-@SCENARIO@.csv</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
 				<Setting>
 					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
-					<Name>Precision</Name>
-					<DefaultValue>10</DefaultValue>
-					<Value>10</Value>
+					<Name>Sampling frequency</Name>
+					<DefaultValue>512</DefaultValue>
+					<Value>512</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
-					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
-					<Name>Append data</Name>
-					<DefaultValue>false</DefaultValue>
-					<Value>false</Value>
+					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
+					<Name>Generated epoch sample count</Name>
+					<DefaultValue>32</DefaultValue>
+					<Value>32</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>384</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>448</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0x9e5ca01e, 0x30a4d8c3)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x0000550e, 0x00005dd5)</Identifier>
+			<Name>Generic stream reader</Name>
+			<AlgorithmClassIdentifier>(0x6468099f, 0x0370095a)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output stream 1</Name>
+				</Output>
+			</Outputs>
+			<Settings>
 				<Setting>
-					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
-					<Name>Only last matrix</Name>
-					<DefaultValue>false</DefaultValue>
-					<Value>false</Value>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue></DefaultValue>
+					<Value>@OVT_TEST_DATA_DIR@/class-matrix2.ov</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 			</Settings>
 			<Attributes>
 				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>528</Value>
+					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
+					<Value></Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>240</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>512</Value>
+					<Value>592</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xee4b6d30, 0x788aed29)</Value>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
-					<Value></Value>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xf37b8e7a, 0x1bc33e4e)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>94</Value>
+					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
+					<Value>(0x00000000, 0x00293cf3)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
+					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
+					<Value>false</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>4</Value>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
-					<Value>2</Value>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
 				</Attribute>
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x00002e39, 0x00006c71)</Identifier>
+			<Identifier>(0x000064b3, 0x000067a0)</Identifier>
 			<Name>CSV File Writer</Name>
 			<AlgorithmClassIdentifier>(0x428375e8, 0x325f2db9)</AlgorithmClassIdentifier>
 			<Inputs>
@@ -202,28 +218,20 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>320</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xee4b6d30, 0x788aed29)</Value>
+					<Value>(0xc33e47e0, 0x70e5f31b)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>94</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>4</Value>
@@ -235,125 +243,73 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x0000491d, 0x00005a04)</Identifier>
-			<Name>Time signal</Name>
-			<AlgorithmClassIdentifier>(0x28a5e7ff, 0x530095de)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
+			<Identifier>(0x000064b3, 0x000067a1)</Identifier>
+			<Name>CSV File Writer</Name>
+			<AlgorithmClassIdentifier>(0x428375e8, 0x325f2db9)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
 					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Generated signal</Name>
-				</Output>
-			</Outputs>
+					<Name>Input stream</Name>
+				</Input>
+				<Input>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Stimulations stream</Name>
+				</Input>
+			</Inputs>
 			<Settings>
 				<Setting>
-					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
-					<Name>Sampling frequency</Name>
-					<DefaultValue>512</DefaultValue>
-					<Value>512</Value>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue>record-[$core{date}-$core{time}].csv</DefaultValue>
+					<Value>@OVT_TEST_TEMPORARY_DIR@/after-classification-@SCENARIO@.csv</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
 					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
-					<Name>Generated epoch sample count</Name>
-					<DefaultValue>32</DefaultValue>
-					<Value>32</Value>
+					<Name>Precision</Name>
+					<DefaultValue>10</DefaultValue>
+					<Value>10</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>448</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0x9e5ca01e, 0x30a4d8c3)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>72</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>2</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
-		<Box>
-			<Identifier>(0x0000550e, 0x00005dd5)</Identifier>
-			<Name>Generic stream reader</Name>
-			<AlgorithmClassIdentifier>(0x6468099f, 0x0370095a)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output stream 1</Name>
-				</Output>
-			</Outputs>
-			<Settings>
 				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/class-matrix2.ov</Value>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Append data</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+				<Setting>
+					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
+					<Name>Only last matrix</Name>
+					<DefaultValue>false</DefaultValue>
+					<Value>false</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 			</Settings>
 			<Attributes>
-				<Attribute>
-					<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>480</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>592.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
+					<Value>592</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xf37b8e7a, 0x1bc33e4e)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>136</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
-					<Value>(0x00000000, 0x00293cf3)</Value>
+					<Value>(0xc33e47e0, 0x70e5f31b)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
-					<Value>false</Value>
+					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
+					<Value></Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>1</Value>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>4</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>1</Value>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>2</Value>
 				</Attribute>
 			</Attributes>
 		</Box>
@@ -383,15 +339,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>289.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>544</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>272.000000</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -401,10 +353,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xf37b8e7a, 0x1bc33e4e)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>136</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00c55e5b)</Value>
@@ -449,15 +397,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>240</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>400.000000</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -467,10 +411,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xf37b8e7a, 0x1bc33e4e)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>136</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x006e0def)</Value>
@@ -529,11 +469,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>384</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
@@ -543,10 +479,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xa6c8e548, 0x9e3e405b)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>116</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>3</Value>
@@ -590,24 +522,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432.000000</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x568d148e, 0x650792b3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>103</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00502c80)</Value>
@@ -649,24 +573,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>320.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>592.000000</Value>
+					<Value>592</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xb5d15cc9, 0x6c8c28fb)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>110</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x001303d8)</Value>
@@ -692,62 +608,26 @@
 	</Boxes>
 	<Links>
 		<Link>
-			<Identifier>(0x00001676, 0x00005a7e)</Identifier>
+			<Identifier>(0x0000141f, 0x000062e6)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00000ad0, 0x00002727)</BoxIdentifier>
+				<BoxIdentifier>(0x000076b8, 0x00005047)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x72a5f195, 0x5ef1cbbb)</BoxIdentifier>
-				<BoxInputIndex>2</BoxInputIndex>
+				<BoxIdentifier>(0x000064b3, 0x000067a0)</BoxIdentifier>
+				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>768</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>297</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>607</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000025fa, 0x00004d83)</Identifier>
+			<Identifier>(0x00001676, 0x00005a7e)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x000076b8, 0x00005047)</BoxIdentifier>
+				<BoxIdentifier>(0x00000ad0, 0x00002727)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00002e39, 0x00006c71)</BoxIdentifier>
-				<BoxInputIndex>1</BoxInputIndex>
+				<BoxIdentifier>(0x72a5f195, 0x5ef1cbbb)</BoxIdentifier>
+				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>314</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>272</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>505</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>327</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00002712, 0x00003a2e)</Identifier>
@@ -759,169 +639,61 @@
 				<BoxIdentifier>(0x72a5f195, 0x5ef1cbbb)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>592</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>297</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>592</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000032fd, 0x00005dc8)</Identifier>
+			<Identifier>(0x00003882, 0x000024e0)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x05295ef4, 0x5f18e7d2)</BoxIdentifier>
+				<BoxIdentifier>(0x000076b8, 0x00005047)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00001a52, 0x00005314)</BoxIdentifier>
-				<BoxInputIndex>1</BoxInputIndex>
+				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>451</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>577</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>505</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>519</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x0000375b, 0x000068a9)</Identifier>
+			<Identifier>(0x00003cb5, 0x00007f04)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x0000491d, 0x00005a04)</BoxIdentifier>
+				<BoxIdentifier>(0x00007876, 0x00004594)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00002e39, 0x00006c71)</BoxIdentifier>
+				<BoxIdentifier>(0x72a5f195, 0x5ef1cbbb)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>467</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>505</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>312</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00003882, 0x000024e0)</Identifier>
+			<Identifier>(0x00004dca, 0x000062d7)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x000076b8, 0x00005047)</BoxIdentifier>
+				<BoxIdentifier>(0x05295ef4, 0x5f18e7d2)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
-				<BoxInputIndex>0</BoxInputIndex>
+				<BoxIdentifier>(0x000064b3, 0x000067a1)</BoxIdentifier>
+				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>314</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>272</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>383</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00003cb5, 0x00007f04)</Identifier>
+			<Identifier>(0x00004f99, 0x00001796)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00007876, 0x00004594)</BoxIdentifier>
+				<BoxIdentifier>(0x0000491d, 0x00005a04)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x72a5f195, 0x5ef1cbbb)</BoxIdentifier>
+				<BoxIdentifier>(0x000064b3, 0x000067a1)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>400</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>297</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>577</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000049b2, 0x00003966)</Identifier>
+			<Identifier>(0x0000724d, 0x00003463)</Identifier>
 			<Source>
 				<BoxIdentifier>(0x0000491d, 0x00005a04)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00001a52, 0x00005314)</BoxIdentifier>
+				<BoxIdentifier>(0x000064b3, 0x000067a0)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>467</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>505</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>504</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x361f100c, 0x31569f97)</Identifier>
@@ -933,24 +705,6 @@
 				<BoxIdentifier>(0x05295ef4, 0x5f18e7d2)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>345</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>592</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>415</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>584</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
diff --git a/validation-test/openvibe-classification-lda/LDA-Native.xml.in b/validation-test/openvibe-classification-lda/LDA-Native.xml.in
index 114983c390988b60bf5dbd13690f800c05555e11..6666f602144bf060dc72a85779f6c5a814506fa1 100755
--- a/validation-test/openvibe-classification-lda/LDA-Native.xml.in
+++ b/validation-test/openvibe-classification-lda/LDA-Native.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,11 +32,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>288.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -90,11 +90,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>464.000000</Value>
+					<Value>512</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -148,11 +148,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>640.000000</Value>
+					<Value>656</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -206,11 +206,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>816.000000</Value>
+					<Value>800</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -316,7 +316,7 @@
 					<Value>Linear Discrimimant Analysis (LDA)</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
-        <Setting>
+				<Setting>
 					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
 					<Name>Use shrinkage</Name>
 					<DefaultValue>false</DefaultValue>
@@ -327,7 +327,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -337,14 +337,14 @@
 					<Value>false</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
-        <Setting>
+				<Setting>
 					<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
 					<Name>Number of partitions for k-fold cross-validation test</Name>
 					<DefaultValue>10</DefaultValue>
 					<Value>10</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
-        <Setting>
+				<Setting>
 					<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
 					<Name>Balance classes</Name>
 					<DefaultValue>false</DefaultValue>
@@ -365,10 +365,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x9de21779, 0x37776c89)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
 					<Value>1</Value>
@@ -416,11 +412,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>688.000000</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -452,7 +448,6 @@
 				<BoxIdentifier>(0x07358c13, 0x4c7f3718)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x1923b651, 0x77968cbc)</Identifier>
@@ -464,7 +459,6 @@
 				<BoxIdentifier>(0x07358c13, 0x4c7f3718)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x193472ca, 0x425c38b4)</Identifier>
@@ -476,7 +470,6 @@
 				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x33f9ee3d, 0x5d880174)</Identifier>
@@ -488,7 +481,6 @@
 				<BoxIdentifier>(0x07358c13, 0x4c7f3718)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x3cf18653, 0x14a9d268)</Identifier>
@@ -500,10 +492,16 @@
 				<BoxIdentifier>(0x07358c13, 0x4c7f3718)</BoxIdentifier>
 				<BoxInputIndex>3</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x00005fd8, 0x0000705a)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[]</Data>
+		</Entry>
+	</Metadata>
 	<Attributes>
 		<Attribute>
 			<Identifier>(0x4c90d4ad, 0x7a2554ec)</Identifier>
@@ -514,4 +512,4 @@
 			<Value>480</Value>
 		</Attribute>
 	</Attributes>
-</OpenViBE-Scenario>
+</OpenViBE-Scenario>
\ No newline at end of file
diff --git a/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in b/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in
index 6b3d70cf5c842da745f6e4b245f5a2532a6e5e56..03b863ab4732d0c6662325c9b1ac2e78200ec020 100755
--- a/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in
+++ b/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,11 +32,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>288.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -90,11 +90,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>464.000000</Value>
+					<Value>512</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -148,11 +148,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>640.000000</Value>
+					<Value>656</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -206,11 +206,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>816.000000</Value>
+					<Value>800</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -267,11 +267,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>688.000000</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -380,7 +380,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -408,11 +408,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>577.000000</Value>
+					<Value>577</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -422,10 +422,6 @@
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00ca1a5c)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
 					<Value>false</Value>
@@ -460,7 +456,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00001a7f, 0x00007594)</Identifier>
@@ -472,7 +467,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00003f05, 0x00000e40)</Identifier>
@@ -484,7 +478,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00006145, 0x000035ca)</Identifier>
@@ -496,7 +489,6 @@
 				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007b19, 0x000024cd)</Identifier>
@@ -508,10 +500,16 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>3</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x00003144, 0x000058ae)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[]</Data>
+		</Entry>
+	</Metadata>
 	<Attributes>
 		<Attribute>
 			<Identifier>(0x4c90d4ad, 0x7a2554ec)</Identifier>
diff --git a/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in b/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in
index 4498af15e50c232de36d7651d243cbf735ef4ec9..f52916ced0b668514691d6f46301ea98bfcce693 100755
--- a/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in
+++ b/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,11 +32,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>288.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -90,11 +90,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>464.000000</Value>
+					<Value>512</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -148,11 +148,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>640.000000</Value>
+					<Value>656</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -206,11 +206,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>816.000000</Value>
+					<Value>800</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -267,11 +267,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>688.000000</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -387,7 +387,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -415,11 +415,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>577.000000</Value>
+					<Value>577</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -429,10 +429,6 @@
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00ca1a5c)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
 					<Value>false</Value>
@@ -467,7 +463,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00001a7f, 0x00007594)</Identifier>
@@ -479,7 +474,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00003f05, 0x00000e40)</Identifier>
@@ -491,7 +485,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00006145, 0x000035ca)</Identifier>
@@ -503,7 +496,6 @@
 				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007b19, 0x000024cd)</Identifier>
@@ -515,10 +507,16 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>3</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x00005548, 0x00004d89)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[]</Data>
+		</Entry>
+	</Metadata>
 	<Attributes>
 		<Attribute>
 			<Identifier>(0x4c90d4ad, 0x7a2554ec)</Identifier>
diff --git a/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in b/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in
index 0dec4ec39faec8d4063c89a7a1288d3dc3912ca1..af65b8807c1b456c78a53fce9338bd58bb03b6cd 100755
--- a/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in
+++ b/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,11 +32,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>288.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -90,11 +90,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>464.000000</Value>
+					<Value>512</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -148,11 +148,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>640.000000</Value>
+					<Value>656</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -206,11 +206,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>816.000000</Value>
+					<Value>800</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -267,11 +267,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>688.000000</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -387,7 +387,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -415,11 +415,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>577.000000</Value>
+					<Value>577</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -429,10 +429,6 @@
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00ca1a5c)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
 					<Value>false</Value>
@@ -467,7 +463,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00001a7f, 0x00007594)</Identifier>
@@ -479,7 +474,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00003f05, 0x00000e40)</Identifier>
@@ -491,7 +485,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00006145, 0x000035ca)</Identifier>
@@ -503,7 +496,6 @@
 				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007b19, 0x000024cd)</Identifier>
@@ -515,10 +507,16 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>3</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x000054e5, 0x00006c23)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[]</Data>
+		</Entry>
+	</Metadata>
 	<Attributes>
 		<Attribute>
 			<Identifier>(0x4c90d4ad, 0x7a2554ec)</Identifier>
diff --git a/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in b/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in
index 0d5a1dd03454a05b4de01730df818ebbf597b149..136f2fabd50be8b64e0c23ba76d3013d7f222ccc 100755
--- a/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in
+++ b/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,11 +32,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>288.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -90,11 +90,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>464.000000</Value>
+					<Value>512</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -148,11 +148,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>640.000000</Value>
+					<Value>656</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -206,11 +206,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>400.000000</Value>
+					<Value>496</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>816.000000</Value>
+					<Value>800</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -267,11 +267,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>688.000000</Value>
+					<Value>640</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -387,7 +387,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -415,11 +415,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>577.000000</Value>
+					<Value>577</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>576.000000</Value>
+					<Value>576</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -429,10 +429,6 @@
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00ca1a5c)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
 					<Value>false</Value>
@@ -467,7 +463,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00001a7f, 0x00007594)</Identifier>
@@ -479,7 +474,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00003f05, 0x00000e40)</Identifier>
@@ -491,7 +485,6 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00006145, 0x000035ca)</Identifier>
@@ -503,7 +496,6 @@
 				<BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007b19, 0x000024cd)</Identifier>
@@ -515,10 +507,16 @@
 				<BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier>
 				<BoxInputIndex>3</BoxInputIndex>
 			</Target>
-			<Attributes></Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
+	<Metadata>
+		<Entry>
+			<Identifier>(0x00006fe7, 0x000043c8)</Identifier>
+			<Type>(0x3bcce5d2, 0x43f2d968)</Type>
+			<Data>[]</Data>
+		</Entry>
+	</Metadata>
 	<Attributes>
 		<Attribute>
 			<Identifier>(0x4c90d4ad, 0x7a2554ec)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/empty-labels-matrix.xml.in b/validation-test/openvibe-file-io-csv/empty-labels-matrix.xml.in
index 32c335293eadf06cad1dfa9f8871ff236282ee82..ed5037940169e3ee69579ea124552a2dd958f0b5 100755
--- a/validation-test/openvibe-file-io-csv/empty-labels-matrix.xml.in
+++ b/validation-test/openvibe-file-io-csv/empty-labels-matrix.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -103,7 +103,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>288</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/empty-labels-vector.xml.in b/validation-test/openvibe-file-io-csv/empty-labels-vector.xml.in
index 138dd779f8482afb3ba4d11057b41f1b38e06035..156779a52200056d355e023776f2e56e9a04ad26 100755
--- a/validation-test/openvibe-file-io-csv/empty-labels-vector.xml.in
+++ b/validation-test/openvibe-file-io-csv/empty-labels-vector.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -103,7 +103,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160</Value>
+					<Value>224</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/features.xml.in b/validation-test/openvibe-file-io-csv/features.xml.in
index 7325af72c1843522f63fb600555a89c2e919eee1..c3ea1f103f6fb8e94ff3dc82ac24135eb4dfaada 100755
--- a/validation-test/openvibe-file-io-csv/features.xml.in
+++ b/validation-test/openvibe-file-io-csv/features.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -103,7 +103,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>272</Value>
+					<Value>288</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in b/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in
index 7ae352726e7c6eb5d8cf17d22f2c7edd8a659fd0..70517bb2629e1df6d9b0878efb51ed54820bc90c 100755
--- a/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in
+++ b/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,11 +32,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>192</Value>
+					<Value>288</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>720</Value>
+					<Value>736</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/signal.xml.in b/validation-test/openvibe-file-io-csv/signal.xml.in
index 194274a388db9b10c0272218b57414132d0ae4c9..3b040e0e85c72480ac0447292f9c633c571190d9 100755
--- a/validation-test/openvibe-file-io-csv/signal.xml.in
+++ b/validation-test/openvibe-file-io-csv/signal.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -103,7 +103,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>144</Value>
+					<Value>304</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/spectrum.xml.in b/validation-test/openvibe-file-io-csv/spectrum.xml.in
index a8572a47b06856353907a953a473c8599714afe3..02d1ac89c015f6f660aa623b87bea27c1ad88137 100755
--- a/validation-test/openvibe-file-io-csv/spectrum.xml.in
+++ b/validation-test/openvibe-file-io-csv/spectrum.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,7 +32,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>128</Value>
+					<Value>176</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/stimulation.xml.in b/validation-test/openvibe-file-io-csv/stimulation.xml.in
index a5db18e2b7ea5fae372bfe396bd97e2c832fee07..5422ddf79e5c5780c829e10812448deb42bced62 100755
--- a/validation-test/openvibe-file-io-csv/stimulation.xml.in
+++ b/validation-test/openvibe-file-io-csv/stimulation.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -99,7 +99,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>224</Value>
+					<Value>272</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in b/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in
index d6ec49b7059c8086882d12cf36543883d1e38f9b..544b39437955d6b6ce5a06cef52536723f14e8da 100755
--- a/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in
+++ b/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -32,7 +32,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>256</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-csv/vector-matrix.xml.in b/validation-test/openvibe-file-io-csv/vector-matrix.xml.in
index 514c967ff05d5c245a903f36e450732b1bd087c5..e1e4b88993076ccb200a62236e688cf3f3cd4174 100755
--- a/validation-test/openvibe-file-io-csv/vector-matrix.xml.in
+++ b/validation-test/openvibe-file-io-csv/vector-matrix.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>3.1.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -103,7 +103,7 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>240</Value>
+					<Value>352</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
diff --git a/validation-test/openvibe-file-io-openvibe/read-write.xml.in b/validation-test/openvibe-file-io-openvibe/read-write.xml.in
index a003038f2f53a84ec1131fa51e71eb156522206b..000fe43c5f411f1ba5ee671284a4c396b5e2ec71 100755
--- a/validation-test/openvibe-file-io-openvibe/read-write.xml.in
+++ b/validation-test/openvibe-file-io-openvibe/read-write.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
 	<FormatVersion>2</FormatVersion>
 	<Creator>OpenViBE Designer</Creator>
-	<CreatorVersion>2.2.0</CreatorVersion>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -40,15 +40,11 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>33</Value>
+					<Value>208</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>384.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -58,10 +54,6 @@
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xf37b8e7a, 0x1bc33e4e)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>153</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x008e3651)</Value>
@@ -117,15 +109,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>272.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>33</Value>
+					<Value>272</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>368.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
@@ -135,18 +123,10 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>149</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x002efb4d)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
 					<Value>false</Value>
@@ -177,24 +157,6 @@
 				<BoxIdentifier>(0x00006172, 0x00004577)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>183</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>369</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>251</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>353</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00003da7, 0x00003850)</Identifier>
@@ -206,24 +168,6 @@
 				<BoxIdentifier>(0x00006172, 0x00004577)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>183</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>384</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>251</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>368</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x000064a1, 0x00002aca)</Identifier>
@@ -235,24 +179,6 @@
 				<BoxIdentifier>(0x00006172, 0x00004577)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>183</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>399</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>251</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>383</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
diff --git a/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in b/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in
index 2527b562cecb43ccbc35481deae98ce63fa6ad93..848efe9c77941b4fb1c08a9bc7aa2a5f3e9d00a3 100755
--- a/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in
+++ b/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.0.0</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -34,15 +34,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>96.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>224</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>128.000000</Value>
+					<Value>256</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -56,10 +52,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>74</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x002b83c2)</Value>
@@ -115,24 +107,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>496.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>464</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432.000000</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x568d148e, 0x650792b3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>103</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x000c92bc)</Value>
@@ -151,126 +135,6 @@
 				</Attribute>
 			</Attributes>
 		</Box>
-		<Box>
-			<Identifier>(0x00002514, 0x00001614)</Identifier>
-			<Name>CSV File Reader</Name>
-			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output stream</Name>
-				</Output>
-				<Output>
-					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>Output stimulation</Name>
-				</Output>
-			</Outputs>
-			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/train-time1.csv</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>16</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>144</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>2</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
-		<Box>
-			<Identifier>(0x00003917, 0x0000574d)</Identifier>
-			<Name>CSV File Reader</Name>
-			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output stream</Name>
-				</Output>
-				<Output>
-					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>Output stimulation</Name>
-				</Output>
-			</Outputs>
-			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/train-noise3.csv</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>16</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>560</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>2</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
 		<Box>
 			<Identifier>(0x00004f85, 0x000075c2)</Identifier>
 			<Name>Simple DSP</Name>
@@ -303,15 +167,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>288</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>256</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -325,10 +185,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>74</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x001b0254)</Value>
@@ -384,24 +240,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>208.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>352</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>80.000000</Value>
+					<Value>368</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x27b3ee3c, 0xc50527e6)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>100</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0026e8e1)</Value>
@@ -443,24 +291,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>288.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>352</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>400.000000</Value>
+					<Value>480</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x990c5a68, 0x0d4024a3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>83</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x004d185b)</Value>
@@ -484,7 +324,7 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x00006be0, 0x000074b5)</Identifier>
+			<Identifier>(0x0000622b, 0x00002f97)</Identifier>
 			<Name>CSV File Reader</Name>
 			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
@@ -502,22 +342,68 @@
 					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
 					<Name>Filename</Name>
 					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/train-noise2.csv</Value>
+					<Value>@OVT_TEST_DATA_DIR@/train-noise3.csv</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 			</Settings>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>16</Value>
+					<Value>160</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>592</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x0000622b, 0x00002f98)</Identifier>
+			<Name>CSV File Reader</Name>
+			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output stream</Name>
+				</Output>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Output stimulation</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue></DefaultValue>
+					<Value>@OVT_TEST_DATA_DIR@/train-time1.csv</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>160</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432</Value>
+					<Value>256</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -525,11 +411,107 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x0000622b, 0x00002f99)</Identifier>
+			<Name>CSV File Reader</Name>
+			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output stream</Name>
+				</Output>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Output stimulation</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue></DefaultValue>
+					<Value>@OVT_TEST_DATA_DIR@/train-noise2.csv</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>160</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>480</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>2</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x0000622b, 0x00002f9a)</Identifier>
+			<Name>CSV File Reader</Name>
+			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Output stream</Name>
+				</Output>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Output stimulation</Name>
+				</Output>
+			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue></DefaultValue>
+					<Value>@OVT_TEST_DATA_DIR@/train-noise1.csv</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>160</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>368</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
@@ -626,24 +608,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>432.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>416</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432.000000</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x97c37a70, 0xbc9fecff)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>143</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x012d01c1)</Value>
@@ -666,181 +640,51 @@
 				</Attribute>
 			</Attributes>
 		</Box>
-		<Box>
-			<Identifier>(0x00007b93, 0x000041da)</Identifier>
-			<Name>CSV File Reader</Name>
-			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output stream</Name>
-				</Output>
-				<Output>
-					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>Output stimulation</Name>
-				</Output>
-			</Outputs>
-			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/train-noise1.csv</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>16</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>272</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>2</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
 	</Boxes>
 	<Links>
 		<Link>
-			<Identifier>(0x0000029d, 0x0000789c)</Identifier>
+			<Identifier>(0x00000852, 0x00007508)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00003917, 0x0000574d)</BoxIdentifier>
+				<BoxIdentifier>(0x0000622b, 0x00002f9a)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x0000752f, 0x00004ce3)</BoxIdentifier>
-				<BoxInputIndex>2</BoxInputIndex>
+				<BoxIdentifier>(0x00004f85, 0x000075c2)</BoxIdentifier>
+				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>41</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>552</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>415</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>447</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00000bda, 0x000031d8)</Identifier>
+			<Identifier>(0x000016c9, 0x000057a9)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00007b93, 0x000041da)</BoxIdentifier>
+				<BoxIdentifier>(0x0000622b, 0x00002f99)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00004f85, 0x000075c2)</BoxIdentifier>
+				<BoxIdentifier>(0x00005dde, 0x000059bc)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>41</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>264</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>137</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>263</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00000e6a, 0x00006e34)</Identifier>
+			<Identifier>(0x000031f9, 0x000000fb)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00006be0, 0x000074b5)</BoxIdentifier>
+				<BoxIdentifier>(0x00004f85, 0x000075c2)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
 				<BoxIdentifier>(0x00005dde, 0x000059bc)</BoxIdentifier>
-				<BoxInputIndex>1</BoxInputIndex>
+				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>41</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>424</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>265</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>407</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000031f9, 0x000000fb)</Identifier>
+			<Identifier>(0x00004f54, 0x00006b1b)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00004f85, 0x000075c2)</BoxIdentifier>
+				<BoxIdentifier>(0x0000622b, 0x00002f98)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00005dde, 0x000059bc)</BoxIdentifier>
+				<BoxIdentifier>(0x000001bf, 0x0000774e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>256</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>265</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>392</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00005e99, 0x0000154b)</Identifier>
@@ -852,24 +696,6 @@
 				<BoxIdentifier>(0x00001d79, 0x0000094b)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>451</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>479</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00005f59, 0x00006c8d)</Identifier>
@@ -881,111 +707,39 @@
 				<BoxIdentifier>(0x0000752f, 0x00004ce3)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>313</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>400</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>415</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x0000769c, 0x00006c88)</Identifier>
+			<Identifier>(0x00006ee1, 0x000060da)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x000001bf, 0x0000774e)</BoxIdentifier>
+				<BoxIdentifier>(0x0000622b, 0x00002f97)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00004f85, 0x000075c2)</BoxIdentifier>
-				<BoxInputIndex>0</BoxInputIndex>
+				<BoxIdentifier>(0x0000752f, 0x00004ce3)</BoxIdentifier>
+				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>121</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>128</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>137</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>248</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00007b5b, 0x000079d9)</Identifier>
+			<Identifier>(0x0000769c, 0x00006c88)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00005cd1, 0x00002308)</BoxIdentifier>
+				<BoxIdentifier>(0x000001bf, 0x0000774e)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x0000752f, 0x00004ce3)</BoxIdentifier>
+				<BoxIdentifier>(0x00004f85, 0x000075c2)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>227</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>80</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>415</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>417</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00007be5, 0x00000765)</Identifier>
+			<Identifier>(0x00007b5b, 0x000079d9)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00002514, 0x00001614)</BoxIdentifier>
+				<BoxIdentifier>(0x00005cd1, 0x00002308)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x000001bf, 0x0000774e)</BoxIdentifier>
+				<BoxIdentifier>(0x0000752f, 0x00004ce3)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>41</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>136</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>73</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>128</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>
diff --git a/validation-test/openvibe-regularized-csp/regularized-csp.xml.in b/validation-test/openvibe-regularized-csp/regularized-csp.xml.in
index b20b93964d5be334f307e0b54fec291b7b0c58ce..4140f11894c5749fa3adc10904d1d593fb09dfb0 100755
--- a/validation-test/openvibe-regularized-csp/regularized-csp.xml.in
+++ b/validation-test/openvibe-regularized-csp/regularized-csp.xml.in
@@ -1,7 +1,7 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.0.0</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
@@ -34,15 +34,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>108.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>128</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>340.000000</Value>
+					<Value>336</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -56,10 +52,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>74</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0027036a)</Value>
@@ -115,24 +107,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>624.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>624</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>560.000000</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x568d148e, 0x650792b3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>103</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0018c8c4)</Value>
@@ -170,24 +154,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>480.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>480</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>544.000000</Value>
+					<Value>544</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xb5d15cc9, 0x6c8c28fb)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>110</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x000cc119)</Value>
@@ -210,64 +186,6 @@
 				</Attribute>
 			</Attributes>
 		</Box>
-		<Box>
-			<Identifier>(0x00002a40, 0x00002c82)</Identifier>
-			<Name>CSV File Reader</Name>
-			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output stream</Name>
-				</Output>
-				<Output>
-					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>Output stimulation</Name>
-				</Output>
-			</Outputs>
-			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/test-noise1.csv</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>32</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>2</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
 		<Box>
 			<Identifier>(0x00003065, 0x00006f68)</Identifier>
 			<Name>Feature aggregator</Name>
@@ -287,24 +205,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>480.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>480</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>720.000000</Value>
+					<Value>672</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0xb5d15cc9, 0x6c8c28fb)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>110</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x000b40fe)</Value>
@@ -376,15 +286,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>288.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>528.000000</Value>
+					<Value>544</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -398,10 +304,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>79</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x000bdfe8)</Value>
@@ -473,15 +375,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>288.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>672.000000</Value>
+					<Value>672</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -495,10 +393,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>79</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00147d55)</Value>
@@ -553,15 +447,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>192</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>416.000000</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -575,10 +465,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>74</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0013b6a4)</Value>
@@ -605,64 +491,6 @@
 				</Attribute>
 			</Attributes>
 		</Box>
-		<Box>
-			<Identifier>(0x0000594d, 0x00001153)</Identifier>
-			<Name>CSV File Reader</Name>
-			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
-			<Outputs>
-				<Output>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Output stream</Name>
-				</Output>
-				<Output>
-					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
-					<Name>Output stimulation</Name>
-				</Output>
-			</Outputs>
-			<Settings>
-				<Setting>
-					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
-					<Name>Filename</Name>
-					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/test-time1.csv</Value>
-					<Modifiability>false</Modifiability>
-				</Setting>
-			</Settings>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>32</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>320</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>2</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
-					<Value>1</Value>
-				</Attribute>
-			</Attributes>
-		</Box>
 		<Box>
 			<Identifier>(0x00005cd1, 0x00002308)</Identifier>
 			<Name>Clock stimulator</Name>
@@ -692,24 +520,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>32.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>480</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>128.000000</Value>
+					<Value>416</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x27b3ee3c, 0xc50527e6)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>100</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x004e6a12)</Value>
@@ -806,7 +626,7 @@
 					<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
 					<Name>Shrinkage coefficient (-1 == auto)</Name>
 					<DefaultValue>-1.000000</DefaultValue>
-					<Value>-1.000000</Value>
+					<Value>-1</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 				<Setting>
@@ -834,24 +654,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>560.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>560.000000</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x9de21779, 0x37776c89)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>100</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x00335a81)</Value>
@@ -901,24 +713,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>208.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>256</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>512.000000</Value>
+					<Value>544</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x990c5a68, 0x0d4024a3)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>83</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0013111d)</Value>
@@ -969,15 +773,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>352.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>384</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>528.000000</Value>
+					<Value>544</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -991,10 +791,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>74</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x000a4547)</Value>
@@ -1049,15 +845,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>352.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>384</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>672.000000</Value>
+					<Value>672</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -1071,10 +863,6 @@
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>74</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x000b54d8)</Value>
@@ -1102,117 +890,107 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x000068ee, 0x0000125c)</Identifier>
-			<Name>Signal average</Name>
-			<AlgorithmClassIdentifier>(0x00642c4d, 0x5df7e50a)</AlgorithmClassIdentifier>
-			<Inputs>
-				<Input>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Input signal</Name>
-				</Input>
-			</Inputs>
+			<Identifier>(0x0000622b, 0x00002f97)</Identifier>
+			<Name>CSV File Reader</Name>
+			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
 				<Output>
 					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Filtered signal</Name>
+					<Name>Output stream</Name>
+				</Output>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Output stimulation</Name>
 				</Output>
 			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue></DefaultValue>
+					<Value>@OVT_TEST_DATA_DIR@/test-noise3.csv</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>416.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>64</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>528.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xc5ff4187, 0xffc5f432)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>86</Value>
+					<Value>672</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
-					<Value>(0x00000000, 0x0008f384)</Value>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
-					<Value>false</Value>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>1</Value>
+					<Value>2</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>1</Value>
 				</Attribute>
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x000068ee, 0x0000125d)</Identifier>
-			<Name>Signal average</Name>
-			<AlgorithmClassIdentifier>(0x00642c4d, 0x5df7e50a)</AlgorithmClassIdentifier>
-			<Inputs>
-				<Input>
-					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Input signal</Name>
-				</Input>
-			</Inputs>
+			<Identifier>(0x0000622b, 0x00002f98)</Identifier>
+			<Name>CSV File Reader</Name>
+			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
 				<Output>
 					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
-					<Name>Filtered signal</Name>
+					<Name>Output stream</Name>
+				</Output>
+				<Output>
+					<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
+					<Name>Output stimulation</Name>
 				</Output>
 			</Outputs>
+			<Settings>
+				<Setting>
+					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
+					<Name>Filename</Name>
+					<DefaultValue></DefaultValue>
+					<Value>@OVT_TEST_DATA_DIR@/test-time1.csv</Value>
+					<Modifiability>false</Modifiability>
+				</Setting>
+			</Settings>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>416.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>64</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>688.000000</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xc5ff4187, 0xffc5f432)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>86</Value>
+					<Value>336</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
-					<Value>(0x00000000, 0x000b0bfd)</Value>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
-					<Value>false</Value>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>1</Value>
+					<Value>2</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>1</Value>
 				</Attribute>
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x00007848, 0x0000588c)</Identifier>
+			<Identifier>(0x0000622b, 0x00002f99)</Identifier>
 			<Name>CSV File Reader</Name>
 			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
@@ -1230,22 +1008,18 @@
 					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
 					<Name>Filename</Name>
 					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/test-noise3.csv</Value>
+					<Value>@OVT_TEST_DATA_DIR@/test-noise2.csv</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 			</Settings>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>48</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>64</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>672</Value>
+					<Value>560</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -1253,15 +1027,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
@@ -1274,7 +1040,7 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x000078e9, 0x00007665)</Identifier>
+			<Identifier>(0x0000622b, 0x00002f9a)</Identifier>
 			<Name>CSV File Reader</Name>
 			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
@@ -1292,41 +1058,127 @@
 					<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
 					<Name>Filename</Name>
 					<DefaultValue></DefaultValue>
-					<Value>@OVT_TEST_DATA_DIR@/test-noise2.csv</Value>
+					<Value>@OVT_TEST_DATA_DIR@/test-noise1.csv</Value>
 					<Modifiability>false</Modifiability>
 				</Setting>
 			</Settings>
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>48</Value>
+					<Value>64</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>448</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
+					<Value></Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>2</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000068ee, 0x0000125c)</Identifier>
+			<Name>Signal average</Name>
+			<AlgorithmClassIdentifier>(0x00642c4d, 0x5df7e50a)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Filtered signal</Name>
+				</Output>
+			</Outputs>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>432</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
 					<Value>544</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
-					<Value></Value>
+					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
+					<Value>(0xc5ff4187, 0xffc5f432)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
+					<Value>(0x00000000, 0x0008f384)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
+					<Value>false</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
+					<Value>1</Value>
+				</Attribute>
+			</Attributes>
+		</Box>
+		<Box>
+			<Identifier>(0x000068ee, 0x0000125d)</Identifier>
+			<Name>Signal average</Name>
+			<AlgorithmClassIdentifier>(0x00642c4d, 0x5df7e50a)</AlgorithmClassIdentifier>
+			<Inputs>
+				<Input>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Input signal</Name>
+				</Input>
+			</Inputs>
+			<Outputs>
+				<Output>
+					<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
+					<Name>Filtered signal</Name>
+				</Output>
+			</Outputs>
+			<Attributes>
+				<Attribute>
+					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
+					<Value>432</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
+					<Value>672</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
+					<Value>(0xc5ff4187, 0xffc5f432)</Value>
+				</Attribute>
+				<Attribute>
+					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
+					<Value>(0x00000000, 0x000b0bfd)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
+					<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
+					<Value>false</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
-					<Value>2</Value>
+					<Value>1</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
+					<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
 					<Value>1</Value>
 				</Attribute>
 			</Attributes>
@@ -1343,24 +1195,6 @@
 				<BoxIdentifier>(0x00002824, 0x00000ec9)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>435</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>457</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00000a93, 0x00007ccc)</Identifier>
@@ -1372,24 +1206,6 @@
 				<BoxIdentifier>(0x000068ee, 0x0000125c)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>377</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>399</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00000e34, 0x00002968)</Identifier>
@@ -1401,24 +1217,6 @@
 				<BoxIdentifier>(0x00005f02, 0x0000326e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>313</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>329</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00000e34, 0x00002969)</Identifier>
@@ -1430,24 +1228,6 @@
 				<BoxIdentifier>(0x00005f02, 0x00003270)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>313</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>672</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>329</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>672</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00000e6b, 0x00006fe7)</Identifier>
@@ -1459,24 +1239,6 @@
 				<BoxIdentifier>(0x0000384e, 0x00003b0e)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>233</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>512</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>265</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>528</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00001191, 0x00001183)</Identifier>
@@ -1488,82 +1250,17 @@
 				<BoxIdentifier>(0x00003065, 0x00006f68)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>435</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>688</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>457</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>720</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00001ab8, 0x0000311b)</Identifier>
+			<Identifier>(0x0000126e, 0x0000698e)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x000078e9, 0x00007665)</BoxIdentifier>
+				<BoxIdentifier>(0x0000622b, 0x00002f9a)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x00005dde, 0x000059bc)</BoxIdentifier>
+				<BoxIdentifier>(0x00004f85, 0x000075c3)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>73</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>536</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>519</Value>
-				</Attribute>
-			</Attributes>
-		</Link>
-		<Link>
-			<Identifier>(0x00001ffb, 0x00004e74)</Identifier>
-			<Source>
-				<BoxIdentifier>(0x00007848, 0x0000588c)</BoxIdentifier>
-				<BoxOutputIndex>0</BoxOutputIndex>
-			</Source>
-			<Target>
-				<BoxIdentifier>(0x0000384e, 0x00003b10)</BoxIdentifier>
-				<BoxInputIndex>0</BoxInputIndex>
-			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>73</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>664</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>265</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>672</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00002a59, 0x00001819)</Identifier>
@@ -1575,111 +1272,28 @@
 				<BoxIdentifier>(0x00001d79, 0x0000094b)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>585</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>560</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>607</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>560</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000031f9, 0x000000fb)</Identifier>
+			<Identifier>(0x00002bd3, 0x0000625a)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00004f85, 0x000075c3)</BoxIdentifier>
+				<BoxIdentifier>(0x0000622b, 0x00002f99)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
 				<BoxIdentifier>(0x00005dde, 0x000059bc)</BoxIdentifier>
-				<BoxInputIndex>0</BoxInputIndex>
-			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>416</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>504</Value>
-				</Attribute>
-			</Attributes>
-		</Link>
-		<Link>
-			<Identifier>(0x000044b5, 0x00002683)</Identifier>
-			<Source>
-				<BoxIdentifier>(0x00002a40, 0x00002c82)</BoxIdentifier>
-				<BoxOutputIndex>0</BoxOutputIndex>
-			</Source>
-			<Target>
-				<BoxIdentifier>(0x00004f85, 0x000075c3)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>57</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>424</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>137</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>423</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x00004d66, 0x00003edb)</Identifier>
+			<Identifier>(0x000031f9, 0x000000fb)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x0000594d, 0x00001153)</BoxIdentifier>
+				<BoxIdentifier>(0x00004f85, 0x000075c3)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x000001bf, 0x0000774e)</BoxIdentifier>
+				<BoxIdentifier>(0x00005dde, 0x000059bc)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>57</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>312</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>85</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>340</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x0000561f, 0x0000678d)</Identifier>
@@ -1691,24 +1305,6 @@
 				<BoxIdentifier>(0x00005d73, 0x000007dc)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>51</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>128</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>537</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>545</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00005a3c, 0x000070e8)</Identifier>
@@ -1720,24 +1316,17 @@
 				<BoxIdentifier>(0x00005d73, 0x000007dc)</BoxIdentifier>
 				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>505</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>544</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>537</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>560</Value>
-				</Attribute>
-			</Attributes>
+		</Link>
+		<Link>
+			<Identifier>(0x00006629, 0x00004c25)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x0000622b, 0x00002f98)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x000001bf, 0x0000774e)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
 		</Link>
 		<Link>
 			<Identifier>(0x00006a54, 0x00006a90)</Identifier>
@@ -1749,24 +1338,6 @@
 				<BoxIdentifier>(0x00005d73, 0x000007dc)</BoxIdentifier>
 				<BoxInputIndex>2</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>505</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>720</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>537</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>575</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00006bee, 0x0000552d)</Identifier>
@@ -1778,24 +1349,6 @@
 				<BoxIdentifier>(0x00004f85, 0x000075c3)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>133</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>340</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>137</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>408</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
 			<Identifier>(0x00007488, 0x00002969)</Identifier>
@@ -1807,24 +1360,17 @@
 				<BoxIdentifier>(0x000068ee, 0x0000125d)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>377</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>672</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>399</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>688</Value>
-				</Attribute>
-			</Attributes>
+		</Link>
+		<Link>
+			<Identifier>(0x00007ad7, 0x0000095a)</Identifier>
+			<Source>
+				<BoxIdentifier>(0x0000622b, 0x00002f97)</BoxIdentifier>
+				<BoxOutputIndex>0</BoxOutputIndex>
+			</Source>
+			<Target>
+				<BoxIdentifier>(0x0000384e, 0x00003b10)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
+			</Target>
 		</Link>
 	</Links>
 	<Comments></Comments>
diff --git a/validation-test/openvibe-stimulation-timeout/timeout.xml.in b/validation-test/openvibe-stimulation-timeout/timeout.xml.in
index 3de4876319714c1f0201d7630ec18eed1c74e9c7..a486c9a5edef18d505fc845b0c12054f486c9e3f 100755
--- a/validation-test/openvibe-stimulation-timeout/timeout.xml.in
+++ b/validation-test/openvibe-stimulation-timeout/timeout.xml.in
@@ -1,13 +1,13 @@
 <OpenViBE-Scenario>
-	<FormatVersion>1</FormatVersion>
-	<Creator>OpenVIBE</Creator>
-	<CreatorVersion>0.0.0</CreatorVersion>
+	<FormatVersion>2</FormatVersion>
+	<Creator>OpenViBE Designer</Creator>
+	<CreatorVersion>3.2.0</CreatorVersion>
 	<Settings></Settings>
 	<Inputs></Inputs>
 	<Outputs></Outputs>
 	<Boxes>
 		<Box>
-			<Identifier>(0x0000050d, 0x000070dd)</Identifier>
+			<Identifier>(0x00000193, 0x000079d4)</Identifier>
 			<Name>CSV File Reader</Name>
 			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
@@ -32,15 +32,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>384</Value>
+					<Value>848</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -48,15 +44,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
-					<Value></Value>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
@@ -69,7 +57,7 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x0000060d, 0x000035cf)</Identifier>
+			<Identifier>(0x00000aab, 0x00005c72)</Identifier>
 			<Name>CSV File Writer</Name>
 			<AlgorithmClassIdentifier>(0x428375e8, 0x325f2db9)</AlgorithmClassIdentifier>
 			<Inputs>
@@ -115,28 +103,20 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>464</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>528</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>448</Value>
+					<Value>912</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xee4b6d30, 0x788aed29)</Value>
+					<Value>(0xc33e47e0, 0x70e5f31b)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
 					<Value></Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>94</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
 					<Value>4</Value>
@@ -148,7 +128,7 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x00002c23, 0x00003a2b)</Identifier>
+			<Identifier>(0x0000724b, 0x00006db0)</Identifier>
 			<Name>CSV File Reader</Name>
 			<AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier>
 			<Outputs>
@@ -173,15 +153,11 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>160</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>37</Value>
+					<Value>320</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>512</Value>
+					<Value>960</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
@@ -189,11 +165,7 @@
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa9cdc629, 0xb153eb33)</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>97</Value>
+					<Value>(0xb7b8f4f9, 0xb979c65c)</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
@@ -206,7 +178,7 @@
 			</Attributes>
 		</Box>
 		<Box>
-			<Identifier>(0x000075ec, 0x00005504)</Identifier>
+			<Identifier>(0x00007c9a, 0x000016ba)</Identifier>
 			<Name>Stimulation based epoching</Name>
 			<AlgorithmClassIdentifier>(0x426163d1, 0x324237b0)</AlgorithmClassIdentifier>
 			<Inputs>
@@ -242,7 +214,7 @@
 				</Setting>
 				<Setting>
 					<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
-					<Name>Stimulation to epoch from</Name>
+					<Name>Stimulation 1</Name>
 					<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
 					<Value>OVTK_StimulationId_Label_00</Value>
 					<Modifiability>false</Modifiability>
@@ -251,23 +223,19 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>352</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>448</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>432</Value>
+					<Value>912</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
-					<Value>(0xa79941ae, 0x80708445)</Value>
+					<Value>(0x5de31172, 0xa1304456)</Value>
 				</Attribute>
 				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>163</Value>
+					<Identifier>(0x61d11811, 0x71e65362)</Identifier>
+					<Value></Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
@@ -318,24 +286,16 @@
 			<Attributes>
 				<Attribute>
 					<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
-					<Value>272</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
-					<Value>25</Value>
+					<Value>384</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
-					<Value>512</Value>
+					<Value>960</Value>
 				</Attribute>
 				<Attribute>
 					<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
 					<Value>(0x1eaee00e, 0xdb05d34e)</Value>
 				</Attribute>
-				<Attribute>
-					<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
-					<Value>57</Value>
-				</Attribute>
 				<Attribute>
 					<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
 					<Value>(0x00000000, 0x0018e348)</Value>
@@ -357,120 +317,48 @@
 	</Boxes>
 	<Links>
 		<Link>
-			<Identifier>(0x00001bce, 0x00007b3f)</Identifier>
+			<Identifier>(0x00001561, 0x000051b1)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x0000050d, 0x000070dd)</BoxIdentifier>
+				<BoxIdentifier>(0x0000724b, 0x00006db0)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x000075ec, 0x00005504)</BoxIdentifier>
+				<BoxIdentifier>(0x0b41bcb4, 0x0c439291)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>376</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>335</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>424</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000025af, 0x00001377)</Identifier>
+			<Identifier>(0x00003bda, 0x00002477)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x00002c23, 0x00003a2b)</BoxIdentifier>
+				<BoxIdentifier>(0x00007c9a, 0x000016ba)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x0b41bcb4, 0x0c439291)</BoxIdentifier>
+				<BoxIdentifier>(0x00000aab, 0x00005c72)</BoxIdentifier>
 				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>185</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>504</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>255</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>512</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000048e6, 0x00003606)</Identifier>
+			<Identifier>(0x00004ca6, 0x0000207e)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x0b41bcb4, 0x0c439291)</BoxIdentifier>
+				<BoxIdentifier>(0x00000193, 0x000079d4)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x000075ec, 0x00005504)</BoxIdentifier>
-				<BoxInputIndex>1</BoxInputIndex>
+				<BoxIdentifier>(0x00007c9a, 0x000016ba)</BoxIdentifier>
+				<BoxInputIndex>0</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>291</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>512</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>335</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>439</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 		<Link>
-			<Identifier>(0x000068f1, 0x000041c2)</Identifier>
+			<Identifier>(0x00005c64, 0x000038b4)</Identifier>
 			<Source>
-				<BoxIdentifier>(0x000075ec, 0x00005504)</BoxIdentifier>
+				<BoxIdentifier>(0x0b41bcb4, 0x0c439291)</BoxIdentifier>
 				<BoxOutputIndex>0</BoxOutputIndex>
 			</Source>
 			<Target>
-				<BoxIdentifier>(0x0000060d, 0x000035cf)</BoxIdentifier>
-				<BoxInputIndex>0</BoxInputIndex>
+				<BoxIdentifier>(0x00007c9a, 0x000016ba)</BoxIdentifier>
+				<BoxInputIndex>1</BoxInputIndex>
 			</Target>
-			<Attributes>
-				<Attribute>
-					<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
-					<Value>371</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
-					<Value>432</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
-					<Value>441</Value>
-				</Attribute>
-				<Attribute>
-					<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
-					<Value>440</Value>
-				</Attribute>
-			</Attributes>
 		</Link>
 	</Links>
 	<Comments></Comments>