diff --git a/modules/system/CMakeLists.txt b/modules/system/CMakeLists.txt
index 4c487fb5ac7ac85a3d0591ac03365291a00d53e5..16e5fb3464f0eb1f08871f8fefce2b5354374ac1 100755
--- a/modules/system/CMakeLists.txt
+++ b/modules/system/CMakeLists.txt
@@ -47,8 +47,14 @@ ENDIF(UNIX)
 
 INCLUDE("FindOpenViBECommon")
 
-INCLUDE("FindThirdPartyBoost")
-INCLUDE("FindThirdPartyBoost_Chrono")
+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")
+ENDIF(WIN32)
+
+
 
 # ---------------------------------
 # Finds standard library winmm
diff --git a/modules/system/include/system/ovCTime.h b/modules/system/include/system/ovCTime.h
index 86b587ba524751dee45bed492317bb2e5fba03c9..be4c4b4215dfadf0c49d1d4da9328b42b9c3e6ea 100644
--- a/modules/system/include/system/ovCTime.h
+++ b/modules/system/include/system/ovCTime.h
@@ -20,26 +20,26 @@ namespace System
 		 * \param ui32MilliSeconds : sleep duration in ms
 		 * \return Always true
 		 */
-		static bool sleep(const System::uint32 ui32MilliSeconds);
+		static bool sleep(const uint32_t ui32MilliSeconds);
 		
 		/**
 		 * \brief Make the calling thread sleep 
 		 * \param ui64Seconds : sleep duration in fixed point 32:32 seconds
 		 * \return Always true
 		 */
-		static bool zsleep(const System::uint64 ui64Seconds);
+		static bool zsleep(const uint64_t ui64Seconds);
 		
 		/**
 		 * \brief Retrieve time in ms 
 		 * \return Elpased time in ms since the first call to this function or zgetTime
 		 */
-		static System::uint32 getTime(void); 
+		static uint32_t getTime(void); 
 		
 		/**
 		 * \brief Retrieve time in fixed point 32:32 seconds 
 		 * \return Elpased time since the first call to the function or getTime
 		 */
-		static System::uint64 zgetTime(void);
+		static uint64_t zgetTime(void);
 		
 		/**
 		 * \brief Check if the internal clock used by the framework is steady
@@ -57,7 +57,7 @@ namespace System
 		 * \note This is a theoretical check that queries the internal
 		 *  	 clock implementation for available services
 		 */
-		 static bool checkResolution(const System::uint32 ui32MilliSeconds);
+		 static bool checkResolution(const uint32_t ui32MilliSeconds);
 		  
 	private:
 
diff --git a/modules/system/src/ovCTime.cpp b/modules/system/src/ovCTime.cpp
index 9c74ff867fbef7a7acde13b91c6d401ae0ca58ff..001a3a13c7a061b037d2d753f57db098d843c199 100644
--- a/modules/system/src/ovCTime.cpp
+++ b/modules/system/src/ovCTime.cpp
@@ -12,59 +12,56 @@
 // 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)
-
-#ifdef TARGET_HAS_Boost_Chrono
+#if (defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono))
 
 #include <boost/chrono/config.hpp>
 
 #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
 
-#include <chrono>
-#include <thread>
-using namespace std;
+#include <boost/chrono.hpp>
+#include <boost/thread.hpp>
+namespace timelib = boost;
 
+#else
+#error "Please use OpenViBE recommended version of Boost"
 #endif // BOOST_CHRONO_HAS_CLOCK_STEADY
 
-#endif // TARGET_HAS_Boost_Chrono
-
-#else // defined(_MSC_VER) && _MSC_VER <= 1800
+#else // defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono)
 
 #include <chrono>
 #include <thread>
-using namespace std;
+namespace timelib = std;
 
-#endif // defined(_MSC_VER) && _MSC_VER <= 1800
+#endif // defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono)
 
-using internal_clock = chrono::steady_clock;
+using internal_clock = timelib::chrono::steady_clock;
+// using internal_clock = chrono::high_resolution_clock;
 
-bool System::Time::sleep(const uint32 ui32MilliSeconds)
+bool System::Time::sleep(const uint32_t ui32MilliSeconds)
 {
-	this_thread::sleep_for(chrono::milliseconds(ui32MilliSeconds));
-
+	timelib::this_thread::sleep_for(timelib::chrono::milliseconds(ui32MilliSeconds));
 	return true;
 }
 
-bool System::Time::zsleep(const uint64 ui64Seconds)
+bool System::Time::zsleep(const uint64_t ui64Seconds)
 {
-	const uint32 l_ui32Seconds = static_cast<uint32>(ui64Seconds >> 32);
+	const uint32_t l_ui32Seconds = static_cast<uint32_t>(ui64Seconds >> 32);
 	// zero the seconds with 0xFFFFFFFF, multiply to get the rest as fixed point microsec, then grab them (now in the 32 msbs)
-	const uint64 l_ui64MicroSeconds = ((ui64Seconds & 0xFFFFFFFFLL) * 1000000LL) >> 32;
-	
-	chrono::microseconds l_oDuration = chrono::seconds(l_ui32Seconds) + chrono::microseconds(l_ui64MicroSeconds);
+	const uint64_t l_ui64MicroSeconds = ((ui64Seconds & 0xFFFFFFFFLL) * 1000000LL) >> 32;
 
-	this_thread::sleep_for(l_oDuration);
+	const timelib::chrono::microseconds l_oDuration =  timelib::chrono::seconds(l_ui32Seconds) + timelib::chrono::microseconds(l_ui64MicroSeconds);
+	timelib::this_thread::sleep_for(l_oDuration);
 
 	return true;
 }
 
-System::uint32 System::Time::getTime(void)
+uint32_t System::Time::getTime(void)
 {
 	// turn the 32:32 fixed point seconds to milliseconds
-	return static_cast<uint32>((zgetTime() * 1000) >> 32);
+	return static_cast<uint32_t>((zgetTime() * 1000) >> 32);
 }
 
-System::uint64 System::Time::zgetTime(void)
+uint64_t System::Time::zgetTime(void)
 {
 	static bool l_bInitialized = false;
 	static internal_clock::time_point l_oTimeStart;
@@ -79,10 +76,9 @@ System::uint64 System::Time::zgetTime(void)
 	
 	const internal_clock::duration l_oElapsed = l_oTimeNow - l_oTimeStart;
 
-	const chrono::microseconds l_oElapsedMs = chrono::duration_cast<chrono::microseconds>(l_oElapsed);
+	const timelib::chrono::microseconds l_oElapsedMs = timelib::chrono::duration_cast<timelib::chrono::microseconds>(l_oElapsed);
 
 	const uint64_t l_ui64MicrosPerSecond = 1000ULL * 1000ULL;
-
 	const uint64_t l_ui64Seconds = static_cast<uint64_t>(l_oElapsedMs.count() / l_ui64MicrosPerSecond);
 	const uint64_t l_ui64Fraction = static_cast<uint64_t>(l_oElapsedMs.count() % l_ui64MicrosPerSecond);
 
@@ -97,11 +93,10 @@ bool System::Time::isClockSteady()
 	return internal_clock::is_steady;
 }
 
-bool System::Time::checkResolution(const System::uint32 ui32MilliSeconds)
+bool System::Time::checkResolution(const uint32_t ui32MilliSeconds)
 {
 	assert(ui32MilliSeconds != 0);
 
 	auto l_ui32Resolution = static_cast<System::float64>(internal_clock::period::num) / internal_clock::period::den;
-
-	return (static_cast<System::uint32>(std::ceil(l_ui32Resolution * 1000)) <= ui32MilliSeconds);
+	return (static_cast<uint32_t>(std::ceil(l_ui32Resolution * 1000)) <= ui32MilliSeconds);
 }
diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp
index ec26f93833324706da3999b7e52e78484c19d0fe..2617871f628adb038734eba8e72b71c3cdfbceb2 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp
@@ -11,13 +11,12 @@ using namespace OpenViBE::Plugins;
 using namespace OpenViBEPlugins;
 using namespace OpenViBEPlugins::SignalProcessing;
 
-boolean CBoxAlgorithmSignalDecimation::initialize(void)
+bool CBoxAlgorithmSignalDecimation::initialize(void)
 {
 	m_pStreamDecoder=NULL;
 	m_pStreamEncoder=NULL;
 
 	m_i64DecimationFactor=FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0);
-
 	OV_ERROR_UNLESS_KRF(
 		m_i64DecimationFactor > 1,
 		"Invalid decimation factor [" << m_i64DecimationFactor << "] (expected value > 1)",
@@ -41,16 +40,19 @@ boolean CBoxAlgorithmSignalDecimation::initialize(void)
 	m_ui32ChannelCount=0;
 	m_ui32InputSampleIndex=0;
 	m_ui32InputSampleCountPerSentBlock=0;
+	m_ui64OutputSamplingFrequency = 0;
 	m_ui32OutputSampleIndex=0;
 	m_ui32OutputSampleCountPerSentBlock=0;
 
 	m_ui64TotalSampleCount=0;
+	m_ui64StartTimeBase = 0;
 	m_ui64LastStartTime=0;
+	m_ui64LastEndTime = 0;
 
 	return true;
 }
 
-boolean CBoxAlgorithmSignalDecimation::uninitialize(void)
+bool CBoxAlgorithmSignalDecimation::uninitialize(void)
 {
 	op_pMemoryBuffer.uninitialize();
 	ip_pMatrix.uninitialize();
@@ -77,25 +79,24 @@ boolean CBoxAlgorithmSignalDecimation::uninitialize(void)
 	return true;
 }
 
-boolean CBoxAlgorithmSignalDecimation::processInput(uint32 ui32InputIndex)
+bool CBoxAlgorithmSignalDecimation::processInput(uint32_t ui32InputIndex)
 {
 	getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess();
 	return true;
 }
 
-boolean CBoxAlgorithmSignalDecimation::process(void)
+bool CBoxAlgorithmSignalDecimation::process(void)
 {
 	// IBox& l_rStaticBoxContext=this->getStaticBoxContext();
 	IBoxIO& l_rDynamicBoxContext=this->getDynamicBoxContext();
-	uint32 i, j, k;
 
-	for(i=0; i<l_rDynamicBoxContext.getInputChunkCount(0); i++)
+	for(uint32_t i = 0; i < l_rDynamicBoxContext.getInputChunkCount(0); i++)
 	{
 		ip_pMemoryBuffer=l_rDynamicBoxContext.getInputChunk(0, i);
 		op_pMemoryBuffer=l_rDynamicBoxContext.getOutputChunk(0);
 
-		uint64 l_ui64StartTime=l_rDynamicBoxContext.getInputChunkStartTime(0, i);
-		uint64 l_ui64EndTime=l_rDynamicBoxContext.getInputChunkEndTime(0, i);
+		uint64_t l_ui64StartTime=l_rDynamicBoxContext.getInputChunkStartTime(0, i);
+		uint64_t l_ui64EndTime=l_rDynamicBoxContext.getInputChunkEndTime(0, i);
 
 		if(l_ui64StartTime!=m_ui64LastEndTime)
 		{
@@ -122,7 +123,7 @@ boolean CBoxAlgorithmSignalDecimation::process(void)
 			);
 
 			m_ui32OutputSampleIndex=0;
-			m_ui32OutputSampleCountPerSentBlock=(uint32)(m_ui32InputSampleCountPerSentBlock/m_i64DecimationFactor);
+			m_ui32OutputSampleCountPerSentBlock = static_cast<uint32_t>(m_ui32InputSampleCountPerSentBlock/m_i64DecimationFactor);
 			m_ui32OutputSampleCountPerSentBlock=(m_ui32OutputSampleCountPerSentBlock?m_ui32OutputSampleCountPerSentBlock:1);
 			m_ui64OutputSamplingFrequency=op_ui64SamplingRate/m_i64DecimationFactor;
 
@@ -148,11 +149,11 @@ boolean CBoxAlgorithmSignalDecimation::process(void)
 			float64* l_pInputBuffer=op_pMatrix->getBuffer();
 			float64* l_pOutputBuffer=ip_pMatrix->getBuffer()+m_ui32OutputSampleIndex;
 
-			for(j=0; j<m_ui32InputSampleCountPerSentBlock; j++)
+			for(uint32_t j = 0; j < m_ui32InputSampleCountPerSentBlock; j++)
 			{
 				float64* l_pInputBufferTmp=l_pInputBuffer;
 				float64* l_pOutputBufferTmp=l_pOutputBuffer;
-				for(k=0; k<m_ui32ChannelCount; k++)
+				for(uint32_t k = 0; k < m_ui32ChannelCount; k++)
 				{
 					*l_pOutputBufferTmp+=*l_pInputBufferTmp;
 					l_pOutputBufferTmp+=m_ui32OutputSampleCountPerSentBlock;
@@ -164,7 +165,7 @@ boolean CBoxAlgorithmSignalDecimation::process(void)
 				{
 					m_ui32InputSampleIndex=0;
 					float64* l_pOutputBufferTmp=l_pOutputBuffer;
-					for(k=0; k<m_ui32ChannelCount; k++)
+					for(uint32_t k = 0; k < m_ui32ChannelCount; k++)
 					{
 						*l_pOutputBufferTmp/=m_i64DecimationFactor;
 						l_pOutputBufferTmp+=m_ui32OutputSampleCountPerSentBlock;
@@ -178,8 +179,8 @@ boolean CBoxAlgorithmSignalDecimation::process(void)
 						l_pOutputBuffer=ip_pMatrix->getBuffer();
 						m_ui32OutputSampleIndex=0;
 						m_pStreamEncoder->process(OVP_GD_Algorithm_SignalStreamEncoder_InputTriggerId_EncodeBuffer);
-						uint64 l_ui64SampleStartTime = m_ui64StartTimeBase + ITimeArithmetics::sampleCountToTime(m_ui64OutputSamplingFrequency, m_ui64TotalSampleCount);
-						uint64 l_ui64SampleEndTime   = m_ui64StartTimeBase + ITimeArithmetics::sampleCountToTime(m_ui64OutputSamplingFrequency, m_ui64TotalSampleCount + m_ui32OutputSampleCountPerSentBlock);
+						uint64_t l_ui64SampleStartTime = m_ui64StartTimeBase + ITimeArithmetics::sampleCountToTime(m_ui64OutputSamplingFrequency, m_ui64TotalSampleCount);
+						uint64_t l_ui64SampleEndTime   = m_ui64StartTimeBase + ITimeArithmetics::sampleCountToTime(m_ui64OutputSamplingFrequency, m_ui64TotalSampleCount + m_ui32OutputSampleCountPerSentBlock);
 						l_rDynamicBoxContext.markOutputAsReadyToSend(0, l_ui64SampleStartTime, l_ui64SampleEndTime);
 						m_ui64TotalSampleCount+=m_ui32OutputSampleCountPerSentBlock;
 
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 fc0cfd923d234333600c493b35b453072f2104c2..f676953a31974d7072fb9cec09d4afeae2156275 100644
--- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h
+++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h
@@ -17,36 +17,36 @@ namespace OpenViBEPlugins
 
 			virtual void release(void) { delete this; }
 
-			virtual OpenViBE::boolean initialize(void);
-			virtual OpenViBE::boolean uninitialize(void);
-			virtual OpenViBE::boolean processInput(OpenViBE::uint32 ui32InputIndex);
-			virtual OpenViBE::boolean process(void);
+			virtual bool initialize(void);
+			virtual bool uninitialize(void);
+			virtual bool processInput(uint32_t ui32InputIndex);
+			virtual bool process(void);
 
 			_IsDerivedFromClass_Final_(OpenViBEToolkit::TBoxAlgorithm < OpenViBE::Plugins::IBoxAlgorithm >, OVP_ClassId_BoxAlgorithm_SignalDecimation);
 
 		protected:
 
-			OpenViBE::int64 m_i64DecimationFactor;
-			OpenViBE::uint32 m_ui32ChannelCount;
-			OpenViBE::uint32 m_ui32InputSampleIndex;
-			OpenViBE::uint32 m_ui32InputSampleCountPerSentBlock;
-			OpenViBE::uint64 m_ui64InputSamplingFrequency;
-			OpenViBE::uint32 m_ui32OutputSampleIndex;
-			OpenViBE::uint32 m_ui32OutputSampleCountPerSentBlock;
-			OpenViBE::uint64 m_ui64OutputSamplingFrequency;
+			int64_t m_i64DecimationFactor;
+			uint32_t m_ui32ChannelCount;
+			uint32_t m_ui32InputSampleIndex;
+			uint32_t m_ui32InputSampleCountPerSentBlock;
+			uint64_t m_ui64InputSamplingFrequency;
+			uint32_t m_ui32OutputSampleIndex;
+			uint32_t m_ui32OutputSampleCountPerSentBlock;
+			uint64_t m_ui64OutputSamplingFrequency;
 
-			OpenViBE::uint64 m_ui64TotalSampleCount;
-			OpenViBE::uint64 m_ui64StartTimeBase;
-			OpenViBE::uint64 m_ui64LastStartTime;
-			OpenViBE::uint64 m_ui64LastEndTime;
+			uint64_t m_ui64TotalSampleCount;
+			uint64_t m_ui64StartTimeBase;
+			uint64_t m_ui64LastStartTime;
+			uint64_t m_ui64LastEndTime;
 
 			OpenViBE::Kernel::IAlgorithmProxy* m_pStreamDecoder;
 			OpenViBE::Kernel::TParameterHandler < const OpenViBE::IMemoryBuffer* > ip_pMemoryBuffer;
 			OpenViBE::Kernel::TParameterHandler < OpenViBE::IMatrix* > op_pMatrix;
-			OpenViBE::Kernel::TParameterHandler < OpenViBE::uint64 > op_ui64SamplingRate;
+			OpenViBE::Kernel::TParameterHandler < uint64_t > op_ui64SamplingRate;
 
 			OpenViBE::Kernel::IAlgorithmProxy* m_pStreamEncoder;
-			OpenViBE::Kernel::TParameterHandler < OpenViBE::uint64 > ip_ui64SamplingRate;
+			OpenViBE::Kernel::TParameterHandler < uint64_t > ip_ui64SamplingRate;
 			OpenViBE::Kernel::TParameterHandler < OpenViBE::IMatrix* > ip_pMatrix;
 			OpenViBE::Kernel::TParameterHandler < OpenViBE::IMemoryBuffer* > op_pMemoryBuffer;
 		};
@@ -71,7 +71,7 @@ namespace OpenViBEPlugins
 			virtual OpenViBE::CIdentifier getCreatedClass(void) const    { return OVP_ClassId_BoxAlgorithm_SignalDecimation; }
 			virtual OpenViBE::Plugins::IPluginObject* create(void)       { return new OpenViBEPlugins::SignalProcessing::CBoxAlgorithmSignalDecimation; }
 
-			virtual OpenViBE::boolean getBoxPrototype(
+			virtual bool getBoxPrototype(
 				OpenViBE::Kernel::IBoxProto& rBoxAlgorithmPrototype) const
 			{
 				rBoxAlgorithmPrototype.addInput  ("Input signal",  OV_TypeId_Signal);