diff --git a/CMake/VirtualFluidsMacros.cmake b/CMake/VirtualFluidsMacros.cmake
index 69e56fa63d4f25adb84e539678055e7f46b62d3d..2d6e63256955f8b739b2c84e695214185471600f 100644
--- a/CMake/VirtualFluidsMacros.cmake
+++ b/CMake/VirtualFluidsMacros.cmake
@@ -112,6 +112,15 @@ function(vf_add_library)
     else()
         vf_get_library_name (library_name)
     endif()
+
+    if(NOT DEFINED ARG_BUILDTYPE)
+        if(BUILD_SHARED_LIBS)
+            set(ARG_BUILDTYPE "shared")
+        else()
+            set(ARG_BUILDTYPE "static")
+        endif()
+    endif()
+
     status("Configuring the target: ${library_name} (type=${ARG_BUILDTYPE})...")
 
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 50073d8a0016c0345e9ae7ae3cfc5507afb6ad14..1fd7dfff17385b7079c0d285b4f326677f65b736 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,8 +8,9 @@
 #################################################################################
 #  required cmake versions
 #  CMAKE 3.13: target_link_options
+#  CMAKE 3.15: CMAKE_MSVC_RUNTIME_LIBRARY
 #################################################################################
-cmake_minimum_required(VERSION 3.13..3.18 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.15..3.18 FATAL_ERROR)
 
 project(VirtualFluids CXX)
 
@@ -43,7 +44,14 @@ option(BUILD_VF_INCLUDE_WHAT_YOU_USE "Add IWYU to the targets" OFF)
 option(BUILD_VF_CPPCHECK "Add cppcheck to the targets" OFF)
 option(BUILD_VF_COVERAGE "Add the -coverage compiler flag." OFF)
 
-option(BUILD_SHARED_LIBS "" ON)
+option(BUILD_SHARED_LIBS "" OFF)
+
+# windows: use multi-threaded dynamically-linked runtime library
+if(BUILD_SHARED_LIBS)
+    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
+else()
+    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
+endif()
 
 option(USE_OPENMP "Include OpenMP support" ON)
 
diff --git a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
index 3c401265dc43f0900094638280c5229894138c64..8bb9ee450616604b8cc636a2e13477d76e6b43d4 100644
--- a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
+++ b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
@@ -2,8 +2,9 @@ PROJECT(DrivenCavity)
 
 #LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-DOMPI_SKIP_MPICXX" )
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluids_GPU basics GridGenerator FILES DrivenCavity.cpp )
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES DrivenCavity.cpp )
 
 set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA)
 
 linkCUDA()
+linkMPI()
diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
index 0af28e6f6c6eed2994d72ceeb1194c399ea79d5a..da53c05db9eeed857e8b6cfed4002aa99e398994 100644
--- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
+++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
@@ -9,6 +9,8 @@
 #include <exception>
 #include <memory>
 
+#include "mpi.h"
+
 //////////////////////////////////////////////////////////////////////////
 
 #include "Core/DataTypes.h"
@@ -122,7 +124,9 @@ void multipleLevel(const std::string& configPath)
     
 	Communicator* comm = Communicator::getInstanz();
 	SPtr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance();
-	SPtr<ConfigData> configData = configReader->readConfigFile(configPath);
+
+    std::cout << configPath << std::endl;
+	SPtr<ConfigData> configData = configReader->readConfigFile(configPath.c_str());
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -350,11 +354,9 @@ int main( int argc, char* argv[])
 
 			targetPath = __FILE__;
 
-#ifdef _WIN32
-			targetPath = targetPath.substr(0, targetPath.find_last_of('\\') + 1);
-#else
 			targetPath = targetPath.substr(0, targetPath.find_last_of('/') + 1);
-#endif
+
+
 
 			std::cout << targetPath << std::endl;
 
diff --git a/gpu.cmake b/gpu.cmake
index f4faec7286c94d1d96386c9e193c0c8acbf29f0b..d1d5415081aa131868c0bc2ee047e8a140eb9a78 100644
--- a/gpu.cmake
+++ b/gpu.cmake
@@ -61,9 +61,9 @@ IF (VF.BUILD_VF_GPU)
     #add_subdirectory(targets/apps/LBM/BaselMultiGPU)
 
     add_subdirectory(apps/gpu/LBM/DrivenCavity)
-    add_subdirectory(apps/gpu/LBM/gridGeneratorTest)
-    add_subdirectory(apps/gpu/LBM/TGV_3D)
-    add_subdirectory(apps/gpu/LBM/TGV_3D_MultiGPU)
+    #add_subdirectory(apps/gpu/LBM/gridGeneratorTest)
+    #add_subdirectory(apps/gpu/LBM/TGV_3D)
+    #add_subdirectory(apps/gpu/LBM/TGV_3D_MultiGPU)
 ELSE()
     MESSAGE( STATUS "exclude Virtual Fluids GPU." )
 ENDIF()
diff --git a/src/basics/CMakeLists.txt b/src/basics/CMakeLists.txt
index 0b643212ad9c5da74e711d72da085c1fe670704e..2eff85ba5c48ec475cd8690060520cc09b4a0cb6 100644
--- a/src/basics/CMakeLists.txt
+++ b/src/basics/CMakeLists.txt
@@ -1,7 +1,7 @@
 
 include(Core/buildInfo.cmake)
 
-vf_add_library(BUILDTYPE static EXCLUDE buildInfo.in.cpp)
+vf_add_library(EXCLUDE buildInfo.in.cpp)
 
 vf_get_library_name (library_name)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Core)
diff --git a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp
index dce44b5551d2aedcf0c0d70a21dbcd9e8b071c8d..8fdb9fe1bc7f5dfe10dbfb522a87a4a3187dd60b 100644
--- a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp
+++ b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.cpp
@@ -6,20 +6,17 @@
 #include <fstream>
 #include <iostream>
 
-BASICS_EXPORT std::shared_ptr<ConfigFileReader> ConfigFileReader::getNewInstance()
+std::shared_ptr<ConfigFileReader> ConfigFileReader::getNewInstance()
 {
     return std::shared_ptr<ConfigFileReader>(new ConfigFileReader());
 }
 
-ConfigFileReader::ConfigFileReader() = default;
-
-BASICS_EXPORT ConfigFileReader::~ConfigFileReader() = default;
-
-BASICS_EXPORT std::shared_ptr<ConfigData> ConfigFileReader::readConfigFile(const std::string &filePath) const
+std::shared_ptr<ConfigData> ConfigFileReader::readConfigFile(const char* filePath) const
 {
+    std::cout << filePath << std::endl;
     std::shared_ptr<ConfigDataImp> data = ConfigDataImp::getNewInstance();
     std::ifstream stream;
-    stream.open(filePath.c_str(), std::ios::in);
+    stream.open(filePath, std::ios::in);
     if (stream.fail())
         throw std::runtime_error("can not open config file!");
     std::unique_ptr<input::Input> input = input::Input::makeInput(stream, "config");
diff --git a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h
index 9d88dfce6a7337d8ffaa7c4ffe43a4fd63949914..77c93ebfa4ba8564188d8e4a5442963382cf91e3 100644
--- a/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h
+++ b/src/basics/Core/Input/ConfigFileReader/ConfigFileReader.h
@@ -1,9 +1,11 @@
 #ifndef CONFIGFILEREADER_H
 #define CONFIGFILEREADER_H
 
-#include "../Input.h"
 
 #include <memory>
+#include <string>
+
+#include "basics_export.h"
 
 class ConfigData;
 
@@ -11,11 +13,10 @@ class ConfigFileReader
 {
 public:
     BASICS_EXPORT static std::shared_ptr<ConfigFileReader> getNewInstance();
-    BASICS_EXPORT virtual ~ConfigFileReader();
 
-    BASICS_EXPORT std::shared_ptr<ConfigData> readConfigFile(const std::string &filePath) const;
+    BASICS_EXPORT std::shared_ptr<ConfigData> readConfigFile(const char* filePath) const;
 
 private:
-    ConfigFileReader();
+    ConfigFileReader() = default;
 };
 #endif
diff --git a/src/basics/Core/buildInfo.in.cpp b/src/basics/Core/buildInfo.in.cpp
index 56f302208256ba86d7f814bfa6711f704aea3479..482f4592a41bfed0615858869ec4bb297764b0b1 100644
--- a/src/basics/Core/buildInfo.in.cpp
+++ b/src/basics/Core/buildInfo.in.cpp
@@ -1,5 +1,3 @@
-#include "buildInfo.h"
-
 #include "basics_export.h"
 
 namespace buildInfo
diff --git a/src/basics/basics/writer/WbWriterVtkXmlBinary.h b/src/basics/basics/writer/WbWriterVtkXmlBinary.h
index 393c6bb13b268805a3fc2ca0850dd75d3fdd5616..421148d90497e3628ed274439c0b2fd7636b7fd2 100644
--- a/src/basics/basics/writer/WbWriterVtkXmlBinary.h
+++ b/src/basics/basics/writer/WbWriterVtkXmlBinary.h
@@ -37,7 +37,9 @@
 
 #include <basics/writer/WbWriter.h>
 
-class WbWriterVtkXmlBinary : public WbWriter
+#include "basics_export.h"
+
+class BASICS_EXPORT WbWriterVtkXmlBinary : public WbWriter
 {
 public:
     static WbWriterVtkXmlBinary *getInstance()
diff --git a/src/basics/geometry3d/GbObject3D.h b/src/basics/geometry3d/GbObject3D.h
index f60e64c8f95dfde84a389c422bbc6b9377e68187..c562f42412c8ab75b0ebcd303a5785ab4939cdfb 100644
--- a/src/basics/geometry3d/GbObject3D.h
+++ b/src/basics/geometry3d/GbObject3D.h
@@ -49,6 +49,8 @@ class GbObject3DCreator;
 
 #include <PointerDefinitions.h>
 
+#include "basics_export.h"
+
 //////////////////////////////////////////////////////////////////////////
 //!
 //! \class GbObject3D
@@ -57,7 +59,7 @@ class GbObject3DCreator;
 //!
 //////////////////////////////////////////////////////////////////////////
 
-class GbObject3D : public ObObject
+class BASICS_EXPORT GbObject3D : public ObObject
 {
 public:
     // abstract Methods
diff --git a/src/gpu/GridGenerator/CMakeLists.txt b/src/gpu/GridGenerator/CMakeLists.txt
index aaabd6d5de07940194e8428f0d3c9a18a741ae33..46866937e2fe91e4d2eedd3cbbaf16a65ae8a6fc 100644
--- a/src/gpu/GridGenerator/CMakeLists.txt
+++ b/src/gpu/GridGenerator/CMakeLists.txt
@@ -1,9 +1,16 @@
 
 
-vf_add_library(BUILDTYPE shared PRIVATE_LINK basics)
+vf_add_library(PRIVATE_LINK basics)
 vf_get_library_name(library_name)
 
 linkCUDA()
 linkOpenMP(${library_name})
 
-set_target_properties(${library_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
\ No newline at end of file
+
+set_target_properties(${library_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+
+# according to linker error when building static libraries.
+# https://stackoverflow.com/questions/50033435/cmake-cuda-separate-compilation-static-lib-link-error-on-windows-but-not-on-ubun
+if (NOT BUILD_SHARED_LIBRARY)
+    set_target_properties(${library_name} PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)
+endif()
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/CMakeLists.txt b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
index 6635323c8be77c36682bac560dc0491d08f3a54f..f533c37993a0eaf97e40b51502058dc97ae32c72 100644
--- a/src/gpu/VirtualFluids_GPU/CMakeLists.txt
+++ b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
@@ -7,7 +7,7 @@ ELSE(MSVC)
 ENDIF(MSVC)
 
 
-vf_add_library(BUILDTYPE shared PRIVATE_LINK ${libsToLink})
+vf_add_library(PRIVATE_LINK ${libsToLink})
 
 linkMPI()
 linkCUDA()
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp b/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp
index 4473a849b97ba59ccc178093c1d36084372ec98b..7ecaa362cfa4253017b021cacb549ef018683a2b 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/Cp.cpp
@@ -7,6 +7,9 @@
 #include <fstream>
 #include <sstream>
 
+#include "Core/StringUtilities/StringUtil.h"
+#include <cassert>
+
 //#include <math.h>
 //#include "LB.h"
 
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/Cp.h b/src/gpu/VirtualFluids_GPU/Calculation/Cp.h
index 203566c5ae609797660f55b66aa54c1d624550d2..d11be83ce347c99f8e8a7e687a8016777c5eb3e8 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/Cp.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/Cp.h
@@ -3,7 +3,6 @@
 
 #include "LBM/LB.h"
 #include "GPU/GPU_Interface.h"
-#include "Utilities/StringUtil.hpp"
 #include "Parameter/Parameter.h"
 #include "GPU/CudaMemoryManager.h"
 
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp
index 219914cf784baa74c11397ebed20eda03266ac98..df153312b489ebbe6d1cb7057797a1a3663b583f 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.cpp
@@ -7,6 +7,8 @@
 #include <fstream>
 #include <sstream>
 
+#include "Core/StringUtilities/StringUtil.h"
+
 //#include <math.h>
 //#include "LB.h"
 
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h
index 31ec90fd42615dcde7a6f57931ee3d160649ba97..7c9dd586fa98434deddf91ad33d53e7a053005fd 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/DragLift.h
@@ -3,7 +3,6 @@
 
 #include "LBM/LB.h"
 #include "GPU/GPU_Interface.h"
-#include "Utilities/StringUtil.hpp"
 #include "Parameter/Parameter.h"
 #include "GPU/CudaMemoryManager.h"
 
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp b/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp
index 77835d66658acfa029c876188264f02204134777..d6b7ca332fbd51293471a8a54e90ce44cef130d0 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/ForceCalculations.cpp
@@ -7,9 +7,9 @@
 #include <stdio.h>
 #include <fstream>
 #include <sstream>
-#include "Utilities/StringUtil.hpp"
 #include "GPU/CudaMemoryManager.h"
 
+#include "Core/StringUtilities/StringUtil.h"
 //using namespace std;
 //////////////////////////////////////////////////////////////////////////
 
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp
index b92ddaaa3ee3449f657d84c7b7c044a51873f00f..e8d1cee6017c43a1447b0ba671ae9c247f75b16d 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp
+++ b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.cpp
@@ -9,6 +9,7 @@
 #include <sstream>
 //using namespace std;
 //////////////////////////////////////////////////////////////////////////
+#include "Core/StringUtilities/StringUtil.h"
 
 void setSizeOfPlane(Parameter* para, int lev, unsigned int z)
 {
diff --git a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h
index 67cb7e2fec293da49230abf0eceafb6588463ea1..a04e6b5c3bf403cd38282382f6db253831f30678 100644
--- a/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h
+++ b/src/gpu/VirtualFluids_GPU/Calculation/PlaneCalculations.h
@@ -3,7 +3,6 @@
 
 #include "Parameter/Parameter.h"
 #include "GPU/CudaMemoryManager.h"
-#include "Utilities/StringUtil.hpp"
 #include "basics/utilities/UbSystem.h"
 
 #include <iostream>
diff --git a/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp b/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp
index 1f6b69c6334e9a6eed9db78679008ca19c945946..613af04d7f89a646f5c8327e5f0fe697d043c6c8 100644
--- a/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp
+++ b/src/gpu/VirtualFluids_GPU/Input/ConfigFile.cpp
@@ -1,11 +1,12 @@
 #include "ConfigFile.h"
-#include "Utilities/StringUtil.hpp"
 #include <errno.h>
 #include <algorithm>
 #include <sstream>
 #include <iostream>
 #include <string>
 
+#include "Core/StringUtilities/StringUtil.h"
+
 
 ConfigFile::ConfigFile( const char *strConfigFile ) 
 {
diff --git a/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp b/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp
index ce00ab7e8876ad73d6bfee410c92bc9b57e2266b..3c94a6a91de739da0056bf793a60f2dcede05b7e 100644
--- a/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp
+++ b/src/gpu/VirtualFluids_GPU/Input/VtkXmlReader.hpp
@@ -10,7 +10,6 @@
 #ifndef VTK_XML_READER_H
 #define VTK_XML_READER_H
 
-#include "Utilities/StringUtil.hpp"
 #include <boost/property_tree/ptree.hpp>
 #include <boost/property_tree/xml_parser.hpp>
 #include <boost/foreach.hpp>
@@ -18,6 +17,8 @@
 #include <vector>
 #include <iostream>
 
+#include "Core/StringUtilities/StringUtil.h"
+
 namespace vtk_xml_reader
 {
 	template <class T>
diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index 1de408a5d5991fd8ceee59e863d5e32e6384fe67..a4dbc09a99fb4e5ffe434b6d0bfeb27a73da1052 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -19,7 +19,7 @@
 #include "Output/VeloASCIIWriter.hpp"
 //////////////////////////////////////////////////////////////////////////
 #include "Utilities/Buffer2D.hpp"
-#include "Utilities/StringUtil.hpp"
+#include "Core/StringUtilities/StringUtil.h"
 //////////////////////////////////////////////////////////////////////////
 #include "Init/InitLattice.h"
 #include "Init/DefineGrid.h"
diff --git a/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp b/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp
index 8163a612f7bcf77884d6f8c78c8e0c09a470daad..9263f5009f6bda53966197bd7076dab23093c8d9 100644
--- a/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/AnalysisData.hpp
@@ -3,7 +3,7 @@
 
 #include "basics/utilities/UbFileOutputASCII.h"
 #include "Parameter/Parameter.h"
-#include "Utilities/StringUtil.hpp"
+#include "Core/StringUtilities/StringUtil.h"
 
 class AnalysisData
 {
diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
index c278f5349cb4bb2d0ce7f758733e143adbaea37a..86f380705a3b89105b084fe40a7ffbae65cb10e6 100644
--- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
@@ -10,7 +10,7 @@
 #include "LBM/D3Q27.h"
 #include "Parameter/Parameter.h"
 #include "basics/utilities/UbSystem.h"
-#include "Utilities/StringUtil.hpp"
+#include "Core/StringUtilities/StringUtil.h"
 #include <basics/writer/WbWriterVtkXmlBinary.h>
 
 
diff --git a/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp
index 583f36730320363dddc52bdce435cbb1f9095bf8..d661aef500b745b49d28892a01fae96e5a6d5dd3 100644
--- a/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/QDebugWriter.hpp
@@ -10,9 +10,8 @@
 #include "LBM/D3Q27.h"
 #include "Parameter/Parameter.h"
 #include "basics/utilities/UbSystem.h"
-#include "Utilities/StringUtil.hpp"
 #include <basics/writer/WbWriterVtkXmlBinary.h>
-
+#include "Core/StringUtilities/StringUtil.h"
 
 //using namespace std;
 
diff --git a/src/gpu/VirtualFluids_GPU/Particles/Particles.h b/src/gpu/VirtualFluids_GPU/Particles/Particles.h
index 4dcea815aa1ebb200e2174f32d5c85dcede53d9b..ccffb11e7afe2a5dce899644d2c65a55feed529f 100644
--- a/src/gpu/VirtualFluids_GPU/Particles/Particles.h
+++ b/src/gpu/VirtualFluids_GPU/Particles/Particles.h
@@ -4,7 +4,7 @@
 #include "LBM/LB.h"
 #include "GPU/GPU_Interface.h"
 #include "GPU/CudaMemoryManager.h"
-#include "Utilities/StringUtil.hpp"
+#include "Core/StringUtilities/StringUtil.h"
 #include "Parameter/Parameter.h"
 
 //extern "C" void calcDragLift(Parameter* para, int lev);
diff --git a/src/gpu/VirtualFluids_GPU/Utilities/StringUtil.hpp b/src/gpu/VirtualFluids_GPU/Utilities/StringUtil.hpp
deleted file mode 100644
index 46b2fccd74f3bc0a1ed207d2d0a3d4b8d74ef834..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Utilities/StringUtil.hpp
+++ /dev/null
@@ -1,299 +0,0 @@
-#ifndef STRINGUTIL_H
-#define STRINGUTIL_H
-#include <errno.h>
-#include <algorithm>
-#include <sstream>
-#include <iostream>
-#include <string>
-#include <boost/foreach.hpp>
-#include <boost/algorithm/string.hpp>
-
-template <class T>
-bool from_string(T &t, const std::string &s, std::ios_base &(*f)(std::ios_base&))
-{
-   std::istringstream iss(s);
-   return !(iss>>f>>t).fail();
-}
-class StringUtil 
-{
-public:
-   StringUtil() {}
-   ~StringUtil() {}
-   // Find the given string in the source string and replace it with the
-   // "replace" string, everywhere instances of that string exist.
-   static void findandreplace( std::string& source, const std::string& find, const std::string& replace )
-   {
-      size_t j;
-      for (;(j = source.find( find )) 
-         != std::string::npos;)
-      {
-         source.replace( j, 
-            find.length(), replace );
-      }
-   }
-   // The following function returns a string with all-uppercase characters.
-   static std::string makeUpper( const std::string& instring)
-   {
-      std::string temp=instring;
-      transform( temp.begin(), temp.end(), temp.begin(), ::toupper );
-      return temp;
-   }
-   // The following function returns a string with all-lowercase characters.
-   static std::string makeLower( const std::string& instring)
-   {
-      std::string temp;
-      transform( temp.begin(), temp.end(), temp.begin(), ::tolower );
-      return temp;
-   }
-   static bool contains( const std::string& source, const char *find )
-   {
-      return ( 0!=strstr(source.c_str(),find) );
-   }
-   static std::string pad( const std::string& instring, char padchar, int length )
-   {
-      std::string outstring = instring;
-      for ( int i=(int)outstring.length(); i<length; ++i )
-         outstring += padchar;
-      return outstring;
-   }
-   // Trim the given characters from the beginning and end of a string.
-   // the default is to trim whitespace. If the string is empty or contains
-   // only the trim characters, an empty string is returned.
-   static std::string trim( const std::string &instring, const std::string &trimstring=std::string(" \t\n"))
-   {
-      if (trimstring.size()==0) 
-         return instring;
-      std::string temp="";
-      std::string::size_type begpos=instring.find_first_not_of (trimstring);
-      if (begpos==std::string::npos)
-      {
-         return temp;
-      }
-      else
-      {
-         std::string::size_type endpos=instring.find_last_not_of (trimstring);
-         temp=instring.substr(begpos, endpos-begpos+1);
-      }
-      return temp;
-   }
-   // Convert the string to an int. Note that a string exception is thrown if
-   // it is invalid.
-   static int toInt(const std::string & myInString)
-   {
-      int i=0;
-      std::string inString = trim(myInString);
-      if( !from_string<int>(i, inString, std::dec) )
-      {
-         std::string exceptionText = "StringUtils::toInt() - Not an integer: " + inString;
-         throw exceptionText;
-      }
-      // Time to run some more checks.
-      for (unsigned int j=0; j < inString.length(); j++)
-      {
-         if ( !isNumeric(inString[j]) )
-         {
-            if (j==0 && inString[j] =='-')
-            {
-               continue;
-            }
-            else
-            {
-               std::string exceptionText = "StringUtils::toInt() - Not an integer: " + inString;
-               throw exceptionText;
-            }
-         }
-      }
-      return (i);
-   }
-   // Convert the string to a float. Note: A string exception is thrown if
-   // it is invalid.
-   static float toFloat(const std::string & myInString)
-   {
-      float f=0;
-      std::string inString = trim(myInString);
-      if( !from_string<float>(f, inString, std::dec) )
-      {
-         std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString;
-         throw exceptionText;
-      }
-      // Now it runs some more checks.
-      int dec_count=0;
-      int e_count=0;
-      for (unsigned int j=0; j < inString.length(); j++)
-      {
-         if ( !isNumeric(inString[j]) )
-         {
-            if ((j==0 || inString[j-1] == 'e' || inString[j-1] == 'E') && inString[j] =='-')
-            {
-               continue;
-            }
-            else if (inString[j]=='.')
-            {
-               dec_count++;
-               if (dec_count > 1)
-               {
-                  std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString;
-                  throw exceptionText;
-               }
-               continue;
-            }
-            else if (inString[j] == 'e' || inString[j] == 'E')
-            {
-               e_count++;
-               if (e_count > 1)
-               {
-                  std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString;
-                  throw exceptionText;
-               }
-               continue;
-            }
-            else
-            {
-               std::string exceptionText = "StringUtils::toFloat() - Not a float: " + inString;
-               throw exceptionText;
-            }
-         }
-      }
-      return (f);
-   }
-   // Convert the string to a double. Note: A string exception is thrown if
-   // it is invalid.
-   static double toDouble(const std::string & myInString)
-   {
-	   double d=0;
-	   std::string inString = trim(myInString);
-	   if( !from_string<double>(d, inString, std::dec) )
-	   {
-		   std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString;
-		   throw exceptionText;
-	   }
-	   // Now it runs some more checks.
-      int dec_count=0;
-      int e_count=0;
-      for (unsigned int j=0; j < inString.length(); j++)
-      {
-         if ( !isNumeric(inString[j]) )
-         {
-            if ((j==0 || inString[j-1] == 'e' || inString[j-1] == 'E') && inString[j] =='-')
-            {
-               continue;
-            }
-            else if (inString[j]=='.')
-            {
-               dec_count++;
-               if (dec_count > 1)
-               {
-                  std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString;
-                  throw exceptionText;
-               }
-               continue;
-            }
-            else if (inString[j] == 'e' || inString[j] == 'E')
-            {
-               e_count++;
-               if (e_count > 1)
-               {
-                  std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString;
-                  throw exceptionText;
-               }
-               continue;
-            }
-            else
-            {
-               std::string exceptionText = "StringUtils::toDouble() - Not a double: " + inString;
-               throw exceptionText;
-            }
-         }
-      }
-	   return (d);
-   }
-   // Convert the string to a boolean. Note: A string exception is thrown if
-   // it is invalid.
-   static bool toBool(const std::string & myInString)
-   {
-      bool b=0;
-      std::string inString = trim(myInString);
-      if( !from_string<bool>(b, inString, std::boolalpha) )
-      {
-         std::string exceptionText = "StringUtils::toBool() - Not a bool: " + inString;
-         throw exceptionText;
-      }
-      return (b);
-   }
-   // Returns true if the character is numeric.
-   static bool isNumeric(char c)
-   {
-      return ('0' <= c && c <= '9');
-   }
-   // Replace environment variables in the string with their values.
-   // Note: environment variables must be of the form ${ENVVAR}.
-   //static std::string substituteEnvVar( const std::string &myInString )
-   //{
-   //   std::string outString="";
-   //   char variable[512];
-   //   const char *s = myInString.c_str();
-   //   while(*s!=0)
-   //   {
-   //      if (*s=='$' && *(s+1)=='{')
-   //      {
-   //         // When you�ve found beginning of variable, find the end.
-   //         //strcpy(variable,s+2);
-   //         strcpy_s(variable, s+2);
-   //         char *end = strchr (variable,'}');
-   //         if (end)
-   //         {
-   //            *end='\0';
-   //            //char *cp = (char *)getenv(variable);
-   //            char *cp;
-   //            size_t len;
-   //            _dupenv_s(&cp, &len, variable );
-   //            if (cp)
-   //               //outString += (char *) getenv(variable);
-   //               outString += (char *) cp;
-   //            s = strchr(s,'}');
-   //         }
-   //         else
-   //         {
-   //            outString += *s;
-   //         }
-   //      }
-   //      else
-   //      {
-   //         outString += *s;
-   //      }
-   //      s++;
-   //   }
-   //   return outString;
-   //}
-   template<class T>
-   static std::vector<T> toVector(const std::string& s)
-   {
-      std::vector<T> v;
-      std::vector<std::string> strings;
-      boost::algorithm::split(strings, s, boost::is_any_of("\t\n "));
-      BOOST_FOREACH(std::string s, strings){
-         if (s != "")
-         {
-            v.push_back(fromString<T>(s));
-         }
-      }
-      return v;
-   }
-   template<class T>
- 	static std::string toString(const T& t)
-	{
-		std::ostringstream stream;
-		stream << t;
-		return stream.str();
-	}
-   template<class T>
-   static T fromString(const std::string& s)
-   {
-      std::istringstream stream (s);
-      T t;
-      stream >> t;
-      return t;
-   }
-};
-#endif //STRINGUTIL_H
-