diff --git a/CMakeLists.txt b/CMakeLists.txt
index 888b462a3..cb3b12598 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,9 +27,6 @@ option (USE_SYSTEMD
 
 set(HAVE_SYSTEMD ${USE_SYSTEMD})
 
-file(STRINGS VERSION VERSION_LINE REGEX "^Version: ")
-string(REPLACE "Version: " "" ICINGA2_VERSION ${VERSION_LINE})
-
 include(GNUInstallDirs)
 include(InstallConfig)
 include(SetFullDir)
@@ -104,15 +101,36 @@ else()
     string(SUBSTRING ${SPEC_REVISION} 10 ${SPEC_REVISION_LENGTH} SPEC_REVISION)
 
     set(GIT_VERSION "r${SPEC_VERSION}-${SPEC_REVISION}")
+    set(ICINGA2_VERSION "${SPEC_VERSION}")
+  else()
+    # use GIT version as ICINGA2_VERSION
+    string(REGEX REPLACE "^[rv]" "" ICINGA2_VERSION "${GIT_VERSION}")
   endif()
   configure_file(icinga-version.h.cmake icinga-version.h)
 endif()
 
+# NuGet on Windows requires a semantic versioning, example: 2.10.4.123 (only 4 element, only numeric)
+string(REGEX REPLACE "-([0-9]+).*$" ".\\1" ICINGA2_VERSION_SAFE "${ICINGA2_VERSION}")
+
 if(WIN32)
   set(Boost_USE_STATIC_LIBS ON)
-  add_definitions(-DBOOST_ALL_NO_LIB)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
+  # Disabled for linking issues for newer Boost versions, they link against Windows SDKs
+  #add_definitions(-DBOOST_ALL_NO_LIB)
+
+  # Disable optimization for Boost::context
+  # https://www.boost.org/doc/libs/1_69_0/libs/context/doc/html/context/overview.html
+  # https://docs.microsoft.com/en-us/cpp/build/reference/gl-whole-program-optimization?view=vs-2017
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj /GL- /EHs")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /GL- /EHs")
+
+  # detect if 32-bit target
+  if(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32")
+    # SAFESEH is not supported in Boost on Windows x86
+    # maybe it is when Boost is compiled with it...
+    # https://lists.boost.org/Archives/boost/2013/10/206720.php
+    # https://docs.microsoft.com/en-us/cpp/build/reference/safeseh-image-has-safe-exception-handlers?view=vs-2017
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
+  endif()
 endif()
 
 if(NOT DEFINED LOGROTATE_HAS_SU)
@@ -386,7 +404,7 @@ endif()
 
 set(CPACK_PACKAGE_NAME "Icinga 2")
 set(CPACK_PACKAGE_VENDOR "Icinga GmbH")
-set(CPACK_PACKAGE_VERSION ${ICINGA2_VERSION})
+set(CPACK_PACKAGE_VERSION ${ICINGA2_VERSION_SAFE})
 set(CPACK_PACKAGE_INSTALL_DIRECTORY "ICINGA2")
 set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico")
 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt")
diff --git a/agent/CMakeLists.txt b/agent/CMakeLists.txt
index ffee2820f..59c1e26c4 100644
--- a/agent/CMakeLists.txt
+++ b/agent/CMakeLists.txt
@@ -5,7 +5,6 @@ if(MSVC)
     icinga2setupagent
     ${CMAKE_CURRENT_SOURCE_DIR}/windows-setup-agent/Icinga2SetupAgent.csproj
     TYPE FAE04EC0-301F-11D3-BF4B-00C04F79EFBC
-    PLATFORM Win32
   )
 
   install(
diff --git a/agent/windows-setup-agent/Icinga2SetupAgent.csproj b/agent/windows-setup-agent/Icinga2SetupAgent.csproj
index 0a5146d95..8778af498 100644
--- a/agent/windows-setup-agent/Icinga2SetupAgent.csproj
+++ b/agent/windows-setup-agent/Icinga2SetupAgent.csproj
@@ -3,7 +3,7 @@
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <Platform Condition=" '$(Platform)' == '' ">x64</Platform>
     <ProjectGuid>{A86F1159-66E8-4BDB-BF28-A2BDAF76517C}</ProjectGuid>
     <OutputType>WinExe</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -65,6 +65,43 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'RelWithDebInfo|Win32' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\RelWithDebInfo\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'MinSizeRel|Win32' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\MinSizeRel\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
     <PlatformTarget>x64</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
@@ -203,11 +240,11 @@
     </BootstrapperPackage>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
   </Target>
   <Target Name="AfterBuild">
   </Target>
   -->
-</Project>
\ No newline at end of file
+</Project>
diff --git a/appveyor.yml b/appveyor.yml
index 48fb507b0..92dfe7bef 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,18 +1,20 @@
 ---
-version: 2.9.0.dev.{build}
+version: 2.11.0.dev.{build}
 
 os: Visual Studio 2017
 platform: x64
 
 environment:
+  BITS: 64
+  CMAKE_BUILD_TYPE: Debug
   CMAKE_GENERATOR: "Visual Studio 15 2017 Win64"
-  VSCMD_VER: 15.0
   # https://www.appveyor.com/docs/windows-images-software/#boost
-  BOOST_ROOT: 'C:\Libraries\boost_1_66_0'
-  BOOST_LIBRARYDIR: 'C:\Libraries\boost_1_66_0\lib64-msvc-14.1'
+  BOOST_ROOT: 'C:\Libraries\boost_1_67_0'
+  BOOST_LIBRARYDIR: 'C:\Libraries\boost_1_67_0\lib64-msvc-14.1'
+  # https://www.appveyor.com/docs/windows-images-software/#tools
+  OPENSSL_ROOT_DIR: 'C:\OpenSSL-v111-Win64'
   BISON_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_bison.exe'
   FLEX_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_flex.exe'
-  CMAKE_BUILD_TYPE: Debug
 
 branches:
   only:
@@ -33,32 +35,21 @@ install:
 # https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell#comment_44999171
 before_build:
 - ps: |
-    $bits = $env:PLATFORM -replace "^x", ""
-    cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars${bits}.bat`" && set > `"${env:TEMP}\vcvars.txt`""
-    Get-Content "$env:TEMP\vcvars.txt" | Foreach-Object {
-      if ($_ -match "^(VSCMD.*?)=(.*)$") {
-        Set-Content ("env:" + $matches[1]) $matches[2]
-      }
-    }
+    & .\tools\win32\load-vsenv.ps1
 
-    if (-not (Test-Path ".\build\vendor\OpenSSL")) {
-      & .\tools\win32\download-openssl.ps1
-      if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
-    }
-
-    & .\tools\win32\configure.ps1
+    & powershell.exe .\tools\win32\configure.ps1
     if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
 
     del build\Icinga*.msi
 
 build_script:
 - ps: |
-    & .\tools\win32\build.ps1
+    & powershell.exe .\tools\win32\build.ps1
     if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
 
 test_script:
 - ps: |
-    & .\tools\win32\test.ps1
+    & powershell.exe .\tools\win32\test.ps1
     if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }
 
 # Disable until we really need them
diff --git a/choco/CMakeLists.txt b/choco/CMakeLists.txt
index 650c41cf1..d7b90bb47 100644
--- a/choco/CMakeLists.txt
+++ b/choco/CMakeLists.txt
@@ -8,7 +8,7 @@ if(WIN32)
 
   add_custom_target(choco-pkg ALL
     COMMAND choco pack
-    COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/icinga2.${SPEC_VERSION}.nupkg ${CMAKE_CURRENT_BINARY_DIR}/icinga2.nupkg
+    COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/icinga2.${ICINGA2_VERSION_SAFE}.nupkg ${CMAKE_CURRENT_BINARY_DIR}/icinga2.nupkg
     DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/icinga2.nuspec ${CMAKE_CURRENT_BINARY_DIR}/chocolateyInstall.ps1 chocolateyUninstall.ps1
   )
 endif()
diff --git a/choco/chocolateyInstall.ps1.cmake b/choco/chocolateyInstall.ps1.cmake
index cbf4ca0d9..ab1660324 100755
--- a/choco/chocolateyInstall.ps1.cmake
+++ b/choco/chocolateyInstall.ps1.cmake
@@ -1,7 +1,7 @@
 $packageName = 'icinga2'
 $installerType = 'msi'
-$url32 = 'https://packages.icinga.com/windows/Icinga2-v${SPEC_VERSION}-x86.msi'
-$url64 = 'https://packages.icinga.com/windows/Icinga2-v${SPEC_VERSION}-x86_64.msi'
+$url32 = 'https://packages.icinga.com/windows/Icinga2-v${ICINGA2_VERSION_SAFE}-x86.msi'
+$url64 = 'https://packages.icinga.com/windows/Icinga2-v${ICINGA2_VERSION_SAFE}-x86_64.msi'
 $silentArgs = '/qn /norestart'
 $validExitCodes = @(0)
 
diff --git a/choco/icinga2.nuspec.cmake b/choco/icinga2.nuspec.cmake
index 1b1465df6..46225b556 100755
--- a/choco/icinga2.nuspec.cmake
+++ b/choco/icinga2.nuspec.cmake
@@ -6,7 +6,7 @@
     <!-- Read this before publishing packages to chocolatey.org: https://github.com/chocolatey/chocolatey/wiki/CreatePackages -->
     <id>icinga2</id>
     <title>Icinga 2</title>
-    <version>${SPEC_VERSION}</version>
+    <version>${ICINGA2_VERSION_SAFE}</version>
     <authors>Icinga GmbH</authors>
     <owners>Icinga GmbH</owners>
     <summary>icinga2 - Monitoring Agent for Windows</summary>
diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp
index a095bbbc3..dc08f3b3b 100644
--- a/plugins/check_swap.cpp
+++ b/plugins/check_swap.cpp
@@ -30,7 +30,7 @@ struct pageFileInfo
 
 static bool l_Debug;
 
-BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCTSTR lpFilename) {
+BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCWSTR lpFilename) {
 	std::vector<pageFileInfo>* pageFile = static_cast<std::vector<pageFileInfo>*>(pContext);
 	SYSTEM_INFO systemInfo;
 
@@ -199,10 +199,11 @@ static int printOutput(printInfoStruct& printInfo)
 
 static int check_swap(printInfoStruct& printInfo)
 {
-	PENUM_PAGE_FILE_CALLBACK pageFileCallback = &EnumPageFilesProc;
+	// Needs explicit cast: http://msinilo.pl/blog2/post/p1348/
+	PENUM_PAGE_FILE_CALLBACKW pageFileCallback = (PENUM_PAGE_FILE_CALLBACKW)EnumPageFilesProc;
 	std::vector<pageFileInfo> pageFiles;
 
-	if(!EnumPageFiles(pageFileCallback, &pageFiles)) {
+	if(!EnumPageFilesW(pageFileCallback, &pageFiles)) {
 		printErrorInfo();
 		return 3;
 	}
diff --git a/tools/win32/build.ps1 b/tools/win32/build.ps1
index d9dba5f94..33346a91b 100644
--- a/tools/win32/build.ps1
+++ b/tools/win32/build.ps1
@@ -1,7 +1,13 @@
+Set-PsDebug -Trace 1
+
 if (-not (Test-Path env:ICINGA2_BUILDPATH)) {
   $env:ICINGA2_BUILDPATH = '.\build'
 }
 
+if (-not (Test-Path env:CMAKE_BUILD_TYPE)) {
+  $env:CMAKE_BUILD_TYPE = 'RelWithDebInfo'
+}
+
 if (-not (Test-Path $env:ICINGA2_BUILDPATH)) {
   Write-Host "Path '$env:ICINGA2_BUILDPATH' does not exist!"
   exit 1
@@ -14,5 +20,8 @@ if (-not ($env:PATH -contains $env:CMAKE_PATH)) {
   $env:PATH = $env:CMAKE_PATH + ';' + $env:PATH
 }
 
-cmake.exe --build "$env:ICINGA2_BUILDPATH" --target PACKAGE --config RelWithDebInfo
+cmake.exe --build "$env:ICINGA2_BUILDPATH" --target ALL_BUILD --config $env:CMAKE_BUILD_TYPE
+if ($lastexitcode -ne 0) { exit $lastexitcode }
+
+cmake.exe --build "$env:ICINGA2_BUILDPATH" --target PACKAGE --config $env:CMAKE_BUILD_TYPE
 if ($lastexitcode -ne 0) { exit $lastexitcode }
diff --git a/tools/win32/configure.ps1 b/tools/win32/configure.ps1
index 0ea0a50cb..63305e5dc 100644
--- a/tools/win32/configure.ps1
+++ b/tools/win32/configure.ps1
@@ -1,3 +1,5 @@
+Set-PsDebug -Trace 1
+
 if (-not (Test-Path env:ICINGA2_BUILDPATH)) {
   $env:ICINGA2_BUILDPATH = '.\build'
 }
@@ -8,40 +10,23 @@ if (-not (Test-Path env:CMAKE_BUILD_TYPE)) {
 if (-not (Test-Path "$env:ICINGA2_BUILDPATH")) {
   mkdir "$env:ICINGA2_BUILDPATH" | out-null
 }
-if (-not (Test-Path "$env:ICINGA2_BUILDPATH\install")) {
-  mkdir "$env:ICINGA2_BUILDPATH\install" | out-null
-}
 if (-not (Test-Path env:CMAKE_PATH)) {
   $env:CMAKE_PATH = 'C:\Program Files\CMake\bin'
 }
 if (-not ($env:PATH -contains $env:CMAKE_PATH)) {
   $env:PATH = $env:CMAKE_PATH + ';' + $env:PATH
 }
-
 if (-not (Test-Path env:CMAKE_GENERATOR)) {
   $env:CMAKE_GENERATOR = 'Visual Studio 15 2017 Win64'
 }
 if (-not (Test-Path env:OPENSSL_ROOT_DIR)) {
-  if (Test-Path env:VSCMD_ARG_TGT_ARCH) {
-    $OpenSSL_arch = $env:VSCMD_ARG_TGT_ARCH
-  } else {
-    throw "Missing env variable VSCMD_ARG_TGT_ARCH"
-  }
-
-  if (Test-Path env:VSCMD_VER) {
-    $VSmajor = $env:VSCMD_VER -replace "\..*$", ""
-    $OpenSSL_vcbuild = "vc${VSmajor}0"
-  } else {
-    throw "Missing env variable VSCMD_VER"
-  }
-
-  $env:OPENSSL_ROOT_DIR = "$env:ICINGA2_BUILDPATH\vendor\OpenSSL-$OpenSSL_arch-$OpenSSL_vcbuild"
+  $env:OPENSSL_ROOT_DIR = 'c:\local\OpenSSL_1_1_1b-Win64'
 }
 if (-not (Test-Path env:BOOST_ROOT)) {
-  $env:BOOST_ROOT = 'c:\local\boost_1_65_1'
+  $env:BOOST_ROOT = 'c:\local\boost_1_69_0-Win64'
 }
 if (-not (Test-Path env:BOOST_LIBRARYDIR)) {
-  $env:BOOST_LIBRARYDIR = 'c:\local\boost_1_65_1\lib64-msvc-14.1'
+  $env:BOOST_LIBRARYDIR = 'c:\local\boost_1_69_0-Win64\lib64-msvc-14.1'
 }
 if (-not (Test-Path env:FLEX_BINARY)) {
   $env:FLEX_BINARY = 'C:\ProgramData\chocolatey\bin\win_flex.exe'
@@ -63,11 +48,12 @@ if (Test-Path CMakeCache.txt) {
 
 & cmake.exe "$sourcePath" `
   -DCMAKE_BUILD_TYPE="$env:CMAKE_BUILD_TYPE" `
-  -G $env:CMAKE_GENERATOR -DCPACK_GENERATOR=WIX `
+  -G "$env:CMAKE_GENERATOR" -DCPACK_GENERATOR=WIX `
   -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF `
+  -DICINGA2_WITH_LIVESTATUS=OFF -DICINGA2_WITH_COMPAT=OFF `
   -DOPENSSL_ROOT_DIR="$env:OPENSSL_ROOT_DIR" `
-  -DBOOST_ROOT="$env:BOOST_ROOT" `
   -DBOOST_LIBRARYDIR="$env:BOOST_LIBRARYDIR" `
+  -DBOOST_INCLUDEDIR="$env:BOOST_ROOT" `
   -DFLEX_EXECUTABLE="$env:FLEX_BINARY" `
   -DBISON_EXECUTABLE="$env:BISON_BINARY"
 
diff --git a/tools/win32/download-openssl.ps1 b/tools/win32/download-openssl.ps1
deleted file mode 100644
index 0e074e6ae..000000000
--- a/tools/win32/download-openssl.ps1
+++ /dev/null
@@ -1,76 +0,0 @@
-$ErrorActionPreference = "Stop"
-
-$OpenSSL_version = '1.1.0g-1'
-
-if (Test-Path env:VSCMD_ARG_TGT_ARCH) {
-  $OpenSSL_arch = $env:VSCMD_ARG_TGT_ARCH
-} else {
-  throw "Missing env variable VSCMD_ARG_TGT_ARCH"
-}
-if (Test-Path env:VSCMD_VER) {
-  $VSmajor = $env:VSCMD_VER -replace "\..*$", ""
-  $OpenSSL_vcbuild = "vc${VSmajor}0"
-} else {
-  throw "Missing env variable VSCMD_VER"
-}
-
-$OpenSSL_fileversion = $OpenSSL_version.Replace('.', '_').Split('-')[0]
-$OpenSSL_file = [string]::Format(
-  'openssl-{0}-binary-icinga-{1}-{2}.zip',
-  $OpenSSL_fileversion,
-  $OpenSSL_arch,
-  $OpenSSL_vcbuild
-)
-$OpenSSL_url = [string]::Format(
-  'https://github.com/Icinga/openssl-windows/releases/download/v{0}/{1}',
-  $OpenSSL_version,
-  $OpenSSL_file
-)
-
-if (-not (Test-Path env:ICINGA2_BUILDPATH)) {
-  $env:ICINGA2_BUILDPATH = '.\build'
-}
-
-$vendor_path = $env:ICINGA2_BUILDPATH + '\vendor'
-$OpenSSL_zip_location = $env:ICINGA2_BUILDPATH + '\vendor\' + $OpenSSL_file
-$OpenSSL_vendor_path = "$vendor_path\OpenSSL-$OpenSSL_arch-$OpenSSL_vcbuild"
-
-# Tune Powershell TLS protocols
-$AllProtocols = [System.Net.SecurityProtocolType]'Tls11,Tls12'
-[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
-
-if (-not (Test-Path $env:ICINGA2_BUILDPATH)) {
-  mkdir $env:ICINGA2_BUILDPATH | out-null
-}
-if (-not (Test-Path $vendor_path)) {
-  mkdir $vendor_path | out-null
-}
-
-if (Test-Path $OpenSSL_zip_location) {
-  Write-Output "OpenSSL archive available at $OpenSSL_zip_location"
-} else {
-  Write-Output "Downloading OpenSSL binary dist from $OpenSSL_url"
-
-  $progressPreference = 'silentlyContinue'
-  Invoke-WebRequest -Uri $OpenSSL_url -OutFile $OpenSSL_zip_location
-  $progressPreference = 'Continue'
-
-  if (Test-Path $OpenSSL_vendor_path) {
-    Remove-Item -Recurse $OpenSSL_vendor_path
-  }
-}
-
-if (-not (Test-Path $OpenSSL_vendor_path)) {
-  mkdir $OpenSSL_vendor_path | out-null
-
-  Write-Output "Extracting ZIP to $OpenSSL_vendor_path"
-  Add-Type -AssemblyName System.IO.Compression.FileSystem
-  $pwd = Get-Location
-  [System.IO.Compression.ZipFile]::ExtractToDirectory(
-    (Join-Path -path $pwd -childpath $OpenSSL_zip_location),
-    (Join-Path -path $pwd -childpath $OpenSSL_vendor_path)
-  )
-  if ($lastexitcode -ne 0){ exit $lastexitcode }
-} else {
-  Write-Output "OpenSSL is already available at $OpenSSL_vendor_path"
-}
diff --git a/tools/win32/load-vsenv.ps1 b/tools/win32/load-vsenv.ps1
new file mode 100644
index 000000000..86fcf4fba
--- /dev/null
+++ b/tools/win32/load-vsenv.ps1
@@ -0,0 +1,58 @@
+# why that env handling, see
+# https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell#comment_44999171
+
+Set-PsDebug -Trace 1
+
+$SOURCE = Get-Location
+
+if (Test-Path env:ICINGA2_BUILDPATH) {
+  $BUILD = $env:ICINGA2_BUILDPATH
+} else {
+  $BUILD = "${SOURCE}\Build"
+}
+
+if (-not (Test-Path $BUILD)) {
+  mkdir $BUILD | Out-Null
+}
+
+if (Test-Path env:VS_INSTALL_PATH) {
+  $VSBASE = $env:VS_INSTALL_PATH
+} else {
+  $VSBASE = "C:\Program Files (x86)\Microsoft Visual Studio\2017"
+}
+
+if (Test-Path env:BITS) {
+  $bits = $env:BITS
+} else {
+  $bits = 64
+}
+
+# Execute vcvars in cmd and store env
+$vcvars_locations = @(
+  "${VSBASE}\BuildTools\VC\Auxiliary\Build\vcvars${bits}.bat",
+  "${VSBASE}\Community\VC\Auxiliary\Build\vcvars${bits}.bat"
+)
+
+$vcvars = $null
+foreach ($file in $vcvars_locations) {
+  if (Test-Path $file) {
+    $vcvars = $file
+    break
+  }
+}
+
+if ($vcvars -eq $null) {
+  throw "Could not get Build environment script at locations: ${vcvars_locations}"
+}
+
+cmd.exe /c "call `"${vcvars}`" && set > `"${BUILD}\vcvars.txt`""
+if ($LastExitCode -ne 0) {
+  throw "Could not load Build environment from: ${vcvars}"
+}
+
+# Load environment for PowerShell
+Get-Content "${BUILD}\vcvars.txt" | Foreach-Object {
+  if ($_ -match "^(VSCMD.*?)=(.*)$") {
+	Set-Content ("env:" + $matches[1]) $matches[2]
+  }
+}
diff --git a/tools/win32/test.ps1 b/tools/win32/test.ps1
index 81fe8e6fa..3d3c12540 100644
--- a/tools/win32/test.ps1
+++ b/tools/win32/test.ps1
@@ -1,7 +1,13 @@
+Set-PsDebug -Trace 1
+
 if (-not (Test-Path env:ICINGA2_BUILDPATH)) {
   $env:ICINGA2_BUILDPATH = 'build'
 }
 
+if (-not (Test-Path env:CMAKE_BUILD_TYPE)) {
+  $env:CMAKE_BUILD_TYPE = 'RelWithDebInfo'
+}
+
 [string]$pwd = Get-Location
 
 if (-not (Test-Path $env:ICINGA2_BUILDPATH)) {
@@ -18,7 +24,7 @@ if (-not ($env:PATH -contains $env:CMAKE_PATH)) {
 
 cd "$env:ICINGA2_BUILDPATH"
 
-ctest.exe -C RelWithDebInfo -T test -O $env:ICINGA2_BUILDPATH/Test.xml --output-on-failure
+ctest.exe -C "${env:CMAKE_BUILD_TYPE}" -T test -O $env:ICINGA2_BUILDPATH/Test.xml --output-on-failure
 if ($lastexitcode -ne 0) {
   cd ..
   exit $lastexitcode