From 373d4ac932906b8384985bf915e01b3b11da6b5f Mon Sep 17 00:00:00 2001
From: Geoffrey McRae <geoff@hostfission.com>
Date: Tue, 28 May 2019 14:47:09 +1000
Subject: [PATCH] [host] removed old host application from the project, see
 c-host

---
 VERSION                                  |   2 +-
 host/.gitignore                          | 308 ---------
 host/Capture/DXGI.cpp                    | 829 -----------------------
 host/Capture/DXGI.h                      | 106 ---
 host/Capture/NvFBC.cpp                   | 395 -----------
 host/Capture/NvFBC.h                     |  79 ---
 host/CaptureFactory.h                    |  95 ---
 host/Com.h                               |  58 --
 host/CrashHandler.cpp                    |  80 ---
 host/CrashHandler.h                      |  30 -
 host/ICapture.h                          |  84 ---
 host/IVSHMEM.cpp                         | 380 -----------
 host/IVSHMEM.h                           |  69 --
 host/Looking Glass.sln                   |  60 --
 host/MFT/H264.cpp                        | 453 -------------
 host/MFT/H264.h                          | 101 ---
 host/Makefile                            |  59 --
 host/Service.cpp                         | 391 -----------
 host/Service.h                           | 114 ----
 host/Shaders/Pixel.hlsl                  |  13 -
 host/Shaders/RGBtoYUV.hlsl               |  31 -
 host/Shaders/Vertex.hlsl                 |  16 -
 host/TextureConverter.cpp                | 418 ------------
 host/TextureConverter.h                  |  80 ---
 host/TraceUtil.cpp                       |  25 -
 host/TraceUtil.h                         |  79 ---
 host/Util.h                              | 154 -----
 host/WinDebug.h                          |  24 -
 host/looking-glass-host.vcxproj          | 418 ------------
 host/looking-glass-host.vcxproj.filters  | 118 ----
 host/main.cpp                            | 373 ----------
 host/sync-test/main.c                    | 109 ---
 host/sync-test/packages.config           |   8 -
 host/sync-test/sync-test.vcxproj         | 302 ---------
 host/sync-test/sync-test.vcxproj.filters |  25 -
 35 files changed, 1 insertion(+), 5885 deletions(-)
 delete mode 100644 host/.gitignore
 delete mode 100644 host/Capture/DXGI.cpp
 delete mode 100644 host/Capture/DXGI.h
 delete mode 100644 host/Capture/NvFBC.cpp
 delete mode 100644 host/Capture/NvFBC.h
 delete mode 100644 host/CaptureFactory.h
 delete mode 100644 host/Com.h
 delete mode 100644 host/CrashHandler.cpp
 delete mode 100644 host/CrashHandler.h
 delete mode 100644 host/ICapture.h
 delete mode 100644 host/IVSHMEM.cpp
 delete mode 100644 host/IVSHMEM.h
 delete mode 100644 host/Looking Glass.sln
 delete mode 100644 host/MFT/H264.cpp
 delete mode 100644 host/MFT/H264.h
 delete mode 100644 host/Makefile
 delete mode 100644 host/Service.cpp
 delete mode 100644 host/Service.h
 delete mode 100644 host/Shaders/Pixel.hlsl
 delete mode 100644 host/Shaders/RGBtoYUV.hlsl
 delete mode 100644 host/Shaders/Vertex.hlsl
 delete mode 100644 host/TextureConverter.cpp
 delete mode 100644 host/TextureConverter.h
 delete mode 100644 host/TraceUtil.cpp
 delete mode 100644 host/TraceUtil.h
 delete mode 100644 host/Util.h
 delete mode 100644 host/WinDebug.h
 delete mode 100644 host/looking-glass-host.vcxproj
 delete mode 100644 host/looking-glass-host.vcxproj.filters
 delete mode 100644 host/main.cpp
 delete mode 100644 host/sync-test/main.c
 delete mode 100644 host/sync-test/packages.config
 delete mode 100644 host/sync-test/sync-test.vcxproj
 delete mode 100644 host/sync-test/sync-test.vcxproj.filters

diff --git a/VERSION b/VERSION
index 5949baca..6b36f1dc 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-B1-rc3-6-g3d426ccef8+1
\ No newline at end of file
+B1-rc3-7-g7d26027752+1
\ No newline at end of file
diff --git a/host/.gitignore b/host/.gitignore
deleted file mode 100644
index ee3dffd4..00000000
--- a/host/.gitignore
+++ /dev/null
@@ -1,308 +0,0 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
-
-# User-specific files
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# compiled shader headers
-Shaders/*.h
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-
-# Visual Studio 2015 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUNIT
-*.VisualState.xml
-TestResult.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-**/Properties/launchSettings.json
-
-*_i.c
-*_p.c
-*_i.h
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*.log
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# JustCode is a .NET coding add-in
-.JustCode
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Typescript v1 declaration files
-typings/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# JetBrains Rider
-.idea/
-*.sln.iml
-
-# CodeRush
-.cr/
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
diff --git a/host/Capture/DXGI.cpp b/host/Capture/DXGI.cpp
deleted file mode 100644
index 36480dcb..00000000
--- a/host/Capture/DXGI.cpp
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "Capture/DXGI.h"
-using namespace Capture;
-
-#include "WinDebug.h"
-#include "common/memcpySSE.h"
-
-static const char * DXGI_FORMAT_STR[] = {
-  "DXGI_FORMAT_UNKNOWN",
-  "DXGI_FORMAT_R32G32B32A32_TYPELESS",
-  "DXGI_FORMAT_R32G32B32A32_FLOAT",
-  "DXGI_FORMAT_R32G32B32A32_UINT",
-  "DXGI_FORMAT_R32G32B32A32_SINT",
-  "DXGI_FORMAT_R32G32B32_TYPELESS",
-  "DXGI_FORMAT_R32G32B32_FLOAT",
-  "DXGI_FORMAT_R32G32B32_UINT",
-  "DXGI_FORMAT_R32G32B32_SINT",
-  "DXGI_FORMAT_R16G16B16A16_TYPELESS",
-  "DXGI_FORMAT_R16G16B16A16_FLOAT",
-  "DXGI_FORMAT_R16G16B16A16_UNORM",
-  "DXGI_FORMAT_R16G16B16A16_UINT",
-  "DXGI_FORMAT_R16G16B16A16_SNORM",
-  "DXGI_FORMAT_R16G16B16A16_SINT",
-  "DXGI_FORMAT_R32G32_TYPELESS",
-  "DXGI_FORMAT_R32G32_FLOAT",
-  "DXGI_FORMAT_R32G32_UINT",
-  "DXGI_FORMAT_R32G32_SINT",
-  "DXGI_FORMAT_R32G8X24_TYPELESS",
-  "DXGI_FORMAT_D32_FLOAT_S8X24_UINT",
-  "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS",
-  "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT",
-  "DXGI_FORMAT_R10G10B10A2_TYPELESS",
-  "DXGI_FORMAT_R10G10B10A2_UNORM",
-  "DXGI_FORMAT_R10G10B10A2_UINT",
-  "DXGI_FORMAT_R11G11B10_FLOAT",
-  "DXGI_FORMAT_R8G8B8A8_TYPELESS",
-  "DXGI_FORMAT_R8G8B8A8_UNORM",
-  "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB",
-  "DXGI_FORMAT_R8G8B8A8_UINT",
-  "DXGI_FORMAT_R8G8B8A8_SNORM",
-  "DXGI_FORMAT_R8G8B8A8_SINT",
-  "DXGI_FORMAT_R16G16_TYPELESS",
-  "DXGI_FORMAT_R16G16_FLOAT",
-  "DXGI_FORMAT_R16G16_UNORM",
-  "DXGI_FORMAT_R16G16_UINT",
-  "DXGI_FORMAT_R16G16_SNORM",
-  "DXGI_FORMAT_R16G16_SINT",
-  "DXGI_FORMAT_R32_TYPELESS",
-  "DXGI_FORMAT_D32_FLOAT",
-  "DXGI_FORMAT_R32_FLOAT",
-  "DXGI_FORMAT_R32_UINT",
-  "DXGI_FORMAT_R32_SINT",
-  "DXGI_FORMAT_R24G8_TYPELESS",
-  "DXGI_FORMAT_D24_UNORM_S8_UINT",
-  "DXGI_FORMAT_R24_UNORM_X8_TYPELESS",
-  "DXGI_FORMAT_X24_TYPELESS_G8_UINT",
-  "DXGI_FORMAT_R8G8_TYPELESS",
-  "DXGI_FORMAT_R8G8_UNORM",
-  "DXGI_FORMAT_R8G8_UINT",
-  "DXGI_FORMAT_R8G8_SNORM",
-  "DXGI_FORMAT_R8G8_SINT",
-  "DXGI_FORMAT_R16_TYPELESS",
-  "DXGI_FORMAT_R16_FLOAT",
-  "DXGI_FORMAT_D16_UNORM",
-  "DXGI_FORMAT_R16_UNORM",
-  "DXGI_FORMAT_R16_UINT",
-  "DXGI_FORMAT_R16_SNORM",
-  "DXGI_FORMAT_R16_SINT",
-  "DXGI_FORMAT_R8_TYPELESS",
-  "DXGI_FORMAT_R8_UNORM",
-  "DXGI_FORMAT_R8_UINT",
-  "DXGI_FORMAT_R8_SNORM",
-  "DXGI_FORMAT_R8_SINT",
-  "DXGI_FORMAT_A8_UNORM",
-  "DXGI_FORMAT_R1_UNORM",
-  "DXGI_FORMAT_R9G9B9E5_SHAREDEXP",
-  "DXGI_FORMAT_R8G8_B8G8_UNORM",
-  "DXGI_FORMAT_G8R8_G8B8_UNORM",
-  "DXGI_FORMAT_BC1_TYPELESS",
-  "DXGI_FORMAT_BC1_UNORM",
-  "DXGI_FORMAT_BC1_UNORM_SRGB",
-  "DXGI_FORMAT_BC2_TYPELESS",
-  "DXGI_FORMAT_BC2_UNORM",
-  "DXGI_FORMAT_BC2_UNORM_SRGB",
-  "DXGI_FORMAT_BC3_TYPELESS",
-  "DXGI_FORMAT_BC3_UNORM",
-  "DXGI_FORMAT_BC3_UNORM_SRGB",
-  "DXGI_FORMAT_BC4_TYPELESS",
-  "DXGI_FORMAT_BC4_UNORM",
-  "DXGI_FORMAT_BC4_SNORM",
-  "DXGI_FORMAT_BC5_TYPELESS",
-  "DXGI_FORMAT_BC5_UNORM",
-  "DXGI_FORMAT_BC5_SNORM",
-  "DXGI_FORMAT_B5G6R5_UNORM",
-  "DXGI_FORMAT_B5G5R5A1_UNORM",
-  "DXGI_FORMAT_B8G8R8A8_UNORM",
-  "DXGI_FORMAT_B8G8R8X8_UNORM",
-  "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM",
-  "DXGI_FORMAT_B8G8R8A8_TYPELESS",
-  "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB",
-  "DXGI_FORMAT_B8G8R8X8_TYPELESS",
-  "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB",
-  "DXGI_FORMAT_BC6H_TYPELESS",
-  "DXGI_FORMAT_BC6H_UF16",
-  "DXGI_FORMAT_BC6H_SF16",
-  "DXGI_FORMAT_BC7_TYPELESS",
-  "DXGI_FORMAT_BC7_UNORM",
-  "DXGI_FORMAT_BC7_UNORM_SRGB",
-  "DXGI_FORMAT_AYUV",
-  "DXGI_FORMAT_Y410",
-  "DXGI_FORMAT_Y416",
-  "DXGI_FORMAT_NV12",
-  "DXGI_FORMAT_P010",
-  "DXGI_FORMAT_P016",
-  "DXGI_FORMAT_420_OPAQUE",
-  "DXGI_FORMAT_YUY2",
-  "DXGI_FORMAT_Y210",
-  "DXGI_FORMAT_Y216",
-  "DXGI_FORMAT_NV11",
-  "DXGI_FORMAT_AI44",
-  "DXGI_FORMAT_IA44",
-  "DXGI_FORMAT_P8",
-  "DXGI_FORMAT_A8P8",
-  "DXGI_FORMAT_B4G4R4A4_UNORM",
-
-  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
-  "DXGI_FORMAT_P208",
-  "DXGI_FORMAT_V208",
-  "DXGI_FORMAT_V408"
-};
-
-const char * GetDXGIFormatStr(DXGI_FORMAT format)
-{
-  if (format > _countof(DXGI_FORMAT_STR))
-    return DXGI_FORMAT_STR[0];
-  return DXGI_FORMAT_STR[format];
-}
-
-DXGI::DXGI() :
-  m_options(NULL),
-  m_initialized(false),
-  m_dxgiFactory(),
-  m_device(),
-  m_deviceContext(),
-  m_dup()
-{
-}
-
-DXGI::~DXGI()
-{
-}
-
-bool DXGI::CanInitialize()
-{
-  HDESK desktop = OpenInputDesktop(0, TRUE, GENERIC_READ);
-  if (!desktop)
-    return false;
-
-  CloseDesktop(desktop);
-  return true;
-}
-
-bool DXGI::Initialize(CaptureOptions * options)
-{
-  if (m_initialized)
-    DeInitialize();
-
-  m_options = options;
-  HRESULT status;
-
-  m_cursorRPos = 0;
-  m_cursorWPos = 0;
-  for (int i = 0; i < _countof(m_cursorRing); ++i)
-  {
-    CursorInfo & cursor = m_cursorRing[i];
-    cursor.visible  = false;
-    cursor.hasPos   = false;
-    cursor.hasShape = false;
-  }
-
-  status = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void **)(&m_dxgiFactory));
-  if (FAILED(status))
-  {
-    DEBUG_ERROR("Failed to create DXGIFactory: %08x", (int)status);
-    return false;
-  }
-
-  bool done = false;
-  IDXGIAdapter1Ptr adapter;
-  for (int i = 0; m_dxgiFactory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND; i++)
-  {
-    for (int i = 0; adapter->EnumOutputs(i, &m_output) != DXGI_ERROR_NOT_FOUND; i++)
-    {
-      DXGI_OUTPUT_DESC outputDesc;
-      m_output->GetDesc(&outputDesc);
-      if (!outputDesc.AttachedToDesktop)
-      {
-        m_output = NULL;
-        continue;
-      }
-
-      DXGI_ADAPTER_DESC1 adapterDesc;
-      adapter->GetDesc1(&adapterDesc);
-      DEBUG_INFO("Device Descripion: %ls"    , adapterDesc.Description);
-      DEBUG_INFO("Device Vendor ID : 0x%x"   , adapterDesc.VendorId);
-      DEBUG_INFO("Device Device ID : 0x%x"   , adapterDesc.DeviceId);
-      DEBUG_INFO("Device Video Mem : %lld MB", adapterDesc.DedicatedVideoMemory  / 1048576);
-      DEBUG_INFO("Device Sys Mem   : %lld MB", adapterDesc.DedicatedSystemMemory / 1048576);
-      DEBUG_INFO("Shared Sys Mem   : %lld MB", adapterDesc.SharedSystemMemory    / 1048576);
-
-      m_width  = outputDesc.DesktopCoordinates.right  - outputDesc.DesktopCoordinates.left;
-      m_height = outputDesc.DesktopCoordinates.bottom - outputDesc.DesktopCoordinates.top;
-      DEBUG_INFO("Capture Size     : %u x %u", m_width, m_height);
-
-      done = true;
-      break;
-    }
-
-    if (done)
-      break;
-
-    adapter = NULL;
-  }
-
-  if (!done)
-  {
-    DEBUG_ERROR("Failed to locate a valid output device");
-    DeInitialize();
-    return false;
-  }
-
-  static const D3D_FEATURE_LEVEL featureLevels[] = {
-    D3D_FEATURE_LEVEL_12_1,
-    D3D_FEATURE_LEVEL_12_0,
-    D3D_FEATURE_LEVEL_11_1,
-    D3D_FEATURE_LEVEL_11_0,
-    D3D_FEATURE_LEVEL_10_1,
-    D3D_FEATURE_LEVEL_10_0,
-    D3D_FEATURE_LEVEL_9_3,
-    D3D_FEATURE_LEVEL_9_2,
-    D3D_FEATURE_LEVEL_9_1
-  };
-
-  #ifdef _DEBUG
-    #define CREATE_FLAGS (D3D11_CREATE_DEVICE_DEBUG)
-  #else
-    #define CREATE_FLAGS (0)
-  #endif
-
-  status = D3D11CreateDevice(
-    adapter,
-    D3D_DRIVER_TYPE_UNKNOWN,
-    NULL,
-    CREATE_FLAGS | D3D11_CREATE_DEVICE_VIDEO_SUPPORT,
-    featureLevels, ARRAYSIZE(featureLevels),
-    D3D11_SDK_VERSION,
-    &m_device,
-    &m_featureLevel,
-    &m_deviceContext
-  );
-  #undef CREATE_FLAGS  
-
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create D3D11 device", status);
-    DeInitialize();
-    return false;
-  }
-
-  DEBUG_INFO("Feature Level    : 0x%x", m_featureLevel);
-
-  IDXGIDevicePtr dxgi;
-  status = m_device->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgi);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to obtain the IDXGIDevice interface from the D3D11 device", status);
-    DeInitialize();
-    return false;
-  }
-
-  dxgi->SetGPUThreadPriority(7);
-
-  // first try to use the newer API
-  IDXGIOutput5Ptr output5 = m_output;
-  if (output5)
-  {
-    // we try this twice in case we still get an error on re-initialization
-    for (int i = 0; i < 2; ++i)
-    {
-      const DXGI_FORMAT supportedFormats[] = {
-        DXGI_FORMAT_B8G8R8A8_UNORM,
-        DXGI_FORMAT_R8G8B8A8_UNORM,
-        DXGI_FORMAT_R10G10B10A2_UNORM
-      };
-
-      status = output5->DuplicateOutput1(m_device, 0, _countof(supportedFormats), supportedFormats, &m_dup);
-      if (SUCCEEDED(status))
-        break;
-      Sleep(200);
-    }
-
-    if (FAILED(status))
-    {
-      DEBUG_WINERROR("DuplicateOutput1 Failed", status);
-      DeInitialize();
-      return false;
-    }
-  }
-  else
-  {
-    DEBUG_WARN("IDXGIOutput5 is not available, please update windows for improved performance!");
-    DEBUG_WARN("Falling back to IDXIGOutput1");
-    IDXGIOutput1Ptr output1 = m_output;
-    if (!output1)
-    {
-      DEBUG_ERROR("Failed to get IDXGIOutput1");
-      DeInitialize();
-      return false;
-    }
-
-    // we try this twice in case we still get an error on re-initialization
-    for (int i = 0; i < 2; ++i)
-    {
-      status = output1->DuplicateOutput(m_device, &m_dup);
-      if (SUCCEEDED(status))
-        break;
-      Sleep(200);
-    }
-
-    if (FAILED(status))
-    {
-      DEBUG_WINERROR("DuplicateOutput Failed", status);
-      DeInitialize();
-      return false;
-    }
-  }
-
-  DXGI_OUTDUPL_DESC dupDesc;
-  m_dup->GetDesc(&dupDesc);
-  DEBUG_INFO("Source Format    : %s", GetDXGIFormatStr(dupDesc.ModeDesc.Format));
-
-  m_started     = false;
-  m_initialized = true;
-  return true;
-}
-
-bool DXGI::InitRawCapture()
-{
-  D3D11_TEXTURE2D_DESC texDesc;
-  ZeroMemory(&texDesc, sizeof(texDesc));
-  texDesc.Width              = m_width;
-  texDesc.Height             = m_height;
-  texDesc.MipLevels          = 1;
-  texDesc.ArraySize          = 1;
-  texDesc.SampleDesc.Count   = 1;
-  texDesc.SampleDesc.Quality = 0;
-  texDesc.Usage              = D3D11_USAGE_STAGING;
-  texDesc.Format             = m_pixelFormat;
-  texDesc.BindFlags          = 0;
-  texDesc.CPUAccessFlags     = D3D11_CPU_ACCESS_READ;
-  texDesc.MiscFlags          = 0;
-
-  HRESULT status = m_device->CreateTexture2D(&texDesc, NULL, &m_texture[0]);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create texture", status);
-    return false;
-  }
-
-  return true;
-}
-
-bool DXGI::InitYUV420Capture()
-{
-  HRESULT status;
-  D3D11_TEXTURE2D_DESC texDesc;
-
-  ZeroMemory(&texDesc, sizeof(texDesc));
-  texDesc.Width              = m_width;
-  texDesc.Height             = m_height;
-  texDesc.MipLevels          = 1;
-  texDesc.ArraySize          = 1;
-  texDesc.SampleDesc.Count   = 1;
-  texDesc.SampleDesc.Quality = 0;
-  texDesc.Usage              = D3D11_USAGE_STAGING;
-  texDesc.Format             = DXGI_FORMAT_R8_UNORM;
-  texDesc.BindFlags          = 0;
-  texDesc.CPUAccessFlags     = D3D11_CPU_ACCESS_READ;
-  texDesc.MiscFlags          = 0;
-
-  status = m_device->CreateTexture2D(&texDesc, NULL, &m_texture[0]);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create texture", status);
-    return false;
-  }
-
-  texDesc.Width  /= 2;
-  texDesc.Height /= 2;
-
-  status = m_device->CreateTexture2D(&texDesc, NULL, &m_texture[1]);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create texture", status);
-    return false;
-  }
-
-  status = m_device->CreateTexture2D(&texDesc, NULL, &m_texture[2]);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create texture", status);
-    return false;
-  }
-
-  m_textureConverter = new TextureConverter();
-  if (!m_textureConverter->Initialize(m_deviceContext, m_device, m_width, m_height, FRAME_TYPE_YUV420))
-    return false;
-
-  return true;
-}
-
-void DXGI::DeInitialize()
-{
-  if (m_h264)
-  {
-    delete m_h264;
-    m_h264 = NULL;
-  }
-
-  if (m_textureConverter)
-  {
-    delete m_textureConverter;
-    m_textureConverter = NULL;
-  }
-
-  ReleaseFrame();
-
-  for(int i = 0; i < _countof(m_cursorRing); ++i)
-  {
-    if (m_cursorRing[i].shape.buffer)
-      delete[] m_cursorRing[i].shape.buffer;
-    m_cursorRing[i].shape.buffer     = NULL;
-    m_cursorRing[i].shape.bufferSize = 0;
-  }
-
-  for(int i = 0; i < _countof(m_texture); ++i)
-    m_texture[i] = NULL;
-
-  m_dup           = NULL;
-  m_output        = NULL;
-  m_deviceContext = NULL;
-  m_device        = NULL;
-  m_dxgiFactory   = NULL;
-
-  m_initialized = false;
-}
-
-FrameType DXGI::GetFrameType()
-{
-  if (!m_initialized)
-    return FRAME_TYPE_INVALID;
-  return m_frameType;
-}
-
-size_t DXGI::GetMaxFrameSize()
-{
-  if (!m_initialized)
-    return 0;
-
-  return (m_width * m_height * 4);
-}
-
-unsigned int Capture::DXGI::Capture()
-{
-  if (!m_initialized)
-    return GRAB_STATUS_ERROR;
-
-  CursorInfo & cursor = m_cursorRing[m_cursorWPos];
-  DXGI_OUTDUPL_FRAME_INFO frameInfo;
-  IDXGIResourcePtr res;
-  unsigned int ret;
-
-  HRESULT status;
-  for (int retryCount = 0; retryCount < 2; ++retryCount)
-  {
-    ret = ReleaseFrame();
-    if (ret != GRAB_STATUS_OK)
-      return ret;
-
-    status = m_dup->AcquireNextFrame(1000, &frameInfo, &res);
-    switch (status)
-    {
-      case S_OK:
-        m_releaseFrame = true;
-        break;
-
-      case DXGI_ERROR_WAIT_TIMEOUT:
-        return GRAB_STATUS_TIMEOUT;
-
-      // desktop switch, mode change, switch DWM on or off or Secure Desktop
-      case DXGI_ERROR_ACCESS_LOST:
-      case WAIT_ABANDONED:
-        return GRAB_STATUS_REINIT;
-
-      default:
-        // unknown failure
-        DEBUG_WINERROR("AcquireNextFrame failed", status);
-        return GRAB_STATUS_ERROR;
-    }
-
-    // if the pointer shape has changed
-    if (frameInfo.PointerShapeBufferSize > 0)
-    {
-      // resize the buffer if required
-      if (cursor.shape.bufferSize < frameInfo.PointerShapeBufferSize)
-      {
-        delete[] cursor.shape.buffer;
-        cursor.shape.buffer     = new char[frameInfo.PointerShapeBufferSize];
-        cursor.shape.bufferSize = frameInfo.PointerShapeBufferSize;
-      }
-
-      cursor.shape.pointerSize = 0;
-      ret                     |= GRAB_STATUS_CURSOR;
-
-      DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo;
-      status = m_dup->GetFramePointerShape(cursor.shape.bufferSize, cursor.shape.buffer, &cursor.shape.pointerSize, &shapeInfo);
-      if (FAILED(status))
-      {
-        DEBUG_WINERROR("Failed to get the new pointer shape", status);
-        return GRAB_STATUS_ERROR;
-      }
-
-      switch (shapeInfo.Type)
-      {
-        case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR       : cursor.type = CURSOR_TYPE_COLOR;        break;
-        case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR: cursor.type = CURSOR_TYPE_MASKED_COLOR; break;
-        case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME  : cursor.type = CURSOR_TYPE_MONOCHROME;   break;
-        default:
-          DEBUG_ERROR("Invalid cursor type");
-          return GRAB_STATUS_ERROR;
-      }
-
-      cursor.hasShape = true;
-      cursor.w        = shapeInfo.Width;
-      cursor.h        = shapeInfo.Height;
-      cursor.pitch    = shapeInfo.Pitch;
-    }
-
-    // if we have a mouse update
-    if (frameInfo.LastMouseUpdateTime.QuadPart)
-    {
-      if (
-        m_lastCursorX != frameInfo.PointerPosition.Position.x ||
-        m_lastCursorY != frameInfo.PointerPosition.Position.y
-      ) {
-        ret |= GRAB_STATUS_CURSOR;
-        cursor.hasPos = true;
-        cursor.x      = m_lastCursorX = frameInfo.PointerPosition.Position.x;
-        cursor.y      = m_lastCursorY = frameInfo.PointerPosition.Position.y;
-      }
-    }
-
-    if (m_lastMouseVis != frameInfo.PointerPosition.Visible)
-      m_lastMouseVis = frameInfo.PointerPosition.Visible;
-    cursor.visible = m_lastMouseVis == TRUE;
-
-    if (ret & GRAB_STATUS_CURSOR && m_cursorWPos == m_cursorRPos)
-    {
-      // atomic advance so we don't have to worry about locking
-      m_cursorWPos = (m_cursorWPos + 1 == DXGI_CURSOR_RING_SIZE) ? 0 : m_cursorWPos + 1;
-    }
-
-    // if we don't have frame data
-    if (frameInfo.LastPresentTime.QuadPart == 0)
-    {
-      // if there is nothing to update, just start again
-      if (!ret)
-      {
-        --retryCount;
-        continue;
-      }
-
-      res = NULL;
-      ret |= GRAB_STATUS_OK;
-      return ret;
-    }
-
-    // success, break out of the retry loop
-    break;
-  }
-
-  ret |= GRAB_STATUS_FRAME;
-
-  // ensure we have a frame
-  if (!m_releaseFrame)
-  {
-    DEBUG_WINERROR("Failed to acquire next frame", status);
-    return GRAB_STATUS_ERROR;
-  }
-
-  // get the texture
-  res.QueryInterface(IID_PPV_ARGS(&m_ftexture));
-  res = NULL;
-  if (!m_ftexture)
-  {
-    DEBUG_ERROR("Failed to get src ID3D11Texture2D");
-    return GRAB_STATUS_ERROR;
-  }
-
-  if (!m_started)
-  {
-    m_started = true;
-
-    // determine the native pixel format
-    D3D11_TEXTURE2D_DESC dupDesc;
-    ZeroMemory(&dupDesc, sizeof(dupDesc));
-    m_ftexture->GetDesc(&dupDesc);
-    m_pixelFormat = dupDesc.Format;
-
-    switch(m_pixelFormat)
-    {
-      case DXGI_FORMAT_R8G8B8A8_UNORM:
-        m_frameType = FRAME_TYPE_RGBA;
-        break;
-
-      case DXGI_FORMAT_B8G8R8A8_UNORM:
-        m_frameType = FRAME_TYPE_BGRA;
-        break;
-
-      case DXGI_FORMAT_R10G10B10A2_UNORM:
-        m_frameType = FRAME_TYPE_RGBA10;
-        break;
-
-      default:
-        DEBUG_WARN("Unsupported pixel format %s, enabling conversions", GetDXGIFormatStr(m_pixelFormat));
-        return GRAB_STATUS_ERROR;
-    }
-
-    DEBUG_INFO("Pixel Format     : %s", GetDXGIFormatStr(m_pixelFormat));
-
-    for(CaptureOptions::const_iterator it = m_options->cbegin(); it != m_options->cend(); ++it)
-    {
-      if (_stricmp(*it, "yuv420") == 0) m_frameType = FRAME_TYPE_YUV420;
-    }
-
-    bool ok = false;
-    switch (m_frameType)
-    {
-      case FRAME_TYPE_BGRA  :
-      case FRAME_TYPE_RGBA  :
-      case FRAME_TYPE_RGBA10: ok = InitRawCapture   (); break;
-      case FRAME_TYPE_YUV420: ok = InitYUV420Capture(); break;
-    }
-
-    if (!ok)
-      return GRAB_STATUS_ERROR;
-  }
-
-  // initiate the texture copy as early as possible
-  if (m_frameType == FRAME_TYPE_YUV420)
-  {
-    TextureList planes;
-    if (!m_textureConverter->Convert(m_ftexture, planes))
-      return GRAB_STATUS_ERROR;
-
-    for (int i = 0; i < 3; ++i)
-    {
-      ID3D11Texture2DPtr t = planes.at(i);
-      m_deviceContext->CopyResource(m_texture[i], t);
-    }
-  }
-  else
-    m_deviceContext->CopyResource(m_texture[0], m_ftexture);
-
-  ret |= GRAB_STATUS_OK;
-  return ret;
-}
-
-GrabStatus Capture::DXGI::ReleaseFrame()
-{
-  if (!m_releaseFrame)
-    return GRAB_STATUS_OK;
-
-  m_releaseFrame = false;
-  m_ftexture     = NULL;
-  
-  switch (m_dup->ReleaseFrame())
-  {
-  case S_OK:
-    break;
-
-  case DXGI_ERROR_INVALID_CALL:
-    DEBUG_ERROR("Frame was already released");
-    return GRAB_STATUS_ERROR;
-
-  case WAIT_ABANDONED:
-  case DXGI_ERROR_ACCESS_LOST:
-    return GRAB_STATUS_REINIT;
-  }
-
-  return GRAB_STATUS_OK;
-}
-
-GrabStatus Capture::DXGI::DiscardFrame()
-{
-  return ReleaseFrame();
-}
-
-GrabStatus Capture::DXGI::GrabFrameRaw(FrameInfo & frame)
-{
-  D3D11_MAPPED_SUBRESOURCE mapping;
-
-  HRESULT status;
-  status = m_deviceContext->Map(m_texture[0], 0, D3D11_MAP_READ, 0, &mapping);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to map the texture", status);
-    DeInitialize();
-    return GRAB_STATUS_ERROR;
-  }
-  
-  frame.pitch  = mapping.RowPitch;
-  frame.stride = mapping.RowPitch / 4;
-
-  memcpySSE(frame.buffer, mapping.pData, frame.pitch * m_height);
-  m_deviceContext->Unmap(m_texture[0], 0);
-
-  return GRAB_STATUS_OK;
-}
-
-GrabStatus Capture::DXGI::GrabFrameYUV420(struct FrameInfo & frame)
-{
-  uint8_t * data   = (uint8_t *)frame.buffer;
-  size_t    remain = frame.bufferSize;
-  for(int i = 0; i < 3; ++i)
-  {
-    HRESULT                  status;
-    D3D11_MAPPED_SUBRESOURCE mapping;
-    D3D11_TEXTURE2D_DESC     desc;
-
-    m_texture[i]->GetDesc(&desc);
-    status = m_deviceContext->Map(m_texture[i], 0, D3D11_MAP_READ, 0, &mapping);
-    if (FAILED(status))
-    {
-      DEBUG_WINERROR("Failed to map the texture", status);
-      DeInitialize();
-      return GRAB_STATUS_ERROR;
-    }
-
-    const unsigned int size = desc.Height * desc.Width;
-    if (size > remain)
-    {
-      m_deviceContext->Unmap(m_texture[i], 0);
-      DEBUG_ERROR("Too much data to fit in buffer");
-      return GRAB_STATUS_ERROR;
-    }
-
-    const uint8_t * src = (uint8_t *)mapping.pData;
-    for(unsigned int y = 0; y < desc.Height; ++y)
-    {
-      memcpySSE(data, src, desc.Width);
-      data += desc.Width;
-      src  += mapping.RowPitch;
-    }
-    m_deviceContext->Unmap(m_texture[i], 0);
-    remain -= size;
-  }
-
-  frame.pitch  = m_width;
-  frame.stride = m_width;
-  return GRAB_STATUS_OK;
-}
-
-GrabStatus DXGI::GetFrame(struct FrameInfo & frame)
-{
-  if (!m_ftexture)
-  {
-    DEBUG_ERROR("A frame has not been captured");
-    return GRAB_STATUS_ERROR;
-  }
-
-  frame.width  = m_width;
-  frame.height = m_height;
-
-  if (m_frameType == FRAME_TYPE_YUV420)
-    return GrabFrameYUV420(frame);
-
-  return GrabFrameRaw(frame);
-}
-
-bool DXGI::GetCursor(CursorInfo & cursor)
-{
-  if (m_cursorRPos == m_cursorWPos)
-    return false;
-
-  cursor = m_cursorRing[m_cursorRPos];
-  return true;
-}
-
-void DXGI::FreeCursor()
-{
-  assert(m_cursorRPos != m_cursorWPos);
-
-  CursorInfo & cursor = m_cursorRing[m_cursorRPos];
-  cursor.visible  = false;
-  cursor.hasPos   = false;
-  cursor.hasShape = false;
-
-  m_cursorRPos = (m_cursorRPos + 1 == DXGI_CURSOR_RING_SIZE) ? 0 : m_cursorRPos + 1;
-}
\ No newline at end of file
diff --git a/host/Capture/DXGI.h b/host/Capture/DXGI.h
deleted file mode 100644
index 6baa1ee0..00000000
--- a/host/Capture/DXGI.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#include "ICapture.h"
-#include "Com.h"
-#include "TextureConverter.h"
-#include "MFT/H264.h"
-
-#include <list>
-
-#define W32_LEAN_AND_MEAN
-#include <windows.h>
-#include <shlwapi.h>
-#include <stdio.h>
-
-#define DXGI_CURSOR_RING_SIZE 3
-
-namespace Capture
-{
-  class DXGI : public ICapture
-  {
-  public:
-    DXGI();
-    virtual ~DXGI();
-
-    const char * GetName() { return "DXGI"; }
-
-    bool CanInitialize();
-    bool Initialize(CaptureOptions * options);
-
-    void DeInitialize();
-    bool ReInitialize()
-    {
-      DeInitialize();
-      /*
-      DXGI needs some time when mode switches occur, failing to do so causes
-      failure to start and exceptions internal to DXGI
-      */
-      Sleep(400);
-      return Initialize(m_options);
-    }
-
-    enum FrameType GetFrameType();
-    size_t GetMaxFrameSize();
-    unsigned int Capture();
-    GrabStatus GetFrame (struct FrameInfo & frame );
-    bool GetCursor(CursorInfo & cursor);
-    void FreeCursor();
-    GrabStatus DiscardFrame();
-
-  private:
-
-    bool InitRawCapture();
-    bool InitYUV420Capture();
-
-    CursorInfo         m_cursorRing[DXGI_CURSOR_RING_SIZE];
-    unsigned int       m_cursorRPos, m_cursorWPos;
-
-    ID3D11Texture2DPtr m_ftexture;
-
-    GrabStatus ReleaseFrame();
-    GrabStatus GrabFrameRaw    (struct FrameInfo & frame);
-    GrabStatus GrabFrameYUV420 (struct FrameInfo & frame);
-
-    CaptureOptions * m_options;
-
-    bool           m_initialized;
-    bool           m_started;
-    unsigned int   m_width;
-    unsigned int   m_height;
-    DXGI_FORMAT    m_pixelFormat;
-    enum FrameType m_frameType;
-
-    IDXGIFactory1Ptr                m_dxgiFactory;
-    ID3D11DevicePtr                 m_device;
-    D3D_FEATURE_LEVEL               m_featureLevel;
-    ID3D11DeviceContextPtr          m_deviceContext;
-    IDXGIOutputPtr                  m_output;
-    IDXGIOutputDuplicationPtr       m_dup;
-    bool                            m_releaseFrame;
-    ID3D11Texture2DPtr              m_texture[3];
-    TextureConverter              * m_textureConverter;
-    MFT::H264                     * m_h264;
-
-    int                             m_lastCursorX, m_lastCursorY;
-    BOOL                            m_lastMouseVis;
-  };
-};
\ No newline at end of file
diff --git a/host/Capture/NvFBC.cpp b/host/Capture/NvFBC.cpp
deleted file mode 100644
index 199ea55e..00000000
--- a/host/Capture/NvFBC.cpp
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#if CONFIG_CAPTURE_NVFBC
-
-#include "NvFBC.h"
-using namespace Capture;
-
-#include <string>
-
-#include "common/debug.h"
-#include "common/memcpySSE.h"
-#include "Util.h"
-
-#ifdef _WIN64
-#define NVFBC_LIBRARY_NAME "NvFBC64.dll"
-#else
-#define NVFBC_LIBRARY_NAME "NvFBC.dll"
-#endif
-
-#define MOPT "privData"
-
-NvFBC::NvFBC() :
-  m_options(NULL),
-  m_optNoCrop(false),
-  m_optNoWait(false),
-  m_initialized(false),
-  m_first(true),
-  m_hDLL(NULL),
-  m_nvFBC(NULL)
-{
-}
-
-NvFBC::~NvFBC()
-{
-}
-
-bool Capture::NvFBC::CanInitialize()
-{
-  return true;
-}
-
-bool NvFBC::Initialize(CaptureOptions * options)
-{
-  if (m_initialized)
-    DeInitialize();
-
-  m_first     = true;
-  m_options   = options;
-  m_optNoCrop = false;
-
-  uint8_t * privData     = NULL;
-  NvU32     privDataSize = 0;
-
-  for (CaptureOptions::const_iterator it = options->cbegin(); it != options->cend(); ++it)
-  {
-    if (_strcmpi(*it, "nocrop") == 0) { m_optNoCrop = false; continue; }
-    if (_strcmpi(*it, "nowait") == 0) { m_optNoWait = true ; continue; }
-
-    if (_strnicmp(*it, MOPT " ", sizeof(MOPT)) == 0)
-    {
-      std::string value(*it);
-      value.erase(0, sizeof(MOPT));
-
-      if (value.empty() || value.length() & 1)
-        continue;
-
-      privDataSize = (NvU32)(value.length() / 2);
-      privData     = new uint8_t[privDataSize];
-      uint8_t *p   = privData;
-      for (int i = 0; i < value.length(); i += 2, ++p)
-      {
-        char hex[3];
-        #pragma warning(disable:4996)
-        value.copy(hex, 2, i);
-        #pragma warning(restore:4996)
-        hex[2] = 0;
-        *p = (uint8_t)strtoul(hex, NULL, 16);
-      }
-    }
-  }
-
-  std::string nvfbc = Util::GetSystemRoot() + "\\" + NVFBC_LIBRARY_NAME;
-  m_hDLL = LoadLibraryA(nvfbc.c_str());
-  if (!m_hDLL)
-  {
-    DEBUG_ERROR("Failed to load the NvFBC library: %d - %s", (int)GetLastError(), nvfbc.c_str());
-    return false;
-  }
-
-  m_fnCreateEx       = (NvFBC_CreateFunctionExType   )GetProcAddress(m_hDLL, "NvFBC_CreateEx"      );
-  m_fnSetGlobalFlags = (NvFBC_SetGlobalFlagsType     )GetProcAddress(m_hDLL, "NvFBC_SetGlobalFlags");
-  m_fnGetStatusEx    = (NvFBC_GetStatusExFunctionType)GetProcAddress(m_hDLL, "NvFBC_GetStatusEx"   );
-  m_fnEnable         = (NvFBC_EnableFunctionType     )GetProcAddress(m_hDLL, "NvFBC_Enable"        );
-
-  if (!m_fnCreateEx || !m_fnSetGlobalFlags || !m_fnGetStatusEx || !m_fnEnable)
-  {
-    DEBUG_ERROR("Unable to locate required entry points in %s", nvfbc.c_str());
-    DeInitialize();
-    return false;
-  }
-
-  NvFBCStatusEx status;
-  ZeroMemory(&status, sizeof(NvFBCStatusEx));
-  status.dwVersion     = NVFBC_STATUS_VER;
-  status.dwAdapterIdx  = 0;
-
-  NVFBCRESULT ret = m_fnGetStatusEx(&status);
-  if (ret != NVFBC_SUCCESS)
-  {
-    DEBUG_ERROR("Failed to get NvFBC status");
-    DeInitialize();
-    return false;
-  }
-
-  if (!status.bIsCapturePossible)
-  {
-    DEBUG_INFO("Attempting to enable NvFBC");
-    switch(m_fnEnable(NVFBC_STATE_ENABLE))
-    {
-      case NVFBC_SUCCESS:
-        DEBUG_INFO("Success, attempting to get status again");
-        if (m_fnGetStatusEx(&status) != NVFBC_SUCCESS)
-        {
-          DEBUG_ERROR("Failed to get NvFBC status");
-          DeInitialize();
-          return false;
-        }
-        break;
-
-      case NVFBC_ERROR_INSUFFICIENT_PRIVILEGES:
-        DEBUG_ERROR("Please run once as administrator to enable the NvFBC API");
-        DeInitialize();
-        return false;
-
-      default:
-        DEBUG_ERROR("Unknown failure enabling NvFBC");
-        DeInitialize();
-        return false;
-    }
-
-    if (!status.bIsCapturePossible)
-    {
-      DEBUG_ERROR("Capture is not possible, unsupported device or driver");
-      DeInitialize();
-      return false;
-    }
-  }
-
-  if (!status.bCanCreateNow)
-  {
-    DEBUG_ERROR("Can not create an instance of NvFBC at this time");
-    DeInitialize();
-    return false;
-  }
-
-  NvFBCCreateParams params;
-  ZeroMemory(&params, sizeof(NvFBCCreateParams));
-  params.dwVersion         = NVFBC_CREATE_PARAMS_VER;
-  params.dwInterfaceType   = NVFBC_TO_SYS;
-  params.pDevice           = NULL;
-  params.dwAdapterIdx      = 0;
-  params.dwPrivateDataSize = privDataSize;
-  params.pPrivateData      = privData;
-
-  if (m_fnCreateEx(&params) != NVFBC_SUCCESS)
-  {
-    if (privData)
-      delete [] privData;
-
-    DEBUG_ERROR("Failed to create an instance of NvFBC");
-    DeInitialize();
-    return false;
-  }
-
-  if (privData)
-    delete[] privData;
-
-  m_maxCaptureWidth = params.dwMaxDisplayWidth;
-  m_maxCaptureHeight = params.dwMaxDisplayHeight;
-  m_nvFBC = static_cast<NvFBCToSys *>(params.pNvFBC);
-
-  NVFBC_TOSYS_SETUP_PARAMS setupParams;
-  ZeroMemory(&setupParams, sizeof(NVFBC_TOSYS_SETUP_PARAMS));
-  setupParams.dwVersion         = NVFBC_TOSYS_SETUP_PARAMS_VER;
-  setupParams.eMode             = NVFBC_TOSYS_ARGB;
-  setupParams.bWithHWCursor     = TRUE;
-  setupParams.bDiffMap          = TRUE;
-  setupParams.eDiffMapBlockSize = NVFBC_TOSYS_DIFFMAP_BLOCKSIZE_128X128;
-  setupParams.ppBuffer          = (void **)&m_frameBuffer;
-  setupParams.ppDiffMap         = (void **)&m_diffMap;
-
-  if (m_nvFBC->NvFBCToSysSetUp(&setupParams) != NVFBC_SUCCESS)
-  {
-    DEBUG_ERROR("NvFBCToSysSetUp Failed");
-    DeInitialize();
-    return false;
-  }
-
-  // this is required according to NVidia sample code
-  Sleep(100);
-
-  HMONITOR monitor = MonitorFromWindow(GetDesktopWindow(), MONITOR_DEFAULTTOPRIMARY);
-  MONITORINFO monitorInfo;
-  monitorInfo.cbSize = sizeof(MONITORINFO);
-  unsigned int screenWidth, screenHeight;
-  GetMonitorInfo(monitor, &monitorInfo);
-  screenWidth  = monitorInfo.rcMonitor.right  - monitorInfo.rcMonitor.left;
-  screenHeight = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top;
-
-  ZeroMemory(&m_grabFrameParams, sizeof(NVFBC_TOSYS_GRAB_FRAME_PARAMS));
-  ZeroMemory(&m_grabInfo, sizeof(NvFBCFrameGrabInfo));
-  m_grabFrameParams.dwVersion           = NVFBC_TOSYS_GRAB_FRAME_PARAMS_VER;
-  m_grabFrameParams.dwFlags             = m_optNoWait ? NVFBC_TOSYS_NOWAIT : NVFBC_TOSYS_WAIT_WITH_TIMEOUT;
-  m_grabFrameParams.dwWaitTime          = 1000;
-  m_grabFrameParams.eGMode              = NVFBC_TOSYS_SOURCEMODE_CROP;
-  m_grabFrameParams.dwStartX            = 0;
-  m_grabFrameParams.dwStartY            = 0;
-  m_grabFrameParams.dwTargetWidth       = screenWidth;
-  m_grabFrameParams.dwTargetHeight      = screenHeight;
-  m_grabFrameParams.pNvFBCFrameGrabInfo = &m_grabInfo;
-
-  m_initialized = true;
-  return true;
-}
-
-void NvFBC::DeInitialize()
-{
-  m_frameBuffer = NULL;
-
-  if (m_nvFBC)
-  {
-    m_nvFBC->NvFBCToSysRelease();
-    m_nvFBC = NULL;
-  }
-
-  m_maxCaptureWidth  = 0;
-  m_maxCaptureHeight = 0;
-  m_fnCreateEx       = NULL;
-  m_fnSetGlobalFlags = NULL;
-  m_fnGetStatusEx    = NULL;
-  m_fnEnable         = NULL;
-
-  if (m_hDLL)
-  {
-    FreeLibrary(m_hDLL);
-    m_hDLL = NULL;
-  }
-
-  m_initialized = false;
-}
-
-FrameType NvFBC::GetFrameType()
-{
-  if (!m_initialized)
-    return FRAME_TYPE_INVALID;
-
-  return FRAME_TYPE_BGRA;
-}
-
-size_t NvFBC::GetMaxFrameSize()
-{
-  if (!m_initialized)
-    return false;
-
-  return m_maxCaptureWidth * m_maxCaptureHeight * 4;
-}
-
-unsigned int Capture::NvFBC::Capture()
-{
-  if (!m_initialized)
-    return GRAB_STATUS_ERROR;
-
-  for (int i = 0; i < 2; ++i)
-  {
-    NVFBCRESULT status = m_nvFBC->NvFBCToSysGrabFrame(&m_grabFrameParams);
-    if (status == NVFBC_SUCCESS)
-    {
-      const int diffW = (m_grabInfo.dwWidth + 0x7F) >> 7;
-      const int diffH = (m_grabInfo.dwHeight + 0x7F) >> 7;
-      bool hasDiff = false;
-      for (int y = 0; y < diffH && !hasDiff; ++y)
-        for (int x = 0; x < diffW; ++x)
-          if (m_diffMap[y * diffW + x])
-          {
-            hasDiff = true;
-            break;
-          }
-
-      if (!hasDiff)
-      {
-        i = 0;
-        continue;
-      }
-      break;
-    }
-    else
-    {
-      if (status == NVFBC_ERROR_DYNAMIC_DISABLE)
-      {
-        DEBUG_ERROR("NvFBC was disabled by someone else");
-        return GRAB_STATUS_ERROR;
-      }
-
-      if (status == NVFBC_ERROR_INVALIDATED_SESSION)
-      {
-        DEBUG_WARN("Session was invalidated, attempting to restart");
-        return GRAB_STATUS_REINIT;
-      }
-
-      if (i == 1)
-      {
-        DEBUG_ERROR("NvFBCToSysGrabFrame failed");
-        return GRAB_STATUS_ERROR;
-      }
-    }
-  }
-
-  // if the capture size doesn't match the screen resolution then re-initialize to avoid
-  // copying black/blank areas of the screen
-  HMONITOR monitor = MonitorFromWindow(GetDesktopWindow(), MONITOR_DEFAULTTOPRIMARY);
-  MONITORINFO monitorInfo;
-  monitorInfo.cbSize = sizeof(MONITORINFO);
-  unsigned int screenWidth, screenHeight;
-  GetMonitorInfo(monitor, &monitorInfo);
-  screenWidth  = monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left;
-  screenHeight = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top;
-  if (m_grabInfo.dwWidth != screenWidth || m_grabInfo.dwHeight != screenHeight)
-  {
-    DEBUG_INFO("Resolution change detected");
-    return GRAB_STATUS_REINIT;
-  }
-
-  // turn off the cursor on the first frame as NvFBC is drawing it
-  if (m_first)
-    return GRAB_STATUS_OK | GRAB_STATUS_FRAME | GRAB_STATUS_CURSOR;
-  else
-    return GRAB_STATUS_OK | GRAB_STATUS_FRAME;
-}
-
-bool Capture::NvFBC::GetCursor(CursorInfo & cursor)
-{
-  cursor.hasShape = false;
-  cursor.hasPos   = false;
-  cursor.visible  = false;
-
-  if (m_first)
-  {
-    m_first = false;
-    return true;
-  }
-
-  return false;
-}
-
-void Capture::NvFBC::FreeCursor()
-{
-}
-
-GrabStatus Capture::NvFBC::DiscardFrame()
-{
-  return GrabStatus();
-}
-
-enum GrabStatus NvFBC::GetFrame(struct FrameInfo & frame)
-{
-  if (!m_initialized)
-    return GRAB_STATUS_ERROR;
-
-  frame.width  = m_grabInfo.dwWidth;
-  frame.height = m_grabInfo.dwHeight;
-  frame.stride = m_grabInfo.dwBufferWidth;
-  frame.pitch  = m_grabInfo.dwBufferWidth * 4;
-
-  memcpySSE((uint8_t*)frame.buffer, (uint8_t *)m_frameBuffer, frame.pitch * frame.height);
-  return GRAB_STATUS_OK;
-}
-
-#endif// CONFIG_CAPTURE_NVFBC
diff --git a/host/Capture/NvFBC.h b/host/Capture/NvFBC.h
deleted file mode 100644
index 31538cb8..00000000
--- a/host/Capture/NvFBC.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#if CONFIG_CAPTURE_NVFBC
-
-#pragma once
-#include "ICapture.h"
-
-#define W32_LEAN_AND_MEAN
-#include <windows.h>
-
-#include <NvFBC/nvFBC.h>
-#include <NvFBC/nvFBCToSys.h>
-
-namespace Capture
-{
-  class NvFBC : public ICapture
-  {
-  public:
-    NvFBC();
-    ~NvFBC();
-
-    const char * GetName() { return "NvFBC"; }
-    bool CanInitialize();
-    bool Initialize(CaptureOptions * options);
-    void DeInitialize();
-    bool ReInitialize()
-    {
-      DeInitialize();
-      return Initialize(m_options);
-    }
-    enum FrameType GetFrameType();
-    size_t GetMaxFrameSize();
-    unsigned int Capture();
-    enum GrabStatus GetFrame(struct FrameInfo & frame);
-    bool GetCursor(CursorInfo & cursor);
-    void FreeCursor() ;
-    enum GrabStatus DiscardFrame();
-
-  private:
-    CaptureOptions * m_options;
-    bool m_optNoCrop;
-    bool m_optNoWait;
-
-    bool m_initialized;
-    bool m_first;
-    HMODULE  m_hDLL;
-
-    NvFBC_CreateFunctionExType    m_fnCreateEx;
-    NvFBC_SetGlobalFlagsType      m_fnSetGlobalFlags;
-    NvFBC_GetStatusExFunctionType m_fnGetStatusEx;
-    NvFBC_EnableFunctionType      m_fnEnable;
-
-    DWORD m_maxCaptureWidth, m_maxCaptureHeight;
-    NvFBCToSys * m_nvFBC;
-    uint8_t * m_frameBuffer;
-    uint8_t * m_diffMap;
-    NvFBCFrameGrabInfo m_grabInfo;
-    NVFBC_TOSYS_GRAB_FRAME_PARAMS m_grabFrameParams;
-  };
-};
-
-#endif //CONFIG_CAPTURE_NVFBC
diff --git a/host/CaptureFactory.h b/host/CaptureFactory.h
deleted file mode 100644
index 829033b6..00000000
--- a/host/CaptureFactory.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#define W32_LEAN_AND_MEAN
-#include <windows.h>
-#include <vector>
-
-#include "common/debug.h"
-#include "ICapture.h"
-#if CONFIG_CAPTURE_NVFBC
-#include "Capture/NvFBC.h"
-#endif
-#include "Capture/DXGI.h"
-
-class CaptureFactory
-{
-public:
-  typedef std::vector<ICapture *> DeviceList;
-
-  static DeviceList & GetDevices()
-  {
-    static DeviceList devices;
-    if (!devices.empty())
-      return devices;
-
-#if CONFIG_CAPTURE_NVFBC
-    devices.push_back(new Capture::NvFBC());
-#endif
-    devices.push_back(new Capture::DXGI ());
-
-    return devices;
-  }
-
-  static ICapture * GetDevice(const char * name, CaptureOptions * options)
-  {
-    DeviceList devices = GetDevices();
-    for (DeviceList::const_iterator it = devices.begin(); it != devices.end(); ++it)
-    {
-      ICapture * device = *it;
-      if (_strcmpi(name, device->GetName()) != 0)
-        continue;
-
-      if (device->Initialize(options))
-      {
-        DEBUG_INFO("Using %s", device->GetName());
-        return device;
-      }
-
-      device->DeInitialize();
-      DEBUG_ERROR("Failed to initialize %s", device->GetName());
-      return NULL;
-    }
-
-    DEBUG_ERROR("No such device: %s", name);
-    return NULL;
-  }
-
-  static ICapture * DetectDevice(CaptureOptions * options)
-  {
-    DeviceList devices = GetDevices();
-    for (DeviceList::const_iterator it = devices.cbegin(); it != devices.cend(); ++it)
-    {
-      ICapture * device = *it;
-
-      DEBUG_INFO("Trying %s", device->GetName());
-      if (device->Initialize(options))
-      {
-        DEBUG_INFO("Using %s", device->GetName());
-        return device;
-      }
-      device->DeInitialize();
-    }
-
-    DEBUG_ERROR("Failed to initialize a capture device");
-    return NULL;
-  }
-};
\ No newline at end of file
diff --git a/host/Com.h b/host/Com.h
deleted file mode 100644
index 86856146..00000000
--- a/host/Com.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-#include <comdef.h>
-#include <dxgi1_2.h>
-#include <dxgi1_5.h>
-#include <d3d11.h>
-#include <mftransform.h>
-
-_COM_SMARTPTR_TYPEDEF(IDXGIFactory1           , __uuidof(IDXGIFactory1           ));
-_COM_SMARTPTR_TYPEDEF(ID3D11Device            , __uuidof(ID3D11Device            ));
-_COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext     , __uuidof(ID3D11DeviceContext     ));
-_COM_SMARTPTR_TYPEDEF(IDXGIDevice             , __uuidof(IDXGIDevice             ));
-_COM_SMARTPTR_TYPEDEF(IDXGIOutput1            , __uuidof(IDXGIOutput1            ));
-_COM_SMARTPTR_TYPEDEF(IDXGIOutput5            , __uuidof(IDXGIOutput5            ));
-_COM_SMARTPTR_TYPEDEF(IDXGIOutput             , __uuidof(IDXGIOutput             ));
-_COM_SMARTPTR_TYPEDEF(IDXGIAdapter1           , __uuidof(IDXGIAdapter1           ));
-_COM_SMARTPTR_TYPEDEF(IDXGIOutputDuplication  , __uuidof(IDXGIOutputDuplication  ));
-_COM_SMARTPTR_TYPEDEF(ID3D11Texture2D         , __uuidof(ID3D11Texture2D         ));
-_COM_SMARTPTR_TYPEDEF(IDXGIResource           , __uuidof(IDXGIResource           ));
-
-_COM_SMARTPTR_TYPEDEF(ID3D10Multithread       , __uuidof(ID3D10Multithread       ));
-_COM_SMARTPTR_TYPEDEF(IMFActivate             , __uuidof(IMFActivate             ));
-_COM_SMARTPTR_TYPEDEF(IMFAttributes           , __uuidof(IMFAttributes           ));
-_COM_SMARTPTR_TYPEDEF(IMFDXGIDeviceManager    , __uuidof(IMFDXGIDeviceManager    ));
-_COM_SMARTPTR_TYPEDEF(IMFTransform            , __uuidof(IMFTransform            ));
-_COM_SMARTPTR_TYPEDEF(IMFMediaEvent           , __uuidof(IMFMediaEvent           ));
-_COM_SMARTPTR_TYPEDEF(IMFMediaEventGenerator  , __uuidof(IMFMediaEventGenerator  ));
-_COM_SMARTPTR_TYPEDEF(IMFMediaType            , __uuidof(IMFMediaType            ));
-_COM_SMARTPTR_TYPEDEF(IMFSample               , __uuidof(IMFSample               ));
-_COM_SMARTPTR_TYPEDEF(IMFMediaBuffer          , __uuidof(IMFMediaBuffer          ));
-_COM_SMARTPTR_TYPEDEF(IMF2DBuffer             , __uuidof(IMF2DBuffer             ));
-
-_COM_SMARTPTR_TYPEDEF(ID3D11RenderTargetView  , __uuidof(ID3D11RenderTargetView  ));
-_COM_SMARTPTR_TYPEDEF(ID3D11ShaderResourceView, __uuidof(ID3D11ShaderResourceView));
-_COM_SMARTPTR_TYPEDEF(ID3D11DepthStencilView  , __uuidof(ID3D11DepthStencilView  ));
-_COM_SMARTPTR_TYPEDEF(ID3D11InputLayout       , __uuidof(ID3D11InputLayout       ));
-_COM_SMARTPTR_TYPEDEF(ID3D11VertexShader      , __uuidof(ID3D11VertexShader      ));
-_COM_SMARTPTR_TYPEDEF(ID3D11PixelShader       , __uuidof(ID3D11PixelShader       ));
-_COM_SMARTPTR_TYPEDEF(ID3D11SamplerState      , __uuidof(ID3D11SamplerState      ));
-_COM_SMARTPTR_TYPEDEF(ID3D11Buffer            , __uuidof(ID3D11Buffer            ));
\ No newline at end of file
diff --git a/host/CrashHandler.cpp b/host/CrashHandler.cpp
deleted file mode 100644
index 60f66ef7..00000000
--- a/host/CrashHandler.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "CrashHandler.h"
-
-typedef BOOL (WINAPI * PMiniDumpWriteDump)(
-    _In_ HANDLE hProcess,
-    _In_ DWORD ProcessId,
-    _In_ HANDLE hFile,
-    _In_ MINIDUMP_TYPE DumpType,
-    _In_opt_ PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
-    _In_opt_ PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
-    _In_opt_ PMINIDUMP_CALLBACK_INFORMATION CallbackParam
-  );
-
-void CrashHandler::Initialize()
-{
-  SetUnhandledExceptionFilter(CrashHandler::ExceptionFilter);
-}
-
-LONG WINAPI CrashHandler::ExceptionFilter(struct _EXCEPTION_POINTERS * apExceptionInfo)
-{
-  HMODULE lib;
-  PMiniDumpWriteDump fn_MiniDumpWriteDump;
-
-  lib = LoadLibraryA("dbghelp.dll");
-  if (!lib)
-    return EXCEPTION_CONTINUE_SEARCH;
-
-  fn_MiniDumpWriteDump = (PMiniDumpWriteDump)GetProcAddress(lib, "MiniDumpWriteDump");
-  if (!fn_MiniDumpWriteDump)
-    return EXCEPTION_CONTINUE_SEARCH;
-
-  HANDLE hFile = CreateFileA(
-    "looking-glass-host.dump",
-    GENERIC_WRITE,
-    FILE_SHARE_WRITE,
-    NULL,
-    CREATE_ALWAYS,
-    FILE_ATTRIBUTE_NORMAL,
-    NULL
-  );
-
-  if (hFile == INVALID_HANDLE_VALUE)
-    return EXCEPTION_CONTINUE_SEARCH;
-
-  _MINIDUMP_EXCEPTION_INFORMATION info;
-  info.ThreadId          = GetCurrentThreadId();
-  info.ExceptionPointers = apExceptionInfo;
-  info.ClientPointers    = FALSE;
-
-  fn_MiniDumpWriteDump(
-    GetCurrentProcess(),
-    GetCurrentProcessId(),
-    hFile,
-    MiniDumpNormal,
-    &info,
-    NULL,
-    NULL
-  );
-
-  CloseHandle(hFile);
-  return EXCEPTION_CONTINUE_SEARCH;
-}
\ No newline at end of file
diff --git a/host/CrashHandler.h b/host/CrashHandler.h
deleted file mode 100644
index 42c4757e..00000000
--- a/host/CrashHandler.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-#include <windows.h>
-#include <dbghelp.h>
-
-class CrashHandler
-{
-public:
-  static void Initialize();
-private:
-  static LONG WINAPI ExceptionFilter(struct _EXCEPTION_POINTERS * apExceptionInfo);
-};
\ No newline at end of file
diff --git a/host/ICapture.h b/host/ICapture.h
deleted file mode 100644
index 1dd5f549..00000000
--- a/host/ICapture.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#include "common/KVMFR.h"
-#include <vector>
-#include <windows.h>
-
-struct CursorBuffer
-{
-  unsigned int bufferSize;
-  char       * buffer;
-  unsigned int pointerSize;
-};
-
-struct CursorInfo
-{
-  bool            visible;
-  bool            hasPos;
-  bool            hasShape;
-  int             x, y;
-
-  enum CursorType type;
-  unsigned int    w, h;
-  unsigned int    pitch;
-  CursorBuffer    shape;
-};
-
-struct FrameInfo
-{
-  unsigned int width;
-  unsigned int height;
-  unsigned int stride;
-  unsigned int pitch;
-  void * buffer;
-  size_t bufferSize;
-};
-
-enum GrabStatus
-{
-  GRAB_STATUS_OK      = 1,
-  GRAB_STATUS_TIMEOUT = 2,
-  GRAB_STATUS_REINIT  = 4,
-  GRAB_STATUS_CURSOR  = 8,
-  GRAB_STATUS_FRAME   = 16,
-  GRAB_STATUS_ERROR   = 32
-};
-
-typedef std::vector<const char *> CaptureOptions;
-
-class ICapture
-{
-public:
-  virtual const char * GetName() = 0;
-
-  virtual bool CanInitialize() = 0;
-  virtual bool Initialize(CaptureOptions * options) = 0;
-  virtual void DeInitialize() = 0;
-  virtual bool ReInitialize() = 0;
-  virtual enum FrameType GetFrameType() = 0;
-  virtual size_t GetMaxFrameSize() = 0;
-  virtual unsigned int Capture() = 0;
-  virtual enum GrabStatus GetFrame(struct FrameInfo & frame) = 0;
-  virtual bool GetCursor(CursorInfo & cursor) = 0;
-  virtual void FreeCursor() = 0;
-  virtual enum GrabStatus DiscardFrame() = 0;
-};
diff --git a/host/IVSHMEM.cpp b/host/IVSHMEM.cpp
deleted file mode 100644
index 3d615a4e..00000000
--- a/host/IVSHMEM.cpp
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "IVSHMEM.h"
-
-#include <windows.h>
-#include <setupapi.h>
-#include "kvm-guest-drivers-windows/ivshmem/Public.h"
-#include "common/debug.h"
-
-IVSHMEM * IVSHMEM::m_instance = NULL;
-
-void IVSHMEM::listDevices() {
-  
-  HDEVINFO deviceInfoSet;
-  PSP_DEVICE_INTERFACE_DETAIL_DATA infData = NULL;
-  SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
-
-  deviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
-  ZeroMemory(&deviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
-  deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
-
-  fprintf(stderr, "Found devices:\n");
-
-  DWORD i = 0;
-  while(SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &GUID_DEVINTERFACE_IVSHMEM, i, &deviceInterfaceData) != FALSE)
-  {
-    DWORD reqSize = 0;
-    SP_DEVINFO_DATA d;
-    d.cbSize = sizeof(SP_DEVINFO_DATA);
-
-    SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &reqSize, &d);
-    if (!reqSize)
-    {
-      fprintf(stderr, "SetupDiGetDeviceInterfaceDetail");
-      break;
-    }
-    
-    infData = static_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(malloc(reqSize));
-    ZeroMemory(infData, reqSize);
-    infData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
-    if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, infData, reqSize, NULL, NULL))
-    {
-      fprintf(stderr, "SetupDiGetDeviceInterfaceDetail");
-      break;
-    }
-
-    DWORD bus, addr, slot, func;
-
-    if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_BUSNUMBER,NULL,(PBYTE)&bus,sizeof(bus),NULL))
-    {
-      DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_BUSNUMBER: %lu\n", GetLastError());
-      free(infData);
-      break;
-    }
-
-    if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_ADDRESS,NULL, (PBYTE)&addr,sizeof(addr),NULL))
-    {
-      DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_ADDRESS: %lu\n", GetLastError());
-      free(infData);
-      break;
-    }
-    
-    slot = (addr >> 16) & 0xFFFF;
-    func = addr & 0xFFFF;
-
-    fprintf(stderr, "[%lu] Found Device: %ls\n"
-               "   Bus:  0x%lx\n"
-               "   Slot: 0x%lx\n"
-               "   Func: 0x%lx\n", 
-               i, infData->DevicePath, bus, slot, func);
-    i++;
-  }
-  
-  DWORD error = GetLastError();
-  if (error != ERROR_NO_MORE_ITEMS)
-  {
-    fprintf(stderr, "Unknown error on index %u: %lu\n", i, error);
-  }
-
-  fprintf(stderr, "%lu devices found\n\n", i);
-} 
-
-IVSHMEM::IVSHMEM() :
-  m_initialized(false),
-  m_handle(INVALID_HANDLE_VALUE),
-  m_gotSize(false),
-  m_gotPeerID(false),
-  m_gotMemory(false)
-{
-
-}
-
-IVSHMEM::~IVSHMEM()
-{
-  DeInitialize();
-}
-
-bool IVSHMEM::Initialize(PCI_DEVICE dev)
-{
-  if (m_initialized)
-    DeInitialize();
-
-  HDEVINFO deviceInfoSet;
-  PSP_DEVICE_INTERFACE_DETAIL_DATA infData = NULL;
-  SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
-
-  deviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
-  ZeroMemory(&deviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
-  deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
-
-  DWORD devid = 0;
-  while (SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &GUID_DEVINTERFACE_IVSHMEM, devid, &deviceInterfaceData) != FALSE)
-  {
-    DWORD reqSize = 0;
-    SP_DEVINFO_DATA d;
-    d.cbSize = sizeof(SP_DEVINFO_DATA);
-    SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &reqSize, &d);
-    if (!reqSize)
-    {
-      DEBUG_ERROR("SetupDiGetDeviceInterfaceDetail");
-      break;
-    }
-
-    infData = static_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(malloc(reqSize));
-    ZeroMemory(infData, reqSize);
-    infData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
-    if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, infData, reqSize, NULL, NULL))
-    {
-      DEBUG_ERROR("SetupDiGetDeviceInterfaceDetail");
-      free(infData);
-      break;
-    }
-
-    DWORD bus, addr, slot, func;
-
-    if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_BUSNUMBER,NULL,(PBYTE)&bus,sizeof(bus),NULL))
-    {
-      DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_BUSNUMBER");
-      free(infData);
-      break;
-    }
-
-    if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, &d,SPDRP_ADDRESS,NULL, (PBYTE)&addr,sizeof(addr),NULL))
-    {
-      DEBUG_ERROR("SetupDiGetDeviceRegistryProperty - SPDRP_ADDRESS");
-      free(infData);
-      break;
-    }
-
-    slot = (addr >> 16) & 0xFFFF;
-    func = addr & 0xFFFF;
-
-    if (dev.bus != bus || dev.addr != slot || dev.func != func) //not the right device, keep searching
-    {
-      free(infData);
-      devid++;
-      continue;
-    }
-
-    fprintf(stderr, "Found Device at Index %lu: %ls\n"
-               "   Bus:  %lu\n"
-               "   Addr: %lu\n"
-               "   Func: %lu\n", 
-               devid, infData->DevicePath, bus, slot, func);
-
-    m_handle = CreateFile(infData->DevicePath, 0, 0, NULL, OPEN_EXISTING, 0, 0);
-    if (m_handle == INVALID_HANDLE_VALUE)
-    {
-      DEBUG_ERROR("CreateFile returned INVALID_HANDLE_VALUE");
-      free(infData);
-      break;
-    }
-
-    m_initialized = true;
-    break;
-  }
-  
-  DWORD error = GetLastError();
-  if (m_initialized == false)
-  {
-    if (error == ERROR_NO_MORE_ITEMS)
-    {
-      DEBUG_ERROR("Unable to enumerate the device, is it attached?");
-    }
-    else
-    {
-      DEBUG_ERROR("Unable to enumerate the device. Error: %lu\n", error);
-    }
-    
-  } 
-
-  SetupDiDestroyDeviceInfoList(deviceInfoSet);
-  return m_initialized;
-}
-
-void IVSHMEM::DeInitialize()
-{
-  if (!m_initialized)
-    return;
-
-  if (m_gotMemory)
-  {
-    if (!DeviceIoControl(m_handle, IOCTL_IVSHMEM_RELEASE_MMAP, NULL, 0, NULL, 0, NULL, NULL))
-      DEBUG_ERROR("DeviceIoControl failed: %d", (int)GetLastError());
-    m_memory = NULL;
-  }
-
-  if (m_handle != INVALID_HANDLE_VALUE)
-    CloseHandle(m_handle);
-
-  m_initialized = false;
-  m_handle      = INVALID_HANDLE_VALUE;
-  m_gotSize     = false;
-  m_gotPeerID   = false;
-  m_gotVectors  = false;
-  m_gotMemory   = false;
-}
-
-bool IVSHMEM::IsInitialized()
-{
-  return m_initialized;
-}
-
-UINT64 IVSHMEM::GetSize()
-{
-  if (!m_initialized)
-    return 0;
-
-  if (m_gotSize)
-    return m_size;
-
-  IVSHMEM_SIZE size;
-  if (!DeviceIoControl(m_handle, IOCTL_IVSHMEM_REQUEST_SIZE, NULL, 0, &size, sizeof(IVSHMEM_SIZE), NULL, NULL))
-  {
-    DEBUG_ERROR("DeviceIoControl Failed: %d", (int)GetLastError());
-    return 0;
-  }
-
-  m_gotSize = true;
-  m_size    = static_cast<UINT64>(size);
-  return m_size;
-}
-
-UINT16 IVSHMEM::GetPeerID()
-{
-  if (!m_initialized)
-    return 0;
-
-  if (m_gotPeerID)
-    return m_peerID;
-
-  IVSHMEM_PEERID peerID;
-  if (!DeviceIoControl(m_handle, IOCTL_IVSHMEM_REQUEST_SIZE, NULL, 0, &peerID, sizeof(IVSHMEM_PEERID), NULL, NULL))
-  {
-    DEBUG_ERROR("DeviceIoControl Failed: %d", (int)GetLastError());
-    return 0;
-  }
-
-  m_gotPeerID = true;
-  m_peerID    = static_cast<UINT16>(peerID);
-  return m_peerID;
-}
-
-UINT16 IVSHMEM::GetVectors()
-{
-  if (!m_initialized)
-    return 0;
-
-  if (!m_gotVectors)
-    return 0;
-
-  return m_vectors;
-}
-
-void * IVSHMEM::GetMemory()
-{
-  if (!m_initialized)
-    return NULL;
-
-  if (m_gotMemory)
-    return m_memory;
-
-// this if define can be removed later once everyone is un the latest version
-// old versions of the IVSHMEM driver ignore the input argument, as such this
-// is completely backwards compatible
-#if defined(IVSHMEM_CACHE_WRITECOMBINED)
-  IVSHMEM_MMAP_CONFIG config;
-  config.cacheMode = IVSHMEM_CACHE_WRITECOMBINED;
-#endif
-
-  IVSHMEM_MMAP map;
-  ZeroMemory(&map, sizeof(IVSHMEM_MMAP));
-  if (!DeviceIoControl(
-    m_handle,
-    IOCTL_IVSHMEM_REQUEST_MMAP,
-#if defined(IVSHMEM_CACHE_WRITECOMBINED)
-    &config, sizeof(IVSHMEM_MMAP_CONFIG),
-#else
-    NULL   , 0,
-#endif
-    &map   , sizeof(IVSHMEM_MMAP       ),
-    NULL, NULL))
-  {
-    DEBUG_ERROR("DeviceIoControl Failed: %d", (int)GetLastError());
-    return NULL;
-  }
-
-  m_gotSize    = true;
-  m_gotPeerID  = true;
-  m_gotMemory  = true;
-  m_gotVectors = true;
-  m_size       = static_cast<UINT64>(map.size   );
-  m_peerID     = static_cast<UINT16>(map.peerID );
-  m_vectors    = static_cast<UINT16>(map.vectors);
-  m_memory     = map.ptr;
-
-  return m_memory;
-}
-
-HANDLE IVSHMEM::CreateVectorEvent(UINT16 vector)
-{
-  if (!m_initialized)
-    return INVALID_HANDLE_VALUE;
-
-  HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);
-  if (event == INVALID_HANDLE_VALUE)
-  {
-    DEBUG_ERROR("CreateEvent Failed: %d", (int)GetLastError());
-    return INVALID_HANDLE_VALUE;
-  }
-
-  IVSHMEM_EVENT msg;
-  msg.event      = event;
-  msg.singleShot = false;
-  msg.vector     = vector;
-
-  if (!DeviceIoControl(m_handle, IOCTL_IVSHMEM_REGISTER_EVENT, &msg, sizeof(IVSHMEM_EVENT), NULL, 0, NULL, NULL))
-  {
-    DEBUG_ERROR("DeviceIoControl Failed: %d", (int)GetLastError());
-    CloseHandle(event);
-    return INVALID_HANDLE_VALUE;
-  }
-
-  return event;
-}
-
-bool IVSHMEM::RingDoorbell(UINT16 peerID, UINT16 door)
-{
-  if (!m_initialized)
-    return false;
-
-  IVSHMEM_RING msg;
-  msg.peerID = peerID;
-  msg.vector = door;
-
-  if (!DeviceIoControl(m_handle, IOCTL_IVSHMEM_RING_DOORBELL, &msg, sizeof(IVSHMEM_RING), NULL, 0, NULL, NULL))
-  {
-    DEBUG_ERROR("DeviceIoControl Failed: %d", (int)GetLastError());
-    return false;
-  }
-
-  return true;
-}
\ No newline at end of file
diff --git a/host/IVSHMEM.h b/host/IVSHMEM.h
deleted file mode 100644
index f6932d05..00000000
--- a/host/IVSHMEM.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#define W32_LEAN_AND_MEAN
-#include <windows.h>
-#include <stdbool.h>
-
-struct PCI_DEVICE {
-  BYTE bus, addr, func;
-};
-
-class IVSHMEM
-{
-public:
-  static IVSHMEM * Get()
-  {
-    if (!m_instance)
-      m_instance = new IVSHMEM();
-    return m_instance;
-  }
-
-  static void listDevices();
-
-  bool Initialize(PCI_DEVICE dev);
-  void DeInitialize();
-  bool IsInitialized();
-
-  UINT64 GetSize();
-  UINT16 GetPeerID();
-  UINT16 GetVectors();
-  void * GetMemory();
-  HANDLE CreateVectorEvent(UINT16 vector);
-  bool   RingDoorbell(UINT16 peerID, UINT16 door);
-
-protected:
-
-
-private:
-  static IVSHMEM * m_instance;
-
-  IVSHMEM();
-  ~IVSHMEM();
-
-  bool   m_initialized;
-  HANDLE m_handle;
-
-  UINT64 m_size   ; bool m_gotSize  ;
-  UINT16 m_peerID ; bool m_gotPeerID;
-  void * m_memory ; bool m_gotMemory;
-  UINT16 m_vectors; bool m_gotVectors;
-};
\ No newline at end of file
diff --git a/host/Looking Glass.sln b/host/Looking Glass.sln
deleted file mode 100644
index fa5dc377..00000000
--- a/host/Looking Glass.sln	
+++ /dev/null
@@ -1,60 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "looking-glass-host", "looking-glass-host.vcxproj", "{D439DE3E-32FB-4599-8B5D-C92674D400D4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sync-test", "sync-test\sync-test.vcxproj", "{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BE5778A4-4447-410B-B8E8-D86087F62CFD}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug - NvFBC|x64 = Debug - NvFBC|x64
-		Debug - NvFBC|x86 = Debug - NvFBC|x86
-		Debug|x64 = Debug|x64
-		Debug|x86 = Debug|x86
-		Release - NvFBC|x64 = Release - NvFBC|x64
-		Release - NvFBC|x86 = Release - NvFBC|x86
-		Release|x64 = Release|x64
-		Release|x86 = Release|x86
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug - NvFBC|x64.ActiveCfg = Debug - NvFBC|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug - NvFBC|x64.Build.0 = Debug - NvFBC|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug - NvFBC|x86.ActiveCfg = Debug - NvFBC|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug - NvFBC|x86.Build.0 = Debug - NvFBC|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug|x64.ActiveCfg = Debug|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug|x64.Build.0 = Debug|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug|x86.ActiveCfg = Debug|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Debug|x86.Build.0 = Debug|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release - NvFBC|x64.ActiveCfg = Release - NvFBC|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release - NvFBC|x64.Build.0 = Release - NvFBC|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release - NvFBC|x86.ActiveCfg = Release - NvFBC|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release - NvFBC|x86.Build.0 = Release - NvFBC|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release|x64.ActiveCfg = Release|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release|x64.Build.0 = Release|x64
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release|x86.ActiveCfg = Release|Win32
-		{D439DE3E-32FB-4599-8B5D-C92674D400D4}.Release|x86.Build.0 = Release|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug - NvFBC|x64.ActiveCfg = Debug - NvFBC|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug - NvFBC|x64.Build.0 = Debug - NvFBC|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug - NvFBC|x86.ActiveCfg = Debug - NvFBC|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug - NvFBC|x86.Build.0 = Debug - NvFBC|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug|x64.ActiveCfg = Debug|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug|x64.Build.0 = Debug|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug|x86.ActiveCfg = Debug|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Debug|x86.Build.0 = Debug|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release - NvFBC|x64.ActiveCfg = Release - NvFBC|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release - NvFBC|x64.Build.0 = Release - NvFBC|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release - NvFBC|x86.ActiveCfg = Release - NvFBC|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release - NvFBC|x86.Build.0 = Release - NvFBC|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release|x64.ActiveCfg = Release|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release|x64.Build.0 = Release|x64
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release|x86.ActiveCfg = Release|Win32
-		{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}.Release|x86.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/host/MFT/H264.cpp b/host/MFT/H264.cpp
deleted file mode 100644
index 2d28f195..00000000
--- a/host/MFT/H264.cpp
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "MFT/H264.h"
-
-#include "WinDebug.h"
-#include "common/memcpySSE.h"
-
-#include <mfapi.h>
-#include <mfidl.h>
-#include <mfreadwrite.h>
-#include <wmcodecdsp.h>
-#include <codecapi.h>
-#include <mferror.h>
-#include <evr.h>
-
-using namespace MFT;
-
-#if __MINGW32__
-EXTERN_GUID(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 0xa634a91c, 0x822b, 0x41b9, 0xa4, 0x94, 0x4d, 0xe4, 0x64, 0x36, 0x12, 0xb0);
-EXTERN_GUID(MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING, 0xf81da2c, 0xb537, 0x4672, 0xa8, 0xb2, 0xa6, 0x81, 0xb1, 0x73, 0x07, 0xa3);
-EXTERN_GUID(MF_SA_D3D11_AWARE, 0x206b4fc8, 0xfcf9, 0x4c51, 0xaf, 0xe3, 0x97, 0x64, 0x36, 0x9e, 0x33, 0xa0);
-
-#define METransformUnknown       600
-#define METransformNeedInput     601
-#define METransformHaveOutput    602
-#define METransformDrainComplete 603
-#define METransformMarker        604
-#endif
-
-MFT::H264::H264() :
-  m_cRef(1)
-{
-  MFStartup(MF_VERSION);
-}
-
-MFT::H264::~H264()
-{
-  DeInitialize();
-}
-
-bool MFT::H264::Initialize(ID3D11DevicePtr device, unsigned int width, unsigned int height)
-{
-  DeInitialize();
-  HRESULT status;
-
-  MFT_REGISTER_TYPE_INFO typeInfo;
-  IMFActivate  **activationPointers;
-  UINT32         activationPointerCount;
-
-  m_device        = device;
-  m_width         = width;
-  m_height        = height;
-
-  m_encodeEvent   = CreateEvent(NULL, TRUE , FALSE, NULL);
-  m_shutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  InitializeCriticalSection(&m_encodeCS);
-
-  ID3D10MultithreadPtr mt(m_device);
-  mt->SetMultithreadProtected(TRUE);
-  mt = NULL;
-
-  typeInfo.guidMajorType = MFMediaType_Video;
-  typeInfo.guidSubtype   = MFVideoFormat_H264;
-
-  status = MFTEnumEx(
-    MFT_CATEGORY_VIDEO_ENCODER,
-    MFT_ENUM_FLAG_HARDWARE,
-    NULL,
-    &typeInfo,
-    &activationPointers,
-    &activationPointerCount
-  );
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to enumerate encoder MFTs", status);
-    return false;
-  }
-
-  if (activationPointerCount == 0)
-  {
-    DEBUG_WINERROR("Hardware H264 MFT not available", status);
-    return false;
-  }
-
-  {
-    UINT32 nameLen = 0;
-    activationPointers[0]->GetStringLength(MFT_FRIENDLY_NAME_Attribute, &nameLen);
-    wchar_t * name = new wchar_t[nameLen + 1];
-    activationPointers[0]->GetString(MFT_FRIENDLY_NAME_Attribute, name, nameLen + 1, NULL);
-    DEBUG_INFO("Using Encoder: %S", name);
-    delete[] name;
-  }
-
-  m_mfActivation = activationPointers[0];
-  CoTaskMemFree(activationPointers);
-
-  status = m_mfActivation->ActivateObject(IID_PPV_ARGS(&m_mfTransform));
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create H264 encoder MFT", status);
-    return false;
-  }
-
-  IMFAttributesPtr attribs;
-  m_mfTransform->GetAttributes(&attribs);
-  attribs->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);
-  attribs->SetUINT32(MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING, TRUE);
-  attribs->SetUINT32(MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING, TRUE);
-  attribs->SetUINT32(MF_LOW_LATENCY, TRUE);
-
-  UINT32 d3d11Aware = 0;
-  UINT32 async = 0;
-  attribs->GetUINT32(MF_TRANSFORM_ASYNC, &async);
-  attribs->GetUINT32(MF_SA_D3D11_AWARE, &d3d11Aware);
-  if (async)
-    attribs->SetUINT32(MF_TRANSFORM_ASYNC_UNLOCK, TRUE);
-  attribs = NULL;
-
-  status = m_mfTransform.QueryInterface(IID_PPV_ARGS(&m_mediaEventGen));
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to obtain the media event generator interface", status);
-    return false;
-  }
-
-  status = m_mediaEventGen->BeginGetEvent(this, NULL);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to set the begin get event", status);
-    return false;
-  }
-
-  if (d3d11Aware)
-  {
-    MFCreateDXGIDeviceManager(&m_resetToken, &m_mfDeviceManager);
-    status = m_mfDeviceManager->ResetDevice(m_device, m_resetToken);
-    if (FAILED(status))
-    {
-      DEBUG_WINERROR("Failed to call reset device", status);
-      return false;
-    }
-
-    status = m_mfTransform->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, ULONG_PTR(m_mfDeviceManager.GetInterfacePtr()));
-    if (FAILED(status))
-    {
-      DEBUG_WINERROR("Failed to set the D3D manager", status);
-      return false;
-    }
-  }
-
-  IMFMediaTypePtr outType;
-  MFCreateMediaType(&outType);
-
-  outType->SetGUID  (MF_MT_MAJOR_TYPE             , MFMediaType_Video           );
-  outType->SetGUID  (MF_MT_SUBTYPE                , MFVideoFormat_H264          );
-  outType->SetUINT32(MF_MT_AVG_BITRATE            , 384 * 1000                  );
-  outType->SetUINT32(MF_MT_INTERLACE_MODE         , MFVideoInterlace_Progressive);
-  outType->SetUINT32(MF_MT_MPEG2_PROFILE          , eAVEncH264VProfile_High     );
-  outType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
-
-  MFSetAttributeSize (outType, MF_MT_FRAME_SIZE        , m_width, m_height);
-  MFSetAttributeRatio(outType, MF_MT_FRAME_RATE        , 60     , 1       );
-  MFSetAttributeRatio(outType, MF_MT_PIXEL_ASPECT_RATIO, 1      , 1       );
-
-  status  = m_mfTransform->SetOutputType(0, outType, 0);
-  outType = NULL;
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to set the output media type on the H264 encoder MFT", status);
-    return false;
-  }
-
-  IMFMediaTypePtr inType;
-  MFCreateMediaType(&inType);
-
-  inType->SetGUID  (MF_MT_MAJOR_TYPE             , MFMediaType_Video           );
-  inType->SetGUID  (MF_MT_SUBTYPE                , MFVideoFormat_NV12          );
-  inType->SetUINT32(MF_MT_INTERLACE_MODE         , MFVideoInterlace_Progressive);
-  inType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE                        );
-
-  MFSetAttributeSize (inType, MF_MT_FRAME_SIZE        , m_width, m_height);
-  MFSetAttributeRatio(inType, MF_MT_FRAME_RATE        , 60     , 1       );
-  MFSetAttributeRatio(inType, MF_MT_PIXEL_ASPECT_RATIO, 1      , 1       );
-
-  status = m_mfTransform->SetInputType(0, inType, 0);
-  inType = NULL;
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to set the input media type on the H264 encoder MFT", status);
-    return false;
-  }
-
-  m_mfTransform->ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH, 0);
-  m_mfTransform->ProcessMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0);
-  m_mfTransform->ProcessMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0);
-
-  return true;
-}
-
-void MFT::H264::DeInitialize()
-{
-  if (m_mediaEventGen)
-  {
-    m_mfTransform->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, 0);
-    m_mfTransform->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0);
-    while (WaitForSingleObject(m_shutdownEvent, INFINITE) != WAIT_OBJECT_0) {}
-    m_mfTransform->DeleteInputStream(0);
-  }
-
-  m_mediaEventGen   = NULL;
-  m_mfTransform     = NULL;
-  m_mfDeviceManager = NULL;
-
-  if (m_encodeEvent)
-  {
-    CloseHandle(m_encodeEvent  );
-    CloseHandle(m_shutdownEvent);
-    m_encodeEvent   = NULL;
-    m_shutdownEvent = NULL;
-    DeleteCriticalSection(&m_encodeCS);
-  }
-
-  if (m_mfActivation)
-  {
-    m_mfActivation->ShutdownObject();
-    m_mfActivation = NULL;
-  }
-}
-
-unsigned int MFT::H264::Process()
-{
-  while(true)
-  {
-    // only reset the event if there isn't work pending
-    EnterCriticalSection(&m_encodeCS);
-    if (!m_encodeHasData && !m_encodeNeedsData)
-      ResetEvent(m_encodeEvent);
-    LeaveCriticalSection(&m_encodeCS);
-
-    switch (WaitForSingleObject(m_encodeEvent, 1000))
-    {
-      case WAIT_FAILED:
-        DEBUG_WINERROR("Wait for encode event failed", GetLastError());
-        return H264_EVENT_ERROR;
-
-      case WAIT_ABANDONED:
-        DEBUG_ERROR("Wait abandoned");
-        return H264_EVENT_ERROR;
-
-      case WAIT_TIMEOUT:
-        continue;
-
-      case WAIT_OBJECT_0:
-        break;
-    }
-
-    unsigned int events = 0;
-    EnterCriticalSection(&m_encodeCS);
-    if (m_encodeNeedsData) events |= H264_EVENT_NEEDS_DATA;
-    if (m_encodeHasData  ) events |= H264_EVENT_HAS_DATA;
-    LeaveCriticalSection(&m_encodeCS);
-
-    return events;
-  }
-
-  return H264_EVENT_ERROR;
-}
-
-bool MFT::H264::ProvideFrame(ID3D11Texture2DPtr texture)
-{
-  EnterCriticalSection(&m_encodeCS);
-  if (!m_encodeNeedsData)
-  {
-    LeaveCriticalSection(&m_encodeCS);
-    return false;
-  }
-  m_encodeNeedsData = false;
-  LeaveCriticalSection(&m_encodeCS);
-
-  HRESULT status;
-  IMFMediaBufferPtr buffer;
-  status = MFCreateDXGISurfaceBuffer(__uuidof(ID3D11Texture2D), texture, 0, FALSE, &buffer);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to create DXGI surface buffer from texture", status);
-    return false;
-  }
-
-  IMF2DBufferPtr imfBuffer(buffer);
-  DWORD length;
-  imfBuffer->GetContiguousLength(&length);
-  buffer->SetCurrentLength(length);
-
-  IMFSamplePtr sample;
-  MFCreateSample(&sample);
-  sample->AddBuffer(buffer);
-
-  status = m_mfTransform->ProcessInput(0, sample, 0);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("Failed to process the input", status);
-    return false;
-  }
-
-  return true;
-}
-
-bool MFT::H264::GetFrame(void * buffer, const size_t bufferSize, unsigned int & dataLen)
-{
-  EnterCriticalSection(&m_encodeCS);
-  if (!m_encodeHasData)
-  {
-    LeaveCriticalSection(&m_encodeCS);
-    return false;
-  }
-
-  m_encodeHasData = false;
-  LeaveCriticalSection(&m_encodeCS);
-
-  HRESULT status;
-  MFT_OUTPUT_STREAM_INFO streamInfo;
-  status = m_mfTransform->GetOutputStreamInfo(0, &streamInfo);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("GetOutputStreamInfo", status);
-    return false;
-  }
-
-  DWORD outStatus;
-  MFT_OUTPUT_DATA_BUFFER outDataBuffer = { 0 };
-  status = m_mfTransform->ProcessOutput(0, 1, &outDataBuffer, &outStatus);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("ProcessOutput", status);
-    return false;
-  }
-
-  IMFMediaBufferPtr mb;
-  outDataBuffer.pSample->ConvertToContiguousBuffer(&mb);
-
-  BYTE *pixels;
-  DWORD curLen;
-  mb->Lock(&pixels, NULL, &curLen);
-  memcpy(buffer, pixels, curLen);
-  mb->Unlock();
-
-  if (outDataBuffer.pSample)
-    outDataBuffer.pSample->Release();
-
-  if (outDataBuffer.pEvents)
-    outDataBuffer.pEvents->Release();
-
-  dataLen = curLen;
-  return true;
-}
-
-STDMETHODIMP MFT::H264::Invoke(IMFAsyncResult * pAsyncResult)
-{
-  HRESULT status, evtStatus;
-  MediaEventType meType = MEUnknown;
-  IMFMediaEventPtr pEvent = NULL;
-
-  status = m_mediaEventGen->EndGetEvent(pAsyncResult, &pEvent);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("EndGetEvent", status);
-    return status;
-  }
-
-  status = pEvent->GetStatus(&evtStatus);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("GetStatus", status);
-    return status;
-  }
-
-  if (FAILED(evtStatus))
-  {
-    DEBUG_WINERROR("evtStatus", evtStatus);
-    return evtStatus;
-  }
-
-  status = pEvent->GetType(&meType);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("GetType", status);
-    return status;
-  }
-
-  switch (meType)
-  {
-    case METransformNeedInput:
-      EnterCriticalSection(&m_encodeCS);
-      m_encodeNeedsData = true;
-      SetEvent(m_encodeEvent);
-      LeaveCriticalSection(&m_encodeCS);
-      break;
-
-    case METransformHaveOutput:
-      EnterCriticalSection(&m_encodeCS);
-      m_encodeHasData = true;
-      SetEvent(m_encodeEvent);
-      LeaveCriticalSection(&m_encodeCS);
-      break;
-
-    case METransformDrainComplete:
-    {
-      status = m_mfTransform->ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH, 0);
-      if (FAILED(status))
-      {
-        DEBUG_WINERROR("MFT_MESSAGE_COMMAND_FLUSH", status);
-        return status;
-      }
-
-      SetEvent(m_shutdownEvent);
-      return S_OK;
-    }
-
-    case MEError:
-      DEBUG_INFO("err");
-      break;
-
-    default:
-      DEBUG_INFO("unk");
-      break;
-  }
-
-  status = m_mediaEventGen->BeginGetEvent(this, NULL);
-  if (FAILED(status))
-  {
-    DEBUG_WINERROR("BeginGetEvent", status);
-    return status;
-  }
-
-  return status;
-}
\ No newline at end of file
diff --git a/host/MFT/H264.h b/host/MFT/H264.h
deleted file mode 100644
index 4142d368..00000000
--- a/host/MFT/H264.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#define W32_LEAN_AND_MEAN
-#include <windows.h>
-#include <shlwapi.h>
-#include <stdio.h>
-
-#include "Com.h"
-
-namespace MFT
-{
-  enum H264_Event
-  {
-    H264_EVENT_ENCODE     = 0x01,
-    H264_EVENT_NEEDS_DATA = 0x04,
-    H264_EVENT_HAS_DATA   = 0x08,
-    H264_EVENT_ERROR      = 0x10
-  };
-
-  class H264: public IMFAsyncCallback
-  {
-  public:
-    H264();
-    ~H264();
-    bool Initialize(ID3D11DevicePtr device, unsigned int width, unsigned int height);
-    void DeInitialize();
-    unsigned int Process();
-    bool ProvideFrame(ID3D11Texture2DPtr texture);
-    bool GetFrame(void * buffer, const size_t bufferSize, unsigned int & dataLen);
-
-    ID3D11DevicePtr                 m_device;
-    unsigned int                    m_width;
-    unsigned int                    m_height;
-
-    HANDLE                          m_encodeEvent;
-    HANDLE                          m_shutdownEvent;
-    bool                            m_encodeNeedsData;
-    bool                            m_encodeHasData;
-    CRITICAL_SECTION                m_encodeCS;
-
-    UINT                            m_resetToken;
-    IMFDXGIDeviceManagerPtr         m_mfDeviceManager;
-    IMFActivatePtr                  m_mfActivation;
-    IMFTransformPtr                 m_mfTransform;
-    IMFMediaEventGeneratorPtr       m_mediaEventGen;
-
-    /*
-    Junk needed for the horrid IMFAsyncCallback interface
-    */
-    STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
-    {
-      if (riid == __uuidof(IUnknown) || riid == __uuidof(IMFAsyncCallback)) {
-        *ppv = static_cast<IMFAsyncCallback*>(this);
-        AddRef();
-        return S_OK;
-      }
-      else {
-        *ppv = NULL;
-        return E_NOINTERFACE;
-      }
-    }
-
-    STDMETHODIMP_(ULONG) AddRef()
-    {
-      return InterlockedIncrement(&m_cRef);
-    }
-
-    STDMETHODIMP_(ULONG) Release()
-    {
-      long cRef = InterlockedDecrement(&m_cRef);
-      if (!cRef)
-        delete this;
-      return cRef;
-    }
-
-    STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) { return E_NOTIMPL; }
-    STDMETHODIMP Invoke(IMFAsyncResult *pAsyncResult);
-
-  private:
-    long m_cRef;
-  };
-};
\ No newline at end of file
diff --git a/host/Makefile b/host/Makefile
deleted file mode 100644
index e86af16b..00000000
--- a/host/Makefile
+++ /dev/null
@@ -1,59 +0,0 @@
-BINARY  = looking-glass-host.exe
-CFLAGS  = -g -O3 -march=native -Wall -Werror -I./ -I../common # -DDEBUG
-LDFLAGS = -lshlwapi -ldxgi -ld3d11 -lsetupapi -luuid -lole32 -lmfplat -lmfuuid
-
-CFLAGS  += -ffast-math
-CFLAGS  += -fdata-sections -ffunction-sections
-CFLAGS  += -I../ -I.
-LDFLAGS += -Wl,--gc-sections -mwindows
-CFLAGS  += -DWINVER=0x0602 -DUNICODE
-
-PREFIX ?= x86_64-w64-mingw32-
-STRIP  = $(PREFIX)strip
-CC     = $(PREFIX)cc
-CXX    = $(PREFIX)c++
-LD     = $(CXX)
-
-BUILD  ?= .build
-BIN    ?= bin
-
-CFLAGS  += -DBUILD_VERSION='"$(shell git describe --always --long --dirty --abbrev=10 --tags)"'
-
-OBJS	= main.o \
-	  CrashHandler.o \
-	  MultiMemcpy.o \
-	  IVSHMEM.o \
-	  Service.o \
-	  Capture/DXGI.o
-
-ifeq ($(ENABLE_TRACING),1)
-CFLAGS  += -DENABLE_TRACING
-OBJS    += TraceUtil.o
-endif
-
-ifeq ($(CONFIG_CAPTURE_NVFBC),1)
-CFLAGS  += -DCONFIG_CAPTURE_NVFBC=1 -I../vendor
-OBJS    += Capture/NvFBC.o
-endif
-
-BUILD_OBJS = $(foreach obj,$(OBJS),$(BUILD)/$(obj))
-
-all: $(BIN)/$(BINARY)
-
-$(BUILD)/%.o: %.c
-	@mkdir -p $(dir $@)
-	$(CC) -c $(CFLAGS) -o $@ $<
-
-$(BUILD)/%.o: %.cpp
-	@mkdir -p $(dir $@)
-	$(CXX) -c $(CFLAGS) -o $@ $<
-
-$(BIN)/$(BINARY): $(BUILD_OBJS)
-	@mkdir -p $(dir $@)
-	$(LD) -o $@ $^ $(LDFLAGS)
-	$(STRIP) -s $@
-
-clean:
-	rm -rf $(BUILD) $(BIN)
-
-.PHONY: clean
diff --git a/host/Service.cpp b/host/Service.cpp
deleted file mode 100644
index 96f9a1de..00000000
--- a/host/Service.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "Service.h"
-#include "IVSHMEM.h"
-#include "TraceUtil.h"
-
-#include "common/debug.h"
-#include "common/KVMFR.h"
-
-#include "Util.h"
-#include "CaptureFactory.h"
-
-PCI_DEVICE Service::s_dev = {0x13, 0x01, 0x00};
-
-Service::Service() :
-  m_initialized(false),
-  m_memory(NULL),
-  m_timer(NULL),
-  m_capture(NULL),
-  m_shmHeader(NULL),
-  m_frameIndex(0),
-  m_cursorDataSize(0),
-  m_cursorData(NULL)
-{
-  m_consoleSessionID = WTSGetActiveConsoleSessionId();
-  m_ivshmem = IVSHMEM::Get();
-
-  if (!m_ivshmem->Initialize(s_dev))
-    throw "IVSHMEM failed to initalize";
-
-  if (m_ivshmem->GetSize() < sizeof(KVMFRHeader))
-    throw "Shared memory is not large enough for the KVMFRHeader";
-
-  m_memory = static_cast<uint8_t*>(m_ivshmem->GetMemory());
-  if (!m_memory)
-    throw "Failed to get IVSHMEM memory";
-
-  if (!InitPointers())
-    throw "Failed to initialize the shared memory pointers";
-}
-
-Service::~Service()
-{
-  DeInitialize();
-}
-
-LRESULT Service::LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
-{
-  if (nCode == HC_ACTION && wParam == WM_MOUSEMOVE)
-  {
-    MSLLHOOKSTRUCT *msg = (MSLLHOOKSTRUCT *)lParam;
-    volatile KVMFRCursor * cursor = &(m_shmHeader->cursor);
-    volatile char * flags = (volatile char *)&(cursor->flags);
-
-    cursor->x = (int16_t)msg->pt.x;
-    cursor->y = (int16_t)msg->pt.y;
-    INTERLOCKED_OR8(flags, KVMFR_CURSOR_FLAG_POS);
-  }
-  return CallNextHookEx(m_mouseHook, nCode, wParam, lParam);
-}
-
-bool Service::Initialize(ICapture * captureDevice)
-{
-  if (m_initialized)
-    DeInitialize();
-
-  m_tryTarget = 0;
-  m_capture   = captureDevice;
-
-  if (m_capture->GetMaxFrameSize() > m_frameSize)
-  {
-    DEBUG_ERROR("Maximum frame size of %zu bytes excceds maximum space available", m_capture->GetMaxFrameSize());
-    DeInitialize();
-    return false;
-  }
-
-  // Create the cursor thread
-  m_cursorThread = CreateThread(NULL, 0, _CursorThread, NULL, 0, NULL);
-  m_cursorEvent  = CreateEvent (NULL, FALSE, FALSE, L"CursorEvent");
-  InitializeCriticalSection(&m_cursorCS);
-
-  // update everything except for the hostID
-  memcpy(m_shmHeader->magic, KVMFR_HEADER_MAGIC, sizeof(KVMFR_HEADER_MAGIC));
-  m_shmHeader->version = KVMFR_HEADER_VERSION;
-
-  // zero and tell the client we have restarted
-  ZeroMemory(&(m_shmHeader->frame ), sizeof(KVMFRFrame ));
-  ZeroMemory(&(m_shmHeader->cursor), sizeof(KVMFRCursor));
-  m_shmHeader->flags &= ~KVMFR_HEADER_FLAG_RESTART;
-
-  m_haveFrame   = false;
-  m_initialized = true;
-  m_running     = true;
-  return true;
-}
-
-#define ALIGN_DN(x) ((uintptr_t)(x) & ~0x7F)
-#define ALIGN_UP(x) ALIGN_DN(x + 0x7F)
-
-bool Service::InitPointers()
-{
-  m_shmHeader      = reinterpret_cast<KVMFRHeader *>(m_memory);
-  m_cursorData     = (uint8_t *)ALIGN_UP(m_memory + sizeof(KVMFRHeader));
-  m_cursorDataSize = 1048576; // 1MB fixed for cursor size, should be more then enough
-  m_cursorOffset   = m_cursorData - m_memory;
-
-  uint8_t * m_frames = (uint8_t *)ALIGN_UP(m_cursorData + m_cursorDataSize);
-  m_frameSize = ALIGN_DN((m_ivshmem->GetSize() - (m_frames - m_memory)) / MAX_FRAMES);
-
-  DEBUG_INFO("Total Available : %3u MB", (unsigned int)(m_ivshmem->GetSize() / 1024 / 1024));
-  DEBUG_INFO("Max Cursor Size : %3u MB", (unsigned int)(m_cursorDataSize / 1024 / 1024));
-  DEBUG_INFO("Max Frame Size  : %3u MB", (unsigned int)(m_frameSize / 1024 / 1024));
-  DEBUG_INFO("Cursor          : %p (0x%08x)", m_cursorData, (int)m_cursorOffset);
-
-  for (int i = 0; i < MAX_FRAMES; ++i)
-  {
-    m_frame[i] = m_frames + i * m_frameSize;
-    m_dataOffset[i] = m_frame[i] - m_memory;
-    DEBUG_INFO("Frame %d         : %p (0x%08x)", i, m_frame[i], (int)m_dataOffset[i]);
-  }
-
-  return true;
-}
-
-void Service::DeInitialize()
-{
-  m_running = false;
-
-  WaitForSingleObject(m_cursorThread, INFINITE);
-  CloseHandle(m_cursorThread);
-  CloseHandle(m_cursorEvent);
-
-  m_shmHeader      = NULL;
-  m_cursorData     = NULL;
-  m_cursorDataSize = 0;
-  m_cursorOffset   = 0;
-  m_haveFrame      = false;
-
-  for(int i = 0; i < MAX_FRAMES; ++i)
-  {
-    m_frame     [i] = NULL;
-    m_dataOffset[i] = 0;
-  }
-  m_frameSize = 0;
-
-  m_ivshmem->DeInitialize();
-
-  if (m_capture)
-  {
-    m_capture->DeInitialize();
-    m_capture = NULL;
-  }
-
-  m_memory = NULL;
-  m_initialized = false;
-}
-
-bool Service::ReInit(volatile char * flags)
-{
-  DEBUG_INFO("ReInitialize Requested");
-
-  INTERLOCKED_OR8(flags, KVMFR_HEADER_FLAG_PAUSED);
-  if (WTSGetActiveConsoleSessionId() != m_consoleSessionID)
-  {
-    DEBUG_INFO("User switch detected, waiting to regain control");
-    while (WTSGetActiveConsoleSessionId() != m_consoleSessionID)
-      Sleep(100);
-  }
-
-  while (!m_capture->CanInitialize())
-    Sleep(100);
-
-  if (!m_capture->ReInitialize())
-  {
-    DEBUG_ERROR("ReInitialize Failed");
-    return false;
-  }
-
-  if (m_capture->GetMaxFrameSize() > m_frameSize)
-  {
-    DEBUG_ERROR("Maximum frame size of %zd bytes excceds maximum space available", m_capture->GetMaxFrameSize());
-    return false;
-  }
-
-  INTERLOCKED_AND8(flags, ~KVMFR_HEADER_FLAG_PAUSED);
-  return true;
-}
-
-ProcessStatus Service::Process()
-{
-  if (!m_initialized)
-    return PROCESS_STATUS_ERROR;
-
-  volatile char * flags = (volatile char *)&(m_shmHeader->flags);
-
-  // check if the client has flagged a restart
-  if (*flags & KVMFR_HEADER_FLAG_RESTART)
-  {
-    DEBUG_INFO("Restart Requested");
-    if (!m_capture->ReInitialize())
-    {
-      DEBUG_ERROR("ReInitialize Failed");
-      return PROCESS_STATUS_ERROR;
-    }
-
-    if (m_capture->GetMaxFrameSize() > m_frameSize)
-    {
-      DEBUG_ERROR("Maximum frame size of %zd bytes exceeds maximum space available", m_capture->GetMaxFrameSize());
-      return PROCESS_STATUS_ERROR;
-    }
-
-    INTERLOCKED_AND8(flags, ~(KVMFR_HEADER_FLAG_RESTART));
-  }
-
-  unsigned int status;
-  bool notify = false;
-
-  status = m_capture->Capture();
-  if (status & GRAB_STATUS_ERROR)
-  {
-    DEBUG_WARN("Capture error, retrying");
-    return PROCESS_STATUS_RETRY;
-  }
-
-  if (status & GRAB_STATUS_TIMEOUT)
-  {
-    // timeouts should not count towards a failure to capture
-    if (!m_haveFrame)
-      return PROCESS_STATUS_OK;
-
-    notify = true;
-  }
-
-  if (status & GRAB_STATUS_REINIT)
-  {
-    if (!ReInit(flags))
-      return PROCESS_STATUS_ERROR;
-
-    // re-init request should not count towards a failure to capture
-    return PROCESS_STATUS_OK;
-  }
-
-  if ((status & (GRAB_STATUS_OK | GRAB_STATUS_TIMEOUT)) == 0)
-  {
-    DEBUG_ERROR("Capture interface returned an unexpected result");
-    return PROCESS_STATUS_ERROR;
-  }
-
-  if (status & GRAB_STATUS_CURSOR)
-    SetEvent(m_cursorEvent);
-
-  volatile KVMFRFrame * fi = &(m_shmHeader->frame);
-  if (status & GRAB_STATUS_FRAME)
-  { 
-    FrameInfo frame  = { 0 };
-    frame.buffer     = m_frame[m_frameIndex];
-    frame.bufferSize = m_frameSize;
-
-    GrabStatus result = m_capture->GetFrame(frame);
-    if (result != GRAB_STATUS_OK)
-    {
-      if (result == GRAB_STATUS_REINIT)
-      {
-        if (!ReInit(flags))
-          return PROCESS_STATUS_ERROR;
-
-        // re-init request should not count towards a failure to capture
-        return PROCESS_STATUS_OK;
-      }
-
-      DEBUG_INFO("GetFrame failed");
-      return PROCESS_STATUS_ERROR;
-    }
-
-    /* don't touch the frame information until the client is done with it */
-    while (fi->flags & KVMFR_FRAME_FLAG_UPDATE)
-    {
-      /* this generally never occurs */
-      Sleep(1);
-      if (*flags & KVMFR_HEADER_FLAG_RESTART)
-        break;
-    }
-
-    fi->type    = m_capture->GetFrameType();
-    fi->width   = frame.width;
-    fi->height  = frame.height;
-    fi->stride  = frame.stride;
-    fi->pitch   = frame.pitch;
-    fi->dataPos = m_dataOffset[m_frameIndex];
-
-    if (++m_frameIndex == MAX_FRAMES)
-      m_frameIndex = 0;
-
-    // remember that we have a valid frame
-    m_haveFrame = true;
-    notify = true;
-  }
-
-  if (notify)
-  {
-    /* don't touch the frame inforamtion until the client is done with it */
-    while (fi->flags & KVMFR_FRAME_FLAG_UPDATE)
-    {
-      if (*flags & KVMFR_HEADER_FLAG_RESTART)
-        break;
-    }
-    // signal a frame update
-    fi->flags |= KVMFR_FRAME_FLAG_UPDATE;
-  }
-
-  // update the flags
-  INTERLOCKED_AND8(flags, KVMFR_HEADER_FLAG_RESTART);
-  return PROCESS_STATUS_OK;
-}
-
-DWORD Service::CursorThread()
-{
-  while(m_running)
-  {
-    if (WaitForSingleObject(m_cursorEvent, 1000) != WAIT_OBJECT_0)
-      continue;
-
-    CursorInfo ci;
-    while (m_capture->GetCursor(ci))
-    {
-      volatile KVMFRCursor * cursor = &(m_shmHeader->cursor);
-      // wait until the client is ready
-      while ((cursor->flags & ~KVMFR_CURSOR_FLAG_POS) != 0)
-      {
-        Sleep(1);
-        if (!m_capture)
-          return 0;
-      }
-
-      uint8_t flags = cursor->flags;
-
-      if (ci.hasPos)
-      {
-        cursor->x = ci.x;
-        cursor->y = ci.y;
-        flags |= KVMFR_CURSOR_FLAG_POS;
-      }
-
-      if (ci.hasShape)
-      {
-        if (ci.shape.pointerSize > m_cursorDataSize)
-          DEBUG_ERROR("Cursor size exceeds allocated space");
-        else
-        {
-          // give the client the new cursor shape
-          flags |= KVMFR_CURSOR_FLAG_SHAPE;
-          ++cursor->version;
-
-          cursor->type    = ci.type;
-          cursor->width   = ci.w;
-          cursor->height  = ci.h;
-          cursor->pitch   = ci.pitch;
-          cursor->dataPos = m_cursorOffset;
-
-          memcpy(m_cursorData, ci.shape.buffer, ci.shape.bufferSize);
-        }
-      }
-
-      if (ci.visible)
-        flags |= KVMFR_CURSOR_FLAG_VISIBLE;
-
-      flags |= KVMFR_CURSOR_FLAG_UPDATE;
-      cursor->flags = flags;
-      m_capture->FreeCursor();
-    }
-  }
-
-  return 0;
-}
\ No newline at end of file
diff --git a/host/Service.h b/host/Service.h
deleted file mode 100644
index be19e460..00000000
--- a/host/Service.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#define W32_LEAN_AND_MEAN
-#include <windows.h>
-#include <stdbool.h>
-
-#include "IVSHMEM.h"
-#include "ICapture.h"
-#include "common/debug.h"
-
-#define MAX_FRAMES 2
-
-enum ProcessStatus
-{
-  PROCESS_STATUS_OK,
-  PROCESS_STATUS_RETRY,
-  PROCESS_STATUS_ERROR
-};
-
-class Service
-{
-public:
-  static Service & Instance()
-  {
-    static Service service;
-    return service;
-  }
-
-  static void InstallHook()
-  {
-    if (Instance().m_mouseHook)
-      RemoveHook();
-    Instance().m_mouseHook = SetWindowsHookEx(WH_MOUSE_LL, _LowLevelMouseProc, NULL, 0);
-  }
-
-  static void RemoveHook()
-  {
-    if (Instance().m_mouseHook)
-    {
-      UnhookWindowsHookEx(Instance().m_mouseHook);
-      Instance().m_mouseHook = NULL;
-    }
-  }
-
-  static void SetDevice(PCI_DEVICE dev)
-  {
-    s_dev = dev;
-  }
-
-  bool Initialize(ICapture * captureDevice);
-  void DeInitialize();
-  ProcessStatus Process();
-
-private:
-  bool InitPointers();
-
-  int m_tryTarget;
-  int m_lastTryCount;
-
-  Service();
-  ~Service();
-
-  HHOOK m_mouseHook;
-  LRESULT LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
-  static LRESULT WINAPI _LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { return Service::Instance().LowLevelMouseProc(nCode, wParam, lParam); }
-
-  bool ReInit(volatile char * flags);
-
-  bool       m_initialized;
-  bool       m_running;
-  DWORD      m_consoleSessionID;
-  uint8_t  * m_memory;
-  IVSHMEM  * m_ivshmem;
-  HANDLE     m_timer;
-  ICapture * m_capture;
-
-  KVMFRHeader * m_shmHeader;
-
-  bool          m_haveFrame;
-  uint8_t     * m_frame[MAX_FRAMES];
-  size_t        m_frameSize;
-  uint64_t      m_dataOffset[MAX_FRAMES];
-  int           m_frameIndex;
-  static PCI_DEVICE  s_dev;
-
-  static DWORD WINAPI _CursorThread(LPVOID lpParameter) { return Service::Instance().CursorThread(); }
-  DWORD CursorThread();
-
-  HANDLE           m_cursorThread;
-  HANDLE           m_cursorEvent;
-  CRITICAL_SECTION m_cursorCS;
-  size_t           m_cursorDataSize;
-  uint8_t        * m_cursorData;
-  uint64_t         m_cursorOffset;
-};
\ No newline at end of file
diff --git a/host/Shaders/Pixel.hlsl b/host/Shaders/Pixel.hlsl
deleted file mode 100644
index a8cb1489..00000000
--- a/host/Shaders/Pixel.hlsl
+++ /dev/null
@@ -1,13 +0,0 @@
-Texture2D    texTexture;
-SamplerState texSampler;
-
-struct VS
-{
-  float4 pos : SV_Position;
-  float2 tex : TEXCOORD;
-};
-
-float4 main(VS input): SV_Target
-{
-  return texTexture.Sample(texSampler, input.tex);
-}
\ No newline at end of file
diff --git a/host/Shaders/RGBtoYUV.hlsl b/host/Shaders/RGBtoYUV.hlsl
deleted file mode 100644
index e3b73350..00000000
--- a/host/Shaders/RGBtoYUV.hlsl
+++ /dev/null
@@ -1,31 +0,0 @@
-Texture2D    texTexture;
-SamplerState texSampler;
-
-struct VS
-{
-  float4 pos : SV_Position;
-  float2 tex : TEXCOORD;
-};
-
-struct OUT
-{
-  float4 y: SV_TARGET0;
-  float4 u: SV_TARGET1;
-  float4 v: SV_TARGET2;
-};
-
-OUT main(VS input)
-{
-  OUT o;
-  const float4 rgba = texTexture.Sample(texSampler, input.tex);
-
-  o.y.gba = 1.0f;
-  o.u.gba = 1.0f;
-  o.v.gba = 1.0f;
-
-  o.y.r  = rgba.r * 0.2126 + 0.7152 * rgba.g + 0.0722 * rgba.b;
-  o.u.r = ((rgba.b - o.y.r) / 1.8556) + 0.5;
-  o.v.r = ((rgba.r - o.y.r) / 1.5748) + 0.5;
-
-  return o;
-}
\ No newline at end of file
diff --git a/host/Shaders/Vertex.hlsl b/host/Shaders/Vertex.hlsl
deleted file mode 100644
index 6b5248be..00000000
--- a/host/Shaders/Vertex.hlsl
+++ /dev/null
@@ -1,16 +0,0 @@
-struct VS
-{
-  float4 pos : POSITION;
-  float2 tex : TEXCOORD; 
-};
-
-struct PS
-{
-  float4 pos : SV_Position;
-  float2 tex : TEXCOORD;
-};
-
-PS main(VS input)
-{
-  return input;
-}
\ No newline at end of file
diff --git a/host/TextureConverter.cpp b/host/TextureConverter.cpp
deleted file mode 100644
index 32272e94..00000000
--- a/host/TextureConverter.cpp
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "TextureConverter.h"
-#include "common\debug.h"
-
-#include "Shaders\Vertex.h"
-#include "Shaders\Pixel.h"
-#include "Shaders\RGBtoYUV.h"
-
-TextureConverter::TextureConverter()
-{
-}
-
-TextureConverter::~TextureConverter()
-{
-  DeInitialize();
-}
-
-bool TextureConverter::Initialize(
-  ID3D11DeviceContextPtr deviceContext,
-  ID3D11DevicePtr        device,
-  const unsigned int     width,
-  const unsigned int     height,
-  FrameType              format
-)
-{
-  HRESULT                         result;
-  D3D11_TEXTURE2D_DESC            texDesc;
-  D3D11_RENDER_TARGET_VIEW_DESC   targetDesc;
-  D3D11_SHADER_RESOURCE_VIEW_DESC shaderDesc;
-  D3D11_SAMPLER_DESC              samplerDesc;
-
-  m_deviceContext = deviceContext;
-  m_device        = device;
-  m_width         = width;
-  m_height        = height;
-  m_format        = format;
-
-  result = device->CreatePixelShader(g_Pixel, sizeof(g_Pixel), NULL, &m_psCopy);
-  if (FAILED(result))
-  {
-    DeInitialize();
-    DEBUG_ERROR("Failed to create the copy pixel shader");
-    return false;
-  }
-
-  switch (format)
-  {
-    case FRAME_TYPE_YUV420:
-      result = device->CreatePixelShader(g_RGBtoYUV, sizeof(g_RGBtoYUV), NULL, &m_psConversion);
-      m_texFormats[0] = DXGI_FORMAT_R8_UNORM; m_scaleFormats[0] = 1;
-      m_texFormats[1] = DXGI_FORMAT_R8_UNORM; m_scaleFormats[1] = 2;
-      m_texFormats[2] = DXGI_FORMAT_R8_UNORM; m_scaleFormats[2] = 2;
-      break;
-
-    default:
-      DEBUG_ERROR("Unsupported format");
-      return false;
-  }
-
-  if (FAILED(result))
-  {
-    DeInitialize();
-    DEBUG_ERROR("Failed to create the pixel shader");
-    return false;
-  }
-
-  const D3D11_INPUT_ELEMENT_DESC inputDesc[] =
-  {
-    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT   , 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
-  };
-  
-  result = device->CreateInputLayout(inputDesc, _countof(inputDesc), g_Vertex, sizeof(g_Vertex), &m_layout);
-  if (FAILED(result))
-  {
-    DeInitialize();
-    DEBUG_ERROR("Failed to create the input layout");
-    return false;
-  }
-
-  result = device->CreateVertexShader(g_Vertex, sizeof(g_Vertex), NULL, &m_vertexShader);
-  if (FAILED(result))
-  {
-    DeInitialize();
-    DEBUG_ERROR("Failed to create the vertex shader");
-    return false;
-  }
-
-  ZeroMemory(&texDesc    , sizeof(texDesc    ));
-  ZeroMemory(&targetDesc , sizeof(targetDesc ));
-  ZeroMemory(&shaderDesc , sizeof(shaderDesc ));
-  ZeroMemory(&samplerDesc, sizeof(samplerDesc));
-
-  texDesc.Width            = width;
-  texDesc.Height           = height;
-  texDesc.MipLevels        = 1;
-  texDesc.ArraySize        = 1;
-  texDesc.SampleDesc.Count = 1;
-  texDesc.Usage            = D3D11_USAGE_DEFAULT;
-  texDesc.CPUAccessFlags   = 0;
-  texDesc.MiscFlags        = 0;
-  texDesc.BindFlags        = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
-
-  targetDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
-
-  shaderDesc.ViewDimension       = D3D11_SRV_DIMENSION_TEXTURE2D;
-  shaderDesc.Texture2D.MipLevels = 1;
-
-  for(int i = 0; i < _countof(m_targetTexture); ++i)
-  {
-    if (m_texFormats[i] == DXGI_FORMAT_UNKNOWN)
-      continue;
-
-    texDesc   .Format = m_texFormats[i];
-    targetDesc.Format = m_texFormats[i];
-    shaderDesc.Format = m_texFormats[i];
-
-    result = device->CreateTexture2D(&texDesc, NULL, &m_targetTexture[i]);
-    if (FAILED(result))
-    {
-      DeInitialize();
-      DEBUG_ERROR("Failed to create the render texture");
-      return false;
-    }
-
-    result = device->CreateRenderTargetView(m_targetTexture[i], &targetDesc, &m_renderView[i]);
-    if (FAILED(result))
-    {
-      DeInitialize();
-      DEBUG_ERROR("Failed to create the render view");
-      return false;
-    }
-
-    result = device->CreateShaderResourceView(m_targetTexture[i], &shaderDesc, &m_shaderView[i]);
-    if (FAILED(result))
-    {
-      DeInitialize();
-      DEBUG_ERROR("Failed to create the resource view");
-      return false;
-    }
-  }
-
-  samplerDesc.Filter         = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
-  samplerDesc.AddressU       = D3D11_TEXTURE_ADDRESS_CLAMP;
-  samplerDesc.AddressV       = D3D11_TEXTURE_ADDRESS_CLAMP;
-  samplerDesc.AddressW       = D3D11_TEXTURE_ADDRESS_CLAMP;
-  samplerDesc.MipLODBias     = 0.0f;
-  samplerDesc.MaxAnisotropy  = 1;
-  samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
-  samplerDesc.BorderColor[0] = 1.0f;
-  samplerDesc.BorderColor[1] = 1.0f;
-  samplerDesc.BorderColor[2] = 1.0f;
-  samplerDesc.MinLOD         = -FLT_MAX;
-  samplerDesc.MaxLOD         = FLT_MAX;
-
-  result = device->CreateSamplerState(&samplerDesc, &m_samplerState);
-  if (FAILED(result))
-  {
-    DeInitialize();
-    DEBUG_ERROR("Failed to create sampler state");
-    return false;
-  }
-
-  return IntializeBuffers();
-}
-
-bool TextureConverter::IntializeBuffers()
-{
-  struct VS_INPUT      * verticies;
-  unsigned long        * indicies;
-  HRESULT                result;
-  D3D11_BUFFER_DESC      vertexDesc, indexDesc;
-  D3D11_SUBRESOURCE_DATA vertexData, indexData;
-
-  m_vertexCount = 4;
-  m_indexCount  = 4;
-
-  verticies = new struct VS_INPUT[m_vertexCount];
-  if (!verticies)
-  {
-    DeInitialize();
-    DEBUG_ERROR("new failure");
-    return false;
-  }
-
-  indicies = new unsigned long[m_indexCount];
-  if (!indicies)
-  {
-    DeInitialize();
-    DEBUG_ERROR("new failure");
-    return false;
-  }
-
-  verticies[0].pos = DirectX::XMFLOAT3(-1.0f, -1.0f, 0.5f); //BL
-  verticies[1].pos = DirectX::XMFLOAT3(-1.0f,  1.0f, 0.5f); //TL
-  verticies[2].pos = DirectX::XMFLOAT3( 1.0f, -1.0f, 0.5f); //BR
-  verticies[3].pos = DirectX::XMFLOAT3( 1.0f,  1.0f, 0.5f); //TR
-  verticies[0].tex = DirectX::XMFLOAT2(0.0f, 1.0f);
-  verticies[1].tex = DirectX::XMFLOAT2(0.0f, 0.0f);
-  verticies[2].tex = DirectX::XMFLOAT2(1.0f, 1.0f);
-  verticies[3].tex = DirectX::XMFLOAT2(1.0f, 0.0f);
-  indicies[0] = 0;
-  indicies[1] = 1;
-  indicies[2] = 2;
-  indicies[3] = 3;
-
-  vertexDesc.Usage               = D3D11_USAGE_DEFAULT;
-  vertexDesc.ByteWidth           = sizeof(struct VS_INPUT) * m_vertexCount;
-  vertexDesc.BindFlags           = D3D11_BIND_VERTEX_BUFFER;
-  vertexDesc.CPUAccessFlags      = 0;
-  vertexDesc.MiscFlags           = 0;
-  vertexDesc.StructureByteStride = 0;
-
-  vertexData.pSysMem          = verticies;
-  vertexData.SysMemPitch      = 0;
-  vertexData.SysMemSlicePitch = 0;
-
-  result = m_device->CreateBuffer(&vertexDesc, &vertexData, &m_vertexBuffer);
-  if (FAILED(result))
-  {
-    delete[] indicies;
-    delete[] verticies;
-    DeInitialize();
-    DEBUG_ERROR("Failed to create vertex buffer");
-    return false;
-  }
-
-  indexDesc.Usage               = D3D11_USAGE_DEFAULT;
-  indexDesc.ByteWidth           = sizeof(unsigned long) * m_indexCount;
-  indexDesc.BindFlags           = D3D11_BIND_INDEX_BUFFER;
-  indexDesc.CPUAccessFlags      = 0;
-  indexDesc.MiscFlags           = 0;
-  indexDesc.StructureByteStride = 0;
-
-  indexData.pSysMem          = indicies;
-  indexData.SysMemPitch      = 0;
-  indexData.SysMemSlicePitch = 0;
-
-  result = m_device->CreateBuffer(&indexDesc, &indexData, &m_indexBuffer);
-  if (FAILED(result))
-  {
-    delete[] indicies;
-    delete[] verticies;
-    DeInitialize();
-    DEBUG_ERROR("Failed to create index buffer");
-    return false;
-  }
-
-  delete[] indicies;
-  delete[] verticies;
-  return true;
-}
-
-void TextureConverter::DeInitialize()
-{
-  m_samplerState  = NULL;
-  m_indexBuffer   = NULL;
-  m_indexBuffer   = NULL;
-
-  for(int i = 0; i < _countof(m_targetTexture); ++i)
-  {
-    m_shaderView   [i] = NULL;
-    m_renderView   [i] = NULL;
-    m_targetTexture[i] = NULL;
-  }
-
-  m_vertexShader = NULL;
-  m_psConversion = NULL;
-  m_layout       = NULL;
-  m_psCopy       = NULL;
-}
-
-bool TextureConverter::Convert(ID3D11Texture2DPtr texture, TextureList & output)
-{
-  unsigned int stride;
-  unsigned int offset;
-  float color[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
-
-  HRESULT                         result;
-  D3D11_TEXTURE2D_DESC            texDesc;
-  D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
-  ID3D11ShaderResourceViewPtr     textureView;
-  texture->GetDesc(&texDesc);
-  viewDesc.Format                    = texDesc.Format;
-  viewDesc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE2D;
-  viewDesc.Texture2D.MostDetailedMip = 0;
-  viewDesc.Texture2D.MipLevels       = 1;
-
-  result = m_device->CreateShaderResourceView(texture, &viewDesc, &textureView);
-  if (FAILED(result))
-  {
-    DeInitialize();
-    DEBUG_ERROR("Failed to create shader resource view");
-    return false;
-  }
-  
-  ID3D11Buffer             *buffers      [] = { m_vertexBuffer.GetInterfacePtr() };
-  ID3D11SamplerState       *samplerStates[] = { m_samplerState.GetInterfacePtr() };
-  ID3D11ShaderResourceView *shaderViews  [] = { textureView   .GetInterfacePtr() };
-  D3D11_VIEWPORT            viewPorts    [] = { {
-    0.0f          , 0.0f,
-    (float)m_width, (float)m_height,
-    0.0f          , 1.0f
-  } };
-
-  int targetCount = 0;
-  ID3D11RenderTargetView **renderViews = new ID3D11RenderTargetView*[_countof(m_renderView)];
-  for(int i = 0; i < _countof(m_renderView); ++i)
-  {
-    if (m_texFormats[i] == DXGI_FORMAT_UNKNOWN)
-      continue;
-
-    m_deviceContext->ClearRenderTargetView(m_renderView[i], color);
-    renderViews[i] = m_renderView[i].GetInterfacePtr();
-    ++targetCount;
-  }
-
-  m_deviceContext->PSSetShaderResources(0, _countof(shaderViews), shaderViews);
-  m_deviceContext->OMSetRenderTargets(targetCount, renderViews, NULL);
-  delete [] renderViews;
-
-  stride = sizeof(VS_INPUT);
-  offset = 0;
-
-  m_deviceContext->RSSetViewports        (_countof(viewPorts), viewPorts);
-  m_deviceContext->IASetInputLayout      (m_layout);
-  m_deviceContext->IASetVertexBuffers    (0, _countof(buffers), buffers, &stride, &offset);
-  m_deviceContext->IASetIndexBuffer      (m_indexBuffer, DXGI_FORMAT_R32_UINT, 0);
-  m_deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
-  m_deviceContext->VSSetShader           (m_vertexShader, NULL, 0);
-
-  m_deviceContext->PSSetSamplers         (0, _countof(samplerStates), samplerStates);
-  m_deviceContext->PSSetShader           (m_psConversion, NULL, 0);
-
-  m_deviceContext->DrawIndexed(m_indexCount, 0, 0);
-  textureView = NULL;
-
-  D3D11_RENDER_TARGET_VIEW_DESC targetDesc;
-  ZeroMemory(&targetDesc, sizeof(targetDesc));
-  targetDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
-  m_deviceContext->PSSetShader(m_psCopy, NULL, 0);
-
-  renderViews = new ID3D11RenderTargetView*[1];
-  for (int i = 0; i < _countof(m_renderView); ++i)
-  {
-    if (m_texFormats[i] == DXGI_FORMAT_UNKNOWN)
-      continue;
-
-    ID3D11Texture2DPtr            src = m_targetTexture[i];
-    ID3D11Texture2DPtr            dest;
-    ID3D11RenderTargetViewPtr     view;
-    D3D11_TEXTURE2D_DESC          srcDesc;
-
-    // if there is no scaling
-    if (m_scaleFormats[i] == 1)
-    {
-      output.push_back(src);
-      continue;
-    }
-
-    src->GetDesc(&srcDesc);
-    viewPorts[0].Width  = srcDesc.Width  / m_scaleFormats[i];
-    viewPorts[0].Height = srcDesc.Height / m_scaleFormats[i];
-    srcDesc.Width       = (UINT)viewPorts[0].Width;
-    srcDesc.Height      = (UINT)viewPorts[0].Height;
-
-    result = m_device->CreateTexture2D(&srcDesc, NULL, &dest);
-    if (FAILED(result))
-    {
-      delete[] renderViews;
-      DeInitialize();
-      DEBUG_ERROR("Failed to create the target texture");
-      return false;
-    }
-
-    targetDesc.Format = srcDesc.Format;
-    result = m_device->CreateRenderTargetView(dest, &targetDesc, &view);
-    if (FAILED(result))
-    {
-      delete[] renderViews;
-      DeInitialize();
-      DEBUG_ERROR("Failed to create the target view");
-      return false;
-    }
-
-    renderViews[0] = view.GetInterfacePtr();
-    shaderViews[0] = m_shaderView[i].GetInterfacePtr();
-
-    m_deviceContext->OMSetRenderTargets(1, renderViews, NULL);
-    m_deviceContext->RSSetViewports(_countof(viewPorts), viewPorts);
-    m_deviceContext->PSSetShaderResources(0, 1, shaderViews);
-    m_deviceContext->DrawIndexed(m_indexCount, 0, 0);
-
-    output.push_back(dest);
-    view = NULL;
-  }
-
-  delete[] renderViews;
-  return true;
-}
diff --git a/host/TextureConverter.h b/host/TextureConverter.h
deleted file mode 100644
index b618c152..00000000
--- a/host/TextureConverter.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#include "Com.h"
-#include "common\KVMFR.h"
-
-#include <DirectXMath.h>
-#include <vector>
-
-typedef std::vector<ID3D11Texture2DPtr> TextureList;
-
-class TextureConverter
-{
-public:
-  TextureConverter();
-  ~TextureConverter();
-
-  bool Initialize(
-    ID3D11DeviceContextPtr deviceContext,
-    ID3D11DevicePtr        device,
-    const unsigned int     width,
-    const unsigned int     height,
-    FrameType              format
-  );
-
-  void DeInitialize();
-
-  bool Convert(ID3D11Texture2DPtr texture, TextureList & output);
-
-private:
-  struct VS_INPUT
-  {
-    DirectX::XMFLOAT3 pos;
-    DirectX::XMFLOAT2 tex;
-  };
-
-  bool IntializeBuffers();
-
-  ID3D11DeviceContextPtr m_deviceContext;
-  ID3D11DevicePtr        m_device;
-  unsigned int           m_width, m_height;
-  FrameType              m_format;
-
-  DXGI_FORMAT                 m_texFormats   [3];
-  unsigned int                m_scaleFormats [3];
-
-  ID3D11Texture2DPtr          m_targetTexture[3];
-  ID3D11RenderTargetViewPtr   m_renderView   [3];
-  ID3D11ShaderResourceViewPtr m_shaderView   [3];
-
-  ID3D11InputLayoutPtr        m_layout;
-  ID3D11VertexShaderPtr       m_vertexShader;
-  ID3D11PixelShaderPtr        m_psCopy;
-  ID3D11PixelShaderPtr        m_psConversion;
-  ID3D11SamplerStatePtr       m_samplerState;
-
-  ID3D11BufferPtr             m_vertexBuffer;
-  unsigned int                m_vertexCount;
-  ID3D11BufferPtr             m_indexBuffer;
-  unsigned int                m_indexCount;
-};
-
diff --git a/host/TraceUtil.cpp b/host/TraceUtil.cpp
deleted file mode 100644
index 5c854bf8..00000000
--- a/host/TraceUtil.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "TraceUtil.h"
-
-double        TraceUtil::m_freq;
-LARGE_INTEGER TraceUtil::m_last;
-LARGE_INTEGER TraceUtil::m_start;
-const char *  TraceUtil::m_traceName;
\ No newline at end of file
diff --git a/host/TraceUtil.h b/host/TraceUtil.h
deleted file mode 100644
index 7e599edf..00000000
--- a/host/TraceUtil.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#include <windows.h>
-#include <stdint.h>
-#include "common/debug.h"
-
-#ifdef ENABLE_TRACING
-  #define TRACE          TraceUtil::Trace(__FUNCTION__, __LINE__)
-  #define TRACE_START(x) TraceUtil::TraceStart(x)
-  #define TRACE_END      TraceUtil::TraceEnd()
-#else
-  #define TRACE
-  #define TRACE_START(x)
-  #define TRACE_END
-#endif
-
-class TraceUtil
-{
-private:
-  static double m_freq;
-  static LARGE_INTEGER m_last;
-  static LARGE_INTEGER m_start;
-  static const char * m_traceName;
-
-public:
-  static void Initialize()
-  {
-#ifdef ENABLE_TRACING
-    LARGE_INTEGER now;
-    QueryPerformanceFrequency(&now);
-    m_freq = (double)now.QuadPart / 1000.0;
-    QueryPerformanceCounter(&m_last);
-#endif
-  }
-
-  static inline void Trace(const char * function, const unsigned int line)
-  {    
-    LARGE_INTEGER now;
-    QueryPerformanceCounter(&now);
-    const double diff = (now.QuadPart - m_last.QuadPart) / m_freq;
-    m_last = now;
-
-    DEBUG_INFO("Trace [%8.4f] %s:%u", diff, function, line);
-  }
-
-  static inline void TraceStart(const char * traceName)
-  {
-    QueryPerformanceCounter(&m_start);
-    m_traceName = traceName;
-  }
-
-  static inline void TraceEnd()
-  {
-    LARGE_INTEGER now;
-    QueryPerformanceCounter(&now);
-    const double diff = (now.QuadPart - m_start.QuadPart) / m_freq;
-
-    DEBUG_INFO("Trace [%8.4f] %s", diff, m_traceName);
-  }
-};
\ No newline at end of file
diff --git a/host/Util.h b/host/Util.h
deleted file mode 100644
index d4d70ba4..00000000
--- a/host/Util.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-#include <string>
-#include <assert.h>
-#include <inttypes.h>
-#include <tmmintrin.h>
-
-#include "common/debug.h"
-
-#if !defined(min)
-#define LG_MIN(a, b) ((a) < (b) ? (a) : (b))
-#else
-#define LG_MIN min
-#endif
-
-#if __MINGW32__
-#define INTERLOCKED_AND8 __sync_and_and_fetch
-#define INTERLOCKED_OR8 __sync_or_and_fetch
-#else
-#define INTERLOCKED_OR8 InterlockedOr8
-#define INTERLOCKED_AND8 InterlockedAnd8
-#endif
-
-class Util
-{
-public:
-  static void DebugWinError(const char * file, const unsigned int line, const char * function, const char * desc, HRESULT status)
-  {
-    char *buffer;
-    FormatMessageA(
-      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
-      NULL,
-      status,
-      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-      (char*)&buffer,
-      1024,
-      NULL
-    );
-
-    for(size_t i = strlen(buffer) - 1; i > 0; --i)
-      if (buffer[i] == '\n' || buffer[i] == '\r')
-        buffer[i] = 0;
-
-    fprintf(stderr, "[E] %20s:%-4u | %-30s | %s: 0x%08x (%s)\n", file, line, function, desc, (int)status, buffer);
-    LocalFree(buffer);
-  }
-
-  static std::string GetSystemRoot()
-  {
-    std::string defaultPath;
-
-#if __MINGW32__
-    const char  * libPath    = getenv("SystemRoot");
-    const size_t  libPathLen = strlen(libPath);
-#else
-    char  * libPath;
-    size_t  libPathLen;
-    _dupenv_s(&libPath, &libPathLen, "SystemRoot");
-#endif
-
-    if (!libPath)
-    {
-      DEBUG_ERROR("Unable to get the SystemRoot environment variable");
-      return defaultPath;
-    }
-
-    if (!libPathLen)
-    {
-      DEBUG_ERROR("The SystemRoot environment variable is not set");
-#ifndef __MINGW32__
-      free(libPath);
-#endif
-      return defaultPath;
-    }
-#ifdef _WIN64
-    defaultPath = std::string(libPath) + "\\System32";
-#else
-    if (IsWow64())
-    {
-      defaultPath = std::string(libPath) + "\\Syswow64";
-    }
-    else
-    {
-      defaultPath = std::string(libPath) + "\\System32";
-    }
-#endif
-#ifndef __MINGW32__
-    free(libPath);
-#endif
-    return defaultPath;
-  }
-
-  static inline void BGRAtoRGB(uint8_t * orig, size_t imagesize, uint8_t * dest)
-  {
-    assert((uintptr_t)orig % 16 == 0);
-    assert((uintptr_t)dest % 16 == 0);
-    assert(imagesize % 16 == 0);
-
-    __m128i mask_right = _mm_set_epi8
-    (
-        12,   13,   14,    8,
-         9,   10,    4,    5, 
-         6,    0,    1,    2,
-      -128, -128, -128, -128
-    );
-
-    __m128i mask_left = _mm_set_epi8
-    (
-      -128, -128, -128, -128,
-        12,   13,   14,    8,
-         9,   10,    4,    5, 
-         6,    0,    1,    2
-    );
-
-
-    uint8_t *end = orig + imagesize * 4;
-    for (; orig != end; orig += 64, dest += 48)
-    {
-      _mm_prefetch((char *)(orig + 128), _MM_HINT_NTA);
-      _mm_prefetch((char *)(orig + 192), _MM_HINT_NTA);
-
-      __m128i v0 = _mm_shuffle_epi8(_mm_load_si128((__m128i *)&orig[0 ]), mask_right);
-      __m128i v1 = _mm_shuffle_epi8(_mm_load_si128((__m128i *)&orig[16]), mask_left );
-      __m128i v2 = _mm_shuffle_epi8(_mm_load_si128((__m128i *)&orig[32]), mask_left );
-      __m128i v3 = _mm_shuffle_epi8(_mm_load_si128((__m128i *)&orig[48]), mask_left );
-
-      v0 = _mm_alignr_epi8(v1, v0, 4);
-      v1 = _mm_alignr_epi8(v2, _mm_slli_si128(v1, 4),  8);
-      v2 = _mm_alignr_epi8(v3, _mm_slli_si128(v2, 4), 12);
-      
-      _mm_stream_si128((__m128i *)&dest[0 ], v0);
-      _mm_stream_si128((__m128i *)&dest[16], v1);
-      _mm_stream_si128((__m128i *)&dest[32], v2);
-    }
-  }
-};
\ No newline at end of file
diff --git a/host/WinDebug.h b/host/WinDebug.h
deleted file mode 100644
index 573fb9c9..00000000
--- a/host/WinDebug.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#pragma once
-
-#include "Util.h"
-
-#define DEBUG_WINERROR(x, y) Util::DebugWinError(STRIPPATH(__FILE__), __LINE__, __FUNCTION__, x, y)
\ No newline at end of file
diff --git a/host/looking-glass-host.vcxproj b/host/looking-glass-host.vcxproj
deleted file mode 100644
index 1b869dcf..00000000
--- a/host/looking-glass-host.vcxproj
+++ /dev/null
@@ -1,418 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug - NvFBC|Win32">
-      <Configuration>Debug - NvFBC</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug - NvFBC|x64">
-      <Configuration>Debug - NvFBC</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release - NvFBC|Win32">
-      <Configuration>Release - NvFBC</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release - NvFBC|x64">
-      <Configuration>Release - NvFBC</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{D439DE3E-32FB-4599-8B5D-C92674D400D4}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>kvmivshmemhost</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
-    <ProjectName>looking-glass-host</ProjectName>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'" Label="Configuration">
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'" Label="Configuration">
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-    <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <LinkIncremental>false</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">
-    <LinkIncremental>false</LinkIncremental>
-    <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\Program Files %28x86%29\NVIDIA Corporation\NVIDIA Capture SDK\inc</IncludePath>
-    <ExecutablePath>C:\Program Files (x86)\Windows Kits\10\bin\$(TargetPlatformVersion)\$(PreferredToolArchitecture);$(ExecutablePath)</ExecutablePath>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>ENABLE_TRACING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>ENABLE_TRACING;CONFIG_CAPTURE_NVFBC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>ENABLE_TRACING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>ENABLE_TRACING;CONFIG_CAPTURE_NVFBC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>CONFIG_CAPTURE_NVFBC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>CONFIG_CAPTURE_NVFBC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-      <AdditionalIncludeDirectories>..\vendor;..\common\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>kernel32.lib;shlwapi.lib;dxgi.lib;d3d11.lib;setupapi.lib;uuid.lib;wmcodecdspuuid.lib;mfplat.lib;mfuuid.lib;evr.lib;avrt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-    </Link>
-    <Manifest>
-      <EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
-    </Manifest>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="..\vendor\getopt\getopt.c" />
-    <ClCompile Include="Capture\DXGI.cpp" />
-    <ClCompile Include="Capture\NvFBC.cpp" />
-    <ClCompile Include="CrashHandler.cpp" />
-    <ClCompile Include="ivshmem.cpp" />
-    <ClCompile Include="main.cpp" />
-    <ClCompile Include="MFT\H264.cpp" />
-    <ClCompile Include="TextureConverter.cpp" />
-    <ClCompile Include="Service.cpp" />
-    <ClCompile Include="TraceUtil.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="CaptureFactory.h" />
-    <ClInclude Include="Capture\DXGI.h" />
-    <ClInclude Include="Capture\NvFBC.h" />
-    <ClInclude Include="Com.h" />
-    <ClInclude Include="CrashHandler.h" />
-    <ClInclude Include="ICapture.h" />
-    <ClInclude Include="ivshmem.h" />
-    <ClInclude Include="MFT\H264.h" />
-    <ClInclude Include="TextureConverter.h" />
-    <ClInclude Include="Service.h" />
-    <ClInclude Include="TraceUtil.h" />
-    <ClInclude Include="Util.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <MASM Include="..\common\src\memcpySSE.asm" />
-  </ItemGroup>
-  <ItemGroup>
-    <FxCompile Include="Shaders\Pixel.hlsl">
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">g_Pixel</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Shaders\Pixel.h</HeaderFileOutput>
-      <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4.0_level_9_1</ShaderModel>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">Pixel</ShaderType>
-      <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">4.0_level_9_1</ShaderModel>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">Pixel</ShaderType>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Pixel</ShaderType>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">g_Pixel</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">Shaders\Pixel.h</HeaderFileOutput>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">g_Pixel</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">Shaders\Pixel.h</HeaderFileOutput>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">g_Pixel</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Shaders\Pixel.h</HeaderFileOutput>
-    </FxCompile>
-    <FxCompile Include="Shaders\RGBtoYUV.hlsl">
-      <FileType>HLSL</FileType>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">g_RGBtoYUV</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Shaders\RGBtoYUV.h</HeaderFileOutput>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">Pixel</ShaderType>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">Pixel</ShaderType>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Pixel</ShaderType>
-      <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4.0_level_9_1</ShaderModel>
-      <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">4.0_level_9_1</ShaderModel>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">g_RGBtoYUV</VariableName>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">g_RGBtoYUV</VariableName>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">g_RGBtoYUV</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">Shaders\RGBtoYUV.h</HeaderFileOutput>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">Shaders\RGBtoYUV.h</HeaderFileOutput>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Shaders\RGBtoYUV.h</HeaderFileOutput>
-    </FxCompile>
-    <FxCompile Include="Shaders\Vertex.hlsl">
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Vertex</ShaderType>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">g_Vertex</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Shaders\Vertex.h</HeaderFileOutput>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">g_Vertex</VariableName>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">g_Vertex</VariableName>
-      <VariableName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">g_Vertex</VariableName>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">Shaders\Vertex.h</HeaderFileOutput>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">Shaders\Vertex.h</HeaderFileOutput>
-      <HeaderFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Shaders\Vertex.h</HeaderFileOutput>
-      <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4.0_level_9_1</ShaderModel>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">Vertex</ShaderType>
-      <ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">4.0_level_9_1</ShaderModel>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">Vertex</ShaderType>
-      <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Vertex</ShaderType>
-    </FxCompile>
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-    <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/host/looking-glass-host.vcxproj.filters b/host/looking-glass-host.vcxproj.filters
deleted file mode 100644
index 9bee91ce..00000000
--- a/host/looking-glass-host.vcxproj.filters
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-    <Filter Include="Header Files\Capture">
-      <UniqueIdentifier>{3a65593b-37a9-448d-acf0-6339dea46ed1}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Source Files\Capture">
-      <UniqueIdentifier>{0a865d22-907e-44ea-a230-ad7ede7edeb0}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Source Files\MFT">
-      <UniqueIdentifier>{bd9c6e76-f398-49eb-acfb-3f50cd99724c}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\MFT">
-      <UniqueIdentifier>{fead4000-1954-4480-8ee7-b817d7042761}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Source Files\Shaders">
-      <UniqueIdentifier>{afb06b60-4959-4447-92ec-75cc07995a8f}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="ivshmem.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="main.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Service.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Capture\NvFBC.cpp">
-      <Filter>Source Files\Capture</Filter>
-    </ClCompile>
-    <ClCompile Include="Capture\DXGI.cpp">
-      <Filter>Source Files\Capture</Filter>
-    </ClCompile>
-    <ClCompile Include="..\vendor\getopt\getopt.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrashHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="TraceUtil.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="MFT\H264.cpp">
-      <Filter>Source Files\MFT</Filter>
-    </ClCompile>
-    <ClCompile Include="TextureConverter.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="ivshmem.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ICapture.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Service.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CaptureFactory.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Capture\NvFBC.h">
-      <Filter>Header Files\Capture</Filter>
-    </ClInclude>
-    <ClInclude Include="Util.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Capture\DXGI.h">
-      <Filter>Header Files\Capture</Filter>
-    </ClInclude>
-    <ClInclude Include="CrashHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TraceUtil.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="MFT\H264.h">
-      <Filter>Header Files\MFT</Filter>
-    </ClInclude>
-    <ClInclude Include="Com.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TextureConverter.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <FxCompile Include="Shaders\Vertex.hlsl">
-      <Filter>Source Files\Shaders</Filter>
-    </FxCompile>
-    <FxCompile Include="Shaders\RGBtoYUV.hlsl">
-      <Filter>Source Files\Shaders</Filter>
-    </FxCompile>
-    <FxCompile Include="Shaders\Pixel.hlsl">
-      <Filter>Source Files\Shaders</Filter>
-    </FxCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <MASM Include="..\common\src\memcpySSE.asm">
-      <Filter>Source Files</Filter>
-    </MASM>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/host/main.cpp b/host/main.cpp
deleted file mode 100644
index 3e82c837..00000000
--- a/host/main.cpp
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
-Looking Glass - KVM FrameRelay (KVMFR) Client
-Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
-https://looking-glass.hostfission.com
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include <windows.h>
-#include <shlwapi.h>
-#include <avrt.h>
-
-#include "common/debug.h"
-#include "getopt/getopt.h"
-
-#include "CrashHandler.h"
-#include "TraceUtil.h"
-#include "CaptureFactory.h"
-#include "Service.h"
-
-#include <io.h>
-#include <fcntl.h> 
-#include <iostream>
-
-int parseArgs(struct StartupArgs & args);
-static DWORD WINAPI CaptureThread(LPVOID lpParameter);
-int run();
-
-void doHelp();
-void doLicense();
-
-bool running = true;
-bool consoleActive = false;
-void setupConsole();
-
-extern "C" NTSYSAPI NTSTATUS NTAPI NtSetTimerResolution(ULONG DesiredResolution, BOOLEAN SetResolution, PULONG CurrentResolution);
-
-struct StartupArgs
-{
-  bool foreground;
-  const char * captureDevice;
-  CaptureOptions captureOptions;
-};
-struct StartupArgs args;
-
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow)
-{
-  CrashHandler::Initialize();
-  TraceUtil::Initialize();
-  CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
-
-  args.foreground = false;
-  args.captureDevice = NULL;
-  int ret = parseArgs(args);
-  if (ret != 0)
-    fprintf(stderr, "Failed to parse command line arguments\n");
-  else
-  {
-    if (args.foreground)
-      setupConsole();
-
-    Service::InstallHook();
-    HANDLE captureThread = CreateThread(NULL, 0, CaptureThread, NULL, 0, NULL);
-    while (running)
-    {
-      MSG msg;
-      BOOL bRet = GetMessage(&msg, NULL, 0, 0);
-      if (bRet == -1 || bRet == 0)
-      {
-        ret = msg.wParam;
-        break;
-      }
-      DispatchMessage(&msg);
-    }
-    Service::RemoveHook();
-    running = false;
-    ret = WaitForSingleObject(captureThread, INFINITE);
-    CloseHandle(captureThread);
-  }
-
-  if (ret != 0)
-  {
-    if (!args.foreground)
-    {
-      setupConsole();
-      fprintf(stderr, "An error occurred, re-run in forground mode (-f) for more information\n");
-    }
-  }
-
-  if (consoleActive)
-  {
-    fprintf(stderr, "\nPress enter to terminate...");
-    fflush(stderr);
-    getc(stdin);
-  }
-
-  return ret;
-}
-
-static DWORD WINAPI CaptureThread(LPVOID lpParameter)
-{
-  int ret = 0;
-  while (running)
-  {
-    ret = run();
-    if (ret != 0)
-      break;
-  }
-  running = false;
-  return ret;
-}
-
-int run()
-{
-  /* increase the system timer resolution */
-  ULONG currentRes;
-  NtSetTimerResolution(0, TRUE, &currentRes);
-
-  /* boost our thread priority class as high as possible */
-  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
-
-  /* use MMCSS to boost our priority for capture */
-  DWORD taskIndex = 0;
-  HANDLE task = AvSetMmThreadCharacteristics(L"Capture", &taskIndex);
-  if (!task || (AvSetMmThreadPriority(task, AVRT_PRIORITY_CRITICAL) == FALSE))
-    DEBUG_WARN("Failed to boosted priority using MMCSS");
-
-  ICapture * captureDevice;
-  if (args.captureDevice == NULL)
-    captureDevice = CaptureFactory::DetectDevice(&args.captureOptions);
-  else
-  {
-    captureDevice = CaptureFactory::GetDevice(args.captureDevice, &args.captureOptions);
-    if (!captureDevice)
-    {
-      setupConsole();
-      fprintf(stderr, "Failed to configure requested capture device\n");
-      return -1;
-    }
-  }
-
-  if (!captureDevice)
-  {
-    setupConsole(); 
-    fprintf(stderr, "Unable to configure a capture device\n");
-    return -1;
-  }
-
-  Service &svc = Service::Instance();
-  if (!svc.Initialize(captureDevice))
-    return -1;
-
-  int retry = 0;
-  bool running = true;
-  while (running)
-  {
-    switch (svc.Process())
-    {
-      case PROCESS_STATUS_OK:
-        retry = 0;
-        break;
-
-      case PROCESS_STATUS_RETRY:
-        if (retry++ == 3)
-        {
-          fprintf(stderr, "Too many consecutive retries, aborting");
-          running = false;
-        }
-        break;
-
-      case PROCESS_STATUS_ERROR:
-        fprintf(stderr, "Capture process returned error");
-        running = false;
-    }
-  }
-
-  svc.DeInitialize();
-
-  if (task)
-    AvRevertMmThreadCharacteristics(task);
-
-  return 0;
-}
-
-int parseArgs(struct StartupArgs & args)
-{
-  int c;
-  while((c = getopt(__argc, __argv, "hc:o:fld:")) != -1)
-  {
-    switch (c)
-    {
-    case '?':
-    case 'h':
-      doHelp();
-      return -1;
-
-    case 'c':
-    {
-      const CaptureFactory::DeviceList deviceList = CaptureFactory::GetDevices();
-
-      bool found = false;
-      if (strcmp(optarg, "?") != 0)
-      {
-        for (CaptureFactory::DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it)
-        {
-          if (_strcmpi(optarg, (*it)->GetName()) == 0)
-          {
-            args.captureDevice = (*it)->GetName();
-            found = true;
-            break;
-          }
-        }
-
-        if (!found)
-        {
-          setupConsole();
-          fprintf(stderr, "Invalid capture device: %s\n\n", optarg);          
-        }
-      }
-
-      if (!found)
-      {
-        setupConsole();
-        fprintf(stderr, "Available Capture Devices:\n\n");
-        for (CaptureFactory::DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it)
-          fprintf(stderr, "  %s\n", (*it)->GetName());
-        return -1;
-      }
-      break;
-    }
-
-    case 'o':
-    {
-      args.captureOptions.push_back(optarg);
-      break;
-    }
-
-    case 'f':
-      args.foreground = true;
-      break;
-
-    case 'l':
-      doLicense();
-      return -1;
-
-    case 'd':
-      if (optarg == NULL || strlen(optarg) == 0)
-      {
-        setupConsole();
-        fprintf(stderr, "Device ID missing\n");
-        return -1;
-      }
-      else if (*optarg == '?')
-      {
-        setupConsole();
-        IVSHMEM::listDevices();
-        return -1;
-      }
-      else
-      {
-        PCI_DEVICE dev;
-        int cnt = sscanf_s(optarg, "%hhu,%hhu,%hhu", &dev.bus, &dev.addr, &dev.func);
-        if (cnt == 3)
-        {
-          Service::SetDevice(dev);
-        }
-        else
-        {
-          setupConsole();
-          fprintf(stderr, "Invalid Parameter\n");
-          return -1;
-        }
-      }
-      break;
-    }
-  }
-
-  return 0;
-}
-
-void doHelp()
-{
-  setupConsole();
-  const char *app = PathFindFileNameA(__argv[0]);
-  fprintf(stderr,
-    "Usage: %s [OPTION]...\n"
-    "Example: %s -c ?\n"
-    "\n"
-    "  -h  Print out this help\n"
-    "  -c  Specify the capture device to use or ? to list availble (device is probed if not specified)\n"
-    "  -o  Option to pass to the capture device, may be specified multiple times for extra options\n"
-    "  -f  Foreground mode\n"
-    "  -l  License information\n"
-    "  -d  Specify the IVSHMEM device with \"<bus>,<slot>,<function>\" or ? to list available\n",
-    app,
-    app
-  );
-}
-
-void doLicense()
-{
-  setupConsole();
-  fprintf(stderr,
-    "Looking Glass - KVM FrameRelay (KVMFR) Client\n"
-    "Copyright(C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>\n"
-    "\n"
-    "This program is free software; you can redistribute it and / or modify it under\n"
-    "the terms of the GNU General Public License as published by the Free Software\n"
-    "Foundation; either version 2 of the License, or (at your option) any later\n"
-    "version.\n"
-    "\n"
-    "This program is distributed in the hope that it will be useful, but WITHOUT ANY\n"
-    "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n"
-    "PARTICULAR PURPOSE.See the GNU General Public License for more details.\n"
-    "\n"
-    "You should have received a copy of the GNU General Public License along with\n"
-    "this program; if not, write to the Free Software Foundation, Inc., 59 Temple\n"
-    "Place, Suite 330, Boston, MA 02111 - 1307 USA\n"
-  );
-}
-
-void setupConsole()
-{
-  if (consoleActive)
-    return;
-
-  HANDLE _handle;
-  int    _conout;
-  FILE * fp;
-
-  AllocConsole();
-
-  CONSOLE_SCREEN_BUFFER_INFO conInfo;
-  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &conInfo);
-  conInfo.dwSize.Y = 500;
-  SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), conInfo.dwSize);
-
-  _handle = GetStdHandle(STD_INPUT_HANDLE);
-  _conout = _open_osfhandle((intptr_t)_handle, _O_TEXT);
-  fp = _fdopen(_conout, "r");
-  freopen_s(&fp, "CONIN$", "r", stdin);
-
-  _handle = GetStdHandle(STD_OUTPUT_HANDLE);
-  _conout = _open_osfhandle((intptr_t)_handle, _O_TEXT);
-  fp = _fdopen(_conout, "w");
-  freopen_s(&fp, "CONOUT$", "w", stdout);
-
-  _handle = GetStdHandle(STD_ERROR_HANDLE);
-  _conout = _open_osfhandle((intptr_t)_handle, _O_TEXT);
-  fp = _fdopen(_conout, "w");
-  freopen_s(&fp, "CONOUT$", "w", stderr);
-
-  std::ios::sync_with_stdio();
-  std::wcout.clear();
-  std::cout.clear();
-  std::wcerr.clear();
-  std::cerr.clear();
-  std::wcin.clear();
-  std::cin.clear();
-
-  consoleActive = true;
-}
\ No newline at end of file
diff --git a/host/sync-test/main.c b/host/sync-test/main.c
deleted file mode 100644
index 37bdd664..00000000
--- a/host/sync-test/main.c
+++ /dev/null
@@ -1,109 +0,0 @@
-#include <stdbool.h>
-#include <SDL.h>
-#include <SDL_ttf.h>
-#include <stdio.h>
-
-int main(int argc, char * argv[])
-{
-  SDL_Window    * window;
-  SDL_Renderer  * renderer;
-
-  TTF_Init();
-  SDL_Init(SDL_INIT_VIDEO);
-  window   = SDL_CreateWindow("sync-test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 1040, SDL_WINDOW_RESIZABLE);
-  renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
-
-  SDL_Event       event;
-  bool            running     = true;
-  unsigned int    frameCount  = 0;
-  Uint32          fpsFrame    = 0;
-  Uint32          fpsStart    = SDL_GetTicks();  
-  float           fps         = 0.0f;
-  TTF_Font      * fpsFont     = NULL;
-  SDL_Rect        fpsTextRect = {5, 5};
-  SDL_Texture   * fpsText     = NULL;
-
-  int width = 1000;
-  int boxX  = 100;
-  int boxY  = 100;
-
-  fpsFont = TTF_OpenFont("C:\\Windows\\Fonts\\cour.ttf", 24);
-
-  while (running)
-  {
-    while (SDL_PollEvent(&event))
-      switch(event.type)
-      {
-        case SDL_QUIT:
-          running = false;
-          break;
-
-        case SDL_KEYUP:
-          switch(event.key.keysym.scancode)
-          {
-            case SDL_SCANCODE_ESCAPE:
-              running = false;
-              break;
-
-            case SDL_SCANCODE_F11:
-              SDL_SetWindowFullscreen(window, (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN_DESKTOP) ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP);
-              break;
-          }
-
-        case SDL_WINDOWEVENT:
-          switch (event.window.event)
-          {
-            case SDL_WINDOWEVENT_RESIZED:
-              width = event.window.data1;
-              boxX  = event.window.data1 / 10;
-              boxY  = (event.window.data2 - 40) / 10;
-              break;
-          }
-      }
-
-    SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE);
-    SDL_RenderClear(renderer);    
-
-    SDL_SetRenderDrawColor(renderer, 0xff, 0xff, 0xff, SDL_ALPHA_OPAQUE);
-    for (int y = 0; y < 10; ++y)
-      for (int x = 0; x < 10; ++x)
-      {
-        const SDL_Rect rect = { x * boxX, y * boxY + 40, boxX, boxY};
-        if (y * 10 + x == frameCount % 100)
-          SDL_RenderFillRect(renderer, &rect);
-         else
-          SDL_RenderDrawRect(renderer, &rect);
-      }
-
-    if (SDL_GetTicks() - fpsStart > 1000)
-    {
-      const float delta         = (float)(SDL_GetTicks() - fpsStart) / 1000.0f;
-      const unsigned int frames = frameCount - fpsFrame;
-      fps = (float)frames / delta;
-
-      fpsStart = SDL_GetTicks();
-      fpsFrame = frameCount;
-    }
-
-    const SDL_Color c = {0x00, 0xff, 0x00, 0xff};
-    char text[128];
-    snprintf(text, sizeof(text), "FPS: %7.4f, Frame: %05u    \"F11\" to toggle Full Screen", fps, frameCount);
-    SDL_Surface * fpsSurf = TTF_RenderText_Solid(fpsFont, text, c);
-    if (fpsText)
-      SDL_DestroyTexture(fpsText);
-    fpsText = SDL_CreateTextureFromSurface(renderer, fpsSurf);
-    fpsTextRect.x = width / 2 - fpsSurf->w / 2;
-    fpsTextRect.y = 20 - fpsSurf->h / 2;
-    fpsTextRect.w = fpsSurf->w;
-    fpsTextRect.h = fpsSurf->h;
-    SDL_FreeSurface(fpsSurf);
-    SDL_RenderCopy(renderer, fpsText, NULL, &fpsTextRect);
-
-    SDL_RenderPresent(renderer);
-    ++frameCount;
-  }
-
-  SDL_DestroyRenderer(renderer);
-  SDL_DestroyWindow(window);
-  return 0;
-}
\ No newline at end of file
diff --git a/host/sync-test/packages.config b/host/sync-test/packages.config
deleted file mode 100644
index 575808e5..00000000
--- a/host/sync-test/packages.config
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="freetype.redist" version="2.6.2.1" targetFramework="native" />
-  <package id="sdl2.v140" version="2.0.4" targetFramework="native" />
-  <package id="sdl2.v140.redist" version="2.0.4" targetFramework="native" />
-  <package id="sdl2_ttf.v140" version="2.0.14" targetFramework="native" />
-  <package id="sdl2_ttf.v140.redist" version="2.0.14" targetFramework="native" />
-</packages>
\ No newline at end of file
diff --git a/host/sync-test/sync-test.vcxproj b/host/sync-test/sync-test.vcxproj
deleted file mode 100644
index 916c40da..00000000
--- a/host/sync-test/sync-test.vcxproj
+++ /dev/null
@@ -1,302 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug - NvFBC|Win32">
-      <Configuration>Debug - NvFBC</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug - NvFBC|x64">
-      <Configuration>Debug - NvFBC</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release - NvFBC|Win32">
-      <Configuration>Release - NvFBC</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release - NvFBC|x64">
-      <Configuration>Release - NvFBC</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{6CC4DA30-6FBD-4ACA-9BA6-2DE731032800}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>synctest</RootNamespace>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug - NvFBC|x64'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release - NvFBC|x64'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <SDLCheck>true</SDLCheck>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="main.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="packages.config" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-    <Import Project="..\packages\freetype.redist.2.6.2.1\build\native\freetype.redist.targets" Condition="Exists('..\packages\freetype.redist.2.6.2.1\build\native\freetype.redist.targets')" />
-    <Import Project="..\packages\sdl2.v140.redist.2.0.4\build\native\sdl2.v140.redist.targets" Condition="Exists('..\packages\sdl2.v140.redist.2.0.4\build\native\sdl2.v140.redist.targets')" />
-    <Import Project="..\packages\sdl2_ttf.v140.redist.2.0.14\build\native\sdl2_ttf.v140.redist.targets" Condition="Exists('..\packages\sdl2_ttf.v140.redist.2.0.14\build\native\sdl2_ttf.v140.redist.targets')" />
-    <Import Project="..\packages\sdl2_ttf.v140.2.0.14\build\native\sdl2_ttf.v140.targets" Condition="Exists('..\packages\sdl2_ttf.v140.2.0.14\build\native\sdl2_ttf.v140.targets')" />
-    <Import Project="..\packages\sdl2.v140.2.0.4\build\native\sdl2.v140.targets" Condition="Exists('..\packages\sdl2.v140.2.0.4\build\native\sdl2.v140.targets')" />
-  </ImportGroup>
-  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
-    <PropertyGroup>
-      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
-    </PropertyGroup>
-    <Error Condition="!Exists('..\packages\freetype.redist.2.6.2.1\build\native\freetype.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\freetype.redist.2.6.2.1\build\native\freetype.redist.targets'))" />
-    <Error Condition="!Exists('..\packages\sdl2.v140.redist.2.0.4\build\native\sdl2.v140.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\sdl2.v140.redist.2.0.4\build\native\sdl2.v140.redist.targets'))" />
-    <Error Condition="!Exists('..\packages\sdl2_ttf.v140.redist.2.0.14\build\native\sdl2_ttf.v140.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\sdl2_ttf.v140.redist.2.0.14\build\native\sdl2_ttf.v140.redist.targets'))" />
-    <Error Condition="!Exists('..\packages\sdl2_ttf.v140.2.0.14\build\native\sdl2_ttf.v140.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\sdl2_ttf.v140.2.0.14\build\native\sdl2_ttf.v140.targets'))" />
-    <Error Condition="!Exists('..\packages\sdl2.v140.2.0.4\build\native\sdl2.v140.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\sdl2.v140.2.0.4\build\native\sdl2.v140.targets'))" />
-  </Target>
-</Project>
\ No newline at end of file
diff --git a/host/sync-test/sync-test.vcxproj.filters b/host/sync-test/sync-test.vcxproj.filters
deleted file mode 100644
index 978b5204..00000000
--- a/host/sync-test/sync-test.vcxproj.filters
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="main.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="packages.config" />
-  </ItemGroup>
-</Project>
\ No newline at end of file