diff --git a/Windows/Windows Service Readme.md b/Windows/Windows Service Readme.md
new file mode 100644
index 0000000..069692e
--- /dev/null
+++ b/Windows/Windows Service Readme.md
@@ -0,0 +1,61 @@
+Running Websockify as a Windows service
+=======================================
+
+Installation and configuration
+------------------------------
+
+Download the following software:
+
+ * Python, from https://www.python.org/downloads/windows/
+ * SrvAny, from http://simpleauto.byethost8.com/Zip/SrvAny.zip
+
+Note that there is [a modern alternative for SrvAny](https://github.com/rwmjones/rhsrvany),
+but that project does not provide binaries.
+
+Install Python for all users, not just the current one. Extract Websockify
+into a directory, e.g. `C:\Program Files\websockify`, so that e.g.
+`README.md` ends up there. Extract the `SrvAny.zip` archive, copy the
+`WIN7\SrvAny.exe` file into `C:\Program Files\websockify`.
+
+Then create a batch file, `C:\Program Files\websockify\run.bat`, that runs
+Websockify from its directory with the correct options under the correct
+Python interpreter:
+
+```
+C:
+cd "\Program Files\websockify"
+"C:\Program Files\Python39\python.exe" -m websockify 5901 127.0.0.1:5900
+```
+
+Run it by hand once so that Windows asks you about a firewall exception.
+After confirming the exception, press `Ctrl+C` to terminate the script.
+
+Then create a Windows service for Websockify (use an Administrator command
+prompt for that). For paths with spaces, like in this example, double-escaping
+is needed: once for `cmd.exe` and once for `SrvAny.exe`.
+
+```
+C:
+cd "\Program Files\websockify"
+SrvAny.exe -install Websockify 10s \\\"C:\Program Files\websockify\run.bat\\\"
+```
+
+In the Windows Control Panel, under Services, a new "Websockify" service will
+appear. In its properties dialog, you can change the startup type, e.g. make
+it start automatically at boot. Or, you can start the service manually.
+
+Uninstallation
+--------------
+
+If you want to remove the service, first set its startup type to Manual, then
+reboot the PC. Then run this command using the Administrator command prompt:
+
+```
+C:
+cd "\Program Files\websockify"
+SrvAny.exe -remove Websockify
+```
+
+After that, you will be able to remove the `C:\Program Files\websockify`
+directory completely.
+
diff --git a/Windows/Windows Service Readme.txt b/Windows/Windows Service Readme.txt
deleted file mode 100644
index 2ebd11e..0000000
--- a/Windows/Windows Service Readme.txt
+++ /dev/null
@@ -1,39 +0,0 @@
------------------------------------
-Windows noVNC Websockify Service
------------------------------------
-
-The "noVNC Websocket Service.exe" file is a windows service wrapper created with Visual Studio 2010 to create a windows service to start stop the noVNC Websocket Server. All files used to create the wrapper can be found in 'noVNC Websocket Service Project' folder.
-
-To download the precompiled executables please grab the zip in the downloads section of websockify project:
-https://github.com/novnc/websockify
-
----------------------------
-Installation
----------------------------
-
-1. This service requires websockify.exe be in the same directory. Instructions on how to compile websockify python script as a windows executable can be found here:
-https://github.com/novnc/websockify/wiki/Compiling-Websockify-as-Windows-Executable
-
-2.To add this service to a Windows PC you need to run the commandline as administrator and then run this line:
-
-sc create "noVNC Websocket Server" binPath= "PATH TO noVNC eg C:\noVNC\utils\Windows\Websocket Service.exe" DisplayName= "noVNC Websocket Server"
-
-3 .Once this is run you will be able to access the service via Control Panel > Admin Tools > Services. In here you can specify whether you want the service to run automatically and start at stop the service.
-
----------------------------
-Configuration
----------------------------
-The file noVNCConfig.ini must be in the same directory as "noVNC Websocket Service.exe".
-
-This file contains a single line which is the websockify.exe statup arguements. An example is:
-192.168.0.1:5901 192.168.0.1:5900
-
-All websockify supported arguements will work if added here.
-
----------------------------
-Deletion
----------------------------
-
-You can delete the service at any time by running the commandline as admin and using this command:
-sc delete "noVNC Websocket Server".
-
diff --git a/Windows/noVNC Websocket Service Project/Program.cs b/Windows/noVNC Websocket Service Project/Program.cs
deleted file mode 100644
index 2d07c33..0000000
--- a/Windows/noVNC Websocket Service Project/Program.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.ServiceProcess;
-using System.Text;
-
-namespace MELT_Command_Websocket
-{
- static class Program
- {
- ///
- /// The main entry point for the application.
- ///
- static void Main()
- {
- ServiceBase[] ServicesToRun;
- ServicesToRun = new ServiceBase[]
- {
- new Service1()
- };
- ServiceBase.Run(ServicesToRun);
- }
- }
-}
diff --git a/Windows/noVNC Websocket Service Project/ProjectInstaller.Designer.cs b/Windows/noVNC Websocket Service Project/ProjectInstaller.Designer.cs
deleted file mode 100644
index 3dab5bb..0000000
--- a/Windows/noVNC Websocket Service Project/ProjectInstaller.Designer.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-namespace MELT_Command_Websocket
-{
- partial class ProjectInstaller
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Component Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
- this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
- //
- // serviceProcessInstaller1
- //
- this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.NetworkService;
- this.serviceProcessInstaller1.Installers.AddRange(new System.Configuration.Install.Installer[] {
- this.serviceInstaller1});
- this.serviceProcessInstaller1.Password = null;
- this.serviceProcessInstaller1.Username = null;
- //
- // serviceInstaller1
- //
- this.serviceInstaller1.Description = "noVNC Websocket Service";
- this.serviceInstaller1.DisplayName = "noVNC Websocket Service";
- this.serviceInstaller1.ServiceName = "noVNC Websocket Service";
- this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
- //
- // ProjectInstaller
- //
- this.Installers.AddRange(new System.Configuration.Install.Installer[] {
- this.serviceProcessInstaller1});
-
- }
-
- #endregion
-
- private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
- private System.ServiceProcess.ServiceInstaller serviceInstaller1;
- }
-}
\ No newline at end of file
diff --git a/Windows/noVNC Websocket Service Project/ProjectInstaller.cs b/Windows/noVNC Websocket Service Project/ProjectInstaller.cs
deleted file mode 100644
index 783bb15..0000000
--- a/Windows/noVNC Websocket Service Project/ProjectInstaller.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Configuration.Install;
-using System.Linq;
-
-
-namespace MELT_Command_Websocket
-{
- [RunInstaller(true)]
- public partial class ProjectInstaller : System.Configuration.Install.Installer
- {
- public ProjectInstaller()
- {
- InitializeComponent();
- }
- }
-}
diff --git a/Windows/noVNC Websocket Service Project/ProjectInstaller.resx b/Windows/noVNC Websocket Service Project/ProjectInstaller.resx
deleted file mode 100644
index fbda1ae..0000000
--- a/Windows/noVNC Websocket Service Project/ProjectInstaller.resx
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 17, 56
-
-
- 196, 17
-
-
- False
-
-
\ No newline at end of file
diff --git a/Windows/noVNC Websocket Service Project/Properties/AssemblyInfo.cs b/Windows/noVNC Websocket Service Project/Properties/AssemblyInfo.cs
deleted file mode 100644
index 832319e..0000000
--- a/Windows/noVNC Websocket Service Project/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("MELT Command Websocket")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Microsoft")]
-[assembly: AssemblyProduct("MELT Command Websocket")]
-[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5ab831cb-6852-4ce1-849c-b26725b0e10b")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Windows/noVNC Websocket Service Project/Service1.Designer.cs b/Windows/noVNC Websocket Service Project/Service1.Designer.cs
deleted file mode 100644
index c569eca..0000000
--- a/Windows/noVNC Websocket Service Project/Service1.Designer.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-namespace MELT_Command_Websocket
-{
- partial class Service1
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Component Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- components = new System.ComponentModel.Container();
- this.ServiceName = "Service1";
- }
-
- #endregion
- }
-}
diff --git a/Windows/noVNC Websocket Service Project/Service1.cs b/Windows/noVNC Websocket Service Project/Service1.cs
deleted file mode 100644
index ce94bf6..0000000
--- a/Windows/noVNC Websocket Service Project/Service1.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Diagnostics;
-using System.Linq;
-using System.ServiceProcess;
-using System.Text;
-using System.IO;
-
-namespace MELT_Command_Websocket
-{
- public partial class Service1 : ServiceBase
- {
- Process websockify;
- public Service1()
- {
- InitializeComponent();
- }
-
- protected override void OnStart(string[] args)
- {
-
- string configpath = AppDomain.CurrentDomain.BaseDirectory + "\\noVNCConfig.ini";
- string sockifypath = AppDomain.CurrentDomain.BaseDirectory + "\\websockify.exe";
- //Load commandline arguements from config file.
- StreamReader streamReader = new StreamReader(configpath);
- string arguements = streamReader.ReadLine();
- streamReader.Close();
-
- //Start websockify.
- websockify = System.Diagnostics.Process.Start(sockifypath, arguements);
- }
-
- protected override void OnStop()
- {
- //Service stopped. Close websockify.
- websockify.Kill();
- }
- }
-}
diff --git a/Windows/noVNC Websocket Service Project/noVNC Websocket.csproj b/Windows/noVNC Websocket Service Project/noVNC Websocket.csproj
deleted file mode 100644
index 368d183..0000000
--- a/Windows/noVNC Websocket Service Project/noVNC Websocket.csproj
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
- Debug
- x86
- 8.0.30703
- 2.0
- {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}
- WinExe
- Properties
- noVNC_Websocket_Service
- noVNC Websocket Service
- v3.5
- 512
-
-
- x86
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- x86
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Component
-
-
- ProjectInstaller.cs
-
-
- Component
-
-
- Service1.cs
-
-
-
-
-
-
- ProjectInstaller.cs
-
-
-
-
-
\ No newline at end of file
diff --git a/Windows/noVNC Websocket Service Project/noVNC Websocket.sln b/Windows/noVNC Websocket Service Project/noVNC Websocket.sln
deleted file mode 100644
index 140de1b..0000000
--- a/Windows/noVNC Websocket Service Project/noVNC Websocket.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "noVNC Websocket", "noVNC Websocket.csproj", "{6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x86 = Debug|x86
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Debug|x86.ActiveCfg = Debug|x86
- {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Debug|x86.Build.0 = Debug|x86
- {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Release|x86.ActiveCfg = Release|x86
- {6B86AE7B-6BBD-4E74-8802-5995E8B6D27D}.Release|x86.Build.0 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal